User account creation filtered due to spam.

Bug 52813 - %rsp in clobber list is silently ignored
Summary: %rsp in clobber list is silently ignored
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: inline-asm (show other bugs)
Version: 4.6.1
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-03-31 22:42 UTC by Josh Haberman
Modified: 2012-05-28 23:06 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Josh Haberman 2012-03-31 22:42:02 UTC
The following test program crashes even though I correctly listed %rsp as clobbered:

--

int main() {
  asm volatile ("movq $0, %%rsp" : : : "%rsp");
  return 0;
}

--

I would prefer gcc to error out in this case instead of silently ignoring my instruction.
Comment 1 Uroš Bizjak 2012-04-01 09:21:09 UTC
The compiler doesn't analyse asm string.
Comment 2 Josh Haberman 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.
Comment 3 Uroš Bizjak 2012-04-01 18:58:27 UTC
(In reply to comment #2)
> 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:

%rsp is considered a "fixed" register, used for fixed purposes all throughout
the compiled code and are therefore not available for general allocation.

So, save %rsp at the beginning of your asm code and restore it at the end.
Comment 4 Josh Haberman 2012-04-01 19:23:14 UTC
I understand that GCC may not be able to save/restore %rsp like it does other registers.  But if that's the case, GCC should throw an error if the user puts %rsp in the clobber list, instead of silently ignoring it.  Otherwise how is the user supposed to know that %rsp will not be saved except through trial and error?
Comment 5 Ralph Corderoy 2012-05-28 23:06:51 UTC
The examples clearly show the problem and it bites me here.  Please change the status to confirmed.