Какой-то он странный стал, дурит.
Есть простой кусок кода, знаю так немного криво делать, но ничего плохого в этом нет, правда ведь? )))
#include <stddef.h>
#pragma pack(1)
typedef struct _footype {
char bar1[8];
void* bar2;
} footype;
footype *foo() {
footype *dummy;
dummy=(footype*)findbar();
*((unsigned long*)&dummy)-=offsetof(footype,bar2);
return dummy;
}
$ gcc -c -S -O1 gcc.c получаю такой листинг
.file "gcc.c"
.text
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call findbar
subl $8, %eax <== получаем указатель на footype
leave
ret
.size foo, .-foo
.ident "GCC: (GNU) 4.4.0 20090526 (prerelease)"
.section .note.GNU-stack,"",@progbits
с оптимизацией O2
$ gcc -c -S -O2 gcc.c
.file "gcc.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call findbar
<===== где sub $8, б&я?
leave
ret
.size foo, .-foo
.ident "GCC: (GNU) 4.4.0 20090526 (prerelease)"
.section .note.GNU-stack,"",@progbits
Тот же код на 4.3.2 дает хоть и кривее листинг, но он корректен.
-O1
.file "gcc.c"
.text
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call findbar
movl %eax, -4(%ebp)
subl $8, -4(%ebp)
movl -4(%ebp), %eax
leave
ret
.size foo, .-foo
.ident "GCC: (GNU) 4.3.2"
.section .note.GNU-stack,"",@progbits
-O2
.file "gcc.c"
.text
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call findbar
movl %eax, -4(%ebp)
subl $8, -4(%ebp)
leave
ret
.size foo, .-foo
.ident "GCC: (GNU) 4.3.2"
.section .note.GNU-stack,"",@progbits
т.е. прямо по стеку фигачит и возвращает значение.
Естественно в этом месте я код поправил, но хотелось бы знать почему гцц приподнес мне такую жопу? И что от него еще ждать. Одну ошибку я так и не могу найти ((( при использовании 4.3.2 все ОК.