From b6e33d73d8aa1b7965d6b2bf08b5bbd673e63284 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 30 Apr 2018 16:40:10 +0200 Subject: [PATCH] lto-wrapper.c (ltrans_priorities): New static var. * 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 | 7 ++++++ gcc/lto-wrapper.c | 28 ++++++++++++++++++++++- gcc/lto/ChangeLog | 8 +++++++ gcc/lto/lto-partition.c | 21 ++++++++++++++++++ gcc/lto/lto.c | 49 +++++------------------------------------ 5 files changed, 68 insertions(+), 45 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 15c3059d710..a3ea6420dfa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-04-30 Jan Hubicka + + * 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 * input.h (builtins_location_check): Convert to a STATIC_ASSERT. 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 d54ef50a84b..77e5915b163 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,11 @@ +2018-04-30 Jan Hubicka + + * 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 * lto-partition.c (lto_balanced_map): Fix sanity check. diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 3efebe73bab..637e5e24b98 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -42,6 +42,24 @@ vec 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. */ 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 temp_filenames = vNULL; + auto_vec temp_filenames; + auto_vec 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; -- 2.30.2