OK.

On Tue, Sep 27, 2016 at 9:47 AM, Richard Biener <rguent...@suse.de> wrote:
>
> 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