4byte structures that are passed as parameters to a fastcall routine will get passed as registers. This does not match the original fastcall convention, which passes such structures on the stack.
Compiling this code: #include <stdio.h> typedef struct { int a; } my_struct; int __attribute__((fastcall)) foo(my_struct s, int b) { return s.a + b; } main() { my_struct ss; ss.a = 1; printf("\nfoo = %d.\n",foo(ss,2)); } Results in: . . movl $1, -12(%ebp) movl -12(%ebp), %ecx movl $2, %edx call _foo . . and . . .globl _foo _foo: pushl %ebp movl %esp, %ebp subl $24, %esp movl %ecx, -12(%ebp) movl %edx, -16(%ebp) movl -12(%ebp), %eax addl -16(%ebp), %eax leave ret With GCC. Using other compilers that support fastcall will pass the struct value on the stack. -- Summary: Incorrect __attribute__ fastcall behavior Product: gcc Version: 4.0.1 Status: UNCONFIRMED Severity: major Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: zia at aracnet dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34001