From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7699 invoked by alias); 15 Mar 2011 09:42:41 -0000 Received: (qmail 7682 invoked by uid 22791); 15 Mar 2011 09:42:40 -0000 X-SWARE-Spam-Status: No, hits=-5.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,TW_XG,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cantor.suse.de (HELO mx1.suse.de) (195.135.220.2) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 15 Mar 2011 09:42:32 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 4D4F174609; Tue, 15 Mar 2011 10:42:29 +0100 (CET) Date: Tue, 15 Mar 2011 09:42:00 -0000 From: Richard Guenther To: Rainer Orth Cc: gcc-patches@gcc.gnu.org, Paolo Bonzini Subject: Re: [build, lto] Only accept -fuse-linker-plugin if linker supports -plugin (PR lto/46944) In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-03/txt/msg00805.txt.bz2 On Mon, 14 Mar 2011, Rainer Orth wrote: > Richard Guenther writes: > > >> > Can you update your patch with the tri-state solution? > >> > >> Sure if the solution is deemed acceptable. There isn't much point in > >> following that route if you see problems up front. > > > > If that solution avoids 3) then yes, I'm fine with going that route. > > Both 1) and 2) are very desirable anyway. > > Here's the updated patch, which also incorporates Paolo's suggestion. > Bootstrapped without regressions on i386-pc-solaris2.11 with Sun as/ld > and GNU as/ld 2.21. I couldn't really test the middle ground (gold 2.20 > with limited plugin support) since even mainline gold doesn't work for > me yet. What I've done is rebuild xgcc after manually changing > HAVE_LTO_PLUGIN to 1 in auto-host.h. After I realized that I needed to > remove the existing specs file, that variant worked as expected in that > -plugin is only passed to the linker with an explicit > -fuse-linker-plugin. > > I had to make a last-minute change when I realized that two other uses > of #ifdef HAVE_LTO_PLUGIN needed to be updated since that macro is now > always defined. I'm running fresh bootstraps to make sure nothing broke > that way. > > Ok for mainline if that passes, and perhaps also the 4.6 branch? I'm ok with this for mainline - Paolo, can you double-check the autofoo stuff? As for 4.6 I'd like to give it a day or two on trunk to allow people to report problems. Thanks, Richard. > Thanks. > Rainer > > > 2011-02-05 Rainer Orth > > PR lto/46944 > * configure.ac (gcc_cv_gld_major_version, gcc_cv_gld_minor): > Handle in-tree gold. > (ld_vers): Extract binutils version for gold. > (gcc_cv_ld_hidden): Handle gold here. > (gcc_cv_lto_plugin): Determine level of linker plugin support. > * configure: Regenerate. > * config.in: Regenerate. > * gcc.c: Only use LTO plugin if HAVE_LTO_PLUGIN > 0, reject > -fuse-linker-plugin otherwise. > (LINK_PLUGIN_SPEC): Define. Extract from LINK_COMMAND_SPEC. > (LINK_COMMAND_SPEC): Use it. > (main): Only look for LTOPLUGINSONAME if HAVE_LTO_PLUGIN > 0. > > diff -r 71f0a0dc3338 gcc/configure.ac > --- a/gcc/configure.ac Mon Mar 14 19:57:51 2011 +0100 > +++ b/gcc/configure.ac Mon Mar 14 19:59:05 2011 +0100 > @@ -1967,7 +1967,8 @@ > esac > > AC_MSG_CHECKING(what linker to use) > -if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext; then > +if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext \ > + || test "$gcc_cv_ld" = ../gold/ld-new$build_exeext; then > # Single tree build which includes ld. We want to prefer it > # over whatever linker top-level may have detected, since > # we'll use what we're building after installation anyway. > @@ -1978,6 +1979,8 @@ > || grep 'EMUL = .*linux' ../ld/Makefile \ > || grep 'EMUL = .*lynx' ../ld/Makefile) > /dev/null; then > in_tree_ld_is_elf=yes > + elif test "$ld_is_gold" = yes; then > + in_tree_ld_is_elf=yes > fi > for f in $gcc_cv_ld_bfd_srcdir/configure $gcc_cv_ld_gld_srcdir/configure $gcc_cv_ld_gld_srcdir/configure.in $gcc_cv_ld_gld_srcdir/Makefile.in > do > @@ -2192,11 +2195,23 @@ > changequote(,)dnl > if test $in_tree_ld != yes ; then > ld_ver=`$gcc_cv_ld --version 2>/dev/null | sed 1q` > - if test x"$ld_is_gold" = xyes; then > - gcc_cv_ld_hidden=yes > - elif echo "$ld_ver" | grep GNU > /dev/null; then > - ld_vers=`echo $ld_ver | sed -n \ > - -e 's,^.*[ ]\([0-9][0-9]*\.[0-9][0-9]*.*\)$,\1,p'` > + if echo "$ld_ver" | grep GNU > /dev/null; then > + if test x"$ld_is_gold" = xyes; then > + # GNU gold --version looks like this: > + # > + # GNU gold (GNU Binutils 2.21.51.20110225) 1.11 > + # > + # We extract the binutils version which is more familiar and specific > + # than the gold version. > + ld_vers=`echo $ld_ver | sed -n \ > + -e 's,^[^)]*[ ]\([0-9][0-9]*\.[0-9][0-9]*[^)]*\)) .*$,\1,p'` > + else > + # GNU ld --version looks like this: > + # > + # GNU ld (GNU Binutils) 2.21.51.20110225 > + ld_vers=`echo $ld_ver | sed -n \ > + -e 's,^.*[ ]\([0-9][0-9]*\.[0-9][0-9]*.*\)$,\1,p'` > + fi > ld_date=`echo $ld_ver | sed -n 's,^.*\([2-9][0-9][0-9][0-9]\)[-]*\([01][0-9]\)[-]*\([0-3][0-9]\).*$,\1\2\3,p'` > ld_vers_major=`expr "$ld_vers" : '\([0-9]*\)'` > ld_vers_minor=`expr "$ld_vers" : '[0-9]*\.\([0-9]*\)'` > @@ -2235,7 +2250,9 @@ > fi > else > gcc_cv_ld_hidden=yes > - if echo "$ld_ver" | grep GNU > /dev/null; then > + if test x"$ld_is_gold" = xyes; then > + : > + elif echo "$ld_ver" | grep GNU > /dev/null; then > if test 0"$ld_date" -lt 20020404; then > if test -n "$ld_date"; then > # If there was date string, but was earlier than 2002-04-04, fail > @@ -3173,23 +3190,27 @@ > fi > > AC_MSG_CHECKING(linker plugin support) > -gcc_cv_lto_plugin=no > +gcc_cv_lto_plugin=0 > if test -f liblto_plugin.la; then > if test $in_tree_ld = yes -a x"$ORIGINAL_PLUGIN_LD_FOR_TARGET=" = x"$gcc_cv_ld"; then > - if test x"$ld_is_gold" = xyes; then > - gcc_cv_lto_plugin=yes > - elif test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 21 -o "$gcc_cv_gld_major_version" -gt 2; then \ > - gcc_cv_lto_plugin=yes > + if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 21 -o "$gcc_cv_gld_major_version" -gt 2; then > + gcc_cv_lto_plugin=2 > + elif test "$ld_is_gold" = yes -a "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -eq 20; then > + gcc_cv_lto_plugin=1 > + > fi > - # Check if the linker supports --plugin-opt option > - elif $ORIGINAL_PLUGIN_LD_FOR_TARGET --help 2>/dev/null | grep plugin-opt > /dev/null; then > - gcc_cv_lto_plugin=yes > + elif echo "$ld_ver" | grep GNU > /dev/null; then > + # Require GNU ld or gold 2.21+ for plugin support by default. > + if test "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -ge 21; then > + gcc_cv_lto_plugin=2 > + # Allow -fuse-linker-plugin to enable plugin support in GNU gold 2.20. > + elif test "$ld_is_gold" = yes -a "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -eq 20; then > + gcc_cv_lto_plugin=1 > + fi > fi > fi > -if test x"$gcc_cv_lto_plugin" = xyes; then > - AC_DEFINE(HAVE_LTO_PLUGIN, 1, > -[Define if your linker supports plugin.]) > -fi > +AC_DEFINE_UNQUOTED(HAVE_LTO_PLUGIN, $gcc_cv_lto_plugin, > + [Define to the level of your linker's plugin support.]) > AC_MSG_RESULT($gcc_cv_lto_plugin) > > case "$target" in > diff -r 71f0a0dc3338 gcc/gcc.c > --- a/gcc/gcc.c Mon Mar 14 19:57:51 2011 +0100 > +++ b/gcc/gcc.c Mon Mar 14 19:59:05 2011 +0100 > @@ -621,19 +621,37 @@ > # endif > #endif > > -/* Conditional to test whether plugin is used or not. > +/* Conditional to test whether the LTO plugin is used or not. > FIXME: For slim LTO we will need to enable plugin unconditionally. This > still cause problems with PLUGIN_LD != LD and when plugin is built but > not useable. For GCC 4.6 we don't support slim LTO and thus we can enable > plugin only when LTO is enabled. We still honor explicit > - -fuse-linker-plugin. */ > -#ifdef HAVE_LTO_PLUGIN > + -fuse-linker-plugin if the linker used understands -plugin. */ > + > +/* The linker has some plugin support. */ > +#if HAVE_LTO_PLUGIN > 0 > +/* The linker used has full plugin support, use LTO plugin by default. */ > +#if HAVE_LTO_PLUGIN == 2 > #define PLUGIN_COND "!fno-use-linker-plugin:%{flto|flto=*|fuse-linker-plugin" > #define PLUGIN_COND_CLOSE "}" > #else > +/* The linker used has limited plugin support, use LTO plugin with explicit > + -fuse-linker-plugin. */ > #define PLUGIN_COND "fuse-linker-plugin" > #define PLUGIN_COND_CLOSE "" > #endif > +#define LINK_PLUGIN_SPEC \ > + "%{"PLUGIN_COND": \ > + -plugin %(linker_plugin_file) \ > + -plugin-opt=%(lto_wrapper) \ > + -plugin-opt=-fresolution=%u.res \ > + %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \ > + }"PLUGIN_COND_CLOSE > +#else > +/* The linker used doesn't support -plugin, reject -fuse-linker-plugin. */ > +#define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\ > + %e-fuse-linker-plugin is not supported in this configuration}" > +#endif > > > /* -u* was put back because both BSD and SysV seem to support it. */ > @@ -648,14 +666,9 @@ > #ifndef LINK_COMMAND_SPEC > #define LINK_COMMAND_SPEC "\ > %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ > - %(linker) \ > - %{"PLUGIN_COND": \ > - -plugin %(linker_plugin_file) \ > - -plugin-opt=%(lto_wrapper) \ > - -plugin-opt=-fresolution=%u.res \ > - %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \ > - }"PLUGIN_COND_CLOSE" \ > - %{flto|flto=*:% + %(linker) " \ > + LINK_PLUGIN_SPEC \ > + "%{flto|flto=*:% %{flto} %{flto=*} %l " LINK_PIE_SPEC \ > "%X %{o*} %{e*} %{N} %{n} %{r}\ > %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\ > @@ -6815,11 +6828,13 @@ > if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2) > { > int tmp = execution_count; > -#ifdef HAVE_LTO_PLUGIN > +#if HAVE_LTO_PLUGIN > 0 > +#if HAVE_LTO_PLUGIN == 2 > const char *fno_use_linker_plugin = "fno-use-linker-plugin"; > #else > const char *fuse_linker_plugin = "fuse-linker-plugin"; > #endif > +#endif > > /* We'll use ld if we can't find collect2. */ > if (! strcmp (linker_name_spec, "collect2")) > @@ -6829,7 +6844,8 @@ > linker_name_spec = "ld"; > } > > -#ifdef HAVE_LTO_PLUGIN > +#if HAVE_LTO_PLUGIN > 0 > +#if HAVE_LTO_PLUGIN == 2 > if (!switch_matches (fno_use_linker_plugin, > fno_use_linker_plugin + strlen (fno_use_linker_plugin), 0)) > #else > @@ -6843,6 +6859,7 @@ > if (!linker_plugin_file_spec) > fatal_error ("-fuse-linker-plugin, but " LTOPLUGINSONAME " not found"); > } > +#endif > lto_gcc_spec = argv[0]; > > /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables > > > -- Richard Guenther Novell / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex