From patchwork Mon Jul 18 05:26:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 72187 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp227133qga; Sun, 17 Jul 2016 22:26:35 -0700 (PDT) X-Received: by 10.98.66.209 with SMTP id h78mr43604196pfd.11.1468819595609; Sun, 17 Jul 2016 22:26:35 -0700 (PDT) Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id p5si1478188pfp.124.2016.07.17.22.26.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 17 Jul 2016 22:26:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 601651A1DF4; Sun, 17 Jul 2016 22:27:23 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wm0-x232.google.com (mail-wm0-x232.google.com [IPv6:2a00:1450:400c:c09::232]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D09E11A1DF2 for ; Sun, 17 Jul 2016 22:27:21 -0700 (PDT) Received: by mail-wm0-x232.google.com with SMTP id o80so99281411wme.1 for ; Sun, 17 Jul 2016 22:26:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=XkvRNzc5yyWXW0aImG0NwTYmrWP9qg4+J4LJF7yRHzA=; b=k0ok85APPKJKn3Gf5cmBq/cAPc0f8jTj1KXPksF4knwHBxA/z94OQ40vNuplahhr9Q lOA/ODORVOU/7LpFdQGLyvP1WemCPNk/JuO+RDMs1dojRRG9B/EH5r1RvSdejZLONsmf gZpeEvaWhcSESiTZlsPV8J24FCPMZ56669DP0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=XkvRNzc5yyWXW0aImG0NwTYmrWP9qg4+J4LJF7yRHzA=; b=Ie8b9Y/Z4HzPCKUPjw5LDGl/sb2ztOVZu40caAcPSRthSeR64QcoQyyumODqnF6EYl 8DsIe+Vqs9NqYtQS234GzN+FMFeJYryAU7Vpcg//YszkMTYDjmvlc6hobDhlyO5NIIjG 5dl9IfSvnizM3LMezvXkEI18aqA16NHKMLRUKoMbyFjPIndRFtkY7tz7wP8v6wHGAPja cNQJ3rG+j88fbGqarrVpKIp2XXSJ/ouNsep1ab1Pf2ZVifjBAGe9p2zz1D9Kch0KRfbH OkPfQUJrF3PawUw97J4VqJrpb/MgOkz1WU22EvZcYIu5G+HMrPeQZY/OaJd9ykmhI+/p mBgg== X-Gm-Message-State: ALyK8tIi0nnXndgE4xh2rzAGqn9LcUgL0iPL5I8eLeKXPe0FWLVwJ5FTasJemavXeDVIASX7 X-Received: by 10.28.23.141 with SMTP id 135mr5905453wmx.100.1468819591012; Sun, 17 Jul 2016 22:26:31 -0700 (PDT) Received: from localhost.localdomain (ip16-2-212-87.adsl2.static.versatel.nl. [87.212.2.16]) by smtp.gmail.com with ESMTPSA id p83sm14054459wma.18.2016.07.17.22.26.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 17 Jul 2016 22:26:30 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, lersek@redhat.com, afish@apple.com, liming.gao@intel.com, steven.shi@intel.com, yonghong.zhu@intel.com, michael.d.kinney@intel.com, jordan.l.justen@intel.com Date: Mon, 18 Jul 2016 07:26:27 +0200 Message-Id: <1468819587-3029-1-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 1.9.1 Subject: [edk2] [RFC PATCH] BaseTools GCC: add support for GCC/X64 and GCC/AARCH64 in LTO mode X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" This introduces support for a new toolchain GCC5 which is identical to GCC49, except for the fact that it enables LTO for X64 and AARCH64. In order to allow the same FAMILY and BUILDRULEFAMILY to be reused, a shell script is used that translates LD arguments to GCC arguments on the fly. I.e., most -xxx arguments are translated to their -Wl,xxx pass throught equivalent, and some other arguments are interpreted by the script directly. Using the same FAMILY and BUILDRULEFAMILY is important, since many .DSC and .INF files contain [BuildOptions] sections that set DLINK flags for, e.g., all GCC/X64 targets, and so using GCC as the linker instead of LD (which LTO requires) would either require a complete new toolchain FAMILY (which would make the GCC5 unavailable without changes to many packages, including out of tree ones), or a new BUILDRULEFAMILY, which has similar problems. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel --- Again, this is not an attempt to interfere with the great work Steven is doing. I am simply concerned that adding a new FAMILY or BUILDRULEFAMILY for GCC in LTO mode further fragments the support for GCC, which is already difficult to maintain. For example, packages that set BuildOptions only for the GCC/LTO FAMILY could not be built with GCC4x without changes. The use of a shell script is a hack, and to support this approach for GCC on Windows, we should probably change it to a shell script. We may even add BaseTools support for converting a LD command line string to a GCC one directly. The point of this RFC is to illustrate is that such translation is feasible, and avoids the pitfall of having to introduce a new FAMILY or BUILDRULEFAMILY I have included LTO support for AARCH64 as well to illustrate that the same approach works there too. Note that the resulting build is BROKEN, i.e., LTO for AARCH64 does not actually work at the moment, but this is under investigation. BaseTools/Conf/tools_def.template | 156 ++++++++++++++++++++ BaseTools/Scripts/lto-ld-wrapper.sh | 26 ++++ 2 files changed, 182 insertions(+) -- 1.9.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index f9b26fad44de..647450c1c232 100644 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -197,6 +197,9 @@ DEFINE GCC48_X64_PREFIX = ENV(GCC48_BIN) DEFINE GCC49_IA32_PREFIX = ENV(GCC49_BIN) DEFINE GCC49_X64_PREFIX = ENV(GCC49_BIN) +DEFINE GCC5_IA32_PREFIX = ENV(GCC5_BIN) +DEFINE GCC5_X64_PREFIX = ENV(GCC5_BIN) + DEFINE UNIX_IASL_BIN = ENV(IASL_PREFIX)iasl DEFINE WIN_ASL_BIN_DIR = C:\ASL DEFINE WIN_IASL_BIN = DEF(WIN_ASL_BIN_DIR)\iasl.exe @@ -4450,6 +4453,27 @@ DEFINE GCC49_AARCH64_DLINK2_FLAGS = DEF(GCC48_AARCH64_DLINK2_FLAGS) DEFINE GCC49_ARM_ASLDLINK_FLAGS = DEF(GCC48_ARM_ASLDLINK_FLAGS) DEFINE GCC49_AARCH64_ASLDLINK_FLAGS = DEF(GCC48_AARCH64_ASLDLINK_FLAGS) +DEFINE GCC5_IA32_CC_FLAGS = DEF(GCC49_IA32_CC_FLAGS) +DEFINE GCC5_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) +DEFINE GCC5_IA32_X64_DLINK_COMMON = DEF(GCC49_IA32_X64_DLINK_COMMON) +DEFINE GCC5_IA32_X64_ASLDLINK_FLAGS = DEF(GCC49_IA32_X64_ASLDLINK_FLAGS) +DEFINE GCC5_IA32_X64_DLINK_FLAGS = DEF(GCC49_IA32_X64_DLINK_FLAGS) +DEFINE GCC5_IA32_DLINK2_FLAGS = DEF(GCC49_IA32_DLINK2_FLAGS) +DEFINE GCC5_X64_DLINK_FLAGS = DEF(GCC49_X64_DLINK_FLAGS) +DEFINE GCC5_X64_DLINK2_FLAGS = DEF(GCC49_X64_DLINK2_FLAGS) +DEFINE GCC5_ASM_FLAGS = DEF(GCC49_ASM_FLAGS) +DEFINE GCC5_ARM_ASM_FLAGS = DEF(GCC49_ARM_ASM_FLAGS) +DEFINE GCC5_AARCH64_ASM_FLAGS = DEF(GCC49_AARCH64_ASM_FLAGS) +DEFINE GCC5_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) +DEFINE GCC5_AARCH64_CC_FLAGS = DEF(GCC49_AARCH64_CC_FLAGS) +DEFINE GCC5_AARCH64_CC_XIPFLAGS = DEF(GCC49_AARCH64_CC_XIPFLAGS) +DEFINE GCC5_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS) +DEFINE GCC5_ARM_DLINK2_FLAGS = DEF(GCC49_ARM_DLINK2_FLAGS) +DEFINE GCC5_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS) +DEFINE GCC5_AARCH64_DLINK2_FLAGS = DEF(GCC49_AARCH64_DLINK2_FLAGS) +DEFINE GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) +DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS) + #################################################################################### # # Unix GCC And Intel Linux ACPI Compiler @@ -5183,6 +5207,138 @@ RELEASE_GCC49_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS) #################################################################################### # +# GCC 5 - This configuration is used to compile under Linux to produce +# PE/COFF binaries using GCC 5 +# +#################################################################################### +*_GCC5_*_*_FAMILY = GCC + +*_GCC5_*_MAKE_PATH = DEF(GCC5_IA32_PREFIX)make +*_GCC5_*_*_DLL = ENV(GCC5_DLL) +*_GCC5_*_ASL_PATH = DEF(UNIX_IASL_BIN) + +*_GCC5_*_PP_FLAGS = DEF(GCC_PP_FLAGS) +*_GCC5_*_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) +*_GCC5_*_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) +*_GCC5_*_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) +*_GCC5_*_APP_FLAGS = +*_GCC5_*_ASL_FLAGS = DEF(IASL_FLAGS) +*_GCC5_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) + +################## +# GCC5 IA32 definitions +################## +*_GCC5_IA32_OBJCOPY_PATH = DEF(GCC5_IA32_PREFIX)objcopy +*_GCC5_IA32_CC_PATH = DEF(GCC5_IA32_PREFIX)gcc +*_GCC5_IA32_SLINK_PATH = DEF(GCC5_IA32_PREFIX)ar +*_GCC5_IA32_DLINK_PATH = DEF(GCC5_IA32_PREFIX)ld +*_GCC5_IA32_ASLDLINK_PATH = DEF(GCC5_IA32_PREFIX)ld +*_GCC5_IA32_ASM_PATH = DEF(GCC5_IA32_PREFIX)gcc +*_GCC5_IA32_PP_PATH = DEF(GCC5_IA32_PREFIX)gcc +*_GCC5_IA32_VFRPP_PATH = DEF(GCC5_IA32_PREFIX)gcc +*_GCC5_IA32_ASLCC_PATH = DEF(GCC5_IA32_PREFIX)gcc +*_GCC5_IA32_ASLPP_PATH = DEF(GCC5_IA32_PREFIX)gcc +*_GCC5_IA32_RC_PATH = DEF(GCC5_IA32_PREFIX)objcopy + +*_GCC5_IA32_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m32 +*_GCC5_IA32_ASLDLINK_FLAGS = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -m elf_i386 +*_GCC5_IA32_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m32 -march=i386 +*_GCC5_IA32_DLINK_FLAGS = DEF(GCC5_IA32_X64_DLINK_FLAGS) -m elf_i386 --oformat=elf32-i386 +*_GCC5_IA32_DLINK2_FLAGS = DEF(GCC5_IA32_DLINK2_FLAGS) +*_GCC5_IA32_RC_FLAGS = DEF(GCC_IA32_RC_FLAGS) +*_GCC5_IA32_OBJCOPY_FLAGS = +*_GCC5_IA32_NASM_FLAGS = -f elf32 + + DEBUG_GCC5_IA32_CC_FLAGS = DEF(GCC5_IA32_CC_FLAGS) -Os +RELEASE_GCC5_IA32_CC_FLAGS = DEF(GCC5_IA32_CC_FLAGS) -Os -Wno-unused-but-set-variable + +################## +# GCC5 X64 definitions +################## +*_GCC5_X64_OBJCOPY_PATH = DEF(GCC5_X64_PREFIX)objcopy +*_GCC5_X64_CC_PATH = DEF(GCC5_X64_PREFIX)gcc +*_GCC5_X64_SLINK_PATH = DEF(GCC5_X64_PREFIX)gcc-ar +*_GCC5_X64_DLINK_PATH = $(EDK_TOOLS_PATH)/Scripts/lto-ld-wrapper.sh +*_GCC5_X64_ASLDLINK_PATH = DEF(GCC5_X64_PREFIX)ld +*_GCC5_X64_ASM_PATH = DEF(GCC5_X64_PREFIX)gcc +*_GCC5_X64_PP_PATH = DEF(GCC5_X64_PREFIX)gcc +*_GCC5_X64_VFRPP_PATH = DEF(GCC5_X64_PREFIX)gcc +*_GCC5_X64_ASLCC_PATH = DEF(GCC5_X64_PREFIX)gcc +*_GCC5_X64_ASLPP_PATH = DEF(GCC5_X64_PREFIX)gcc +*_GCC5_X64_RC_PATH = DEF(GCC5_X64_PREFIX)objcopy + +*_GCC5_X64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m64 -fno-lto +*_GCC5_X64_ASLDLINK_FLAGS = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -m elf_x86_64 +*_GCC5_X64_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m64 +*_GCC5_X64_DLINK_FLAGS = --cc "DEF(GCC5_X64_PREFIX)gcc" DEF(GCC5_X64_DLINK_FLAGS) +*_GCC5_X64_DLINK2_FLAGS = DEF(GCC5_X64_DLINK2_FLAGS) +*_GCC5_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS) +*_GCC5_X64_OBJCOPY_FLAGS = +*_GCC5_X64_NASM_FLAGS = -f elf64 + + DEBUG_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -flto +RELEASE_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -flto -Wno-unused-but-set-variable + +################## +# GCC5 ARM definitions +################## +*_GCC5_ARM_CC_PATH = ENV(GCC5_ARM_PREFIX)gcc +*_GCC5_ARM_SLINK_PATH = ENV(GCC5_ARM_PREFIX)ar +*_GCC5_ARM_DLINK_PATH = ENV(GCC5_ARM_PREFIX)ld +*_GCC5_ARM_ASLDLINK_PATH = ENV(GCC5_ARM_PREFIX)ld +*_GCC5_ARM_ASM_PATH = ENV(GCC5_ARM_PREFIX)gcc +*_GCC5_ARM_PP_PATH = ENV(GCC5_ARM_PREFIX)gcc +*_GCC5_ARM_VFRPP_PATH = ENV(GCC5_ARM_PREFIX)gcc +*_GCC5_ARM_ASLCC_PATH = ENV(GCC5_ARM_PREFIX)gcc +*_GCC5_ARM_ASLPP_PATH = ENV(GCC5_ARM_PREFIX)gcc +*_GCC5_ARM_RC_PATH = ENV(GCC5_ARM_PREFIX)objcopy + +*_GCC5_ARM_ARCHCC_FLAGS = -mthumb +*_GCC5_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) +*_GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC5_ARM_ASLDLINK_FLAGS) +*_GCC5_ARM_ASM_FLAGS = DEF(GCC5_ARM_ASM_FLAGS) +*_GCC5_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) +*_GCC5_ARM_DLINK2_FLAGS = DEF(GCC5_ARM_DLINK2_FLAGS) +*_GCC5_ARM_PLATFORM_FLAGS = -march=armv7-a +*_GCC5_ARM_PP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS) +*_GCC5_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) +*_GCC5_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_VFRPP_FLAGS) + + DEBUG_GCC5_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -O0 +RELEASE_GCC5_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -Wno-unused-but-set-variable + +################## +# GCC5 AARCH64 definitions +################## +*_GCC5_AARCH64_CC_PATH = ENV(GCC5_AARCH64_PREFIX)gcc +*_GCC5_AARCH64_SLINK_PATH = ENV(GCC5_AARCH64_PREFIX)gcc-ar +*_GCC5_AARCH64_DLINK_PATH = $(EDK_TOOLS_PATH)/Scripts/lto-ld-wrapper.sh +*_GCC5_AARCH64_ASLDLINK_PATH = ENV(GCC5_AARCH64_PREFIX)ld +*_GCC5_AARCH64_ASM_PATH = ENV(GCC5_AARCH64_PREFIX)gcc +*_GCC5_AARCH64_PP_PATH = ENV(GCC5_AARCH64_PREFIX)gcc +*_GCC5_AARCH64_VFRPP_PATH = ENV(GCC5_AARCH64_PREFIX)gcc +*_GCC5_AARCH64_ASLCC_PATH = ENV(GCC5_AARCH64_PREFIX)gcc +*_GCC5_AARCH64_ASLPP_PATH = ENV(GCC5_AARCH64_PREFIX)gcc +*_GCC5_AARCH64_RC_PATH = ENV(GCC5_AARCH64_PREFIX)objcopy + +*_GCC5_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -fno-lto +*_GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC5_AARCH64_ASLDLINK_FLAGS) +*_GCC5_AARCH64_ASM_FLAGS = DEF(GCC5_AARCH64_ASM_FLAGS) +*_GCC5_AARCH64_DLINK2_FLAGS = DEF(GCC5_AARCH64_DLINK2_FLAGS) +*_GCC5_AARCH64_PLATFORM_FLAGS = +*_GCC5_AARCH64_PP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS) +*_GCC5_AARCH64_RC_FLAGS = DEF(GCC_AARCH64_RC_FLAGS) +*_GCC5_AARCH64_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_VFRPP_FLAGS) +*_GCC5_AARCH64_CC_XIPFLAGS = DEF(GCC5_AARCH64_CC_XIPFLAGS) + + DEBUG_GCC5_AARCH64_CC_FLAGS = DEF(GCC5_AARCH64_CC_FLAGS) -O0 -mcmodel=small + DEBUG_GCC5_AARCH64_DLINK_FLAGS = --cc "ENV(GCC5_AARCH64_PREFIX)gcc" DEF(GCC5_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 + +RELEASE_GCC5_AARCH64_CC_FLAGS = DEF(GCC5_AARCH64_CC_FLAGS) -flto -Wno-unused-but-set-variable -mcmodel=tiny +RELEASE_GCC5_AARCH64_DLINK_FLAGS = --cc "ENV(GCC5_AARCH64_PREFIX)gcc" DEF(GCC5_AARCH64_DLINK_FLAGS) + +#################################################################################### +# # CLANG35 - This configuration is used to compile under Linux to produce # PE/COFF binaries using the clang compiler and assembler (v3.5 and up) # and GNU linker diff --git a/BaseTools/Scripts/lto-ld-wrapper.sh b/BaseTools/Scripts/lto-ld-wrapper.sh new file mode 100755 index 000000000000..325a8390f668 --- /dev/null +++ b/BaseTools/Scripts/lto-ld-wrapper.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +while [ $# -gt 0 ] +do + OPT="$1" + shift + + case "$OPT" in + --cc) + BIN="$1" + shift + ;; + -o) + OUT="$1" + shift + ;; + -nostdlib) + GCC_ARGS="$GCC_ARGS $OPT" + ;; + *) + LD_ARGS="$LD_ARGS,$OPT" + ;; + esac +done + +exec "$BIN" -o "$OUT" $GCC_ARGS -Wl,$LD_ARGS