diff mbox

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

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

Commit Message

Thomas Schwinge May 22, 2014, 10:56 a.m. UTC
Hi!

Now that GCC again is in development stage, and with fresh hope to have
someone review this patch submission, after having let the issue rest for
several months: I just re-tested the current versions.  Still there are
no changes for a "regular" build (not using the new configure options).
On the other hand, configuring GCC as described in the documentation
update, it is possible to 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.  See
<http://news.gmane.org/find-root.php?message_id=%3C87k3hioknw.fsf%40kepler.schwinge.homeip.net%3E>
for the whole story.

The patches looked fine to Cary, but he says they need approval by a
global maintainer or build machinery maintainer.

commit 64cb4b8443eee67eeccc6b6996b0b66856a86990
Author:     Thomas Schwinge <thomas@codesourcery.com>
AuthorDate: Sun Oct 13 16:15:56 2013 +0200
Commit:     Thomas Schwinge <thomas@codesourcery.com>
CommitDate: Wed May 21 07:24:01 2014 +0200

    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_noasan, 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  | 31 +++++++++++++++++--------------
 lto-plugin/Makefile.in  | 32 +++++++++++++++++---------------
 lto-plugin/configure    | 17 +++++++++++++++--
 lto-plugin/configure.ac |  5 +++++
 4 files changed, 54 insertions(+), 31 deletions(-)



Grüße,
 Thomas

Comments

Nathanael Nerode May 27, 2014, 4:35 a.m. UTC | #1
On 05/22/2014 06:56 AM, Thomas Schwinge wrote:
> Hi!
>
> Now that GCC again is in development stage, and with fresh hope to have
> someone review this patch submission, after having let the issue rest for
> several months: I just re-tested the current versions.  Still there are
> no changes for a "regular" build (not using the new configure options).
> On the other hand, configuring GCC as described in the documentation
> update, it is possible to 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.  See
> <http://news.gmane.org/find-root.php?message_id=%3C87k3hioknw.fsf%40kepler.schwinge.homeip.net%3E>
> for the whole story.
>
> The patches looked fine to Cary, but he says they need approval by a
> global maintainer or build machinery maintainer.

The module_srcdir patch is fine (assuming you've tested it on a Canadian 
cross).

The "Non-host system configuration for linker plugins" patch is OK if 
you test it on a Canadian cross (unexpected bugs can pop up with 
Canadian crosses, so you need to test it with build != host != target, 
preferably with all three incompatible).

I don't feel that I understand the lto-plugin code well enough to 
approve that patch.
diff mbox

Patch

diff --git lto-plugin/Makefile.am lto-plugin/Makefile.am
index bbb92f9..f3fb89b 100644
--- lto-plugin/Makefile.am
+++ lto-plugin/Makefile.am
@@ -18,22 +18,25 @@  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,
-LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
-
 liblto_plugin_la_SOURCES = lto-plugin.c
-liblto_plugin_la_LIBADD = \
-	$(if $(wildcard ../libiberty/noasan/libiberty.a),$(Wc)../libiberty/noasan/libiberty.a, \
-	$(if $(wildcard ../libiberty/pic/libiberty.a),$(Wc)../libiberty/pic/libiberty.a,))
-# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS
+# Note that we intentionally override the bindir supplied by ACX_LT_HOST_FLAGS.
 liblto_plugin_la_LDFLAGS = $(AM_LDFLAGS) \
-	$(lt_host_flags) -module -bindir $(libexecsubdir) \
-	$(if $(wildcard ../libiberty/noasan/libiberty.a),, \
-	$(if $(wildcard ../libiberty/pic/libiberty.a),,-Wc,../libiberty/libiberty.a))
-liblto_plugin_la_DEPENDENCIES = $(if $(wildcard \
-	../libiberty/noasan/libiberty.a),../libiberty/noasan/libiberty.a, \
-	$(if $(wildcard ../libiberty/pic/libiberty.a),../libiberty/pic/libiberty.a,))
+	$(lt_host_flags) -module -bindir $(libexecsubdir)
+# Can be simplified when libiberty becomes a normal convenience library.
+libiberty = $(with_libiberty)/libiberty.a
+libiberty_noasan = $(with_libiberty)/noasan/libiberty.a
+libiberty_pic = $(with_libiberty)/pic/libiberty.a
+Wc=-Wc,
+liblto_plugin_la_LIBADD = \
+	$(if $(wildcard $(libiberty_noasan)),$(Wc)$(libiberty_noasan), \
+	$(if $(wildcard $(libiberty_pic)),$(Wc)$(libiberty_pic),))
+liblto_plugin_la_LDFLAGS += \
+	$(if $(wildcard $(libiberty_noasan)),, \
+	$(if $(wildcard $(libiberty_pic)),,-Wc,$(libiberty)))
+liblto_plugin_la_DEPENDENCIES = \
+	$(if $(wildcard $(libiberty_noasan)),$(libiberty_noasan), \
+	$(if $(wildcard $(libiberty_pic)),$(libiberty_pic),))
+LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
 liblto_plugin_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(liblto_plugin_la_LDFLAGS) $(LTLDFLAGS) -o $@
diff --git lto-plugin/Makefile.in lto-plugin/Makefile.in
index 6e2fcc6..0a259e4 100644
--- lto-plugin/Makefile.in
+++ lto-plugin/Makefile.in
[...]
diff --git lto-plugin/configure lto-plugin/configure
index a579b99..6c36dfb 100755
--- lto-plugin/configure
+++ lto-plugin/configure
[...]
diff --git lto-plugin/configure.ac lto-plugin/configure.ac
index a5f1774d..6a5ae8a 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])

commit 4f145a98767b78c083fa981f211d79591e0fe456
Author:     Thomas Schwinge <thomas@codesourcery.com>
AuthorDate: Sun Oct 13 14:36:07 2013 +0200
Commit:     Thomas Schwinge <thomas@codesourcery.com>
CommitDate: Wed May 21 07:24:02 2014 +0200

    Allow for overriding a module's srcdir.
    
    	* Makefile.tpl (configure-[+prefix+][+module+])
    	(configure-stage[+id+]-[+prefix+][+module+]): If specified, use
    	"module_srcdir" instead of "module" for locating a module's srcdir.
    	* Makefile.in: Regenerate.
---
 Makefile.in  | 2200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------
 Makefile.tpl |   19 +-
 2 files changed, 1160 insertions(+), 1059 deletions(-)

diff --git Makefile.in Makefile.in
index bf06dce..41170f4 100644
--- Makefile.in
+++ Makefile.in
[...]
diff --git Makefile.tpl Makefile.tpl
index 54a8dc3..4822c32 100644
--- Makefile.tpl
+++ Makefile.tpl
@@ -1002,12 +1002,13 @@  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=[+? module_srcdir (get "module_srcdir") (get "module")+]; \
 	[+ 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+]
 
@@ -1055,12 +1056,12 @@  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=[+? module_srcdir (get "module_srcdir") (get "module")+]; \
+	$(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

commit 73819b18536890bf99acbe23d60973366b86c1a6
Author:     Thomas Schwinge <thomas@codesourcery.com>
AuthorDate: Sun Oct 13 20:05:14 2013 +0200
Commit:     Thomas Schwinge <thomas@codesourcery.com>
CommitDate: Wed May 21 07:24:02 2014 +0200

    Non-host system configuration for linker plugins.
    
    	* configure.ac (--enable-linker-plugin-configure-flags)
    	(--enable-linker-plugin-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-configure-flags)
    	(--enable-linker-plugin-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 ec2b0f2..239ad36 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;
@@ -338,7 +347,10 @@  dependencies = { module=all-fixincludes; on=all-libiberty; };
 dependencies = { module=all-gnattools; on=all-target-libada; };
 dependencies = { module=all-gnattools; on=all-target-libstdc++-v3; };
 
+// 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 Makefile.in Makefile.in
index 41170f4..329af7f 100644
--- Makefile.in
+++ Makefile.in
[...]
diff --git configure configure
index 36455713..a032d40 100755
--- configure
+++ configure
[...]
diff --git configure.ac configure.ac
index 07c3a66..a05c219 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-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)
+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)
+
 
 # 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 7851b00..c662175 100644
--- gcc/doc/install.texi
+++ gcc/doc/install.texi
@@ -1780,6 +1780,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-configure-flags=FLAGS
+@itemx --enable-linker-plugin-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-configure-flags=--host=i686-pc-linux-gnu \
+    --enable-linker-plugin-flags='CC=gcc\ -m32\ -Wl,-rpath,[...]/i686-pc-linux-gnu/lib'
+@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.