From 29a50dfb47ff12c7730a3d604642ce500a39c78f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 8 Jun 2018 18:12:39 +0200 Subject: [PATCH] dumpfile.c (FIRST_ME_AUTO_NUMBERED_DUMP): Bump to 4. * dumpfile.c (FIRST_ME_AUTO_NUMBERED_DUMP): Bump to 4. * lto-lang.c (lto_link_dump_id, decl_merge_dump_id, partition_dump_id): New global vars. (lto_register_dumps): New hook. (LANG_HOOKS_REGISTER_DUMPS): New. * lto-partition.c: Dump into dump_file instead of symtab->dump_file. * lto-symtab.c: Include lto.h; dump into dump_file instead of symtab->dump_file. (lto_symtab_merge_decls): Initialize dump file. * lto.c (read_cgraph_and_symbols): Initialize dump file. (do_whole_program_analysis): Likewise. From-SVN: r261337 --- gcc/ChangeLog | 4 +++ gcc/dumpfile.c | 2 +- gcc/lto/ChangeLog | 13 ++++++++ gcc/lto/lto-lang.c | 22 ++++++++++++ gcc/lto/lto-partition.c | 66 ++++++++++++++++++------------------ gcc/lto/lto-symtab.c | 74 +++++++++++++++++++++++------------------ gcc/lto/lto.c | 61 +++++++++++++++++++++------------ gcc/lto/lto.h | 2 ++ 8 files changed, 155 insertions(+), 89 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd3769fcf77..1e67efcca28 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2018-06-08 Jan Hubicka + + * dumpfile.c (FIRST_ME_AUTO_NUMBERED_DUMP): Bump to 4. + 2018-06-08 David Edelsohn * config/rs6000/rs6000.c (rs6000_passes_ieee128): Protect with #if diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c index e94e2747829..3dd41c42a7f 100644 --- a/gcc/dumpfile.c +++ b/gcc/dumpfile.c @@ -65,7 +65,7 @@ static struct dump_file_info dump_files[TDI_end] = DUMP_FILE_INFO (".gimple", "tree-gimple", DK_tree, 0), DUMP_FILE_INFO (".nested", "tree-nested", DK_tree, 0), #define FIRST_AUTO_NUMBERED_DUMP 1 -#define FIRST_ME_AUTO_NUMBERED_DUMP 3 +#define FIRST_ME_AUTO_NUMBERED_DUMP 4 DUMP_FILE_INFO (NULL, "lang-all", DK_lang, 0), DUMP_FILE_INFO (NULL, "tree-all", DK_tree, 0), diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index aaf375bc307..feb98bbb521 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,16 @@ +2018-06-08 Jan Hubicka + + * lto-lang.c (lto_link_dump_id, decl_merge_dump_id, partition_dump_id): + New global vars. + (lto_register_dumps): New hook. + (LANG_HOOKS_REGISTER_DUMPS): New. + * lto-partition.c: Dump into dump_file instead of symtab->dump_file. + * lto-symtab.c: Include lto.h; dump into dump_file instead of + symtab->dump_file. + (lto_symtab_merge_decls): Initialize dump file. + * lto.c (read_cgraph_and_symbols): Initialize dump file. + (do_whole_program_analysis): Likewise. + 2018-06-08 Martin Liska * lto-partition.c (lto_balanced_map): Use cgraph_node::uid diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 1a70f4f1eec..a1a41bc2751 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -37,6 +37,9 @@ along with GCC; see the file COPYING3. If not see #include "stringpool.h" #include "attribs.h" +/* LTO specific dumps. */ +int lto_link_dump_id, decl_merge_dump_id, partition_dump_id; + static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *); static tree handle_leaf_attribute (tree *, tree, tree, int, bool *); static tree handle_const_attribute (tree *, tree, tree, int, bool *); @@ -1375,6 +1378,23 @@ lto_init (void) return true; } +/* Register c++-specific dumps. */ + +void +lto_register_dumps (gcc::dump_manager *dumps) +{ + lto_link_dump_id = dumps->dump_register + (".lto-link", "ipa-lto-link", "ipa-lto-link", + DK_ipa, OPTGROUP_NONE, false); + decl_merge_dump_id = dumps->dump_register + (".lto-decl-merge", "ipa-lto-decl-merge", "ipa-lto-decl-merge", + DK_ipa, OPTGROUP_NONE, false); + partition_dump_id = dumps->dump_register + (".lto-partition", "ipa-lto-partition", "ipa-lto-partition", + DK_ipa, OPTGROUP_NONE, false); +} + + /* Initialize tree structures required by the LTO front end. */ static void lto_init_ts (void) @@ -1390,6 +1410,8 @@ static void lto_init_ts (void) #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lto_complain_wrong_lang_p #undef LANG_HOOKS_INIT_OPTIONS_STRUCT #define LANG_HOOKS_INIT_OPTIONS_STRUCT lto_init_options_struct +#undef LANG_HOOKS_REGISTER_DUMPS +#define LANG_HOOKS_REGISTER_DUMPS lto_register_dumps #undef LANG_HOOKS_HANDLE_OPTION #define LANG_HOOKS_HANDLE_OPTION lto_handle_option #undef LANG_HOOKS_POST_OPTIONS diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 006eec77b26..0ceb1b63f95 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -160,8 +160,8 @@ add_symbol_to_partition_1 (ltrans_partition part, symtab_node *node) if (symbol_partitioned_p (node)) { node->in_other_partition = 1; - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Symbol node %s now used in multiple partitions\n", node->name ()); } @@ -541,13 +541,13 @@ lto_balanced_map (int n_lto_partitions, int max_partition_size) order.qsort (node_cmp); noreorder.qsort (node_cmp); - if (symtab->dump_file) + if (dump_file) { for (unsigned i = 0; i < order.length (); i++) - fprintf (symtab->dump_file, "Balanced map symbol order:%s:%u\n", + fprintf (dump_file, "Balanced map symbol order:%s:%u\n", order[i]->name (), order[i]->tp_first_run); for (unsigned i = 0; i < noreorder.length (); i++) - fprintf (symtab->dump_file, "Balanced map symbol no_reorder:%s:%u\n", + fprintf (dump_file, "Balanced map symbol no_reorder:%s:%u\n", noreorder[i]->name (), noreorder[i]->tp_first_run); } @@ -569,8 +569,8 @@ lto_balanced_map (int n_lto_partitions, int max_partition_size) partition_size = PARAM_VALUE (MIN_PARTITION_SIZE); npartitions = 1; partition = new_partition (""); - if (symtab->dump_file) - fprintf (symtab->dump_file, "Total unit size: %" PRId64 ", partition size: %" PRId64 "\n", + if (dump_file) + fprintf (dump_file, "Total unit size: %" PRId64 ", partition size: %" PRId64 "\n", total_size, partition_size); auto_vec next_nodes; @@ -763,8 +763,8 @@ lto_balanced_map (int n_lto_partitions, int max_partition_size) best_n_nodes = lto_symtab_encoder_size (partition->encoder); best_varpool_pos = varpool_pos; } - if (symtab->dump_file) - fprintf (symtab->dump_file, "Step %i: added %s/%i, size %i, " + if (dump_file) + fprintf (dump_file, "Step %i: added %s/%i, size %i, " "cost %" PRId64 "/%" PRId64 " " "best %" PRId64 "/%" PRId64", step %i\n", i, order[i]->name (), order[i]->order, @@ -777,16 +777,16 @@ lto_balanced_map (int n_lto_partitions, int max_partition_size) { if (best_i != i) { - if (symtab->dump_file) - fprintf (symtab->dump_file, "Unwinding %i insertions to step %i\n", + if (dump_file) + fprintf (dump_file, "Unwinding %i insertions to step %i\n", i - best_i, best_i); undo_partition (partition, best_n_nodes); varpool_pos = best_varpool_pos; } gcc_assert (best_size == partition->insns); i = best_i; - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Partition insns: %i (want %" PRId64 ")\n", partition->insns, partition_size); /* When we are finished, avoid creating empty partition. */ @@ -799,8 +799,8 @@ lto_balanced_map (int n_lto_partitions, int max_partition_size) last_visited_node = 0; cost = 0; - if (symtab->dump_file) - fprintf (symtab->dump_file, "New partition\n"); + if (dump_file) + fprintf (dump_file, "New partition\n"); best_n_nodes = 0; best_cost = -1; @@ -812,8 +812,8 @@ lto_balanced_map (int n_lto_partitions, int max_partition_size) /* Watch for overflow. */ partition_size = INT_MAX / 16; - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Total size: %" PRId64 " partition_size: %" PRId64 "\n", total_size, partition_size); if (partition_size < PARAM_VALUE (MIN_PARTITION_SIZE)) @@ -840,21 +840,21 @@ lto_balanced_map (int n_lto_partitions, int max_partition_size) gcc_assert (next_nodes.length () || npartitions != 1 || !best_cost || best_cost == -1); add_sorted_nodes (next_nodes, partition); - if (symtab->dump_file) + if (dump_file) { - fprintf (symtab->dump_file, "\nPartition sizes:\n"); + fprintf (dump_file, "\nPartition sizes:\n"); unsigned partitions = ltrans_partitions.length (); for (unsigned i = 0; i < partitions ; i++) { ltrans_partition p = ltrans_partitions[i]; - fprintf (symtab->dump_file, "partition %d contains %d (%2.2f%%)" + fprintf (dump_file, "partition %d contains %d (%2.2f%%)" " symbols and %d (%2.2f%%) insns\n", i, p->symbols, 100.0 * p->symbols / order.length (), p->insns, 100.0 * p->insns / original_total_size); } - fprintf (symtab->dump_file, "\n"); + fprintf (dump_file, "\n"); } } @@ -869,8 +869,8 @@ must_not_rename (symtab_node *node, const char *name) if (node->lto_file_data && lto_get_decl_name_mapping (node->lto_file_data, name) != name) { - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Not privatizing symbol name: %s. It privatized already.\n", name); return true; @@ -881,8 +881,8 @@ must_not_rename (symtab_node *node, const char *name) that are not really clones. */ if (node->unique_name) { - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Not privatizing symbol name: %s. Has unique name.\n", name); return true; @@ -972,8 +972,8 @@ privatize_symbol_name_1 (symtab_node *node, tree decl) IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))); - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Privatizing symbol name: %s -> %s\n", name, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))); @@ -1018,8 +1018,8 @@ promote_symbol (symtab_node *node) TREE_PUBLIC (node->decl) = 1; DECL_VISIBILITY (node->decl) = VISIBILITY_HIDDEN; DECL_VISIBILITY_SPECIFIED (node->decl) = true; - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Promoting as hidden: %s (%s)\n", node->name (), IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl))); @@ -1035,8 +1035,8 @@ promote_symbol (symtab_node *node) TREE_PUBLIC (alias->decl) = 1; DECL_VISIBILITY (alias->decl) = VISIBILITY_HIDDEN; DECL_VISIBILITY_SPECIFIED (alias->decl) = true; - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Promoting alias as hidden: %s\n", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl))); } @@ -1102,8 +1102,8 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node *node) if (!s) return; - if (symtab->dump_file) - fprintf (symtab->dump_file, + if (dump_file) + fprintf (dump_file, "Renaming statics with asm name: %s\n", node->name ()); /* Assign every symbol in the set that shares the same ASM name an unique diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index b1df9bb77d1..a40ba1f32ef 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see #include "ipa-utils.h" #include "builtins.h" #include "alias.h" +#include "lto.h" #include "lto-symtab.h" #include "stringpool.h" #include "attribs.h" @@ -45,9 +46,9 @@ lto_cgraph_replace_node (struct cgraph_node *node, struct cgraph_edge *e, *next; bool compatible_p; - if (symtab->dump_file) + if (dump_file) { - fprintf (symtab->dump_file, "Replacing cgraph node %s by %s" + fprintf (dump_file, "Replacing cgraph node %s by %s" " for symbol %s\n", node->dump_name (), prevailing_node->dump_name (), @@ -211,7 +212,7 @@ warn_type_compatibility_p (tree prevailing_type, tree type, if (TREE_CODE (type) != TREE_CODE (prevailing_type)) lev |= 1; lev |= warn_type_compatibility_p (TREE_TYPE (prevailing_type), - TREE_TYPE (type), false); + TREE_TYPE (type), false); if (TREE_CODE (type) == METHOD_TYPE && TREE_CODE (prevailing_type) == METHOD_TYPE) lev |= warn_type_compatibility_p (TYPE_METHOD_BASETYPE (prevailing_type), @@ -271,7 +272,7 @@ warn_type_compatibility_p (tree prevailing_type, tree type, if (set1 && set2 && set1 != set2) { - tree t1 = type, t2 = prevailing_type; + tree t1 = type, t2 = prevailing_type; /* Alias sets of arrays with aliased components are the same as alias sets of the inner types. */ @@ -283,10 +284,10 @@ warn_type_compatibility_p (tree prevailing_type, tree type, t1 = TREE_TYPE (t1); t2 = TREE_TYPE (t2); } - if ((!POINTER_TYPE_P (t1) || !POINTER_TYPE_P (t2)) + if ((!POINTER_TYPE_P (t1) || !POINTER_TYPE_P (t2)) || (set1 != TYPE_ALIAS_SET (ptr_type_node) && set2 != TYPE_ALIAS_SET (ptr_type_node))) - lev |= 5; + lev |= 5; } } @@ -325,7 +326,7 @@ lto_symtab_merge (symtab_node *prevailing, symtab_node *entry) DECL_POSSIBLY_INLINED (decl) |= DECL_POSSIBLY_INLINED (prevailing_decl); if (warn_type_compatibility_p (TREE_TYPE (prevailing_decl), - TREE_TYPE (decl), + TREE_TYPE (decl), DECL_COMMON (decl) || DECL_EXTERNAL (decl))) return false; @@ -536,8 +537,8 @@ lto_symtab_merge_p (tree prevailing, tree decl) { if (TREE_CODE (prevailing) != TREE_CODE (decl)) { - if (symtab->dump_file) - fprintf (symtab->dump_file, "Not merging decls; " + if (dump_file) + fprintf (dump_file, "Not merging decls; " "TREE_CODE mismatch\n"); return false; } @@ -547,8 +548,8 @@ lto_symtab_merge_p (tree prevailing, tree decl) { if (DECL_BUILT_IN (prevailing) != DECL_BUILT_IN (decl)) { - if (symtab->dump_file) - fprintf (symtab->dump_file, "Not merging decls; " + if (dump_file) + fprintf (dump_file, "Not merging decls; " "DECL_BUILT_IN mismatch\n"); return false; } @@ -556,8 +557,8 @@ lto_symtab_merge_p (tree prevailing, tree decl) && (DECL_BUILT_IN_CLASS (prevailing) != DECL_BUILT_IN_CLASS (decl) || DECL_FUNCTION_CODE (prevailing) != DECL_FUNCTION_CODE (decl))) { - if (symtab->dump_file) - fprintf (symtab->dump_file, "Not merging decls; " + if (dump_file) + fprintf (dump_file, "Not merging decls; " "DECL_BUILT_IN_CLASS or CODE mismatch\n"); return false; } @@ -572,8 +573,8 @@ lto_symtab_merge_p (tree prevailing, tree decl) if ((prev_attr == NULL) != (attr == NULL) || (prev_attr && !attribute_value_equal (prev_attr, attr))) { - if (symtab->dump_file) - fprintf (symtab->dump_file, "Not merging decls; " + if (dump_file) + fprintf (dump_file, "Not merging decls; " "error attribute mismatch\n"); return false; } @@ -583,8 +584,8 @@ lto_symtab_merge_p (tree prevailing, tree decl) if ((prev_attr == NULL) != (attr == NULL) || (prev_attr && !attribute_value_equal (prev_attr, attr))) { - if (symtab->dump_file) - fprintf (symtab->dump_file, "Not merging decls; " + if (dump_file) + fprintf (dump_file, "Not merging decls; " "warning attribute mismatch\n"); return false; } @@ -593,8 +594,8 @@ lto_symtab_merge_p (tree prevailing, tree decl) attr = lookup_attribute ("noreturn", DECL_ATTRIBUTES (decl)); if ((prev_attr == NULL) != (attr == NULL)) { - if (symtab->dump_file) - fprintf (symtab->dump_file, "Not merging decls; " + if (dump_file) + fprintf (dump_file, "Not merging decls; " "noreturn attribute mismatch\n"); return false; } @@ -631,7 +632,7 @@ lto_symtab_merge_decls_2 (symtab_node *first, bool diagnosed_p) visited. */ if (lto_symtab_prevailing_decl (e->decl) != e->decl || !lto_symtab_symbol_p (e) - || e->decl == prevailing->decl) + || e->decl == prevailing->decl) continue; if (!lto_symtab_merge (prevailing, e) @@ -683,9 +684,9 @@ lto_symtab_merge_decls_2 (symtab_node *first, bool diagnosed_p) FOR_EACH_VEC_ELT (mismatches, i, decl) { /* Do not diagnose two built-in declarations, there is no useful - location in that case. It also happens for AVR if two built-ins - use the same asm name because their libgcc assembler code is the - same, see PR78562. */ + location in that case. It also happens for AVR if two built-ins + use the same asm name because their libgcc assembler code is the + same, see PR78562. */ if (DECL_IS_BUILTIN (prevailing->decl) && DECL_IS_BUILTIN (decl)) continue; @@ -719,7 +720,7 @@ lto_symtab_merge_decls_2 (symtab_node *first, bool diagnosed_p) diagnosed_p |= diag; } else if ((DECL_USER_ALIGN (prevailing->decl) - && DECL_USER_ALIGN (decl)) + && DECL_USER_ALIGN (decl)) && DECL_ALIGN (prevailing->decl) < DECL_ALIGN (decl)) { diagnosed_p |= warning_at (DECL_SOURCE_LOCATION (decl), @@ -753,13 +754,13 @@ lto_symtab_merge_decls_1 (symtab_node *first) symtab_node *prevailing; bool diagnosed_p = false; - if (symtab->dump_file) + if (dump_file) { - fprintf (symtab->dump_file, "Merging nodes for %s. Candidates:\n", + fprintf (dump_file, "Merging nodes for %s. Candidates:\n", first->asm_name ()); for (e = first; e; e = e->next_sharing_asm_name) if (TREE_PUBLIC (e->decl)) - e->dump (symtab->dump_file); + e->dump (dump_file); } /* Compute the symbol resolutions. This is a no-op when using the @@ -849,11 +850,11 @@ lto_symtab_merge_decls_1 (symtab_node *first) mismatches. */ lto_symtab_merge_decls_2 (prevailing, diagnosed_p); - if (symtab->dump_file) + if (dump_file) { - fprintf (symtab->dump_file, "After resolution:\n"); + fprintf (dump_file, "After resolution:\n"); for (e = prevailing; e; e = e->next_sharing_asm_name) - e->dump (symtab->dump_file); + e->dump (dump_file); } } @@ -864,6 +865,9 @@ lto_symtab_merge_decls (void) { symtab_node *node; + gcc_assert (!dump_file); + dump_file = dump_begin (decl_merge_dump_id, NULL); + /* Populate assembler name hash. */ symtab->symtab_initialize_asm_name_hash (); @@ -871,6 +875,10 @@ lto_symtab_merge_decls (void) if (!node->previous_sharing_asm_name && node->next_sharing_asm_name) lto_symtab_merge_decls_1 (node); + + if (dump_file) + dump_end (decl_merge_dump_id, dump_file); + dump_file = NULL; } /* Helper to process the decl chain for the symbol table entry *SLOT. */ @@ -897,7 +905,7 @@ lto_symtab_merge_symbols_1 (symtab_node *prevailing) /* No matter how we are going to deal with resolution, we will ultimately use prevailing definition. */ if (ce) - ipa_merge_profiles (dyn_cast (prevailing), + ipa_merge_profiles (dyn_cast (prevailing), dyn_cast (e)); /* If we decided to replace the node by TO, do it. */ @@ -919,7 +927,7 @@ lto_symtab_merge_symbols_1 (symtab_node *prevailing) { lto_free_function_in_decl_state_for_node (ce); if (!ce->weakref) - ce->release_body (); + ce->release_body (); ce->reset (); symtab->call_cgraph_removal_hooks (ce); } @@ -956,7 +964,7 @@ lto_symtab_merge_symbols (void) symtab->symtab_initialize_asm_name_hash (); /* Do the actual merging. - At this point we invalidate hash translating decls into symtab nodes + At this point we invalidate hash translating decls into symtab nodes because after removing one of duplicate decls the hash is not correcly updated to the ohter dupliate. */ FOR_EACH_SYMBOL (node) diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 17634797c6e..3b57c12bc9f 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -2972,29 +2972,43 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames) all_file_decl_data[i]->current_decl_state = NULL; } - /* Finally merge the cgraph according to the decl merging decisions. */ - timevar_push (TV_IPA_LTO_CGRAPH_MERGE); - if (symtab->dump_file) - { - fprintf (symtab->dump_file, "Before merging:\n"); - symtab->dump (symtab->dump_file); - } if (!flag_ltrans) { + /* Finally merge the cgraph according to the decl merging decisions. */ + timevar_push (TV_IPA_LTO_CGRAPH_MERGE); + + gcc_assert (!dump_file); + dump_file = dump_begin (lto_link_dump_id, NULL); + + if (dump_file) + { + fprintf (dump_file, "Before merging:\n"); + symtab->dump (dump_file); + } lto_symtab_merge_symbols (); /* Removal of unreachable symbols is needed to make verify_symtab to pass; we are still having duplicated comdat groups containing local statics. We could also just remove them while merging. */ symtab->remove_unreachable_nodes (dump_file); + ggc_collect (); + + if (dump_file) + dump_end (lto_link_dump_id, dump_file); + dump_file = NULL; + timevar_pop (TV_IPA_LTO_CGRAPH_MERGE); } - ggc_collect (); symtab->state = IPA_SSA; - /* FIXME: Technically all node removals happening here are useless, because - WPA should not stream them. */ + /* All node removals happening here are useless, because + WPA should not stream them. Still always perform remove_unreachable_nodes + because we may reshape clone tree, get rid of dead masters of inline + clones and remove symbol entries for read-only variables we keep around + only to be able to constant fold them. */ if (flag_ltrans) - symtab->remove_unreachable_nodes (dump_file); - - timevar_pop (TV_IPA_LTO_CGRAPH_MERGE); + { + if (symtab->dump_file) + symtab->dump (symtab->dump_file); + symtab->remove_unreachable_nodes (symtab->dump_file); + } /* Indicate that the cgraph is built and ready. */ symtab->function_flags_ready = true; @@ -3152,19 +3166,19 @@ do_whole_program_analysis (void) if (seen_error ()) return; - if (symtab->dump_file) - { - fprintf (symtab->dump_file, "Optimized "); - symtab->dump (symtab->dump_file); - } - - symtab_node::checking_verify_symtab_nodes (); - bitmap_obstack_release (NULL); - /* We are about to launch the final LTRANS phase, stop the WPA timer. */ timevar_pop (TV_WHOPR_WPA); timevar_push (TV_WHOPR_PARTITIONING); + + gcc_assert (!dump_file); + dump_file = dump_begin (partition_dump_id, NULL); + + if (dump_file) + symtab->dump (dump_file); + + symtab_node::checking_verify_symtab_nodes (); + bitmap_obstack_release (NULL); if (flag_lto_partition == LTO_PARTITION_1TO1) lto_1_to_1_map (); else if (flag_lto_partition == LTO_PARTITION_MAX) @@ -3192,6 +3206,9 @@ do_whole_program_analysis (void) to globals with hidden visibility because they are accessed from multiple partitions. */ lto_promote_cross_file_statics (); + if (dump_file) + dump_end (partition_dump_id, dump_file); + dump_file = NULL; timevar_pop (TV_WHOPR_PARTITIONING); timevar_stop (TV_PHASE_OPT_GEN); diff --git a/gcc/lto/lto.h b/gcc/lto/lto.h index 9dab2adedcf..6893fc87cd6 100644 --- a/gcc/lto/lto.h +++ b/gcc/lto/lto.h @@ -51,6 +51,8 @@ extern void lto_obj_end_section (void); extern lto_file *lto_set_current_out_file (lto_file *file); extern lto_file *lto_get_current_out_file (void); +extern int lto_link_dump_id, decl_merge_dump_id, partition_dump_id; + /* Hash table entry to hold the start offset and length of an LTO section in a .o file. */ struct lto_section_slot -- 2.30.2