------- Comment #2 from hjl dot tools at gmail dot com 2009-12-07 18:39 ------- (In reply to comment #1) > For what it's worth, gcc 3.4.6 generates a clear on the output register, and > therefore complies with the written ABI. >
That is true. However, gcc 3.4.6 does: [...@gnu-26 pr42324]$ cat b1.c _Bool myfunction(char val); int foo (char v) { return myfunction (v); } [...@gnu-26 pr42324]$ gcc -O2 -S b1.c [...@gnu-26 pr42324]$ cat b1.s .file "b1.c" .text .p2align 4,,15 .globl foo .type foo, @function foo: .LFB2: subq $8, %rsp .LCFI0: movsbl %dil,%edi call myfunction addq $8, %rsp movzbl %al, %eax ret It assumes that _Bool is returned in AL. Gcc 3.4.6 generates: [...@gnu-26 pr42324]$ cat b2.c void foo (char, char, char, char, char, char, char, _Bool); void myfunction(char val) { foo (val, val, val, val, val, val, val, val); } [...@gnu-26 pr42324]$ gcc -O2 -S b2.c [...@gnu-26 pr42324]$ cat b2.s .file "b2.c" .text .p2align 4,,15 .globl myfunction .type myfunction, @function myfunction: .LFB2: movsbl %dil,%r10d subq $24, %rsp .LCFI0: xorl %eax, %eax testb %dil, %dil movl %r10d, %r9d movl %r10d, %r8d setne %al movl %r10d, %ecx movl %r10d, %edx movl %r10d, %esi movl %r10d, %edi movl %eax, 8(%rsp) movl %r10d, (%rsp) call foo addq $24, %rsp ret The upper 32bits of _Bool on stack aren't zeroed. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42324