I think the subject should include be something like "add GCC5 toolchain for X64/AARCH64 with LTO support".
On 2016-07-18 05:09:15, Ard Biesheuvel wrote: > This adds support for GCC 5.x in LTO mode for IA32, X64, ARM and > AARCH64. Due to the fact that the GCC project switched to a new > numbering scheme where the first digit is now incremented for every > major release, the new toolchain is simply called 'GCC5', and is > intended to support all GCC v5.x releases. > > Note that this requires the use of an wrapper script, since the GCC > toolchain family usually invokes the linker directly, whereas LTO > requires GCC to be invoked with the linker arguments decorated with > -Wl,xxx prefixes. Does it require the wrapper script? Steven's GCC5 toolchain didn't have it. Also, I was able to convert the GCC49 toolchain to invoke gcc for the linker, rather than ld. Like Steven's GCC5, I had to add -Wl to various flags. Based on this, I was wondering if we could just convert all of the GCC toolchains to invoke gcc for linking. -Jordan > > Since IA32 and X64 enable compiler optimizations (-Os) for both DEBUG > and RELEASE builds, LTO support is equally enabled for both targets. > On ARM and AARCH64, DEBUG builds are not optimized, and so the LTO > optimizations are only enabled for RELEASE. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <[email protected]> > --- > BaseTools/Conf/tools_def.template | 156 ++++++++++++++++++++ > BaseTools/Scripts/lto-ld-wrapper.py | 39 +++++ > 2 files changed, 195 insertions(+) > > diff --git a/BaseTools/Conf/tools_def.template > b/BaseTools/Conf/tools_def.template > index f9b26fad44de..56bcf04690d4 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) -flto > +DEFINE GCC5_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -flto > +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) -flto > +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) -flto > +DEFINE GCC5_ARM_DLINK2_FLAGS = DEF(GCC49_ARM_DLINK2_FLAGS) > +DEFINE GCC5_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS) -flto > +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_*_DLINK_PATH = > $(EDK_TOOLS_PATH)/Scripts/lto-ld-wrapper.py > + > +################## > +# 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)gcc-ar > +*_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 -fno-lto > +*_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 = --cc "DEF(GCC5_IA32_PREFIX)gcc" > 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_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) > +RELEASE_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) > -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)gcc-ar > +*_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) -fno-lto > +*_GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC5_ARM_ASLDLINK_FLAGS) > +*_GCC5_ARM_ASM_FLAGS = DEF(GCC5_ARM_ASM_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) -flto > -Wno-unused-but-set-variable > + > + DEBUG_GCC5_ARM_DLINK_FLAGS = --cc "ENV(GCC5_ARM_PREFIX)gcc" > DEF(GCC5_ARM_DLINK_FLAGS) > +RELEASE_GCC5_ARM_DLINK_FLAGS = --cc "ENV(GCC5_ARM_PREFIX)gcc" > DEF(GCC5_ARM_DLINK_FLAGS) -L$(WORKSPACE)/ArmPkg/GccLto -llto-arm > -plugin-opt=-pass-through=-llto-arm > + > +################## > +# GCC5 AARCH64 definitions > +################## > +*_GCC5_AARCH64_CC_PATH = ENV(GCC5_AARCH64_PREFIX)gcc > +*_GCC5_AARCH64_SLINK_PATH = ENV(GCC5_AARCH64_PREFIX)gcc-ar > +*_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) -L$(WORKSPACE)/ArmPkg/GccLto -llto-aarch64 > -plugin-opt=-pass-through=-llto-aarch64 > + > +#################################################################################### > +# > # 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.py > b/BaseTools/Scripts/lto-ld-wrapper.py > new file mode 100755 > index 000000000000..381837fb9fa7 > --- /dev/null > +++ b/BaseTools/Scripts/lto-ld-wrapper.py > @@ -0,0 +1,39 @@ > +#!/usr/bin/env python > + > +# > +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > +# > +# This program and the accompanying materials are licensed and made > available under > +# the terms and conditions of the BSD License that accompanies this > distribution. > +# The full text of the license may be found at > +# http://opensource.org/licenses/bsd-license.php. > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +# > + > +import sys > +import subprocess > + > +bin = '' > +out = '' > +gcc_args = [] > +ld_args = [] > + > +sys.argv.pop(0) > + > +while len(sys.argv) > 0: > + opt = sys.argv.pop(0) > + > + if opt == '--cc': > + bin = sys.argv.pop(0) > + elif opt == '-o': > + out = sys.argv.pop(0) > + elif opt == '-nostdlib' or opt[:2] == '-f': > + gcc_args.append(opt) > + else: > + ld_args.append(opt) > + > +gcc_args.append('-Wl,' + ','.join(ld_args)) > + > +subprocess.call([bin, '-o', out] + gcc_args) > -- > 2.7.4 > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

