toolchain: add link-time-optimization support
PATCH v2 1/1 toolchain: add link-time-optimization support
Add a new option BR2_GCC_ENABLE_LTO that builds gcc and binutils with LTO support.
Individual packages still have to enable LTO explicitly by passing '-flto' to GCC, which passes it on to the linker. This option does not add that flag globally. Some packages detect if the compiler supports LTO and enable the flag if it does.
To support LTO, ar and ranlib must be called with an argument which triggers the usage of the LTO plugin. Since GCC doesn't call these tools itself, it instead provides wrappers for ar and ranlib that pass the LTO arguments. This way existing Makefiles don't need to be changed for LTO support. However, these wrappers are called <tuple>-gcc-ar which matches the pattern to link to the buildroot wrapper in the external toolchain logic. So the external toolchain logic is updated to provide the correct symlink.
---
Changes vor v2:
- update commit message
- UI text change for BR2_GCC_ENABLE_LTO
package/binutils/binutils.mk | 4 ++++ package/gcc/Config.in.host | 7 +++++++ package/gcc/gcc.mk | 4 ++++ toolchain/toolchain-external/toolchain-external.mk | 8 ++++++++ 4 files changed, 23 insertions(+)
package/binutils/binutils.mk +4 -0
@@ -96,5 +96,9 @@ BINUTILS_PRE_PATCH_HOOKS += BINUTILS_XTENSA_PRE_PATCH HOST_BINUTILS_PRE_PATCH_HOOKS += BINUTILS_XTENSA_PRE_PATCH endif +ifeq ($(BR2_GCC_ENABLE_LTO),y) +HOST_BINUTILS_CONF_OPTS += --enable-plugins --enable-lto +endif + $(eval $(autotools-package)) $(eval $(host-autotools-package))
package/gcc/Config.in.host +7 -0
@@ -116,6 +116,13 @@ config BR2_GCC_ENABLE_TLS Enable the compiler to generate code for accessing thread local storage variables +config BR2_GCC_ENABLE_LTO + bool "Enable compiler link-time-optimization support" + depends on !BR2_GCC_VERSION_4_2_2_AVR32_2_1_5 + help + Since version 4.5, GCC supports link-time optimization (LTO). + Select this option to turn on LTO support in GCC. + config BR2_GCC_ENABLE_OPENMP bool "Enable compiler OpenMP support" depends on !BR2_PTHREADS_NONE && !BR2_arc && !BR2_microblaze
package/gcc/gcc.mk +4 -0
@@ -132,6 +132,10 @@ else HOST_GCC_COMMON_CONF_OPTS += --disable-tls endif +ifeq ($(BR2_GCC_ENABLE_LTO),y) +HOST_GCC_COMMON_CONF_OPTS += --enable-plugins --enable-lto +endif + ifeq ($(BR2_GCC_ENABLE_LIBMUDFLAP),y) HOST_GCC_COMMON_CONF_OPTS += --enable-libmudflap else
toolchain/toolchain-external/toolchain-external.mk +8 -0
@@ -647,12 +647,20 @@ endif # Build toolchain wrapper for preprocessor, C and C++ compiler and setup # symlinks for everything else. Skip gdb symlink when we are building our # own gdb to prevent two gdb's in output/host/usr/bin. +# When the link-time-optimazation flag '-flto' is used, then the compiler +# and binutils have to support lto. ar/ranlib needs to be called with the +# lto plugin. The wrappers *-gcc-ar and *-gcc-ranlib provided by GCC could +# be used as drop-ins for ar/runlib when Makefiles are used which do not +# pass the lto arguments. define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER $(Q)$(call MESSAGE,"Building ext-toolchain wrapper") mkdir -p $(HOST_DIR)/usr/bin; cd $(HOST_DIR)/usr/bin; \ for i in $(TOOLCHAIN_EXTERNAL_CROSS)*; do \ base=$${i##*/}; \ case "$$base" in \ + *-ar|*-ranlib|*-nm) \ + ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \ + ;; \ *cc|*cc-*|*++|*++-*|*cpp) \ ln -sf ext-toolchain-wrapper $$base; \ ;; \
Signature · 1 line
2.3.0
Thomas Petazzoni
AppliedPATCH v2 1/1 toolchain: add link-time-optimization support
Dear Peter K?mmel,
Quoted 15 lines · Peter K?mmel
Add a new option
BR2_GCC_ENABLE_LTOthat builds gcc and binutils with LTO support.Individual packages still have to enable LTO explicitly by passing '-flto' to GCC, which passes it on to the linker. This option does not add that flag globally. Some packages detect if the compiler supports LTO and enable the flag if it does.
To support LTO, ar and ranlib must be called with an argument which triggers the usage of the LTO plugin. Since GCC doesn't call these tools itself, it instead provides wrappers for ar and ranlib that pass the LTO arguments. This way existing Makefiles don't need to be changed for LTO support. However, these wrappers are called <tuple>-gcc-ar which matches the pattern to link to the buildroot wrapper in the external toolchain logic. So the external toolchain logic is updated to provide the correct symlink.
Quoted 1 line
Signed-off-by Peter K?mmel <[email protected]>
Thanks, applied, after doing a few changes:
[Thomas:
- Add a separate BR2_BINUTILS_ENABLE_LTO option to enable LTO support in binutils. This is a blind option, selected by BR2_GCC_ENABLE_LTO. It just avoids having binutils.mk poke directly into gcc Config.in options.
- Remove the check on the AVR32 special gcc version, which we don't support anymore.
- Adapt the help text of the LTO Config.in option to no longer mention "Since version 4.5", since we only support gcc >= 4.5 in Buildroot anyway.
- Fix typo in toolchain-external.mk comment.]
I did a test build, and I could see the difference in the generated code between a -flto build a non -flto build of a stupid test application.
Thanks,
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com