dumpfile.c (FIRST_ME_AUTO_NUMBERED_DUMP): Bump to 4.
authorJan Hubicka <hubicka@ucw.cz>
Fri, 8 Jun 2018 16:12:39 +0000 (18:12 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 8 Jun 2018 16:12:39 +0000 (16:12 +0000)
* 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
gcc/dumpfile.c
gcc/lto/ChangeLog
gcc/lto/lto-lang.c
gcc/lto/lto-partition.c
gcc/lto/lto-symtab.c
gcc/lto/lto.c
gcc/lto/lto.h

index cd3769fcf77c52b1a90ed8d52398a91b31b37d4a..1e67efcca28e67a40ac8bdf5c2846fe1cbdeb4be 100644 (file)
@@ -1,3 +1,7 @@
+2018-06-08  Jan Hubicka  <hubicka@ucw.cz>
+
+       * dumpfile.c (FIRST_ME_AUTO_NUMBERED_DUMP): Bump to 4.
+
 2018-06-08  David Edelsohn  <dje.gcc@gmail.com>
 
        * config/rs6000/rs6000.c (rs6000_passes_ieee128): Protect with #if
index e94e274782934b5bcb5306337ff157c880b3e861..3dd41c42a7fa409ff312900b04ceae4f28929113 100644 (file)
@@ -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),
index aaf375bc3071663cac86e76ce80dba15554d2236..feb98bbb521b6bd8cf010181b072f5635aff3eef 100644 (file)
@@ -1,3 +1,16 @@
+2018-06-08  Jan Hubicka  <hubicka@ucw.cz>
+
+       * 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  <mliska@suse.cz>
 
        * lto-partition.c (lto_balanced_map): Use cgraph_node::uid
index 1a70f4f1eeca04c0adc1c71d75c606d38900d1f2..a1a41bc27512c99607c8af93161e7d79ec031aac 100644 (file)
@@ -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
index 006eec77b26617a19028adb775b0b3189e8f39a3..0ceb1b63f953e7376a473fd1ef24b97a86452893 100644 (file)
@@ -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<symtab_node *> 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
index b1df9bb77d13a450e621bd84daa94dc15e1d8005..a40ba1f32eff706a7d9d9a45935843010ac19df4 100644 (file)
@@ -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<cgraph_node *> (prevailing),
+       ipa_merge_profiles (dyn_cast<cgraph_node *> (prevailing),
                              dyn_cast<cgraph_node *> (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)
index 17634797c6edd7efee7699a29f50fd2043b27112..3b57c12bc9ff23ef8da83482802d167d3aee2942 100644 (file)
@@ -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);
index 9dab2adedcfffa8a87f0d6a727da614520e95729..6893fc87cd63ea6fece5af82f0c30f25f853e10e 100644 (file)
@@ -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