кто сталкивался с тем что бы заставить gcc собирать код на asm? что бы параметры функции передавались через push а не через mov платформа x86 по всякому перепробовал может он этого и неумеет?
самое интересное, что -mpush-args действительно не работает c -Os работает, но при этом идет оптимизация всех инструкций по размеру кода, а это не всегда нужно
Сложно сказать. Код (Text): int foo (int a, int b) { return a + b; } int bar (int x) { return foo (x, 2) * foo (x, 4); } Компилируется в: Код (Text): .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'ами в стек аргументы складываются.
Точно? А может x86_64? Я никак не мог сообразить, почему я всё время видел именно movl вместо pushl, и почему же, когда я решил проверить, я почему-то не увидел movl... Домой пришёл, попробовал, и, думаю, понял: на x86_64 gcc так поступает. -fpush-args я включил явно, -faccumulate-outgoing-args (которая включена была по-дефолту) я выключил. В низкоуровневых оптимизациях я не секу, поэтому не могу сказать, зачем он так делает, но, думаю, так лучше. Сделай вот что: Код (Text): gcc -S -fverbose-asm file.c А потом загляни в file.s, там будет написано всё про gcc и про опции, которые используются. Собственно в предыдущем моём посте можно видеть пример такого вывода. Собственно, я не знаю как сделать push'ами. С этими вопросами, наверное, стоит обращаться в списки рассылки gcc. Быть может какой-нибудь из оптимизаторов решает, что push будет не лучшим выходом (и судя по результатам при -Os, так оно и есть). Быть может это не фича, а глюк -- сложно сказать.
Включал и отключал. Про -O не догадался. Кстати он у меня ругаться стал когда к push-args и no-accumulate я добавил -O: Код (Text): 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
Поднимем эту старую тему. Код (Text): gcc -mpush-args -mno-accumulate-outgoing-args test.c test.c:1:0: warning: stack probing requires -maccumulate-outgoing-args for correctness Как отключить stack probing?