diff mbox

lto-plugin: mismatch between ld's architecture and GCC's configure --host

Message ID 87a9icno3o.fsf@kepler.schwinge.homeip.net
State New
Headers show

Commit Message

Thomas Schwinge Oct. 14, 2013, 10:28 a.m. UTC
Hi!

On Sat, 12 Oct 2013 12:20:19 +0200, I wrote:
> This is a bit of a weird scenario -- but it is supposed to work fine in
> my opinion (but doesn't).
> 
> I have a GNU toolchain as 32-bit x86 GNU/Linux executables, configured to
> to generate code for 32-bit x86 by default, and using -m64 for x86_64.
> 
> This toolchain I'm using on a x86_64 system (which can execute 32-bit
> executables) to build a *native* GCC, that is I'm using the 32-bit
> toolchain to build a x86_64 GCC (configuring with CC='gcc -m64' CXX='g++
> -m64').  I intend to continue using the 32-bit toolchain's linker, which
> also is a 32-bit executable (GNU ld).  That one also defaults to x86
> code, but can handle the x86_64 case fine if passed -m elf_x86_64, which
> GCC does.
> 
> That the linker is a 32-bit executable is an implementation detail that
> is not important generally: it's a separate process living in its own
> address space.  However it becomes relevant in the case of linker
> plugins: the native x86_64 GCC that I'm building also builds a x86_64
> lto-plugin, which the 32-bit ld cannot load:
> 
>     $ gcc/xgcc -B[...] [...]/gcc.c-torture/execute/ieee/20000320-1.c [...] -flto [...]
>     [...]/ld: [...]/gcc/liblto_plugin.so: error loading plugin: [...]/gcc/liblto_plugin.so: wrong ELF class: ELFCLASS64
>     collect2: error: ld returned 1 exit status
> 
> So, aside from building a 64-bit ld (which is the "lame" alternative), I
> now need to teach GCC's build system that the lto-plugin may need special
> configuration: CC='gcc -m32' -- and possibly its own build of libiberty,
> too, which it may depend on (but doesn't in my case, so I might cut this
> short, and just error out).

The latter was a Saturday morning thinko: only because linking a shared
library succeeds, that doesn't mean all the symbols it depends on are
present.  ;-) So I do need a special libiberty build (or get rid of the
libiberty dependency in lto-plugin, of course, which I have not
assessed).

> Instead of auto-detecting the linker's
> architecture (and then, what to do with that information?), I intend to
> make this a manual process (so, some new top-level configure
> argument(s)).  Adding yet another set of {...,CC,...}_FOR_[something] is
> probably overkill -- I'll try to find something simpler.
> 
> Any comments on this scenario?

Here are the patches.  Unless the new option is exercised, there are no
effects on a native x86_64 GNU/Linux bootstrap build (the build trees'
*.o files are identical, as are the test results).  OK to commit?

Allow overriding the libiberty used for building the LTO plugin.

	lto-plugin/
	* configure.ac (--with-libiberty): New configure option.
	* configure: Regenerate.
	* Makefile.am (libiberty, libiberty_pic): New variables.
	(liblto_plugin_la_LIBADD, liblto_plugin_la_LDFLAGS)
	(liblto_plugin_la_DEPENDENCIES): Use them.
	* Makefile.in: Regenerate.
---
 lto-plugin/Makefile.am  | 20 +++++++++++---------
 lto-plugin/Makefile.in  | 22 ++++++++++++----------
 lto-plugin/configure    | 17 +++++++++++++++--
 lto-plugin/configure.ac |  5 +++++
 4 files changed, 43 insertions(+), 21 deletions(-)



Grüße,
 Thomas

Comments

Thomas Schwinge Oct. 25, 2013, 7:23 a.m. UTC | #1
Hi!

Ping.  To sum it up, with these patches applied, there are no changes for
a "regular" build (not using the new configure options).  On the other
hand, configuring GCC as described, it is possible use the 32-bit x86
linker for/with a x86_64 build, and get the very same GCC test results as
when using a x86_64 linker.


On Mon, 14 Oct 2013 12:28:11 +0200, I wrote:
> On Sat, 12 Oct 2013 12:20:19 +0200, I wrote:
> > This is a bit of a weird scenario -- but it is supposed to work fine in
> > my opinion (but doesn't).
> > 
> > I have a GNU toolchain as 32-bit x86 GNU/Linux executables, configured to
> > to generate code for 32-bit x86 by default, and using -m64 for x86_64.
> > 
> > This toolchain I'm using on a x86_64 system (which can execute 32-bit
> > executables) to build a *native* GCC, that is I'm using the 32-bit
> > toolchain to build a x86_64 GCC (configuring with CC='gcc -m64' CXX='g++
> > -m64').  I intend to continue using the 32-bit toolchain's linker, which
> > also is a 32-bit executable (GNU ld).  That one also defaults to x86
> > code, but can handle the x86_64 case fine if passed -m elf_x86_64, which
> > GCC does.
> > 
> > That the linker is a 32-bit executable is an implementation detail that
> > is not important generally: it's a separate process living in its own
> > address space.  However it becomes relevant in the case of linker
> > plugins: the native x86_64 GCC that I'm building also builds a x86_64
> > lto-plugin, which the 32-bit ld cannot load:
> > 
> >     $ gcc/xgcc -B[...] [...]/gcc.c-torture/execute/ieee/20000320-1.c [...] -flto [...]
> >     [...]/ld: [...]/gcc/liblto_plugin.so: error loading plugin: [...]/gcc/liblto_plugin.so: wrong ELF class: ELFCLASS64
> >     collect2: error: ld returned 1 exit status
> > 
> > So, aside from building a 64-bit ld (which is the "lame" alternative), I
> > now need to teach GCC's build system that the lto-plugin may need special
> > configuration: CC='gcc -m32' -- and [...] its own build of libiberty,
> > too [...]
> 
> > Instead of auto-detecting the linker's
> > architecture (and then, what to do with that information?), I intend to
> > make this a manual process (so, some new top-level configure
> > argument(s)).  Adding yet another set of {...,CC,...}_FOR_[something] is
> > probably overkill -- I'll try to find something simpler.
> > 
> > Any comments on this scenario?
> 
> Here are the patches.  Unless the new option is exercised, there are no
> effects on a native x86_64 GNU/Linux bootstrap build (the build trees'
> *.o files are identical, as are the test results).  OK to commit?

> Allow overriding the libiberty used for building the LTO plugin.
> 
> 	lto-plugin/
> 	* configure.ac (--with-libiberty): New configure option.
> 	* configure: Regenerate.
> 	* Makefile.am (libiberty, libiberty_pic): New variables.
> 	(liblto_plugin_la_LIBADD, liblto_plugin_la_LDFLAGS)
> 	(liblto_plugin_la_DEPENDENCIES): Use them.
> 	* Makefile.in: Regenerate.
> ---
>  lto-plugin/Makefile.am  | 20 +++++++++++---------
>  lto-plugin/Makefile.in  | 22 ++++++++++++----------
>  lto-plugin/configure    | 17 +++++++++++++++--
>  lto-plugin/configure.ac |  5 +++++
>  4 files changed, 43 insertions(+), 21 deletions(-)
> 
> diff --git lto-plugin/Makefile.am lto-plugin/Makefile.am
> index b24015e..8b7bb54 100644
> --- lto-plugin/Makefile.am
> +++ lto-plugin/Makefile.am
> @@ -15,17 +15,19 @@ libexecsub_LTLIBRARIES = liblto_plugin.la
>  gcc_build_dir = ../$(host_subdir)/gcc
>  in_gcc_libs = $(foreach lib, $(libexecsub_LTLIBRARIES), $(gcc_build_dir)/$(lib))
>  
> -# Can be removed when libiberty becomes a normal convenience library
> -Wc=-Wc,
> -
>  liblto_plugin_la_SOURCES = lto-plugin.c
> +# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS.
> +liblto_plugin_la_LDFLAGS = $(lt_host_flags) -module -bindir $(libexecsubdir)
> +# Can be simplified when libiberty becomes a normal convenience library.
> +libiberty=$(with_libiberty)/libiberty.a
> +libiberty_pic=$(with_libiberty)/pic/libiberty.a
> +Wc=-Wc,
>  liblto_plugin_la_LIBADD = \
> -	$(if $(wildcard ../libiberty/pic/libiberty.a),$(Wc)../libiberty/pic/libiberty.a,)
> -# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS
> -liblto_plugin_la_LDFLAGS = $(lt_host_flags) -module -bindir $(libexecsubdir) \
> -	$(if $(wildcard ../libiberty/pic/libiberty.a),,-Wc,../libiberty/libiberty.a)
> -liblto_plugin_la_DEPENDENCIES = $(if $(wildcard \
> -	../libiberty/pic/libiberty.a),../libiberty/pic/libiberty.a,)
> +	$(if $(wildcard $(libiberty_pic)),$(Wc)$(libiberty_pic),)
> +liblto_plugin_la_LDFLAGS += \
> +	$(if $(wildcard $(libiberty_pic)),,-Wc,$(libiberty))
> +liblto_plugin_la_DEPENDENCIES = \
> +	$(if $(wildcard $(libiberty_pic)),$(libiberty_pic),)
>  
>  all-local: $(in_gcc_libs)
>  
> diff --git lto-plugin/configure.ac lto-plugin/configure.ac
> index 9a418d2..b73fabb 100644
> --- lto-plugin/configure.ac
> +++ lto-plugin/configure.ac
> @@ -4,6 +4,11 @@ AC_CANONICAL_SYSTEM
>  GCC_TOPLEV_SUBDIRS
>  AM_INIT_AUTOMAKE([foreign no-dist])
>  AM_MAINTAINER_MODE
> +AC_ARG_WITH(libiberty,
> +  [AS_HELP_STRING([--with-libiberty=PATH],
> +    [specify the directory where to find libiberty [../libiberty]])],
> +  [], with_libiberty=../libiberty)
> +AC_SUBST(with_libiberty)
>  AC_PROG_CC
>  AC_SYS_LARGEFILE
>  ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_lto_plugin_warn_cflags])

> Allow for overriding a module's srcdir.
> 
> 	* Makefile.tpl (configure-[+prefix+][+module+])
> 	(configure-stage[+id+]-[+prefix+][+module+]): Allow for
> 	overriding a module's srcdir.
> 	* Makefile.in: Regenerate.
> 
> ---
>  Makefile.in  | 2141 ++++++++++++++++++++++++++++++----------------------------
>  Makefile.tpl |   21 +-
>  2 files changed, 1132 insertions(+), 1030 deletions(-)
> 
> diff --git Makefile.tpl Makefile.tpl
> index 2695a2b..36d480e 100644
> --- Makefile.tpl
> +++ Makefile.tpl
> @@ -1000,12 +1000,14 @@ configure-[+prefix+][+module+]: [+ IF bootstrap +][+ ELSE +]
>  	  *) topdir=`echo [+subdir+]/[+module+]/ | \
>  		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
>  	esac; \
> -	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
> -	libsrcdir="$$s/[+module+]"; \
> +	module_srcdir=[+ IF module_srcdir +][+module_srcdir+][+
> +	ELSE module_srcdir +][+module+][+ ENDIF module_srcdir +]; \
>  	[+ IF no-config-site +]rm -f no-such-file || : ; \
> -	CONFIG_SITE=no-such-file [+ ENDIF +]$(SHELL) $${libsrcdir}/configure \
> +	CONFIG_SITE=no-such-file [+ ENDIF +]$(SHELL) \
> +	  $$s/$$module_srcdir/configure \
> +	  --srcdir=$${topdir}/$$module_srcdir \
>  	  [+args+] --build=${build_alias} --host=[+host_alias+] \
> -	  --target=[+target_alias+] $${srcdiroption} [+extra_configure_flags+] \
> +	  --target=[+target_alias+] [+extra_configure_flags+] \
>  	  || exit 1
>  @endif [+prefix+][+module+]
>  
> @@ -1053,12 +1055,13 @@ configure-stage[+id+]-[+prefix+][+module+]:
>  	  *) topdir=`echo [+subdir+]/[+module+]/ | \
>  		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
>  	esac; \
> -	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
> -	libsrcdir="$$s/[+module+]"; \
> -	$(SHELL) $${libsrcdir}/configure \
> +	module_srcdir=[+ IF module_srcdir +][+module_srcdir+][+
> +	ELSE module_srcdir +][+module+][+ ENDIF module_srcdir +]; \
> +	$(SHELL) $$s/$$module_srcdir/configure \
> +	  --srcdir=$${topdir}/$$module_srcdir \
>  	  [+args+] --build=${build_alias} --host=[+host_alias+] \
> -	  --target=[+target_alias+] $${srcdiroption} [+ IF prev +]\
> -	  --with-build-libsubdir=$(HOST_SUBDIR) [+ ENDIF prev +]\
> +	  --target=[+target_alias+] \
> +	  [+ IF prev +] --with-build-libsubdir=$(HOST_SUBDIR) [+ ENDIF prev +] \
>  	  $(STAGE[+id+]_CONFIGURE_FLAGS)[+ IF extra_configure_flags +] \
>  	  [+extra_configure_flags+][+ ENDIF extra_configure_flags +]
>  @endif [+prefix+][+module+]-bootstrap

> Non-host system configuration for linker plugins.
> 
> 	* configure.ac (--enable-linker-plugin-flags)
> 	(--enable-linker-plugin-configure-flags): New flags.
> 	(configdirs): Conditionally add libiberty-linker-plugin.
> 	* configure: Regenerate.
> 	* Makefile.def (host_modules): Add libiberty-linker-plugin.
> 	(host_modules) <lto-plugin>: Pay attention to
> 	@extra_linker_plugin_flags@ and
> 	@extra_linker_plugin_configure_flags@.
> 	(all-lto-plugin): Also depend on all-libiberty-linker-plugin.
> 	* Makefile.in: Regenerate.
> 	gcc/
> 	* doc/install.texi (--enable-linker-plugin-flags)
> 	(--enable-linker-plugin-configure-flags): Document new flags.
> ---
>  Makefile.def         |   14 +-
>  Makefile.in          | 1051 ++++++++++++++++++++++++++++++++++++++++++++++++--
>  configure            |   42 ++
>  configure.ac         |   28 ++
>  gcc/doc/install.texi |   19 +
>  5 files changed, 1117 insertions(+), 37 deletions(-)
> 
> diff --git Makefile.def Makefile.def
> index 3ba1a5b..ea48792 100644
> --- Makefile.def
> +++ Makefile.def
> @@ -85,6 +85,14 @@ host_modules= { module= libdecnumber; bootstrap=true; };
>  host_modules= { module= libgui; };
>  host_modules= { module= libiberty; bootstrap=true;
>  	        extra_configure_flags='@extra_host_libiberty_configure_flags@';};
> +// Linker plugins may need their own build of libiberty; see
> +// gcc/doc/install.texi.  We take care that this build of libiberty doesn't get
> +// installed.  It's a helper library for linker plugins, so we pay attention to
> +// @extra_linker_plugin_flags@ and @extra_linker_plugin_configure_flags@.
> +host_modules= { module= libiberty-linker-plugin; bootstrap=true;
> +		module_srcdir=libiberty;
> +	        extra_configure_flags='@extra_host_libiberty_configure_flags@ --disable-install-libiberty @extra_linker_plugin_flags@ @extra_linker_plugin_configure_flags@';
> +		extra_make_flags='@extra_linker_plugin_flags@'; };
>  // We abuse missing to avoid installing anything for libiconv.
>  host_modules= { module= libiconv;
>  		extra_configure_flags='--disable-shared';
> @@ -111,7 +119,8 @@ host_modules= { module= libtermcap; no_check=true;
>  host_modules= { module= utils; no_check=true; };
>  host_modules= { module= gnattools; };
>  host_modules= { module= lto-plugin; bootstrap=true;
> -		extra_configure_flags=--enable-shared; };
> +		extra_configure_flags='--enable-shared @extra_linker_plugin_flags@ @extra_linker_plugin_configure_flags@';
> +		extra_make_flags='@extra_linker_plugin_flags@'; };
>  
>  target_modules = { module= libstdc++-v3;
>  		   bootstrap=true;
> @@ -336,7 +345,10 @@ dependencies = { module=all-fixincludes; on=all-libiberty; };
>  
>  dependencies = { module=all-gnattools; on=all-target-libada; };
>  
> +// Depending on the specific configuration, the LTO plugin will either use the
> +// generic libiberty build or the specific build for linker plugins.
>  dependencies = { module=all-lto-plugin; on=all-libiberty; };
> +dependencies = { module=all-lto-plugin; on=all-libiberty-linker-plugin; };
>  
>  dependencies = { module=all-utils; on=all-libiberty; };
>  
> diff --git configure.ac configure.ac
> index b5caebb..128c60b 100644
> --- configure.ac
> +++ configure.ac
> @@ -1731,6 +1731,19 @@ ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always.
>    esac
>  ])
>  
> +AC_ARG_ENABLE(linker-plugin-flags,
> +  [AS_HELP_STRING([[--enable-linker-plugin-flags=FLAGS]],
> +    [additional flags for configuring and building linker plugins @<:@none@:>@])],
> +  extra_linker_plugin_flags=$enableval,
> +  extra_linker_plugin_flags=)
> +AC_SUBST(extra_linker_plugin_flags)
> +AC_ARG_ENABLE(linker-plugin-configure-flags,
> +  [AS_HELP_STRING([[--enable-linker-plugin-configure-flags=FLAGS]],
> +    [additional flags for configuring linker plugins @<:@none@:>@])],
> +  extra_linker_plugin_configure_flags=$enableval,
> +  extra_linker_plugin_configure_flags=)
> +AC_SUBST(extra_linker_plugin_configure_flags)
> +
>  
>  # By default, C and C++ are the only stage 1 languages.
>  stage1_languages=,c,
> @@ -2133,6 +2146,21 @@ for i in ${target_configdirs_all} ; do
>    fi
>  done
>  
> +# libiberty-linker-plugin is special: it doesn't have its own source directory,
> +# so we have to add it after the preceding checks.
> +if test x"$extra_linker_plugin_flags$extra_linker_plugin_configure_flags" != x
> +then
> +  case " $configdirs " in
> +    *" libiberty "*)
> +      # If we can build libiberty, we can also build libiberty-linker-plugin.
> +      configdirs="$configdirs libiberty-linker-plugin"
> +      extra_linker_plugin_configure_flags="$extra_linker_plugin_configure_flags \
> +        --with-libiberty=../libiberty-linker-plugin";;
> +    *)
> +      AC_MSG_ERROR([libiberty missing]);;
> +  esac
> +fi
> +
>  # Produce a warning message for the subdirs we can't configure.
>  # This isn't especially interesting in the Cygnus tree, but in the individual
>  # FSF releases, it's important to let people know when their machine isn't
> diff --git gcc/doc/install.texi gcc/doc/install.texi
> index 7be8e5a..74cf660 100644
> --- gcc/doc/install.texi
> +++ gcc/doc/install.texi
> @@ -1746,6 +1746,25 @@ GLIBC 2.11 or above, otherwise disabled.
>  Enable support for link-time optimization (LTO).  This is enabled by
>  default, and may be disabled using @option{--disable-lto}.
>  
> +@item --enable-linker-plugin-flags=FLAGS
> +@itemx --enable-linker-plugin-configure-flags=FLAGS
> +By default, linker plugins (such as the LTO plugin) are built for the
> +host system architecture.  For the case that the linker has a
> +different (but run-time compatible) architecture, these flags can be
> +specified to build plugins that are compatible to the linker.  For
> +example, if you are building GCC for a 64-bit x86_64
> +(@samp{x86_64-unknown-linux-gnu}) host system, but have a 32-bit x86
> +GNU/Linux (@samp{i686-pc-linux-gnu}) linker executable (which is
> +executable on the former system), you can configure GCC as follows for
> +getting compatible linker plugins:
> +
> +@smallexample
> +% @var{srcdir}/configure \
> +    --host=x86_64-unknown-linux-gnu \
> +    --enable-linker-plugin-flags='CC=gcc\ -m32' \
> +    --enable-linker-plugin-configure-flags=--host=i686-pc-linux-gnu
> +@end smallexample
> +
>  @item --with-plugin-ld=@var{pathname}
>  Enable an alternate linker to be used at link-time optimization (LTO)
>  link time when @option{-fuse-linker-plugin} is enabled.

> GNU ld can use linker plugins, too.
> 
> 	gcc/
> 	* doc/sourcebuild.texi (Top Level) <lto-plugin>: GNU ld can use
> 	linker plugins, too.
> 
> ---
>  gcc/doc/sourcebuild.texi | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git gcc/doc/sourcebuild.texi gcc/doc/sourcebuild.texi
> index 90bd0bd..23ff04a 100644
> --- gcc/doc/sourcebuild.texi
> +++ gcc/doc/sourcebuild.texi
> @@ -120,7 +120,7 @@ The Stack protector runtime library.
>  The C++ runtime library.
>  
>  @item lto-plugin
> -Plugin used by @command{gold} if link-time optimizations are enabled.
> +Plugin used by the linker if link-time optimizations are enabled.
>  
>  @item maintainer-scripts
>  Scripts used by the @code{gccadmin} account on @code{gcc.gnu.org}.

> Fix typo.
> 
> 	* Makefile.tpl: Fix typo.
> 	* Makefile.in: Regenerate.
> 
> ---
>  Makefile.in  | 2 +-
>  Makefile.tpl | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git Makefile.in Makefile.in
> index a13771d..67d8cfb 100644
> --- Makefile.in
> +++ Makefile.in
> @@ -166,7 +166,7 @@ BUILD_EXPORTS = \
>  	WINDMC="$(WINDMC_FOR_BUILD)"; export WINDMC;
>  
>  # These variables must be set on the make command line for directories
> -# built for the build system to override those in BASE_FLAGS_TO_PASSS.
> +# built for the build system to override those in BASE_FLAGS_TO_PASS.
>  EXTRA_BUILD_FLAGS = \
>  	CFLAGS="$(CFLAGS_FOR_BUILD)" \
>  	LDFLAGS="$(LDFLAGS_FOR_BUILD)"
> diff --git Makefile.tpl Makefile.tpl
> index 3233a78..2695a2b 100644
> --- Makefile.tpl
> +++ Makefile.tpl
> @@ -169,7 +169,7 @@ BUILD_EXPORTS = \
>  	WINDMC="$(WINDMC_FOR_BUILD)"; export WINDMC;
>  
>  # These variables must be set on the make command line for directories
> -# built for the build system to override those in BASE_FLAGS_TO_PASSS.
> +# built for the build system to override those in BASE_FLAGS_TO_PASS.
>  EXTRA_BUILD_FLAGS = \
>  	CFLAGS="$(CFLAGS_FOR_BUILD)" \
>  	LDFLAGS="$(LDFLAGS_FOR_BUILD)"


Grüße,
 Thomas
Thomas Schwinge Nov. 2, 2013, 11:14 p.m. UTC | #2
Hi!

Ping.


On Fri, 25 Oct 2013 09:23:24 +0200, I wrote:
> Ping.  To sum it up, with these patches applied, there are no changes for
> a "regular" build (not using the new configure options).  On the other
> hand, configuring GCC as described, it is possible use the 32-bit x86
> linker for/with a x86_64 build, and get the very same GCC test results as
> when using a x86_64 linker.
> 
> 
> On Mon, 14 Oct 2013 12:28:11 +0200, I wrote:
> > On Sat, 12 Oct 2013 12:20:19 +0200, I wrote:
> > > This is a bit of a weird scenario -- but it is supposed to work fine in
> > > my opinion (but doesn't).
> > > 
> > > I have a GNU toolchain as 32-bit x86 GNU/Linux executables, configured to
> > > to generate code for 32-bit x86 by default, and using -m64 for x86_64.
> > > 
> > > This toolchain I'm using on a x86_64 system (which can execute 32-bit
> > > executables) to build a *native* GCC, that is I'm using the 32-bit
> > > toolchain to build a x86_64 GCC (configuring with CC='gcc -m64' CXX='g++
> > > -m64').  I intend to continue using the 32-bit toolchain's linker, which
> > > also is a 32-bit executable (GNU ld).  That one also defaults to x86
> > > code, but can handle the x86_64 case fine if passed -m elf_x86_64, which
> > > GCC does.
> > > 
> > > That the linker is a 32-bit executable is an implementation detail that
> > > is not important generally: it's a separate process living in its own
> > > address space.  However it becomes relevant in the case of linker
> > > plugins: the native x86_64 GCC that I'm building also builds a x86_64
> > > lto-plugin, which the 32-bit ld cannot load:
> > > 
> > >     $ gcc/xgcc -B[...] [...]/gcc.c-torture/execute/ieee/20000320-1.c [...] -flto [...]
> > >     [...]/ld: [...]/gcc/liblto_plugin.so: error loading plugin: [...]/gcc/liblto_plugin.so: wrong ELF class: ELFCLASS64
> > >     collect2: error: ld returned 1 exit status
> > > 
> > > So, aside from building a 64-bit ld (which is the "lame" alternative), I
> > > now need to teach GCC's build system that the lto-plugin may need special
> > > configuration: CC='gcc -m32' -- and [...] its own build of libiberty,
> > > too [...]
> > 
> > > Instead of auto-detecting the linker's
> > > architecture (and then, what to do with that information?), I intend to
> > > make this a manual process (so, some new top-level configure
> > > argument(s)).  Adding yet another set of {...,CC,...}_FOR_[something] is
> > > probably overkill -- I'll try to find something simpler.
> > > 
> > > Any comments on this scenario?
> > 
> > Here are the patches.  Unless the new option is exercised, there are no
> > effects on a native x86_64 GNU/Linux bootstrap build (the build trees'
> > *.o files are identical, as are the test results).  OK to commit?
> 
> > Allow overriding the libiberty used for building the LTO plugin.
> > 
> > 	lto-plugin/
> > 	* configure.ac (--with-libiberty): New configure option.
> > 	* configure: Regenerate.
> > 	* Makefile.am (libiberty, libiberty_pic): New variables.
> > 	(liblto_plugin_la_LIBADD, liblto_plugin_la_LDFLAGS)
> > 	(liblto_plugin_la_DEPENDENCIES): Use them.
> > 	* Makefile.in: Regenerate.
> > ---
> >  lto-plugin/Makefile.am  | 20 +++++++++++---------
> >  lto-plugin/Makefile.in  | 22 ++++++++++++----------
> >  lto-plugin/configure    | 17 +++++++++++++++--
> >  lto-plugin/configure.ac |  5 +++++
> >  4 files changed, 43 insertions(+), 21 deletions(-)
> > 
> > diff --git lto-plugin/Makefile.am lto-plugin/Makefile.am
> > index b24015e..8b7bb54 100644
> > --- lto-plugin/Makefile.am
> > +++ lto-plugin/Makefile.am
> > @@ -15,17 +15,19 @@ libexecsub_LTLIBRARIES = liblto_plugin.la
> >  gcc_build_dir = ../$(host_subdir)/gcc
> >  in_gcc_libs = $(foreach lib, $(libexecsub_LTLIBRARIES), $(gcc_build_dir)/$(lib))
> >  
> > -# Can be removed when libiberty becomes a normal convenience library
> > -Wc=-Wc,
> > -
> >  liblto_plugin_la_SOURCES = lto-plugin.c
> > +# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS.
> > +liblto_plugin_la_LDFLAGS = $(lt_host_flags) -module -bindir $(libexecsubdir)
> > +# Can be simplified when libiberty becomes a normal convenience library.
> > +libiberty=$(with_libiberty)/libiberty.a
> > +libiberty_pic=$(with_libiberty)/pic/libiberty.a
> > +Wc=-Wc,
> >  liblto_plugin_la_LIBADD = \
> > -	$(if $(wildcard ../libiberty/pic/libiberty.a),$(Wc)../libiberty/pic/libiberty.a,)
> > -# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS
> > -liblto_plugin_la_LDFLAGS = $(lt_host_flags) -module -bindir $(libexecsubdir) \
> > -	$(if $(wildcard ../libiberty/pic/libiberty.a),,-Wc,../libiberty/libiberty.a)
> > -liblto_plugin_la_DEPENDENCIES = $(if $(wildcard \
> > -	../libiberty/pic/libiberty.a),../libiberty/pic/libiberty.a,)
> > +	$(if $(wildcard $(libiberty_pic)),$(Wc)$(libiberty_pic),)
> > +liblto_plugin_la_LDFLAGS += \
> > +	$(if $(wildcard $(libiberty_pic)),,-Wc,$(libiberty))
> > +liblto_plugin_la_DEPENDENCIES = \
> > +	$(if $(wildcard $(libiberty_pic)),$(libiberty_pic),)
> >  
> >  all-local: $(in_gcc_libs)
> >  
> > diff --git lto-plugin/configure.ac lto-plugin/configure.ac
> > index 9a418d2..b73fabb 100644
> > --- lto-plugin/configure.ac
> > +++ lto-plugin/configure.ac
> > @@ -4,6 +4,11 @@ AC_CANONICAL_SYSTEM
> >  GCC_TOPLEV_SUBDIRS
> >  AM_INIT_AUTOMAKE([foreign no-dist])
> >  AM_MAINTAINER_MODE
> > +AC_ARG_WITH(libiberty,
> > +  [AS_HELP_STRING([--with-libiberty=PATH],
> > +    [specify the directory where to find libiberty [../libiberty]])],
> > +  [], with_libiberty=../libiberty)
> > +AC_SUBST(with_libiberty)
> >  AC_PROG_CC
> >  AC_SYS_LARGEFILE
> >  ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_lto_plugin_warn_cflags])
> 
> > Allow for overriding a module's srcdir.
> > 
> > 	* Makefile.tpl (configure-[+prefix+][+module+])
> > 	(configure-stage[+id+]-[+prefix+][+module+]): Allow for
> > 	overriding a module's srcdir.
> > 	* Makefile.in: Regenerate.
> > 
> > ---
> >  Makefile.in  | 2141 ++++++++++++++++++++++++++++++----------------------------
> >  Makefile.tpl |   21 +-
> >  2 files changed, 1132 insertions(+), 1030 deletions(-)
> > 
> > diff --git Makefile.tpl Makefile.tpl
> > index 2695a2b..36d480e 100644
> > --- Makefile.tpl
> > +++ Makefile.tpl
> > @@ -1000,12 +1000,14 @@ configure-[+prefix+][+module+]: [+ IF bootstrap +][+ ELSE +]
> >  	  *) topdir=`echo [+subdir+]/[+module+]/ | \
> >  		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
> >  	esac; \
> > -	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
> > -	libsrcdir="$$s/[+module+]"; \
> > +	module_srcdir=[+ IF module_srcdir +][+module_srcdir+][+
> > +	ELSE module_srcdir +][+module+][+ ENDIF module_srcdir +]; \
> >  	[+ IF no-config-site +]rm -f no-such-file || : ; \
> > -	CONFIG_SITE=no-such-file [+ ENDIF +]$(SHELL) $${libsrcdir}/configure \
> > +	CONFIG_SITE=no-such-file [+ ENDIF +]$(SHELL) \
> > +	  $$s/$$module_srcdir/configure \
> > +	  --srcdir=$${topdir}/$$module_srcdir \
> >  	  [+args+] --build=${build_alias} --host=[+host_alias+] \
> > -	  --target=[+target_alias+] $${srcdiroption} [+extra_configure_flags+] \
> > +	  --target=[+target_alias+] [+extra_configure_flags+] \
> >  	  || exit 1
> >  @endif [+prefix+][+module+]
> >  
> > @@ -1053,12 +1055,13 @@ configure-stage[+id+]-[+prefix+][+module+]:
> >  	  *) topdir=`echo [+subdir+]/[+module+]/ | \
> >  		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
> >  	esac; \
> > -	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
> > -	libsrcdir="$$s/[+module+]"; \
> > -	$(SHELL) $${libsrcdir}/configure \
> > +	module_srcdir=[+ IF module_srcdir +][+module_srcdir+][+
> > +	ELSE module_srcdir +][+module+][+ ENDIF module_srcdir +]; \
> > +	$(SHELL) $$s/$$module_srcdir/configure \
> > +	  --srcdir=$${topdir}/$$module_srcdir \
> >  	  [+args+] --build=${build_alias} --host=[+host_alias+] \
> > -	  --target=[+target_alias+] $${srcdiroption} [+ IF prev +]\
> > -	  --with-build-libsubdir=$(HOST_SUBDIR) [+ ENDIF prev +]\
> > +	  --target=[+target_alias+] \
> > +	  [+ IF prev +] --with-build-libsubdir=$(HOST_SUBDIR) [+ ENDIF prev +] \
> >  	  $(STAGE[+id+]_CONFIGURE_FLAGS)[+ IF extra_configure_flags +] \
> >  	  [+extra_configure_flags+][+ ENDIF extra_configure_flags +]
> >  @endif [+prefix+][+module+]-bootstrap
> 
> > Non-host system configuration for linker plugins.
> > 
> > 	* configure.ac (--enable-linker-plugin-flags)
> > 	(--enable-linker-plugin-configure-flags): New flags.
> > 	(configdirs): Conditionally add libiberty-linker-plugin.
> > 	* configure: Regenerate.
> > 	* Makefile.def (host_modules): Add libiberty-linker-plugin.
> > 	(host_modules) <lto-plugin>: Pay attention to
> > 	@extra_linker_plugin_flags@ and
> > 	@extra_linker_plugin_configure_flags@.
> > 	(all-lto-plugin): Also depend on all-libiberty-linker-plugin.
> > 	* Makefile.in: Regenerate.
> > 	gcc/
> > 	* doc/install.texi (--enable-linker-plugin-flags)
> > 	(--enable-linker-plugin-configure-flags): Document new flags.
> > ---
> >  Makefile.def         |   14 +-
> >  Makefile.in          | 1051 ++++++++++++++++++++++++++++++++++++++++++++++++--
> >  configure            |   42 ++
> >  configure.ac         |   28 ++
> >  gcc/doc/install.texi |   19 +
> >  5 files changed, 1117 insertions(+), 37 deletions(-)
> > 
> > diff --git Makefile.def Makefile.def
> > index 3ba1a5b..ea48792 100644
> > --- Makefile.def
> > +++ Makefile.def
> > @@ -85,6 +85,14 @@ host_modules= { module= libdecnumber; bootstrap=true; };
> >  host_modules= { module= libgui; };
> >  host_modules= { module= libiberty; bootstrap=true;
> >  	        extra_configure_flags='@extra_host_libiberty_configure_flags@';};
> > +// Linker plugins may need their own build of libiberty; see
> > +// gcc/doc/install.texi.  We take care that this build of libiberty doesn't get
> > +// installed.  It's a helper library for linker plugins, so we pay attention to
> > +// @extra_linker_plugin_flags@ and @extra_linker_plugin_configure_flags@.
> > +host_modules= { module= libiberty-linker-plugin; bootstrap=true;
> > +		module_srcdir=libiberty;
> > +	        extra_configure_flags='@extra_host_libiberty_configure_flags@ --disable-install-libiberty @extra_linker_plugin_flags@ @extra_linker_plugin_configure_flags@';
> > +		extra_make_flags='@extra_linker_plugin_flags@'; };
> >  // We abuse missing to avoid installing anything for libiconv.
> >  host_modules= { module= libiconv;
> >  		extra_configure_flags='--disable-shared';
> > @@ -111,7 +119,8 @@ host_modules= { module= libtermcap; no_check=true;
> >  host_modules= { module= utils; no_check=true; };
> >  host_modules= { module= gnattools; };
> >  host_modules= { module= lto-plugin; bootstrap=true;
> > -		extra_configure_flags=--enable-shared; };
> > +		extra_configure_flags='--enable-shared @extra_linker_plugin_flags@ @extra_linker_plugin_configure_flags@';
> > +		extra_make_flags='@extra_linker_plugin_flags@'; };
> >  
> >  target_modules = { module= libstdc++-v3;
> >  		   bootstrap=true;
> > @@ -336,7 +345,10 @@ dependencies = { module=all-fixincludes; on=all-libiberty; };
> >  
> >  dependencies = { module=all-gnattools; on=all-target-libada; };
> >  
> > +// Depending on the specific configuration, the LTO plugin will either use the
> > +// generic libiberty build or the specific build for linker plugins.
> >  dependencies = { module=all-lto-plugin; on=all-libiberty; };
> > +dependencies = { module=all-lto-plugin; on=all-libiberty-linker-plugin; };
> >  
> >  dependencies = { module=all-utils; on=all-libiberty; };
> >  
> > diff --git configure.ac configure.ac
> > index b5caebb..128c60b 100644
> > --- configure.ac
> > +++ configure.ac
> > @@ -1731,6 +1731,19 @@ ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always.
> >    esac
> >  ])
> >  
> > +AC_ARG_ENABLE(linker-plugin-flags,
> > +  [AS_HELP_STRING([[--enable-linker-plugin-flags=FLAGS]],
> > +    [additional flags for configuring and building linker plugins @<:@none@:>@])],
> > +  extra_linker_plugin_flags=$enableval,
> > +  extra_linker_plugin_flags=)
> > +AC_SUBST(extra_linker_plugin_flags)
> > +AC_ARG_ENABLE(linker-plugin-configure-flags,
> > +  [AS_HELP_STRING([[--enable-linker-plugin-configure-flags=FLAGS]],
> > +    [additional flags for configuring linker plugins @<:@none@:>@])],
> > +  extra_linker_plugin_configure_flags=$enableval,
> > +  extra_linker_plugin_configure_flags=)
> > +AC_SUBST(extra_linker_plugin_configure_flags)
> > +
> >  
> >  # By default, C and C++ are the only stage 1 languages.
> >  stage1_languages=,c,
> > @@ -2133,6 +2146,21 @@ for i in ${target_configdirs_all} ; do
> >    fi
> >  done
> >  
> > +# libiberty-linker-plugin is special: it doesn't have its own source directory,
> > +# so we have to add it after the preceding checks.
> > +if test x"$extra_linker_plugin_flags$extra_linker_plugin_configure_flags" != x
> > +then
> > +  case " $configdirs " in
> > +    *" libiberty "*)
> > +      # If we can build libiberty, we can also build libiberty-linker-plugin.
> > +      configdirs="$configdirs libiberty-linker-plugin"
> > +      extra_linker_plugin_configure_flags="$extra_linker_plugin_configure_flags \
> > +        --with-libiberty=../libiberty-linker-plugin";;
> > +    *)
> > +      AC_MSG_ERROR([libiberty missing]);;
> > +  esac
> > +fi
> > +
> >  # Produce a warning message for the subdirs we can't configure.
> >  # This isn't especially interesting in the Cygnus tree, but in the individual
> >  # FSF releases, it's important to let people know when their machine isn't
> > diff --git gcc/doc/install.texi gcc/doc/install.texi
> > index 7be8e5a..74cf660 100644
> > --- gcc/doc/install.texi
> > +++ gcc/doc/install.texi
> > @@ -1746,6 +1746,25 @@ GLIBC 2.11 or above, otherwise disabled.
> >  Enable support for link-time optimization (LTO).  This is enabled by
> >  default, and may be disabled using @option{--disable-lto}.
> >  
> > +@item --enable-linker-plugin-flags=FLAGS
> > +@itemx --enable-linker-plugin-configure-flags=FLAGS
> > +By default, linker plugins (such as the LTO plugin) are built for the
> > +host system architecture.  For the case that the linker has a
> > +different (but run-time compatible) architecture, these flags can be
> > +specified to build plugins that are compatible to the linker.  For
> > +example, if you are building GCC for a 64-bit x86_64
> > +(@samp{x86_64-unknown-linux-gnu}) host system, but have a 32-bit x86
> > +GNU/Linux (@samp{i686-pc-linux-gnu}) linker executable (which is
> > +executable on the former system), you can configure GCC as follows for
> > +getting compatible linker plugins:
> > +
> > +@smallexample
> > +% @var{srcdir}/configure \
> > +    --host=x86_64-unknown-linux-gnu \
> > +    --enable-linker-plugin-flags='CC=gcc\ -m32' \
> > +    --enable-linker-plugin-configure-flags=--host=i686-pc-linux-gnu
> > +@end smallexample
> > +
> >  @item --with-plugin-ld=@var{pathname}
> >  Enable an alternate linker to be used at link-time optimization (LTO)
> >  link time when @option{-fuse-linker-plugin} is enabled.
> 
> > GNU ld can use linker plugins, too.
> > 
> > 	gcc/
> > 	* doc/sourcebuild.texi (Top Level) <lto-plugin>: GNU ld can use
> > 	linker plugins, too.
> > 
> > ---
> >  gcc/doc/sourcebuild.texi | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git gcc/doc/sourcebuild.texi gcc/doc/sourcebuild.texi
> > index 90bd0bd..23ff04a 100644
> > --- gcc/doc/sourcebuild.texi
> > +++ gcc/doc/sourcebuild.texi
> > @@ -120,7 +120,7 @@ The Stack protector runtime library.
> >  The C++ runtime library.
> >  
> >  @item lto-plugin
> > -Plugin used by @command{gold} if link-time optimizations are enabled.
> > +Plugin used by the linker if link-time optimizations are enabled.
> >  
> >  @item maintainer-scripts
> >  Scripts used by the @code{gccadmin} account on @code{gcc.gnu.org}.
> 
> > Fix typo.
> > 
> > 	* Makefile.tpl: Fix typo.
> > 	* Makefile.in: Regenerate.
> > 
> > ---
> >  Makefile.in  | 2 +-
> >  Makefile.tpl | 2 +-
> >  2 files changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git Makefile.in Makefile.in
> > index a13771d..67d8cfb 100644
> > --- Makefile.in
> > +++ Makefile.in
> > @@ -166,7 +166,7 @@ BUILD_EXPORTS = \
> >  	WINDMC="$(WINDMC_FOR_BUILD)"; export WINDMC;
> >  
> >  # These variables must be set on the make command line for directories
> > -# built for the build system to override those in BASE_FLAGS_TO_PASSS.
> > +# built for the build system to override those in BASE_FLAGS_TO_PASS.
> >  EXTRA_BUILD_FLAGS = \
> >  	CFLAGS="$(CFLAGS_FOR_BUILD)" \
> >  	LDFLAGS="$(LDFLAGS_FOR_BUILD)"
> > diff --git Makefile.tpl Makefile.tpl
> > index 3233a78..2695a2b 100644
> > --- Makefile.tpl
> > +++ Makefile.tpl
> > @@ -169,7 +169,7 @@ BUILD_EXPORTS = \
> >  	WINDMC="$(WINDMC_FOR_BUILD)"; export WINDMC;
> >  
> >  # These variables must be set on the make command line for directories
> > -# built for the build system to override those in BASE_FLAGS_TO_PASSS.
> > +# built for the build system to override those in BASE_FLAGS_TO_PASS.
> >  EXTRA_BUILD_FLAGS = \
> >  	CFLAGS="$(CFLAGS_FOR_BUILD)" \
> >  	LDFLAGS="$(LDFLAGS_FOR_BUILD)"


Grüße,
 Thomas
Cary Coutant Nov. 4, 2013, 6:13 p.m. UTC | #3
>> Ping.  To sum it up, with these patches applied, there are no changes for
>> a "regular" build (not using the new configure options).  On the other
>> hand, configuring GCC as described, it is possible use the 32-bit x86
>> linker for/with a x86_64 build, and get the very same GCC test results as
>> when using a x86_64 linker.

Sorry, I've been hoping someone with more global approval authority
would respond.

> Allow overriding the libiberty used for building the LTO plugin.
>
>         lto-plugin/
>         * configure.ac (--with-libiberty): New configure option.
>         * configure: Regenerate.
>         * Makefile.am (libiberty, libiberty_pic): New variables.
>         (liblto_plugin_la_LIBADD, liblto_plugin_la_LDFLAGS)
>         (liblto_plugin_la_DEPENDENCIES): Use them.
>         * Makefile.in: Regenerate.

These look OK to me.

> Allow for overriding a module's srcdir.
>
>         * Makefile.tpl (configure-[+prefix+][+module+])
>         (configure-stage[+id+]-[+prefix+][+module+]): Allow for
>         overriding a module's srcdir.
>         * Makefile.in: Regenerate.

These look OK, but I think a global maintainer or build machinery
maintainer should give approval.

> Non-host system configuration for linker plugins.
>
>         * configure.ac (--enable-linker-plugin-flags)
>         (--enable-linker-plugin-configure-flags): New flags.
>         (configdirs): Conditionally add libiberty-linker-plugin.
>         * configure: Regenerate.
>         * Makefile.def (host_modules): Add libiberty-linker-plugin.
>         (host_modules) <lto-plugin>: Pay attention to
>         @extra_linker_plugin_flags@ and
>         @extra_linker_plugin_configure_flags@.
>         (all-lto-plugin): Also depend on all-libiberty-linker-plugin.
>         * Makefile.in: Regenerate.
>         gcc/
>         * doc/install.texi (--enable-linker-plugin-flags)
>         (--enable-linker-plugin-configure-flags): Document new flags.

Same here.

> GNU ld can use linker plugins, too.
>
>         gcc/
>         * doc/sourcebuild.texi (Top Level) <lto-plugin>: GNU ld can use
>         linker plugins, too.

OK.

> Fix typo.
>
>         * Makefile.tpl: Fix typo.
>         * Makefile.in: Regenerate.

OK (qualifies as trivial and obvious).

-cary
Thomas Schwinge Nov. 12, 2013, 1:52 p.m. UTC | #4
Hi!

Could a global maintainer or build machinery maintainer please review the
two unreviewed patches posted in this series?

On Mon, 4 Nov 2013 10:13:39 -0800, Cary Coutant <ccoutant@google.com> wrote:
> >> Ping.  To sum it up, with these patches applied, there are no changes for
> >> a "regular" build (not using the new configure options).  On the other
> >> hand, configuring GCC as described, it is possible use the 32-bit x86
> >> linker for/with a x86_64 build, and get the very same GCC test results as
> >> when using a x86_64 linker.
> 
> Sorry, I've been hoping someone with more global approval authority
> would respond.
> 
> > Allow overriding the libiberty used for building the LTO plugin.
> >
> >         lto-plugin/
> >         * configure.ac (--with-libiberty): New configure option.
> >         * configure: Regenerate.
> >         * Makefile.am (libiberty, libiberty_pic): New variables.
> >         (liblto_plugin_la_LIBADD, liblto_plugin_la_LDFLAGS)
> >         (liblto_plugin_la_DEPENDENCIES): Use them.
> >         * Makefile.in: Regenerate.
> 
> These look OK to me.
> 
> > Allow for overriding a module's srcdir.
> >
> >         * Makefile.tpl (configure-[+prefix+][+module+])
> >         (configure-stage[+id+]-[+prefix+][+module+]): Allow for
> >         overriding a module's srcdir.
> >         * Makefile.in: Regenerate.
> 
> These look OK, but I think a global maintainer or build machinery
> maintainer should give approval.
> 
> > Non-host system configuration for linker plugins.
> >
> >         * configure.ac (--enable-linker-plugin-flags)
> >         (--enable-linker-plugin-configure-flags): New flags.
> >         (configdirs): Conditionally add libiberty-linker-plugin.
> >         * configure: Regenerate.
> >         * Makefile.def (host_modules): Add libiberty-linker-plugin.
> >         (host_modules) <lto-plugin>: Pay attention to
> >         @extra_linker_plugin_flags@ and
> >         @extra_linker_plugin_configure_flags@.
> >         (all-lto-plugin): Also depend on all-libiberty-linker-plugin.
> >         * Makefile.in: Regenerate.
> >         gcc/
> >         * doc/install.texi (--enable-linker-plugin-flags)
> >         (--enable-linker-plugin-configure-flags): Document new flags.
> 
> Same here.
> 
> > GNU ld can use linker plugins, too.
> >
> >         gcc/
> >         * doc/sourcebuild.texi (Top Level) <lto-plugin>: GNU ld can use
> >         linker plugins, too.
> 
> OK.
> 
> > Fix typo.
> >
> >         * Makefile.tpl: Fix typo.
> >         * Makefile.in: Regenerate.
> 
> OK (qualifies as trivial and obvious).


Grüße,
 Thomas
diff mbox

Patch

diff --git lto-plugin/Makefile.am lto-plugin/Makefile.am
index b24015e..8b7bb54 100644
--- lto-plugin/Makefile.am
+++ lto-plugin/Makefile.am
@@ -15,17 +15,19 @@  libexecsub_LTLIBRARIES = liblto_plugin.la
 gcc_build_dir = ../$(host_subdir)/gcc
 in_gcc_libs = $(foreach lib, $(libexecsub_LTLIBRARIES), $(gcc_build_dir)/$(lib))
 
-# Can be removed when libiberty becomes a normal convenience library
-Wc=-Wc,
-
 liblto_plugin_la_SOURCES = lto-plugin.c
+# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS.
+liblto_plugin_la_LDFLAGS = $(lt_host_flags) -module -bindir $(libexecsubdir)
+# Can be simplified when libiberty becomes a normal convenience library.
+libiberty=$(with_libiberty)/libiberty.a
+libiberty_pic=$(with_libiberty)/pic/libiberty.a
+Wc=-Wc,
 liblto_plugin_la_LIBADD = \
-	$(if $(wildcard ../libiberty/pic/libiberty.a),$(Wc)../libiberty/pic/libiberty.a,)
-# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS
-liblto_plugin_la_LDFLAGS = $(lt_host_flags) -module -bindir $(libexecsubdir) \
-	$(if $(wildcard ../libiberty/pic/libiberty.a),,-Wc,../libiberty/libiberty.a)
-liblto_plugin_la_DEPENDENCIES = $(if $(wildcard \
-	../libiberty/pic/libiberty.a),../libiberty/pic/libiberty.a,)
+	$(if $(wildcard $(libiberty_pic)),$(Wc)$(libiberty_pic),)
+liblto_plugin_la_LDFLAGS += \
+	$(if $(wildcard $(libiberty_pic)),,-Wc,$(libiberty))
+liblto_plugin_la_DEPENDENCIES = \
+	$(if $(wildcard $(libiberty_pic)),$(libiberty_pic),)
 
 all-local: $(in_gcc_libs)
 
diff --git lto-plugin/configure.ac lto-plugin/configure.ac
index 9a418d2..b73fabb 100644
--- lto-plugin/configure.ac
+++ lto-plugin/configure.ac
@@ -4,6 +4,11 @@  AC_CANONICAL_SYSTEM
 GCC_TOPLEV_SUBDIRS
 AM_INIT_AUTOMAKE([foreign no-dist])
 AM_MAINTAINER_MODE
+AC_ARG_WITH(libiberty,
+  [AS_HELP_STRING([--with-libiberty=PATH],
+    [specify the directory where to find libiberty [../libiberty]])],
+  [], with_libiberty=../libiberty)
+AC_SUBST(with_libiberty)
 AC_PROG_CC
 AC_SYS_LARGEFILE
 ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_lto_plugin_warn_cflags])


Allow for overriding a module's srcdir.

	* Makefile.tpl (configure-[+prefix+][+module+])
	(configure-stage[+id+]-[+prefix+][+module+]): Allow for
	overriding a module's srcdir.
	* Makefile.in: Regenerate.

---
 Makefile.in  | 2141 ++++++++++++++++++++++++++++++----------------------------
 Makefile.tpl |   21 +-
 2 files changed, 1132 insertions(+), 1030 deletions(-)

diff --git Makefile.tpl Makefile.tpl
index 2695a2b..36d480e 100644
--- Makefile.tpl
+++ Makefile.tpl
@@ -1000,12 +1000,14 @@  configure-[+prefix+][+module+]: [+ IF bootstrap +][+ ELSE +]
 	  *) topdir=`echo [+subdir+]/[+module+]/ | \
 		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
 	esac; \
-	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
-	libsrcdir="$$s/[+module+]"; \
+	module_srcdir=[+ IF module_srcdir +][+module_srcdir+][+
+	ELSE module_srcdir +][+module+][+ ENDIF module_srcdir +]; \
 	[+ IF no-config-site +]rm -f no-such-file || : ; \
-	CONFIG_SITE=no-such-file [+ ENDIF +]$(SHELL) $${libsrcdir}/configure \
+	CONFIG_SITE=no-such-file [+ ENDIF +]$(SHELL) \
+	  $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
 	  [+args+] --build=${build_alias} --host=[+host_alias+] \
-	  --target=[+target_alias+] $${srcdiroption} [+extra_configure_flags+] \
+	  --target=[+target_alias+] [+extra_configure_flags+] \
 	  || exit 1
 @endif [+prefix+][+module+]
 
@@ -1053,12 +1055,13 @@  configure-stage[+id+]-[+prefix+][+module+]:
 	  *) topdir=`echo [+subdir+]/[+module+]/ | \
 		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
 	esac; \
-	srcdiroption="--srcdir=$${topdir}/[+module+]"; \
-	libsrcdir="$$s/[+module+]"; \
-	$(SHELL) $${libsrcdir}/configure \
+	module_srcdir=[+ IF module_srcdir +][+module_srcdir+][+
+	ELSE module_srcdir +][+module+][+ ENDIF module_srcdir +]; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
 	  [+args+] --build=${build_alias} --host=[+host_alias+] \
-	  --target=[+target_alias+] $${srcdiroption} [+ IF prev +]\
-	  --with-build-libsubdir=$(HOST_SUBDIR) [+ ENDIF prev +]\
+	  --target=[+target_alias+] \
+	  [+ IF prev +] --with-build-libsubdir=$(HOST_SUBDIR) [+ ENDIF prev +] \
 	  $(STAGE[+id+]_CONFIGURE_FLAGS)[+ IF extra_configure_flags +] \
 	  [+extra_configure_flags+][+ ENDIF extra_configure_flags +]
 @endif [+prefix+][+module+]-bootstrap


Non-host system configuration for linker plugins.

	* configure.ac (--enable-linker-plugin-flags)
	(--enable-linker-plugin-configure-flags): New flags.
	(configdirs): Conditionally add libiberty-linker-plugin.
	* configure: Regenerate.
	* Makefile.def (host_modules): Add libiberty-linker-plugin.
	(host_modules) <lto-plugin>: Pay attention to
	@extra_linker_plugin_flags@ and
	@extra_linker_plugin_configure_flags@.
	(all-lto-plugin): Also depend on all-libiberty-linker-plugin.
	* Makefile.in: Regenerate.
	gcc/
	* doc/install.texi (--enable-linker-plugin-flags)
	(--enable-linker-plugin-configure-flags): Document new flags.
---
 Makefile.def         |   14 +-
 Makefile.in          | 1051 ++++++++++++++++++++++++++++++++++++++++++++++++--
 configure            |   42 ++
 configure.ac         |   28 ++
 gcc/doc/install.texi |   19 +
 5 files changed, 1117 insertions(+), 37 deletions(-)

diff --git Makefile.def Makefile.def
index 3ba1a5b..ea48792 100644
--- Makefile.def
+++ Makefile.def
@@ -85,6 +85,14 @@  host_modules= { module= libdecnumber; bootstrap=true; };
 host_modules= { module= libgui; };
 host_modules= { module= libiberty; bootstrap=true;
 	        extra_configure_flags='@extra_host_libiberty_configure_flags@';};
+// Linker plugins may need their own build of libiberty; see
+// gcc/doc/install.texi.  We take care that this build of libiberty doesn't get
+// installed.  It's a helper library for linker plugins, so we pay attention to
+// @extra_linker_plugin_flags@ and @extra_linker_plugin_configure_flags@.
+host_modules= { module= libiberty-linker-plugin; bootstrap=true;
+		module_srcdir=libiberty;
+	        extra_configure_flags='@extra_host_libiberty_configure_flags@ --disable-install-libiberty @extra_linker_plugin_flags@ @extra_linker_plugin_configure_flags@';
+		extra_make_flags='@extra_linker_plugin_flags@'; };
 // We abuse missing to avoid installing anything for libiconv.
 host_modules= { module= libiconv;
 		extra_configure_flags='--disable-shared';
@@ -111,7 +119,8 @@  host_modules= { module= libtermcap; no_check=true;
 host_modules= { module= utils; no_check=true; };
 host_modules= { module= gnattools; };
 host_modules= { module= lto-plugin; bootstrap=true;
-		extra_configure_flags=--enable-shared; };
+		extra_configure_flags='--enable-shared @extra_linker_plugin_flags@ @extra_linker_plugin_configure_flags@';
+		extra_make_flags='@extra_linker_plugin_flags@'; };
 
 target_modules = { module= libstdc++-v3;
 		   bootstrap=true;
@@ -336,7 +345,10 @@  dependencies = { module=all-fixincludes; on=all-libiberty; };
 
 dependencies = { module=all-gnattools; on=all-target-libada; };
 
+// Depending on the specific configuration, the LTO plugin will either use the
+// generic libiberty build or the specific build for linker plugins.
 dependencies = { module=all-lto-plugin; on=all-libiberty; };
+dependencies = { module=all-lto-plugin; on=all-libiberty-linker-plugin; };
 
 dependencies = { module=all-utils; on=all-libiberty; };
 
diff --git configure.ac configure.ac
index b5caebb..128c60b 100644
--- configure.ac
+++ configure.ac
@@ -1731,6 +1731,19 @@  ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always.
   esac
 ])
 
+AC_ARG_ENABLE(linker-plugin-flags,
+  [AS_HELP_STRING([[--enable-linker-plugin-flags=FLAGS]],
+    [additional flags for configuring and building linker plugins @<:@none@:>@])],
+  extra_linker_plugin_flags=$enableval,
+  extra_linker_plugin_flags=)
+AC_SUBST(extra_linker_plugin_flags)
+AC_ARG_ENABLE(linker-plugin-configure-flags,
+  [AS_HELP_STRING([[--enable-linker-plugin-configure-flags=FLAGS]],
+    [additional flags for configuring linker plugins @<:@none@:>@])],
+  extra_linker_plugin_configure_flags=$enableval,
+  extra_linker_plugin_configure_flags=)
+AC_SUBST(extra_linker_plugin_configure_flags)
+
 
 # By default, C and C++ are the only stage 1 languages.
 stage1_languages=,c,
@@ -2133,6 +2146,21 @@  for i in ${target_configdirs_all} ; do
   fi
 done
 
+# libiberty-linker-plugin is special: it doesn't have its own source directory,
+# so we have to add it after the preceding checks.
+if test x"$extra_linker_plugin_flags$extra_linker_plugin_configure_flags" != x
+then
+  case " $configdirs " in
+    *" libiberty "*)
+      # If we can build libiberty, we can also build libiberty-linker-plugin.
+      configdirs="$configdirs libiberty-linker-plugin"
+      extra_linker_plugin_configure_flags="$extra_linker_plugin_configure_flags \
+        --with-libiberty=../libiberty-linker-plugin";;
+    *)
+      AC_MSG_ERROR([libiberty missing]);;
+  esac
+fi
+
 # Produce a warning message for the subdirs we can't configure.
 # This isn't especially interesting in the Cygnus tree, but in the individual
 # FSF releases, it's important to let people know when their machine isn't
diff --git gcc/doc/install.texi gcc/doc/install.texi
index 7be8e5a..74cf660 100644
--- gcc/doc/install.texi
+++ gcc/doc/install.texi
@@ -1746,6 +1746,25 @@  GLIBC 2.11 or above, otherwise disabled.
 Enable support for link-time optimization (LTO).  This is enabled by
 default, and may be disabled using @option{--disable-lto}.
 
+@item --enable-linker-plugin-flags=FLAGS
+@itemx --enable-linker-plugin-configure-flags=FLAGS
+By default, linker plugins (such as the LTO plugin) are built for the
+host system architecture.  For the case that the linker has a
+different (but run-time compatible) architecture, these flags can be
+specified to build plugins that are compatible to the linker.  For
+example, if you are building GCC for a 64-bit x86_64
+(@samp{x86_64-unknown-linux-gnu}) host system, but have a 32-bit x86
+GNU/Linux (@samp{i686-pc-linux-gnu}) linker executable (which is
+executable on the former system), you can configure GCC as follows for
+getting compatible linker plugins:
+
+@smallexample
+% @var{srcdir}/configure \
+    --host=x86_64-unknown-linux-gnu \
+    --enable-linker-plugin-flags='CC=gcc\ -m32' \
+    --enable-linker-plugin-configure-flags=--host=i686-pc-linux-gnu
+@end smallexample
+
 @item --with-plugin-ld=@var{pathname}
 Enable an alternate linker to be used at link-time optimization (LTO)
 link time when @option{-fuse-linker-plugin} is enabled.


GNU ld can use linker plugins, too.

	gcc/
	* doc/sourcebuild.texi (Top Level) <lto-plugin>: GNU ld can use
	linker plugins, too.

---
 gcc/doc/sourcebuild.texi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git gcc/doc/sourcebuild.texi gcc/doc/sourcebuild.texi
index 90bd0bd..23ff04a 100644
--- gcc/doc/sourcebuild.texi
+++ gcc/doc/sourcebuild.texi
@@ -120,7 +120,7 @@  The Stack protector runtime library.
 The C++ runtime library.
 
 @item lto-plugin
-Plugin used by @command{gold} if link-time optimizations are enabled.
+Plugin used by the linker if link-time optimizations are enabled.
 
 @item maintainer-scripts
 Scripts used by the @code{gccadmin} account on @code{gcc.gnu.org}.


Fix typo.

	* Makefile.tpl: Fix typo.
	* Makefile.in: Regenerate.

---
 Makefile.in  | 2 +-
 Makefile.tpl | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git Makefile.in Makefile.in
index a13771d..67d8cfb 100644
--- Makefile.in
+++ Makefile.in
@@ -166,7 +166,7 @@  BUILD_EXPORTS = \
 	WINDMC="$(WINDMC_FOR_BUILD)"; export WINDMC;
 
 # These variables must be set on the make command line for directories
-# built for the build system to override those in BASE_FLAGS_TO_PASSS.
+# built for the build system to override those in BASE_FLAGS_TO_PASS.
 EXTRA_BUILD_FLAGS = \
 	CFLAGS="$(CFLAGS_FOR_BUILD)" \
 	LDFLAGS="$(LDFLAGS_FOR_BUILD)"
diff --git Makefile.tpl Makefile.tpl
index 3233a78..2695a2b 100644
--- Makefile.tpl
+++ Makefile.tpl
@@ -169,7 +169,7 @@  BUILD_EXPORTS = \
 	WINDMC="$(WINDMC_FOR_BUILD)"; export WINDMC;
 
 # These variables must be set on the make command line for directories
-# built for the build system to override those in BASE_FLAGS_TO_PASSS.
+# built for the build system to override those in BASE_FLAGS_TO_PASS.
 EXTRA_BUILD_FLAGS = \
 	CFLAGS="$(CFLAGS_FOR_BUILD)" \
 	LDFLAGS="$(LDFLAGS_FOR_BUILD)"