From patchwork Thu Apr 11 18:18:51 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Bird X-Patchwork-Id: 2429891 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by patchwork2.kernel.org (Postfix) with ESMTP id 94C9DDF230 for ; Thu, 11 Apr 2013 18:15:44 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UQM28-0001NO-RC; Thu, 11 Apr 2013 18:15:41 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UQM26-0001Fi-Bu; Thu, 11 Apr 2013 18:15:38 +0000 Received: from co9ehsobe001.messaging.microsoft.com ([207.46.163.24] helo=co9outboundpool.messaging.microsoft.com) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UQM22-0001FO-Sv for linux-arm-kernel@lists.infradead.org; Thu, 11 Apr 2013 18:15:36 +0000 Received: from mail29-co9-R.bigfish.com (10.236.132.252) by CO9EHSOBE035.bigfish.com (10.236.130.98) with Microsoft SMTP Server id 14.1.225.23; Thu, 11 Apr 2013 18:15:32 +0000 Received: from mail29-co9 (localhost [127.0.0.1]) by mail29-co9-R.bigfish.com (Postfix) with ESMTP id 74E7F1E01CE; Thu, 11 Apr 2013 18:15:32 +0000 (UTC) X-Forefront-Antispam-Report: CIP:160.33.194.229; KIP:(null); UIP:(null); IPV:NLI; H:usculsndmail02v.am.sony.com; RD:mail02.sonyusa.com; EFVD:NLI X-SpamScore: -3 X-BigFish: VPS-3(z10d0kzbb2dI98dI9371I936eI1432I14ffIzz1f42h1fc6h1ee6h1de0h1fdah1202h1e76h1d1ah1d2ahzzz2fh2a8h668h839h93fhd25hf0ah1288h12a5h12a9h12bdh137ah13b6h1441h1504h1537h153bh162dh1631h1758h1765h18e1h190ch1946h19b4h19c3h1b0ah1155h) Received-SPF: pass (mail29-co9: domain of am.sony.com designates 160.33.194.229 as permitted sender) client-ip=160.33.194.229; envelope-from=tim.bird@am.sony.com; helo=usculsndmail02v.am.sony.com ; .am.sony.com ; Received: from mail29-co9 (localhost.localdomain [127.0.0.1]) by mail29-co9 (MessageSwitch) id 1365704129707475_31149; Thu, 11 Apr 2013 18:15:29 +0000 (UTC) Received: from CO9EHSMHS023.bigfish.com (unknown [10.236.132.243]) by mail29-co9.bigfish.com (Postfix) with ESMTP id A00D38004F; Thu, 11 Apr 2013 18:15:29 +0000 (UTC) Received: from usculsndmail02v.am.sony.com (160.33.194.229) by CO9EHSMHS023.bigfish.com (10.236.130.33) with Microsoft SMTP Server (TLS) id 14.1.225.23; Thu, 11 Apr 2013 18:15:28 +0000 Received: from usculsndmail13v.am.sony.com (usculsndmail13v.am.sony.com [146.215.230.104]) by usculsndmail02v.am.sony.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r3BIEKUb030494; Thu, 11 Apr 2013 18:14:20 GMT Received: from mail1x.sjc.in.sel.sony.com (mail1x.sjc.in.sel.sony.com [43.134.1.112]) by usculsndmail13v.am.sony.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r3BIEI5F008086 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 11 Apr 2013 18:14:19 GMT Received: from [43.135.148.222] ([43.135.148.222]) by mail1x.sjc.in.sel.sony.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id r3BIEIHI023521; Thu, 11 Apr 2013 18:14:18 GMT Message-ID: <5166FE8B.2070603@am.sony.com> Date: Thu, 11 Apr 2013 11:18:51 -0700 From: Tim Bird User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130308 Thunderbird/17.0.4 MIME-Version: 1.0 To: "Jon Medhurst (Tixy)" Subject: Re: RFC: right way to conditional-ize some macros for LTO References: <5155E28A.30509@am.sony.com> <1364907037.3650.54.camel@linaro1.home> In-Reply-To: <1364907037.3650.54.camel@linaro1.home> X-OriginatorOrg: am.sony.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130411_141535_156988_077D2378 X-CRM114-Status: GOOD ( 38.85 ) X-Spam-Score: -4.2 (----) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-4.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [207.46.163.24 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: "Kleen, Andi" , Catalin Marinas , Russell King , linux kernel , "linux-arm-kernel@lists.infradead.org" X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org On 04/02/2013 05:50 AM, Jon Medhurst (Tixy) wrote: > On Fri, 2013-03-29 at 11:50 -0700, Tim Bird wrote: >> Hi all, >> >> A while ago I was working on supporting link-time optimization >> for ARM, and I'm just now getting around to submitting some of >> the patches from my work. I'll explain more below, but the >> executive summary is this: Andi Kleen's LTO patches for Linux >> almost work on ARM. I ran into one issue in >> arch/arm/include/asm/unified.h where various 'it'-related >> macros are expanding multiple times, in C context, and causing >> build errors. >> >> As near as I can tell, these macros are not used except by >> arch/arm/kernel/kprobes-test-thumb.c (and most are not used >> at all). >> >> When compiling with CONFIG_LTO=y, in Andi's 3.7.0 tree with LTO >> patches, I got the messages below: >> ----------------------------------------------- >> ... >> LD drivers/tty/built-in.o >> LD drivers/built-in.o >> LINK vmlinux >> GEN .version >> CHK include/generated/compile.h >> UPD include/generated/compile.h >> CC init/version.o >> LD init/built-in.o >> LDFINAL vmlinux.o >> [Leaving LTRANS /tmp/ccsIMbQT.args] >> [Leaving LTRANS vmlinux.o.ltrans.out] >> In file included from /a/home/tbird/work/auto-reduce/lto-work/linux-misc-andi-kleen/include/uapi/linux/swab.h:269:0, >> from :872: >> /a/home/tbird/work/auto-reduce/lto-work/linux-misc-andi-kleen/crypto/wp512.c: In function 'wp512_process_buffer': >> /a/home/tbird/work/auto-reduce/lto-work/linux-misc-andi-kleen/crypto/wp512.c:987:1: warning: the frame size of 1160 bytes is larger than 1024 bytes [-Wframe-larger-than=] >> vmlinux.o.ltrans0.s: Assembler messages: >> vmlinux.o.ltrans0.s:408: Error: Macro `it' was already defined >> vmlinux.o.ltrans0.s:410: Error: Macro `itt' was already defined >> vmlinux.o.ltrans0.s:412: Error: Macro `ite' was already defined >> vmlinux.o.ltrans0.s:414: Error: Macro `ittt' was already defined >> vmlinux.o.ltrans0.s:416: Error: Macro `itte' was already defined >> vmlinux.o.ltrans0.s:418: Error: Macro `itet' was already defined >> vmlinux.o.ltrans0.s:420: Error: Macro `itee' was already defined >> vmlinux.o.ltrans0.s:422: Error: Macro `itttt' was already defined >> vmlinux.o.ltrans0.s:424: Error: Macro `ittte' was already defined >> vmlinux.o.ltrans0.s:426: Error: Macro `ittet' was already defined >> vmlinux.o.ltrans0.s:428: Error: Macro `ittee' was already defined >> vmlinux.o.ltrans0.s:430: Error: Macro `itett' was already defined >> vmlinux.o.ltrans0.s:432: Error: Macro `itete' was already defined >> vmlinux.o.ltrans0.s:434: Error: Macro `iteet' was already defined >> vmlinux.o.ltrans0.s:436: Error: Macro `iteee' was already defined >> vmlinux.o.ltrans0.s:968: Error: Macro `it' was already defined >> vmlinux.o.ltrans0.s:970: Error: Macro `itt' was already defined >> vmlinux.o.ltrans0.s:972: Error: Macro `ite' was already defined >> vmlinux.o.ltrans0.s:974: Error: Macro `ittt' was already defined >> vmlinux.o.ltrans0.s:976: Error: Macro `itte' was already defined >> ... >> [Leaving LTRANS vmlinux.o.ltrans30.ltrans.o] >> [Leaving LTRANS vmlinux.o.ltrans31.o] >> [Leaving LTRANS vmlinux.o.ltrans31.ltrans.o] >> /a/home/tbird/work/auto-reduce/sony-yocto/lto-build2/tmp/sysroots/x86_64-linux/usr/libexec/armv5te-sony-linux-gnueabi/gcc/arm-sony-linux-gnueabi/4.7.3/arm-sony-linux-gnueabi-ld: lto-wrapper failed >> collect2: error: ld returned 1 exit status >> make[1]: *** [vmlinux] Error 1 >> make: *** [sub-make] Error 2 >> >> Error: Bad result 512, running "make -j 8 KALLSYMS_EXTRA_PASS=1 bzImage": (output follows) >> Error: >> --------------------------------------------- >> >> The messages are repeated thousands of times (I'm guessing for every object >> file after the first that included arch/arm/include/asm/unified.h) >> >> Recognizing that LTO is currently incompatible with kprobes, and (so far) >> finding that only kprobes appeared to use these macros, I did the following hack: >> >> diff --git a/arch/arm/include/asm/unified.h b/arch/arm/include/asm/unified.h >> index f5989f4..5179c13 100644 >> --- a/arch/arm/include/asm/unified.h >> +++ b/arch/arm/include/asm/unified.h >> @@ -92,6 +92,7 @@ >> .macro iteee, cond >> .endm >> #else /* !__ASSEMBLY__ */ >> +#ifndef CONFIG_LTO >> __asm__( >> " .macro it, cond\n" >> " .endm\n" >> @@ -123,6 +124,7 @@ __asm__( >> " .endm\n" >> " .macro iteee, cond\n" >> " .endm\n"); >> +#endif /* ! CONFIG_LTO */ >> #endif /* __ASSEMBLY__ */ >> >> #endif /* CONFIG_ARM_ASM_UNIFIED */ >> >> This the macros thus removed, I had no problems building the kernel >> and running it on target. >> >> While this works to remove the build error, it doesn't seem robust and I'd >> like to either 1) find a better way to make these macro definitions conditional, >> or 2) eliminate them completely. >> >> The macros themselves seem empty. Can someone tell me what they do? >> What is the status of these macros? Are they even needed? > > The names of the macros are for Thumb2 instructions which are redundant > when building for the ARM instruction set. Newer toolchains which > support the unified assembler syntax will effectively ignore them and I > guess these empty macros are there so people can write assembler which > will compile with older toolchains. > >> Could they be >> made conditional on something like NEED_IT_MACROS, and then have that set only >> in the arch/arm/kernel/kprobes-test-thumb.c, before the unified.h is included? > > That file needs the real Thumb2 instructions, not empty macros, and > indeed it doesn't use them, because it is only compiled when > CONFIG_THUMB2_KERNEL=y and that selects CONFIG_ARM_ASM_UNIFIED and those > 'it' macro's are guarded by #ifndef CONFIG_ARM_ASM_UNIFIED. > > Note, there are other files which use the 'it' instructions, e.g. > arch/arm/include/asm/futex.h. > >> I would like get this minor issue resolved in mainline, to make it easier for Andi >> to get his LTO work upstream and have it work with ARM. >> >> Any suggestions are welcome. > > If your toolchain supports the unified assembler syntax, you could try > enabling CONFIG_ARM_ASM_UNIFIED in ARM builds. > Well, I came up with the patch below, but it doesn't feel right. There must be a better way to select an arch-specific config variable. It seems goofy to add this to the general init/Kconfig LTO option. Any better suggestions for how to do this? When LTO is turned on for the ARM architecture, the macros in arch/arm/include/asm/unified.h get included multiple times in the global build, causing build errors. Avoid this by turning on CONFIG_ARM_ASM_UNIFIED. Unfortunately, this causes another set of errors from .S files about 'conditional infixes are deprecated'. This commit also avoids that warning, by turning off the warning in the flags to the toolchain (when CONFIG_ARM_ASM_UNIFIED=y). --- arch/arm/Makefile | 5 ++++- init/Kconfig | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 5f914fc..ac3f9a8 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -110,7 +110,10 @@ ifeq ($(CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11),y) CFLAGS_MODULE +=-fno-optimize-sibling-calls endif else -CFLAGS_ISA :=$(call cc-option,-marm,) +ifeq ($(CONFIG_ARM_ASM_UNIFIED),y) +AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) +endif +CFLAGS_ISA :=$(call cc-option,-marm,) $(AFLAGS_NOWARN) AFLAGS_ISA :=$(CFLAGS_ISA) endif diff --git a/init/Kconfig b/init/Kconfig index 33090d8..b586be9 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1164,6 +1164,7 @@ config LTO_DISABLE config LTO bool default y + select ARM_ASM_UNIFIED depends on LTO_MENU && !LTO_DISABLE config LTO_DEBUG