From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5429 invoked by alias); 1 Apr 2012 15:54:44 -0000 Received: (qmail 5416 invoked by uid 22791); 1 Apr 2012 15:54:43 -0000 X-SWARE-Spam-Status: No, hits=-3.7 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00,KHOP_THREADED,TW_BJ X-Spam-Check-By: sourceware.org Received: from localhost (HELO gcc.gnu.org) (127.0.0.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 01 Apr 2012 15:54:30 +0000 From: "jhaberman at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug inline-asm/52813] %rsp in clobber list is silently ignored Date: Sun, 01 Apr 2012 15:54:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: inline-asm X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: jhaberman at gmail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: Status Resolution Message-ID: In-Reply-To: References: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2012-04/txt/msg00026.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52813 Josh Haberman changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |UNCONFIRMED Resolution|INVALID | --- Comment #2 from 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 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
: 0: 48 83 ec 08 sub rsp,0x8 4: e8 00 00 00 00 call 9 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.