Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751551AbdITBS0 (ORCPT ); Tue, 19 Sep 2017 21:18:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60204 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750733AbdITBSZ (ORCPT ); Tue, 19 Sep 2017 21:18:25 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 64E312CE90D Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=jpoimboe@redhat.com Date: Tue, 19 Sep 2017 20:18:23 -0500 From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , Andy Lutomirski , Linus Torvalds , Alexander Potapenko , Dmitriy Vyukov , Matthias Kaehlcke , Arnd Bergmann , Peter Zijlstra , Andrey Ryabinin Subject: Re: [PATCH 2/2] x86/asm: Fix inline asm call constraints for clang Message-ID: <20170920011823.wbkn4qagiovuzkow@treble> References: <31e96e6bcfcb47725e15a093b9c31660dfaad430.1505846562.git.jpoimboe@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <31e96e6bcfcb47725e15a093b9c31660dfaad430.1505846562.git.jpoimboe@redhat.com> User-Agent: Mutt/1.6.0.1 (2016-04-01) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 20 Sep 2017 01:18:25 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1606 Lines: 46 On Tue, Sep 19, 2017 at 01:45:28PM -0500, 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. > > Here are the vmlinux .text size differences with the following configs > on GCC: > > - defconfig > - defconfig without frame pointers > - Fedora distro config > - Fedora distro config without frame pointers > > defconfig defconfig-nofp distro distro-nofp > before 9796300 9466764 9076191 8789745 > after 9796941 9462859 9076381 8785325 > > With frame pointers, the text size increases slightly. Without frame > pointers, the text size decreases, and a little more significantly. > > Reported-by: Matthias Kaehlcke > Signed-off-by: Josh Poimboeuf NAK - kbuild bot is reporting some cases where this patch doesn't force the frame pointer setup. -- Josh