Hello.

In g:3835aa0eb90292d652dd6b200f302f3cac7e643f, I changed logic that the output
-flto=foo argument is taken from IL file command lines. However, it should be 
also
merged with linker command line. One can use -flto for compilation and -flto=16 
for linking.
Ready after it finishes tests?
Thanks,
Martin

gcc/ChangeLog:

        * lto-wrapper.c (merge_flto_options): Factor out a new function.
        (merge_and_complain): Use it.
        (run_gcc): Merge also linker command line -flto=foo argument
        with IL files.
---
 gcc/lto-wrapper.c | 118 +++++++++++++++++++++++++---------------------
 1 file changed, 65 insertions(+), 53 deletions(-)

diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index a71d6147152..1c2643984f9 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -189,6 +189,37 @@ find_option (vec<cl_decoded_option> &options, 
cl_decoded_option *option)
   return find_option (options, option->opt_index);
 }
+/* Merge -flto FOPTION into vector of DECODED_OPTIONS. */
+
+static void
+merge_flto_options (vec<cl_decoded_option> &decoded_options,
+                   cl_decoded_option *foption)
+{
+  int existing_opt = find_option (decoded_options, foption);
+  if (existing_opt == -1)
+    decoded_options.safe_push (*foption);
+  else
+    {
+      if (strcmp (foption->arg, decoded_options[existing_opt].arg) != 0)
+       {
+         /* -flto=auto is preferred.  */
+         if (strcmp (decoded_options[existing_opt].arg, "auto") == 0)
+           ;
+         else if (strcmp (foption->arg, "auto") == 0
+                  || strcmp (foption->arg, "jobserver") == 0)
+           decoded_options[existing_opt].arg = foption->arg;
+         else if (strcmp (decoded_options[existing_opt].arg,
+                          "jobserver") != 0)
+           {
+             int n = atoi (foption->arg);
+             int original_n = atoi (decoded_options[existing_opt].arg);
+             if (n > original_n)
+               decoded_options[existing_opt].arg = foption->arg;
+           }
+       }
+    }
+}
+
 /* Try to merge and complain about options FDECODED_OPTIONS when applied
    ontop of DECODED_OPTIONS.  */
@@ -427,28 +458,7 @@ merge_and_complain (vec<cl_decoded_option> decoded_options,
          break;
case OPT_flto_:
-         if (existing_opt == -1)
-           decoded_options.safe_push (*foption);
-         else
-           {
-             if (strcmp (foption->arg, decoded_options[existing_opt].arg) != 0)
-               {
-                 /* -flto=auto is preferred.  */
-                 if (strcmp (decoded_options[existing_opt].arg, "auto") == 0)
-                   ;
-                 else if (strcmp (foption->arg, "auto") == 0
-                          || strcmp (foption->arg, "jobserver") == 0)
-                   decoded_options[existing_opt].arg = foption->arg;
-                 else if (strcmp (decoded_options[existing_opt].arg,
-                                  "jobserver") != 0)
-                   {
-                     int n = atoi (foption->arg);
-                     int original_n = atoi (decoded_options[existing_opt].arg);
-                     if (n > original_n)
-                       decoded_options[existing_opt].arg = foption->arg;
-                   }
-               }
-           }
+         merge_flto_options (decoded_options, foption);
          break;
        }
     }
@@ -1515,37 +1525,6 @@ run_gcc (unsigned argc, char *argv[])
   append_compiler_options (&argv_obstack, fdecoded_options);
   append_linker_options (&argv_obstack, decoded_options);
- /* Process LTO-related options on merged options. */
-  for (j = 1; j < fdecoded_options.length (); ++j)
-    {
-      cl_decoded_option *option = &fdecoded_options[j];
-      switch (option->opt_index)
-       {
-       case OPT_flto_:
-         if (strcmp (option->arg, "jobserver") == 0)
-           {
-             parallel = 1;
-             jobserver = 1;
-           }
-         else if (strcmp (option->arg, "auto") == 0)
-           {
-             parallel = 1;
-             auto_parallel = 1;
-           }
-         else
-           {
-             parallel = atoi (option->arg);
-             if (parallel <= 1)
-               parallel = 0;
-           }
-         /* Fallthru.  */
-
-       case OPT_flto:
-         lto_mode = LTO_MODE_WHOPR;
-         break;
-       }
-    }
-
   /* Scan linker driver arguments for things that are of relevance to us.  */
   for (j = 1; j < decoded_options.length (); ++j)
     {
@@ -1574,6 +1553,8 @@ run_gcc (unsigned argc, char *argv[])
          break;
case OPT_flto_:
+         /* Merge linker -flto= option with what we have in IL files.  */
+         merge_flto_options (fdecoded_options, option);
          if (strcmp (option->arg, "jobserver") == 0)
            jobserver_requested = true;
          break;
@@ -1596,6 +1577,37 @@ run_gcc (unsigned argc, char *argv[])
        }
     }
+ /* Process LTO-related options on merged options. */
+  for (j = 1; j < fdecoded_options.length (); ++j)
+    {
+      cl_decoded_option *option = &fdecoded_options[j];
+      switch (option->opt_index)
+       {
+       case OPT_flto_:
+         if (strcmp (option->arg, "jobserver") == 0)
+           {
+             parallel = 1;
+             jobserver = 1;
+           }
+         else if (strcmp (option->arg, "auto") == 0)
+           {
+             parallel = 1;
+             auto_parallel = 1;
+           }
+         else
+           {
+             parallel = atoi (option->arg);
+             if (parallel <= 1)
+               parallel = 0;
+           }
+         /* Fallthru.  */
+
+       case OPT_flto:
+         lto_mode = LTO_MODE_WHOPR;
+         break;
+       }
+    }
+
   /* Output lto-wrapper invocation command.  */
   if (verbose)
     {
--
2.31.1

Reply via email to