https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83157
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> --- A workaround might be in dwarf2out_function_decl push/pop the decl_die_table like with a "simple" undo stack: Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 256378) +++ gcc/dwarf2out.c (working copy) @@ -3159,6 +3159,7 @@ struct decl_die_hasher : ggc_ptr_hash<di /* A hash table of references to DIE's that describe declarations. The key is a DECL_UID() which is a unique number identifying each decl. */ static GTY (()) hash_table<decl_die_hasher> *decl_die_table; +static vec<std::pair<tree, dw_die_ref> > *decl_die_table_undo_stack; struct GTY ((for_user)) variable_value_struct { unsigned int decl_id; @@ -5762,7 +5763,10 @@ equate_decl_number_to_die (tree decl, dw { unsigned int decl_id = DECL_UID (decl); - *decl_die_table->find_slot_with_hash (decl, decl_id, INSERT) = decl_die; + dw_die_ref *slot = decl_die_table->find_slot_with_hash (decl, decl_id, INSERT); + if (*slot && decl_die_table_undo_stack) + decl_die_table_undo_stack->safe_push (std::make_pair (decl, *slot)); + *slot = decl_die; decl_die->decl_id = decl_id; } @@ -26044,6 +26048,10 @@ dwarf2out_decl (tree decl) static void dwarf2out_function_decl (tree decl) { + vec<std::pair<tree, dw_die_ref> > *undo_stack + = new vec<std::pair<tree, dw_die_ref> > (); + decl_die_table_undo_stack = undo_stack; + dwarf2out_decl (decl); call_arg_locations = NULL; call_arg_loc_last = NULL; @@ -26051,6 +26059,15 @@ dwarf2out_function_decl (tree decl) tail_call_site_count = -1; decl_loc_table->empty (); cached_dw_loc_list_table->empty (); + + decl_die_table_undo_stack = NULL; + while (! undo_stack->is_empty ()) + { + std::pair<tree, dw_die_ref> op = undo_stack->pop (); + equate_decl_number_to_die (op.first, op.second); + } + + delete undo_stack; } /* Output a marker (i.e. a label) for the beginning of the generated code for