From patchwork Mon Mar 14 19:07:22 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rainer Orth X-Patchwork-Id: 86800 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]) by ozlabs.org (Postfix) with SMTP id 77CF7B6EDD for ; Tue, 15 Mar 2011 06:07:39 +1100 (EST) Received: (qmail 2475 invoked by alias); 14 Mar 2011 19:07:38 -0000 Received: (qmail 2465 invoked by uid 22791); 14 Mar 2011 19:07:37 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, TW_XG, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from snape.CeBiTec.Uni-Bielefeld.DE (HELO smtp-relay.CeBiTec.Uni-Bielefeld.DE) (129.70.160.84) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 14 Mar 2011 19:07:31 +0000 Received: from localhost (localhost.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) by smtp-relay.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTP id 19455867; Mon, 14 Mar 2011 20:07:28 +0100 (CET) Received: from smtp-relay.CeBiTec.Uni-Bielefeld.DE ([127.0.0.1]) by localhost (malfoy.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) (amavisd-new, port 10024) with LMTP id OJW6GzHjC6pi; Mon, 14 Mar 2011 20:07:23 +0100 (CET) Received: from manam.CeBiTec.Uni-Bielefeld.DE (manam.CeBiTec.Uni-Bielefeld.DE [129.70.161.120]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-relay.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTPS id 4D6E4866; Mon, 14 Mar 2011 20:07:23 +0100 (CET) Received: (from ro@localhost) by manam.CeBiTec.Uni-Bielefeld.DE (8.14.4+Sun/8.14.4/Submit) id p2EJ7MbG011810; Mon, 14 Mar 2011 20:07:22 +0100 (MET) From: Rainer Orth To: Richard Guenther Cc: gcc-patches@gcc.gnu.org, Paolo Bonzini Subject: Re: [build, lto] Only accept -fuse-linker-plugin if linker supports -plugin (PR lto/46944) References: Date: Mon, 14 Mar 2011 20:07:22 +0100 In-Reply-To: (Richard Guenther's message of "Fri, 11 Mar 2011 16:31:50 +0100 (CET)") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (usg-unix-v) MIME-Version: 1.0 X-IsSubscribed: yes 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 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? 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=*:% 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