Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751609AbdITRid (ORCPT ); Wed, 20 Sep 2017 13:38:33 -0400 Received: from mail-qt0-f182.google.com ([209.85.216.182]:43414 "EHLO mail-qt0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751387AbdITRib (ORCPT ); Wed, 20 Sep 2017 13:38:31 -0400 X-Google-Smtp-Source: AOwi7QACBFOXYwDcXhNmBaM/lnhnRvQwuu5NCmYkYhpqug5BJLjlbe3harEpPxZ9XzV5CScdYu3Zt4p878mDLkiAjf0= MIME-Version: 1.0 In-Reply-To: References: <31e96e6bcfcb47725e15a093b9c31660dfaad430.1505846562.git.jpoimboe@redhat.com> From: Dmitry Vyukov Date: Wed, 20 Sep 2017 19:38:09 +0200 Message-ID: Subject: Re: [PATCH 2/2] x86/asm: Fix inline asm call constraints for clang To: "H. Peter Anvin" Cc: Josh Poimboeuf , "x86@kernel.org" , LKML , Ingo Molnar , Thomas Gleixner , Andy Lutomirski , Linus Torvalds , Alexander Potapenko , Matthias Kaehlcke , Arnd Bergmann , Peter Zijlstra , Andrey Ryabinin Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1338 Lines: 32 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.