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

Тема в разделе "WASM.UNIX", создана пользователем reversecode, 16 май 2008.

  1. reversecode

    reversecode Guest

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

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    __stdcall вместо __cdecl?
     
  3. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Если я правильно понял проблему, попробуй опцию -mpush-args или -mno-accumulate-outgoing-args.
     
  4. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    а -O0 или -Os не помогают?
     
  5. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Покажи полную командную строку, которой запускается gcc.
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    самое интересное, что -mpush-args действительно не работает
    c -Os работает, но при этом идет оптимизация всех инструкций по размеру кода, а это не всегда нужно
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Сложно сказать.
    Код (Text):
    1. int foo (int a, int b)
    2. {
    3.     return a + b;
    4. }
    5.  
    6. int bar (int x)
    7. {
    8.     return foo (x, 2) * foo (x, 4);
    9. }
    Компилируется в:
    Код (Text):
    1.     .file   "tmp.c"
    2. # GNU C version 4.1.2 (Gentoo 4.1.2) (i486-pc-linux-gnu)
    3. #   compiled by GNU C version 4.1.2 (Gentoo 4.1.2).
    4. # GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=63297
    5. # переданы ключи:  -march=i386 -auxbase -fverbose-asm
    6. # активные ключи:  -falign-loops -fargument-alias
    7. # -fbranch-count-reg -fcommon -fearly-inlining
    8. # -feliminate-unused-debug-types -ffunction-cse -fgcse-lm -fident
    9. # -finline-functions-called-once -fivopts -fkeep-static-consts
    10. # -fleading-underscore -floop-optimize2 -fmath-errno -fpcc-struct-return
    11. # -fpeephole -fsched-interblock -fsched-spec -fsched-stalled-insns-dep
    12. # -fshow-column -fsplit-ivs-in-unroller -ftrapping-math -ftree-loop-im
    13. # -ftree-loop-ivcanon -ftree-loop-optimize -ftree-vect-loop-version
    14. # -fverbose-asm -fzero-initialized-in-bss -m32 -m80387 -m96bit-long-double
    15. # -malign-stringops -mfancy-math-387 -mfp-ret-in-387 -mieee-fp
    16. # -mno-red-zone -mpush-args -mtls-direct-seg-refs
    17.  
    18. # Compiler executable checksum: 0fc900551e93a9af83dbbe81eea806a0
    19.  
    20.     .text
    21. .globl foo
    22.     .type   foo, @function
    23. foo:
    24.     pushl   %ebp    #
    25.     movl    %esp, %ebp  #,
    26.     movl    12(%ebp), %eax  # b, b
    27.     addl    8(%ebp), %eax   # a, D.1280
    28.     leave
    29.     ret
    30.     .size   foo, .-foo
    31. .globl bar
    32.     .type   bar, @function
    33. bar:
    34.     pushl   %ebp    #
    35.     movl    %esp, %ebp  #,
    36.     pushl   %ebx    #
    37.     pushl   $2  #
    38.     pushl   8(%ebp) # x
    39.     call    foo #
    40.     addl    $8, %esp    #,
    41.     movl    %eax, %ebx  #, D.1286
    42.     pushl   $4  #
    43.     pushl   8(%ebp) # x
    44.     call    foo #
    45.     addl    $8, %esp    #,
    46.     imull   %ebx, %eax  # D.1286, D.1285
    47.     movl    -4(%ebp), %ebx  #,
    48.     leave
    49.     ret
    50.     .size   bar, .-bar
    51.     .ident  "GCC: (GNU) 4.1.2 (Gentoo 4.1.2)"
    52.     .section    .note.GNU-stack,"",@progbits
    -O2 тоже пробовал передавать -- всё равно push'ами в стек аргументы складываются.
     
  8. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Возможно локальный глюк. Попробуй другую версию gcc или на другой машине.
     
  9. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Точно? А может x86_64?

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

    Сделай вот что:
    Код (Text):
    1. gcc -S -fverbose-asm file.c
    А потом загляни в file.s, там будет написано всё про gcc и про опции, которые используются. Собственно в предыдущем моём посте можно видеть пример такого вывода.

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

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Включал и отключал. Про -O не догадался. Кстати он у меня ругаться стал когда к push-args и no-accumulate я добавил -O:
    Код (Text):
    1.  gcc -mpush-args -mno-accumulate-outgoing-args -fverbose-asm -O -S tmp.c
    2. tmp.c:1: предупреждение: unwind tables currently require either a frame pointer or -maccumulate-outgoing-args for correctness
     
  11. LaoFremda

    LaoFremda New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2009
    Сообщения:
    13
    Поднимем эту старую тему.
    Код (Text):
    1. gcc -mpush-args -mno-accumulate-outgoing-args test.c
    2. test.c:1:0: warning: stack probing requires -maccumulate-outgoing-args for correctness
    Как отключить stack probing?