[Buildroot] [PATCH 1/1] Add support for gold linker and LTO for GCC.

Thomas Petazzoni thomas.petazzoni at free-electrons.com
Thu Jun 12 19:54:36 UTC 2014


Dear Steve Thomas,

Great, glad to see someone working on LTO support in Buildroot!

On Tue, 10 Jun 2014 22:13:24 +0000, Steve Thomas wrote:
> Link Time Optimisations (LTO) from GCC needs the linker plugin. It also
> needs support from the tools, in particular the archiver (AR) to
> properly form archives that can be used by the linker.  The linker needs
> to support the plugin also.
> 
> This patch changes the linker from BFD to GOLD and wraps the ar, nm and
> ranlib utilities with a wrapper that calls the gcc-wrapper version that
> call the actual utilities with an additional argument. This is a
> temporary measure until the GCC versions supoort this properly and saves

supoort -> support.

> having to modify a few hundres packages.

This wrapper thing is indeed a bit annoying.

> diff --git a/package/binutils/Config.in.host b/package/binutils/Config.in.host
> index 08540a3..a6e5ba6 100644
> --- a/package/binutils/Config.in.host
> +++ b/package/binutils/Config.in.host
> @@ -1,5 +1,8 @@
>  comment "Binutils Options"
>  
> +config BR2_BINUTILS_SUPPORTS_GOLD
> +	bool "binutils 2.24"

This should be a blind option, so just "bool", with no prompt.

>  choice
>  	prompt "Binutils Version"
>  	depends on !BR2_arc
> @@ -42,6 +45,7 @@ choice
>  
>  	config BR2_BINUTILS_VERSION_2_24
>  		depends on !BR2_avr32
> +		select BR2_BINUTILS_SUPPORTS_GOLD
>  		bool "binutils 2.24"
>  
>  endchoice
> diff --git a/package/binutils/binutils.mk b/package/binutils/binutils.mk
> index 9cc4d28..5e32b2d 100644
> --- a/package/binutils/binutils.mk
> +++ b/package/binutils/binutils.mk
> @@ -62,6 +62,18 @@ HOST_BINUTILS_CONF_OPT = --disable-multilib --disable-werror \
>  			--with-sysroot=$(STAGING_DIR) \
>  			$(BINUTILS_EXTRA_CONFIG_OPTIONS)
>  
> +# disable ld explicitely and use ld.gold exclusively
> +ifeq ($(BR2_TOOLCHAIN_BUILDROOT_GOLD),y)
> +HOST_BINUTILS_CONF_OPT += \
> +           --enable-plugins \
> +           --enable-gold \
> +           --disable-ld

Indentation should use one tab.

> +endif
> +
> +ifeq ($(BR2_TOOLCHAIN_BUILDROOT_LTO),y)
> +HOST_BINUTILS_CONF_OPT += --enable-lto
> +endif
> +
>  # We just want libbfd and libiberty, not the full-blown binutils in staging
>  define BINUTILS_INSTALL_STAGING_CMDS
>  	$(MAKE) -C $(@D)/bfd DESTDIR=$(STAGING_DIR) install
> diff --git a/package/gcc/4.8.3/950-lto-support.patch b/package/gcc/4.8.3/950-lto-support.patch
> new file mode 100644
> index 0000000..c45512a
> --- /dev/null
> +++ b/package/gcc/4.8.3/950-lto-support.patch

All patches should have a description + Signed-off-by line.

> diff --git a/package/gcc/4.9.0/950-lto-support.patch b/package/gcc/4.9.0/950-lto-support.patch
> new file mode 100644
> index 0000000..c45512a
> --- /dev/null
> +++ b/package/gcc/4.9.0/950-lto-support.patch

Same comment here.

> diff --git a/package/gcc/Config.in.host b/package/gcc/Config.in.host
> index b6d4b5e..ea464bf 100644
> --- a/package/gcc/Config.in.host
> +++ b/package/gcc/Config.in.host
> @@ -6,6 +6,9 @@ config BR2_GCC_NEEDS_MPC
>  config BR2_GCC_SUPPORTS_GRAPHITE
>  	bool
>  
> +config BR2_GCC_SUPPORTS_GOLD
> +	bool
> +
>  choice
>  	prompt "GCC compiler Version"
>  	default BR2_GCC_VERSION_4_4_X if BR2_sparc_sparchfleon || BR2_sparc_sparchfleonv8 || BR2_sparc_sparcsfleon || BR2_sparc_sparcsfleonv8
> @@ -64,6 +67,7 @@ choice
>  		depends on !BR2_microblaze && !BR2_arc && !BR2_avr32 && !BR2_bfin && !BR2_cortex_a12 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_powerpc64le
>  		select BR2_GCC_NEEDS_MPC
>  		select BR2_GCC_SUPPORTS_GRAPHITE
> +		select BR2_GCC_SUPPORTS_GOLD
>  		bool "gcc 4.8.x"
>  
>  	config BR2_GCC_VERSION_4_8_ARC
> @@ -75,6 +79,7 @@ choice
>  		depends on !BR2_arc && !BR2_avr32 && !BR2_bfin && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8
>  		select BR2_GCC_NEEDS_MPC
>  		select BR2_GCC_SUPPORTS_GRAPHITE
> +		select BR2_GCC_SUPPORTS_GOLD
>  		bool "gcc 4.9.x"
>  
>  	config BR2_GCC_VERSION_SNAP
> @@ -147,6 +152,13 @@ config BR2_INSTALL_OBJC
>  	  cross-compiler, and install the Objective-C runtime to the
>  	  target.
>  
> +config BR2_GCC_ENABLE_GRAPHITE
> +   bool "Enable compiler graphite optimisations"
> +   depends on BR2_GCC_SUPPORTS_GRAPHITE
> +   help
> +     Enable the compiler to support graphite optimisations
> +

I believe this hunk should not be part of the patch, as it's unrelated.

> +
>  config BR2_INSTALL_FORTRAN
>  	bool "Enable Fortran support"
>  	depends on !BR2_avr32
> @@ -186,10 +198,3 @@ config BR2_GCC_ENABLE_LIBMUDFLAP
>  	  the help of the gcc -fmudflap option for more details.
>  
>  	  If you're unsure, leave this option disabled.
> -
> -config BR2_GCC_ENABLE_GRAPHITE
> -	bool "Enable graphite support"
> -	depends on BR2_GCC_SUPPORTS_GRAPHITE
> -	help
> -	  This option enables the graphite optimizations in the
> -	  compiler.

Ditto.

> diff --git a/package/gcc/gcc-initial/gcc-initial.mk b/package/gcc/gcc-initial/gcc-initial.mk
> index bc5ad26..57df10d 100644
> --- a/package/gcc/gcc-initial/gcc-initial.mk
> +++ b/package/gcc/gcc-initial/gcc-initial.mk
> @@ -40,4 +40,22 @@ HOST_GCC_INITIAL_CONF_ENV = \
>  HOST_GCC_INITIAL_MAKE_OPT = all-gcc
>  HOST_GCC_INITIAL_INSTALL_OPT = install-gcc
>  
> +# Extremely nasty hack for setting up links for binutils programs that are
> +# executed using the wrapper.
> +ifeq ($(BR2_TOOLCHAIN_BUILDROOT_GOLD),y)
> +define HOST_GCC_INSTALL_WRAPPERS
> +        for i in ar nm ranlib ; do \
> +			_tmp=$(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-$${i}; \
> +	        if [ ! -f "$${_tmp}-bin" ] ; then \
> +				mv $${_tmp} $${_tmp}-bin; \
> +				cp -dpf $$(echo $${_tmp} | sed 's:-[^-]*$$:-gcc&:') $${_tmp}; \
> +				ln -f $${_tmp}-bin $(HOST_DIR)/usr/$(GNU_TARGET_NAME)/bin/$${i}-bin; \
> +				ln -f $${_tmp} $(HOST_DIR)/usr/$(GNU_TARGET_NAME)/bin/$${i}; \
> +			fi; \
> +        done; \
> +		ln -fs $(HOST_DIR)/usr/libexec $(HOST_DIR)/usr/$(GNU_TARGET_NAME)/libexec
> +endef
> +HOST_GCC_INITIAL_POST_INSTALL_HOOKS += HOST_GCC_INSTALL_WRAPPERS
> +endif

Indentation is a bit broken as well. Also, in the comment, instead of
saying that's it's a nasty hack, it would be a lot more useful to
explain what this is doing.

> +
>  $(eval $(host-autotools-package))
> diff --git a/package/gcc/gcc.mk b/package/gcc/gcc.mk
> index 5b60bc3..6980fa8 100644
> --- a/package/gcc/gcc.mk
> +++ b/package/gcc/gcc.mk
> @@ -213,6 +213,17 @@ ifneq ($(GCC_TARGET_MODE),)
>  HOST_GCC_COMMON_CONF_OPT += --with-mode=$(GCC_TARGET_MODE)
>  endif
>  
> +ifeq ($(BR2_TOOLCHAIN_BUILDROOT_GOLD),y)
> +HOST_GCC_COMMON_CONF_OPT += \
> +           --enable-plugins \
> +           --enable-gold \
> +           --disable-ld
> +endif

Indentation should be one tab.

> +
> +ifeq ($(BR2_TOOLCHAIN_BUILDROOT_LTO),y)
> +HOST_GCC_COMMON_CONF_OPT += --enable-lto
> +endif
> +
>  # Branding works on >= 4.3
>  ifneq ($(findstring x4.2.,x$(GCC_VERSION)),x4.2.)
>  HOST_GCC_COMMON_CONF_OPT += \
> diff --git a/toolchain/toolchain-buildroot/Config.in b/toolchain/toolchain-buildroot/Config.in
> index eef9f9c..8f38b4f 100644
> --- a/toolchain/toolchain-buildroot/Config.in
> +++ b/toolchain/toolchain-buildroot/Config.in
> @@ -100,6 +100,17 @@ config BR2_TOOLCHAIN_BUILDROOT_LIBC
>  	default "glibc"  if BR2_TOOLCHAIN_BUILDROOT_GLIBC
>  	default "musl"	 if BR2_TOOLCHAIN_BUILDROOT_MUSL
>  
> +config BR2_TOOLCHAIN_BUILDROOT_GOLD
> +	bool "gold (experimental)"
> +	depends on BR2_BINUTILS_SUPPORTS_GOLD
> +	depends on BR2_GCC_SUPPORTS_GOLD
> +	depends on BR2_arm || BR2_armeb || BR2_i386 || BR2_x86_64

Help text needed.

I'm curious, is gold actually limited to the architectures you've
listed?

> +
> +config BR2_TOOLCHAIN_BUILDROOT_LTO
> +	bool "lto (experimental)"
> +	depends on BR2_TOOLCHAIN_BUILDROOT_GOLD
> +	depends on BR2_arm || BR2_armeb || BR2_i386 || BR2_x86_64

Same (help text + limitation on architectures).

Also, I'm not sure just "gold" or "lto" are sufficient, some more
descriptive prompt text would be useful.

Thanks!

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com



More information about the buildroot mailing list