Messages in this thread | | | From | Dmitry Vyukov <> | Date | Wed, 20 Sep 2017 19:38:09 +0200 | Subject | Re: [PATCH 2/2] x86/asm: Fix inline asm call constraints for clang |
| |
On Wed, Sep 20, 2017 at 7:32 PM, H. Peter Anvin <hpa@zytor.com> 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.
| |