lto-wrapper.c (ltrans_priorities): New static var.
authorJan Hubicka <jh@suse.cz>
Mon, 30 Apr 2018 14:40:10 +0000 (16:40 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 30 Apr 2018 14:40:10 +0000 (14:40 +0000)
* lto-wrapper.c (ltrans_priorities): New static var.
(cmp_priority): New.
(run_gcc): Read priorities and if doing parallel build order
the Makefile by them.

* lto.c (cmp_partitions_size): Remove.
(lto_wpa_write_files): Also output priorities; do not sort partitions.
(cmp_partition_order): Move to ...
* lto-partition.c (cmp_partition_order): ...
(lto_1_to_1_map): Sort partitions.

From-SVN: r259767

gcc/ChangeLog
gcc/lto-wrapper.c
gcc/lto/ChangeLog
gcc/lto/lto-partition.c
gcc/lto/lto.c

index 15c3059d710e2be7e35dffedcbbf04a321f553f0..a3ea6420dfad768aa5181ae5014fdbc2f312a574 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-30  Jan Hubicka  <jh@suse.cz>
+
+       * lto-wrapper.c (ltrans_priorities): New static var.
+       (cmp_priority): New.
+       (run_gcc): Read priorities and if doing parallel build order
+       the Makefile by them.
+
 2018-04-30  David Malcolm  <dmalcolm@redhat.com>
 
        * input.h (builtins_location_check): Convert to a STATIC_ASSERT.
index f1f059cbfc0f58b4175bd1baa62dbc163488eb97..a61d5dd2e44a7ac6d6920326d4e7427b3b1336d6 100644 (file)
@@ -65,6 +65,7 @@ static enum lto_mode_d lto_mode = LTO_MODE_NONE;
 static char *ltrans_output_file;
 static char *flto_out;
 static unsigned int nr;
+static int *ltrans_priorities;
 static char **input_names;
 static char **output_names;
 static char **offload_names;
@@ -1018,6 +1019,13 @@ debug_objcopy (const char *infile)
   return outfile;
 }
 
+/* Helper for qsort: compare priorities for parallel compilation.  */
+
+int
+cmp_priority (const void *a, const void *b)
+{
+  return *((const int *)b)-*((const int *)a);
+}
 
 
 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
@@ -1477,6 +1485,7 @@ cont1:
       FILE *stream = fopen (ltrans_output_file, "r");
       FILE *mstream = NULL;
       struct obstack env_obstack;
+      int priority;
 
       if (!stream)
        fatal_error (input_location, "fopen: %s: %m", ltrans_output_file);
@@ -1492,6 +1501,14 @@ cont1:
          size_t len;
 
          buf = input_name;
+          if (fscanf (stream, "%i\n", &priority) != 1)
+           {
+             if (!feof (stream))
+               fatal_error (input_location,
+                            "Corrupted ltrans output file %s",
+                            ltrans_output_file);
+             break;
+           }
 cont:
          if (!fgets (buf, piece, stream))
            break;
@@ -1508,8 +1525,12 @@ cont:
            output_name = &input_name[1];
 
          nr++;
+         ltrans_priorities
+            = (int *)xrealloc (ltrans_priorities, nr * sizeof (int) * 2);
          input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
          output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
+         ltrans_priorities[(nr-1)*2] = priority;
+         ltrans_priorities[(nr-1)*2+1] = nr-1;
          input_names[nr-1] = input_name;
          output_names[nr-1] = output_name;
        }
@@ -1521,6 +1542,7 @@ cont:
        {
          makefile = make_temp_file (".mk");
          mstream = fopen (makefile, "w");
+         qsort (ltrans_priorities, nr, sizeof (int) * 2, cmp_priority);
        }
 
       /* Execute the LTRANS stage for each input file (or prepare a
@@ -1586,7 +1608,10 @@ cont:
 
          fprintf (mstream, "all:");
          for (i = 0; i < nr; ++i)
-           fprintf (mstream, " \\\n\t%s", output_names[i]);
+           {
+             int j = ltrans_priorities[i*2 + 1];
+             fprintf (mstream, " \\\n\t%s", output_names[j]);
+           }
          fprintf (mstream, "\n");
          fclose (mstream);
          if (!jobserver)
@@ -1630,6 +1655,7 @@ cont:
          free (input_names[i]);
        }
       nr = 0;
+      free (ltrans_priorities);
       free (output_names);
       free (input_names);
       free (list_option_full);
index d54ef50a84be6d67a7d1bc54d87b566d68cc95d2..77e5915b1632f3e28dda1fc1fe4247c074089901 100644 (file)
@@ -1,3 +1,11 @@
+2018-04-30  Jan Hubicka  <jh@suse.cz>
+
+       * lto.c (cmp_partitions_size): Remove.
+       (lto_wpa_write_files): Also output priorities; do not sort partitions.
+       (cmp_partition_order): Move to ...
+       * lto-partition.c (cmp_partition_order): ...
+       (lto_1_to_1_map): Sort partitions.
+
 2018-04-20  Jan Hubicka  <jh@suse.cz>
 
        * lto-partition.c (lto_balanced_map): Fix sanity check.
index 3efebe73babfb129c9f914e6396453eef71b39e7..637e5e24b980e4f0ac434e6517982b39f32a56aa 100644 (file)
@@ -42,6 +42,24 @@ vec<ltrans_partition> ltrans_partitions;
 static void add_symbol_to_partition (ltrans_partition part, symtab_node *node);
 
 
+/* Helper for qsort; compare partitions and return one with smaller order.  */
+
+static int
+cmp_partitions_order (const void *a, const void *b)
+{
+  const struct ltrans_partition_def *pa
+     = *(struct ltrans_partition_def *const *)a;
+  const struct ltrans_partition_def *pb
+     = *(struct ltrans_partition_def *const *)b;
+  int ordera = -1, orderb = -1;
+
+  if (lto_symtab_encoder_size (pa->encoder))
+    ordera = lto_symtab_encoder_deref (pa->encoder, 0)->order;
+  if (lto_symtab_encoder_size (pb->encoder))
+    orderb = lto_symtab_encoder_deref (pb->encoder, 0)->order;
+  return orderb - ordera;
+}
+
 /* Create new partition with name NAME.  */
 
 static ltrans_partition
@@ -334,6 +352,9 @@ lto_1_to_1_map (void)
   if (!npartitions)
     new_partition ("empty");
 
+  /* Order partitions by order of symbols because they are linked into binary
+     that way.  */
+  ltrans_partitions.qsort (cmp_partitions_order);
 }
 
 /* Maximal partitioning.  Put every new symbol into new partition if possible.  */
index 1c55f3f691adca90bd2f074795c56b103b3b40d7..d2ccaf676893785a60c31c58f13163d2e1b9c1ca 100644 (file)
@@ -2327,38 +2327,6 @@ free_section_data (struct lto_file_decl_data *file_data ATTRIBUTE_UNUSED,
 
 static lto_file *current_lto_file;
 
-/* Helper for qsort; compare partitions and return one with smaller size.
-   We sort from greatest to smallest so parallel build doesn't stale on the
-   longest compilation being executed too late.  */
-
-static int
-cmp_partitions_size (const void *a, const void *b)
-{
-  const struct ltrans_partition_def *pa
-     = *(struct ltrans_partition_def *const *)a;
-  const struct ltrans_partition_def *pb
-     = *(struct ltrans_partition_def *const *)b;
-  return pb->insns - pa->insns;
-}
-
-/* Helper for qsort; compare partitions and return one with smaller order.  */
-
-static int
-cmp_partitions_order (const void *a, const void *b)
-{
-  const struct ltrans_partition_def *pa
-     = *(struct ltrans_partition_def *const *)a;
-  const struct ltrans_partition_def *pb
-     = *(struct ltrans_partition_def *const *)b;
-  int ordera = -1, orderb = -1;
-
-  if (lto_symtab_encoder_size (pa->encoder))
-    ordera = lto_symtab_encoder_deref (pa->encoder, 0)->order;
-  if (lto_symtab_encoder_size (pb->encoder))
-    orderb = lto_symtab_encoder_deref (pb->encoder, 0)->order;
-  return orderb - ordera;
-}
-
 /* Actually stream out ENCODER into TEMP_FILENAME.  */
 
 static void
@@ -2468,7 +2436,8 @@ lto_wpa_write_files (void)
   ltrans_partition part;
   FILE *ltrans_output_list_stream;
   char *temp_filename;
-  vec <char *>temp_filenames = vNULL;
+  auto_vec <char *>temp_filenames;
+  auto_vec <int>temp_priority;
   size_t blen;
 
   /* Open the LTRANS output list.  */
@@ -2496,15 +2465,6 @@ lto_wpa_write_files (void)
 
   n_sets = ltrans_partitions.length ();
 
-  /* Sort partitions by size so small ones are compiled last.
-     FIXME: Even when not reordering we may want to output one list for parallel make
-     and other for final link command.  */
-
-  if (!flag_profile_reorder_functions || !flag_profile_use)
-    ltrans_partitions.qsort (flag_toplevel_reorder
-                          ? cmp_partitions_size
-                          : cmp_partitions_order);
-
   for (i = 0; i < n_sets; i++)
     {
       ltrans_partition part = ltrans_partitions[i];
@@ -2556,6 +2516,7 @@ lto_wpa_write_files (void)
 
       part->encoder = NULL;
 
+      temp_priority.safe_push (part->insns);
       temp_filenames.safe_push (xstrdup (temp_filename));
     }
   ltrans_output_list_stream = fopen (ltrans_output_list, "w");
@@ -2565,13 +2526,13 @@ lto_wpa_write_files (void)
   for (i = 0; i < n_sets; i++)
     {
       unsigned int len = strlen (temp_filenames[i]);
-      if (fwrite (temp_filenames[i], 1, len, ltrans_output_list_stream) < len
+      if (fprintf (ltrans_output_list_stream, "%i\n", temp_priority[i]) < 0
+         || fwrite (temp_filenames[i], 1, len, ltrans_output_list_stream) < len
          || fwrite ("\n", 1, 1, ltrans_output_list_stream) < 1)
        fatal_error (input_location, "writing to LTRANS output list %s: %m",
                     ltrans_output_list);
      free (temp_filenames[i]);
     }
-  temp_filenames.release();
 
   lto_stats.num_output_files += n_sets;