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

--- Comment #23 from Richard Biener <rguenth at gcc dot gnu.org> ---
When doing LTO early-debug work I stumbled over one reason we can crash here
which I fixed with

Index: dwarf2out.c
===================================================================
*** dwarf2out.c (revision 222165)
--- dwarf2out.c (working copy)
*************** resolve_addr (dw_die_ref die)
*** 23950,23957 ****
                && DECL_EXTERNAL (tdecl)
                && DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE)
              {
!               force_decl_die (tdecl);
!               tdie = lookup_decl_die (tdecl);
              }
            if (tdie)
              {
--- 23950,23964 ----
                && DECL_EXTERNAL (tdecl)
                && DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE)
              {
!               /* Creating a full DIE for tdecl is overly expensive and
!                  at this point (with early debug active) even wrong
!                  as it can end up generating new type DIEs we didn't
!                  output.  */
!               tdie = new_die (DW_TAG_subprogram, comp_unit_die (),
NULL_TREE);
!               add_AT_flag (tdie, DW_AT_external, 1);
!               add_AT_flag (tdie, DW_AT_declaration, 1);
!               add_linkage_attr (tdie, tdecl);
!               equate_decl_number_to_die (tdecl, tdie);
              }
            if (tdie)
              {

change the comment to "at this point (with LTO) even wrong" and it still
applies.  The point is, if we didn't create a DIE for the external decl
it isn't a good idea to create a full DIE for it for the reference.  Just
create a DIE with enough info for the debugger (I suppose that's the
linkage name?  I really didn't check whether that's ok for the purpose
of DW_TAG_GNU_call_site - Jakub?  (not sure if we have guality checks
that cover this very case)

ISTR that for the case I ran into the call was to some builtin function.

The above patch fixes this bug.

Reply via email to