[Bug inline-asm/52813] %rsp in clobber list is silently ignored
jhaberman at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sun Apr 1 15:54:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52813
Josh Haberman <jhaberman at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |UNCONFIRMED
Resolution|INVALID |
--- Comment #2 from Josh Haberman <jhaberman at gmail dot com> 2012-04-01 15:54:27 UTC ---
I don't expect the compiler to analyze the asm string. I expect the compiler
to respect my clobber list.
I told GCC that I would clobber %rsp. Any other register that I put in the
clobber list causes GCC to save that register to the stack or to another
register before the asm and restore it from the stack/register after the asm.
For example:
--
#include <stdlib.h>
int main() {
int x = rand();
asm volatile ("movq $0, %%rax" : : : "%rax");
return x;
}
$ gcc -Wall -O3 -fomit-frame-pointer -c -o test.o test.c
$ objdump -d -r -M intel test.o
test.o: file format elf64-x86-64
Disassembly of section .text.startup:
0000000000000000 <main>:
0: 48 83 ec 08 sub rsp,0x8
4: e8 00 00 00 00 call 9 <main+0x9>
5: R_X86_64_PC32 rand-0x4
9: 89 c2 mov edx,eax
b: 48 c7 c0 00 00 00 00 mov rax,0x0
12: 89 d0 mov eax,edx
14: 48 83 c4 08 add rsp,0x8
18: c3 ret
--
Notice that it saved eax to edx before my asm and restored it afterwards. This
works for every register except %rsp, which is silently ignored if you try to
list it in the clobber list. This is a bug.
More information about the Gcc-bugs
mailing list