The following patch addresses the common (?) issue of people
omitting -flto from the linker command-line which gets more
severe with GCC 4.9 where slim LTO objects are emitted by
default.  The patch simply _always_ arranges for the linker
plugin to be used, so if there are any (slim) LTO objects
on the link LTO will be done on them.  Similarly the
non-linker-plugin path in collect2 is adjusted.

You can still disable this by specifying -fno-lto on the 
linker command-line.

One side-effect of enabling the linker-plugin by default
(for HAVE_LTO_PLUGIN == 2) is that collect2 will then
use the configured plugin ld rather than the default ld.
Not sure if that is desired.

Comments?

Thanks,
Richard.

2014-03-04  Richard Biener  <rguent...@suse.de>

        * gcc.c (PLUGIN_COND): Always enable unless -fno-use-linker-plugin
        or -fno-lto is specified and the linker has full plugin support.
        * collect2.c (lto_mode): Default to LTO_MODE_WHOPR if LTO is
        enabled.
        (main): Remove -flto processing, adjust lto_mode using
        use_plugin late.

Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c   (revision 208310)
+++ gcc/gcc.c   (working copy)
@@ -695,7 +695,7 @@ proper position among the other output f
 #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 "!fno-use-linker-plugin:%{!fno-lto"
 #define PLUGIN_COND_CLOSE "}"
 #else
 /* The linker used has limited plugin support, use LTO plugin with explicit
Index: gcc/collect2.c
===================================================================
--- gcc/collect2.c      (revision 208310)
+++ gcc/collect2.c      (working copy)
@@ -192,7 +192,11 @@ enum lto_mode_d {
 };
 
 /* Current LTO mode.  */
+#ifdef ENABLE_LTO
+static enum lto_mode_d lto_mode = LTO_MODE_WHOPR;
+#else
 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
+#endif
 
 bool debug;                            /* true if -debug */
 bool helpflag;                 /* true if --help */
@@ -1018,15 +1022,11 @@ main (int argc, char **argv)
          debug = true;
         else if (! strcmp (argv[i], "-flto-partition=none"))
          no_partition = true;
-        else if ((! strncmp (argv[i], "-flto=", 6)
-                 || ! strcmp (argv[i], "-flto")) && ! use_plugin)
-         lto_mode = LTO_MODE_WHOPR;
        else if (!strncmp (argv[i], "-fno-lto", 8))
          lto_mode = LTO_MODE_NONE;
         else if (! strcmp (argv[i], "-plugin"))
          {
            use_plugin = true;
-           lto_mode = LTO_MODE_NONE;
            if (selected_linker == USE_DEFAULT_LD)
              selected_linker = USE_PLUGIN_LD;
          }
@@ -1056,6 +1056,8 @@ main (int argc, char **argv)
       }
     vflag = debug;
     find_file_set_debug (debug);
+    if (use_plugin)
+      lto_mode = LTO_MODE_NONE;
     if (no_partition && lto_mode == LTO_MODE_WHOPR)
       lto_mode = LTO_MODE_LTO;
   }

Reply via email to