This is moving break_out_includes (aka -feliminate-dwarf2-dups handling)
to early finish.  It requires some massaging with the way we pick
up its results which previously "conveniently" ended up in the
limbo list but after moving to early will be scrapped off by
late finish doing a limbo list flush (where we just drop all CU DIEs
thinking it can only be comp_unit_die () itself).  Thus this patch
adds a cu_die_list list for it (much similar to the comdat one we already
have).

Eventually -feliminate-dwarf2-dups might die anyway(?), its testing
coverage is very low and it's declared broken for C++.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Ok for trunk?

Thanks,
Richard.

2016-09-27  Richard Biener  <rguent...@suse.de>

        * dwarf2out.c (cu_die_list): New global.
        (dwarf2out_finish): Walk cu_die_list instead of limbo DIEs.  Add
        main_comp_unit_die to cu_die_list if we created it.
        Move break_out_includes ...
        (dwarf2out_early_finish): ... here.  Push created CU DIEs onto
        the cu_die_list.

diff -u gcc/dwarf2out.c gcc/dwarf2out.c
--- gcc/dwarf2out.c     (working copy)
+++ gcc/dwarf2out.c     (working copy)
@@ -2866,6 +2866,9 @@
 /* A list of type DIEs that have been separated into comdat sections.  */
 static GTY(()) comdat_type_node *comdat_type_list;
 
+/* A list of CU DIEs that have been separated.  */
+static GTY(()) limbo_die_node *cu_die_list;
+
 /* A list of DIEs with a NULL parent waiting to be relocated.  */
 static GTY(()) limbo_die_node *limbo_die_list;
 
@@ -27855,11 +27858,6 @@
   resolve_addr (comp_unit_die ());
   move_marked_base_types ();
 
-  /* Generate separate CUs for each of the include files we've seen.
-     They will go into limbo_die_list.  */
-  if (flag_eliminate_dwarf2_dups)
-    break_out_includes (comp_unit_die ());
-
   /* Initialize sections and labels used for actual assembler output.  */
   init_sections_and_labels ();
 
@@ -27867,7 +27865,7 @@
      have children.  */
   add_sibling_attributes (comp_unit_die ());
   limbo_die_node *node;
-  for (node = limbo_die_list; node; node = node->next)
+  for (node = cu_die_list; node; node = node->next)
     add_sibling_attributes (node->die);
   for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
     add_sibling_attributes (ctnode->root_die);
@@ -27876,7 +27874,15 @@
      skeleton compile_unit DIE that remains in the .o, while
      most attributes go in the DWO compile_unit_die.  */
   if (dwarf_split_debug_info)
-    main_comp_unit_die = gen_compile_unit_die (NULL);
+    {
+      limbo_die_node *cu;
+      main_comp_unit_die = gen_compile_unit_die (NULL);
+      cu = limbo_die_list;
+      gcc_assert (cu->die == main_comp_unit_die);
+      limbo_die_list = limbo_die_list->next;
+      cu->next = cu_die_list;
+      cu_die_list = cu;
+    }
   else
     main_comp_unit_die = comp_unit_die ();
 
@@ -27988,7 +27994,7 @@
 
   /* Output all of the compilation units.  We put the main one last so that
      the offsets are available to output_pubnames.  */
-  for (node = limbo_die_list; node; node = node->next)
+  for (node = cu_die_list; node; node = node->next)
     output_comp_unit (node->die, 0);
 
   hash_table<comdat_type_hasher> comdat_type_table (100);
@@ -28217,6 +28223,21 @@
       prune_unused_types ();
     }
 
+  /* Generate separate CUs for each of the include files we've seen.
+     They will go into limbo_die_list and from there to cu_die_list.  */
+  if (flag_eliminate_dwarf2_dups)
+    {
+      gcc_assert (limbo_die_list == NULL);
+      break_out_includes (comp_unit_die ());
+      limbo_die_node *cu;
+      while ((cu = limbo_die_list))
+       {
+         limbo_die_list = cu->next;
+         cu->next = cu_die_list;
+         cu_die_list = cu;
+       }
+    }
+
   /* The early debug phase is now finished.  */
   early_dwarf_finished = true;
 }

Reply via email to