diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ee08364dc0839699865390198e4778b12f1698a..351c745608f932bf5b7f7a3e3a73ed9503477280 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2011-03-16 Rainer Orth <ro@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): 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. + 2011-03-16 Jakub Jelinek <jakub@redhat.com> * emit-rtl.c (try_split): Don't call copy_call_info debug hook. diff --git a/gcc/config.in b/gcc/config.in index 7604b687a899d853baf57844532c5082f649f00a..f4885ca8374b5eada08caa418a96d9d8af8844e8 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -1252,7 +1252,7 @@ #endif -/* Define if your linker supports plugin. */ +/* Define to the level of your linker's plugin support. */ #ifndef USED_FOR_TARGET #undef HAVE_LTO_PLUGIN #endif diff --git a/gcc/configure b/gcc/configure index e5e6164102c749675422d6f7e490bca0435f515a..a2f78c394164c77af49b29f1834ad0d92feec0f2 100755 --- a/gcc/configure +++ b/gcc/configure @@ -21096,7 +21096,8 @@ esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking what linker to use" >&5 $as_echo_n "checking what linker to use... " >&6; } -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. @@ -21108,6 +21109,8 @@ $as_echo "newly built ld" >&6; } || 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 @@ -21716,11 +21719,23 @@ fi 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]*\)'` @@ -21762,7 +21777,9 @@ else 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 @@ -23115,24 +23132,30 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker plugin support" >&5 $as_echo_n "checking linker plugin support... " >&6; } -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 + 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 - # 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 fi fi -if test x"$gcc_cv_lto_plugin" = xyes; then -$as_echo "#define HAVE_LTO_PLUGIN 1" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define HAVE_LTO_PLUGIN $gcc_cv_lto_plugin +_ACEOF -fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_lto_plugin" >&5 $as_echo "$gcc_cv_lto_plugin" >&6; } diff --git a/gcc/configure.ac b/gcc/configure.ac index fd4dd4644740246fad56c6d4c2bbfafe207dc704..2e83b2d46daa404a70d769492617862bb01d7a24 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -1967,7 +1967,8 @@ case "$ORIGINAL_LD_FOR_TARGET" in 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 @@ if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext; then || 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 @@ fi 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 @@ AC_CACHE_CHECK(linker for .hidden support, gcc_cv_ld_hidden, 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 @@ if test x"$demangler_in_ld" = xyes; then 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 + 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 - # 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 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 --git a/gcc/gcc.c b/gcc/gcc.c index 75f522e1db5180b770887467af42ad5799803dbd..ef308e33dc3fb6e04e125a2e23385c8e0c2799c4 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -621,19 +621,37 @@ proper position among the other output files. */ # 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 @@ proper position among the other output files. */ #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}}\ @@ -6815,10 +6828,12 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" 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. */ @@ -6829,7 +6844,8 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" 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 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" 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