From patchwork Thu May 22 10:56:58 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Schwinge X-Patchwork-Id: 351429 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 94BDF14008B for ; Thu, 22 May 2014 20:57:22 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:in-reply-to:references:date:message-id :mime-version:content-type; q=dns; s=default; b=MepRClUQaitmYSSV opaEd/1A7YWryK8CjbQhPb4lNSEXrl3ojP615hyMTvjvl0x0WzmIouKfNjJCRsys JFaZYKyji8aP9LNXEUJBKFQxitdgbILpZcfh89oiNcLPCYcVzhKRocZ4aFnPWyBo I5e9JlJXePg/jbRBHc9izAo2V1w= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:in-reply-to:references:date:message-id :mime-version:content-type; s=default; bh=PFhuliXjaFf5MFmsgmKzQo hgxDs=; b=H1ikcpUIIyedFjrfEJ+20rNrQYGj87QrPLkY0qhDO8jWnIoyPx6XZH bqI4Ug3mScv7yEroQmow9rvoM4Lc9YFBQ/IHcfN/tvMEVWkPqrVYFAVhhC8rZxcm tmS3IMGtnBFD+f20INnwhpd9DeezG5uM9BPeKI23TARnrXmPrxEaQ= Received: (qmail 1189 invoked by alias); 22 May 2014 10:57:13 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 1165 invoked by uid 89); 22 May 2014 10:57:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 22 May 2014 10:57:09 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1WnQgK-0003Se-46 from Thomas_Schwinge@mentor.com ; Thu, 22 May 2014 03:57:04 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 22 May 2014 03:57:04 -0700 Received: from feldtkeller.schwinge.homeip.net (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.2.247.3; Thu, 22 May 2014 11:57:02 +0100 From: Thomas Schwinge To: , , DJ Delorie , , Alexandre Oliva , Ralf Wildenhues CC: Cary Coutant Subject: Re: lto-plugin: mismatch between ld's architecture and GCC's configure --host In-Reply-To: <87txct5qkn.fsf@kepler.schwinge.homeip.net> References: <87k3hioknw.fsf@kepler.schwinge.homeip.net> <87a9icno3o.fsf@kepler.schwinge.homeip.net> <87k3h1g6fn.fsf@kepler.schwinge.homeip.net> <87habubdma.fsf@kepler.schwinge.homeip.net> <878uwtu3q2.fsf@kepler.schwinge.homeip.net> <87y53nr5qr.fsf@kepler.schwinge.homeip.net> <87zjn4f3nt.fsf@kepler.schwinge.homeip.net> <87txct5qkn.fsf@kepler.schwinge.homeip.net> User-Agent: Notmuch/0.9-101-g81dad07 (http://notmuchmail.org) Emacs/23.4.1 (i486-pc-linux-gnu) Date: Thu, 22 May 2014 12:56:58 +0200 Message-ID: <87mweaw079.fsf@kepler.schwinge.homeip.net> MIME-Version: 1.0 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 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 AuthorDate: Sun Oct 13 16:15:56 2013 +0200 Commit: Thomas Schwinge 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 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 AuthorDate: Sun Oct 13 14:36:07 2013 +0200 Commit: Thomas Schwinge 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 AuthorDate: Sun Oct 13 20:05:14 2013 +0200 Commit: Thomas Schwinge 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) : 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.