[lkml]   [2017]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: [PATCH 2/2] x86/asm: Fix inline asm call constraints for clang
On Wed, Sep 20, 2017 at 7:32 PM, H. Peter Anvin <> wrote:
> On 09/19/17 11:45, Josh Poimboeuf wrote:
>> For inline asm statements which have a CALL instruction, we list the
>> stack pointer as a constraint to convince GCC to ensure the frame
>> pointer is set up first:
>> static inline void foo()
>> {
>> register void *__sp asm(_ASM_SP);
>> asm("call bar" : "+r" (__sp))
>> }
>> Unfortunately, that pattern causes clang to corrupt the stack pointer.
>> There's actually an easier way to achieve the same goal in GCC, without
>> causing trouble for clang. If we declare the stack pointer register
>> variable as a global variable, and remove the constraint altogether,
>> that convinces GCC to always set up the frame pointer before inserting
>> *any* inline asm.
>> It basically acts as if *every* inline asm statement has a CALL
>> instruction. It's a bit overkill, but the performance impact should be
>> negligible.
> Again, probably negligible, but why do we need a frame pointer just
> because we have a call assembly instruction?

I think we need just the frame itself and RSP pointing below this
frame. If we don't have a frame, CALL instruction will smash whatever
RSP happens to point to. Compiler doesn't have to setup RSP to point
below used part of stack in leaf functions.

 \ /
  Last update: 2017-09-20 19:39    [W:0.110 / U:1.400 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site