mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 18:20:51 +08:00
re PR driver/46944 (gcc should accept -fuse-linker-plugin only if linker handles -plugin)
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. From-SVN: r171039
This commit is contained in:
parent
c2969d8ee4
commit
55b465747a
@ -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.
|
||||
|
@ -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
|
||||
|
59
gcc/configure
vendored
59
gcc/configure
vendored
@ -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; }
|
||||
|
||||
|
@ -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
|
||||
|
43
gcc/gcc.c
43
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user