Hi, as noted in the bug trail the fix for PR48207 broke compilation of C++ programs with -g. This variant fixes the bug too without breaking -g.
Basically we have to set assembler names early also for TYPE_DECLs, we can't rely on the frontends langhook to do that after free_lang_data. Okay for trunk assuming regstrapping on x86_64-linux works? Ciao, Michael. ------------------------ PR debug/48703 * dwarf2out.c (retry_incomplete_types): Export. Clear incomplete_types. * dwarf2out.h (retry_incomplete_types): Declare. * tree.c (need_assembler_name_p): Also handle TYPE_DECLs. (free_lang_data_in_cgraph): Call retry_incomplete_types. (free_lang_data): Reset set_decl_assembler_name langhook. * Makefile.in (tree.o): Depend on dwarf2out.h. Index: tree.c =================================================================== --- tree.c (revision 172769) +++ tree.c (working copy) @@ -61,6 +61,7 @@ along with GCC; see the file COPYING3. #include "except.h" #include "debug.h" #include "intl.h" +#include "dwarf2out.h" /* Tree code classes. */ @@ -4500,7 +4501,8 @@ need_assembler_name_p (tree decl) { /* Only FUNCTION_DECLs and VAR_DECLs are considered. */ if (TREE_CODE (decl) != FUNCTION_DECL - && TREE_CODE (decl) != VAR_DECL) + && TREE_CODE (decl) != VAR_DECL + && TREE_CODE (decl) != TYPE_DECL) return false; /* If DECL already has its assembler name set, it does not need a @@ -4538,6 +4540,11 @@ need_assembler_name_p (tree decl) return false; } + if (TREE_CODE (decl) == TYPE_DECL) + { + if (TYPE_DECL_SUPPRESS_DEBUG (decl)) + return false; + } return true; } @@ -5111,6 +5118,8 @@ free_lang_data_in_cgraph (void) FOR_EACH_VEC_ELT (tree, fld.decls, i, t) assign_assembler_name_if_neeeded (t); + retry_incomplete_types (); + /* Traverse every decl found freeing its language data. */ FOR_EACH_VEC_ELT (tree, fld.decls, i, t) free_lang_data_in_decl (t); @@ -5182,6 +5191,7 @@ free_lang_data (void) name and only produce assembler names for local symbols. Or rather make sure we never call decl_assembler_name on local symbols and devise a separate, middle-end private scheme for it. */ + lang_hooks.set_decl_assembler_name = lhd_set_decl_assembler_name; /* Reset diagnostic machinery. */ diagnostic_starter (global_dc) = default_tree_diagnostic_starter; Index: dwarf2out.c =================================================================== --- dwarf2out.c (revision 172769) +++ dwarf2out.c (working copy) @@ -6575,7 +6575,6 @@ static dw_die_ref force_type_die (tree); static dw_die_ref setup_namespace_context (tree, dw_die_ref); static dw_die_ref declare_in_namespace (tree, dw_die_ref); static struct dwarf_file_data * lookup_filename (const char *); -static void retry_incomplete_types (void); static void gen_type_die_for_member (tree, tree, dw_die_ref); static void gen_generic_params_dies (tree); static void gen_tagged_type_die (tree, dw_die_ref, enum debug_info_usage); @@ -18497,15 +18496,17 @@ gen_entry_point_die (tree decl, dw_die_r /* Walk through the list of incomplete types again, trying once more to emit full debugging info for them. */ -static void +void retry_incomplete_types (void) { int i; - - for (i = VEC_length (tree, incomplete_types) - 1; i >= 0; i--) - if (should_emit_struct_debug (VEC_index (tree, incomplete_types, i), + VEC(tree,gc) *types = incomplete_types; + incomplete_types = NULL; + for (i = VEC_length (tree, types) - 1; i >= 0; i--) + if (should_emit_struct_debug (VEC_index (tree, types, i), DINFO_USAGE_DIR_USE)) - gen_type_die (VEC_index (tree, incomplete_types, i), comp_unit_die ()); + gen_type_die (VEC_index (tree, types, i), comp_unit_die ()); + types = NULL; } /* Determine what tag to use for a record type. */ Index: dwarf2out.h =================================================================== --- dwarf2out.h (revision 172769) +++ dwarf2out.h (working copy) @@ -25,6 +25,8 @@ extern void dwarf2out_cfi_begin_epilogue extern void dwarf2out_frame_debug_restore_state (void); extern void dwarf2out_flush_queued_reg_saves (void); +extern void retry_incomplete_types (void); + extern void debug_dwarf (void); struct die_struct; extern void debug_dwarf_die (struct die_struct *); Index: Makefile.in =================================================================== --- Makefile.in (revision 172769) +++ Makefile.in (working copy) @@ -2354,7 +2354,7 @@ langhooks.o : langhooks.c $(CONFIG_H) $( tree.o: tree.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ all-tree.def $(FLAGS_H) $(FUNCTION_H) $(PARAMS_H) \ toplev.h $(DIAGNOSTIC_CORE_H) $(GGC_H) $(HASHTAB_H) $(TARGET_H) output.h $(TM_P_H) \ - langhooks.h gt-tree.h $(TREE_INLINE_H) tree-iterator.h \ + langhooks.h gt-tree.h $(TREE_INLINE_H) tree-iterator.h dwarf2out.h \ $(BASIC_BLOCK_H) $(TREE_FLOW_H) $(OBSTACK_H) pointer-set.h \ tree-pass.h $(LANGHOOKS_DEF_H) $(DIAGNOSTIC_H) $(CGRAPH_H) $(TIMEVAR_H) \ $(EXCEPT_H) debug.h intl.h tree-diagnostic.h tree-pretty-print.h