aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/lto-wrapper.c28
-rw-r--r--gcc/lto/ChangeLog11
-rw-r--r--gcc/lto/lto-partition.c21
-rw-r--r--gcc/lto/lto.c49
5 files changed, 74 insertions, 45 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b081fb0d320..57fc209c2fb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2018-05-02 Jan Hubicka <jh@suse.cz>
+
+ Backport from mainline
+ 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-06-25 Segher Boessenkool <segher@kernel.crashing.org>
Backport from trunk
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index f1f059cbfc0..a61d5dd2e44 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -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);
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 1deb8da83f2..af4b956baae 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,14 @@
+2018-05-02 Jan Hubicka <jh@suse.cz>
+
+ Backport from mainline
+ 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-05-02 Release Manager
* GCC 8.1.0 released.
diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 60daafdf375..12150214a53 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -41,6 +41,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
@@ -332,6 +350,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. */
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 1c55f3f691a..d2ccaf67689 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -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;