Объявление

#1 16-05-2008 00:09:29

как побороть gcc

кто сталкивался с тем что бы заставить gcc собирать код на asm?
что бы параметры функции передавались через push
а не через mov
платформа x86
по всякому перепробовал
может он этого и неумеет?

 

#2 16-05-2008 00:12:37

Re: как побороть gcc

__stdcall вместо __cdecl?


Entia non sunt multiplicanda sine necessitate (не нужно усложнять сверх необходимого)

 

#3 16-05-2008 13:11:53

Re: как побороть gcc

Если я правильно понял проблему, попробуй опцию -mpush-args или -mno-accumulate-outgoing-args.

 

#4 18-05-2008 19:15:24

Re: как побороть gcc

в том то и дело что
-mpush-args или -mno-accumulate-outgoing-args
ничего не меняют
а  __stdcall , __cdecl
совершенно не то

ведь параметры все так же через стек идут
токо не командой push а командой mov [esp-.....

 

#5 19-05-2008 07:25:58

Re: как побороть gcc

а -O0 или -Os не помогают?

 

#6 19-05-2008 10:13:03

Re: как побороть gcc

reversecode
Покажи полную командную строку, которой запускается gcc.

 

#7 19-05-2008 11:55:11

Re: как побороть gcc

а -O0 или -Os не помогают?

самое интересное, что -mpush-args действительно не работает
c -Os работает, но при этом идет оптимизация всех инструкций по размеру кода, а это не всегда нужно

 

#8 19-05-2008 12:49:57

Re: как побороть gcc

Сложно сказать.

Код:

int foo (int a, int b)
{
    return a + b;
}

int bar (int x)
{
    return foo (x, 2) * foo (x, 4);
}

Компилируется в:

Код:

    .file    "tmp.c"
# GNU C version 4.1.2 (Gentoo 4.1.2) (i486-pc-linux-gnu)
#    compiled by GNU C version 4.1.2 (Gentoo 4.1.2).
# GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=63297
# переданы ключи:  -march=i386 -auxbase -fverbose-asm
# активные ключи:  -falign-loops -fargument-alias
# -fbranch-count-reg -fcommon -fearly-inlining
# -feliminate-unused-debug-types -ffunction-cse -fgcse-lm -fident
# -finline-functions-called-once -fivopts -fkeep-static-consts
# -fleading-underscore -floop-optimize2 -fmath-errno -fpcc-struct-return
# -fpeephole -fsched-interblock -fsched-spec -fsched-stalled-insns-dep
# -fshow-column -fsplit-ivs-in-unroller -ftrapping-math -ftree-loop-im
# -ftree-loop-ivcanon -ftree-loop-optimize -ftree-vect-loop-version
# -fverbose-asm -fzero-initialized-in-bss -m32 -m80387 -m96bit-long-double
# -malign-stringops -mfancy-math-387 -mfp-ret-in-387 -mieee-fp
# -mno-red-zone -mpush-args -mtls-direct-seg-refs

# Compiler executable checksum: 0fc900551e93a9af83dbbe81eea806a0

    .text
.globl foo
    .type    foo, @function
foo:
    pushl    %ebp    #
    movl    %esp, %ebp    #,
    movl    12(%ebp), %eax    # b, b
    addl    8(%ebp), %eax    # a, D.1280
    leave
    ret
    .size    foo, .-foo
.globl bar
    .type    bar, @function
bar:
    pushl    %ebp    #
    movl    %esp, %ebp    #,
    pushl    %ebx    #
    pushl    $2    #
    pushl    8(%ebp)    # x
    call    foo    #
    addl    $8, %esp    #,
    movl    %eax, %ebx    #, D.1286
    pushl    $4    #
    pushl    8(%ebp)    # x
    call    foo    #
    addl    $8, %esp    #,
    imull    %ebx, %eax    # D.1286, D.1285
    movl    -4(%ebp), %ebx    #,
    leave
    ret
    .size    bar, .-bar
    .ident    "GCC: (GNU) 4.1.2 (Gentoo 4.1.2)"
    .section    .note.GNU-stack,"",@progbits

-O2 тоже пробовал передавать -- всё равно push'ами в стек аргументы складываются.

 

#9 19-05-2008 13:04:37

Re: как побороть gcc

reversecode
Возможно локальный глюк. Попробуй другую версию gcc или на другой машине.

 

#10 19-05-2008 15:33:19

Re: как побороть gcc

разобрался
нужно сразу две опции
-mpush-args -mno-accumulate-outgoing-args
тогда все впорядке
ну еще можно -O
добавить тогда вообще красота

 

#11 19-05-2008 15:53:54

Re: как побороть gcc

платформа x86

Точно? А может x86_64?

Я никак не мог сообразить, почему я всё время видел именно movl вместо pushl, и почему же, когда я решил проверить, я почему-то не увидел movl... Домой пришёл, попробовал, и, думаю, понял: на x86_64 gcc так поступает. -fpush-args я включил явно, -faccumulate-outgoing-args (которая включена была по-дефолту) я выключил. В низкоуровневых оптимизациях я не секу, поэтому не могу сказать, зачем он так делает, но, думаю, так лучше.

Сделай вот что:

Код:

gcc -S -fverbose-asm file.c

А потом загляни в file.s, там будет написано всё про gcc и про опции, которые используются. Собственно в предыдущем моём посте можно видеть пример такого вывода.

Собственно, я не знаю как сделать push'ами. С этими вопросами, наверное, стоит обращаться в списки рассылки gcc. Быть может какой-нибудь из оптимизаторов решает, что push будет не лучшим выходом (и судя по результатам при -Os, так оно и есть). Быть может это не фича, а глюк -- сложно сказать.

 

#12 19-05-2008 19:26:33

Re: как побороть gcc

>r90

-maccumulate-outgoing-args
почему то включена по дефолту всегда
а в соурсах нашел
что бы был push должен быть отключен accumulate-outgoing-args

нужно обе опции включать
и проще делать objdump -d file.o
тоесть
-mpush-args -mno-accumulate-outgoing-args -O
все просто замечательно

нормально это нигде толком не описано
думаю по нормальному включение -mpush-args должно отключать accumulate-outgoing-args

 

#13 19-05-2008 22:53:10

Re: как побороть gcc

Включал и отключал. Про -O не догадался. Кстати он у меня ругаться стал когда к push-args и no-accumulate я добавил -O:

Код:

 gcc -mpush-args -mno-accumulate-outgoing-args -fverbose-asm -O -S tmp.c
tmp.c:1: предупреждение: unwind tables currently require either a frame pointer or -maccumulate-outgoing-args for correctness

Отредактировано r90 (19-05-2008 22:53:54)

 

#14 09-07-2010 23:25:07

Re: как побороть gcc

Поднимем эту старую тему.

Код:

gcc -mpush-args -mno-accumulate-outgoing-args test.c
test.c:1:0: warning: stack probing requires -maccumulate-outgoing-args for correctness

Как отключить stack probing?

 

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson