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; }