After considerable discussion in this thread Unreviewed build, lto patch http://gcc.gnu.org/ml/gcc-patches/2011-02/msg00868.html
Richard's recommendation was to only use the lto-plugin with known-good linkers supporting -plugin, i.e. GNU ld or gold >= 2.21. I'm extracting the binutils version number from gold --version since it's more familiar than the separate gold version number and provides a higher resolution than the gold version number that only changes once per binutils release. Here's the reworked patch that implements this suggestion. I couldn't check with gold yet since it doesn't work on Solaris so far, but i386-pc-solaris2.11 bootstraps with Sun ld and GNU ld 2.21 work as expected, i.e. the failure described in PR lto/46944 is gone. Ok for mainline? Rainer 2011-02-05 Rainer Orth <r...@cebitec.uni-bielefeld.de> 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): Require gld or gold 2.21. * configure: Regenerate. * gcc.c [HAVE_LTO_PLUGIN] (PLUGIN_COND, PLUGIN_COND_CLOSE): Remove. (LINK_PLUGIN_SPEC): Define. Extract from LINK_COMMAND_SPEC, integrate PLUGIN_COND, PLUGIN_COND_CLOSE. [!HAVE_LTO_PLUGIN] (LINK_PLUGIN_SPEC): Define, reject -fuse-linker-plugin. (LINK_COMMAND_SPEC): Use it. diff -r bbab4a602b6f gcc/configure.ac --- a/gcc/configure.ac Sat Feb 26 09:27:25 2011 +0100 +++ b/gcc/configure.ac Sat Mar 05 09:36:08 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 @@ -3176,14 +3193,14 @@ gcc_cv_lto_plugin=no 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 \ + 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=yes 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. + if test "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -ge 21; then + gcc_cv_lto_plugin=yes + fi fi fi if test x"$gcc_cv_lto_plugin" = xyes; then diff -r bbab4a602b6f gcc/gcc.c --- a/gcc/gcc.c Sat Feb 26 09:27:25 2011 +0100 +++ b/gcc/gcc.c Sat Mar 05 09:36:08 2011 +0100 @@ -623,16 +623,20 @@ /* Conditional to test whether 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 + still causes 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. */ + plugin only when LTO is enabled. */ #ifdef HAVE_LTO_PLUGIN -#define PLUGIN_COND "!fno-use-linker-plugin:%{flto|flto=*|fuse-linker-plugin" -#define PLUGIN_COND_CLOSE "}" +#define LINK_PLUGIN_SPEC \ + "%{!fno-use-linker-plugin:%{flto|flto=*|fuse-linker-plugin: \ + -plugin %(linker_plugin_file) \ + -plugin-opt=%(lto_wrapper) \ + -plugin-opt=-fresolution=%u.res \ + %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \ + }}" #else -#define PLUGIN_COND "fuse-linker-plugin" -#define PLUGIN_COND_CLOSE "" +#define LINK_PLUGIN_SPEC "%{fuse-linker-plugin:\ + %e-fuse-linker-plugin is not supported in this configuration}" #endif @@ -648,14 +652,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=*:%<fcompare-debug*} \ + %(linker) " \ + LINK_PLUGIN_SPEC \ + "%{flto|flto=*:%<fcompare-debug*} \ %{flto} %{flto=*} %l " LINK_PIE_SPEC \ "%X %{o*} %{e*} %{N} %{n} %{r}\ %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\ -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University