[Bug lto/86321] [9 Regression] ICE: in splice_child_die, at dwarf2out.c:5693 for several Fortran tests with -g -flto

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jun 26 13:07:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86321

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
We're generating types late via

  if ((origin == NULL && !specialization_p)
      || (origin != NULL
          && !DECL_ABSTRACT_P (decl_or_origin)
          && variably_modified_type_p (TREE_TYPE (decl_or_origin),
                                       decl_function_context
                                                        (decl_or_origin))))
    {
      tree type = TREE_TYPE (decl_or_origin);

      if (decl_by_reference_p (decl_or_origin))
        add_type_attribute (var_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false,
                            context_die);
      else
        add_type_attribute (var_die, type, decl_quals (decl_or_origin), false,
                            context_die);
    }

but then somehow end up doing this twice and get confused with gen_member_die
having an old DIE in an existing correct place but we just generated the
parent again.

      /* If we thought we were generating minimal debug info for TYPE
         and then changed our minds, some of the member declarations
         may have already been defined.  Don't define them again, but
         do put them in the right order.  */

      if (dw_die_ref child = lookup_decl_die (member))
        {
...
          if (child->die_tag == DW_TAG_variable
              && child->die_parent == comp_unit_die ()
              && ref == NULL)
            {
              reparent_child (child, context_die);
              if (dwarf_version < 5)
                child->die_tag = DW_TAG_member;
            }
          else
            splice_child_die (context_die, child);

we run into splice_child_die with child already having a (non-comp_unit_die)
parent.

The solution is of course to not generate the type twice.  Not sure how
easy that is to wire in.

Or to avoid generating anything but "stub" types for late LTO when
origin == NULL.


More information about the Gcc-bugs mailing list