https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> --- OK, so during early creation of the DIE for the type we end up in static void gen_struct_or_union_type_die (tree type, dw_die_ref context_die, enum debug_info_usage usage) { ... int complete = (TYPE_SIZE (type) && (! TYPE_STUB_DECL (type) || ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)))); where complete is false because of TYPE_DECL_SUPPRESS_DEBUG. When record the type to be re-processed later and between now and then the C++ FE does note_debug_info_needed via maybe_emit_vtables and clears TYPE_DECL_SUPPRESS_DEBUG, causing the type to be completed during retry_incomplete_types processing. I think PR93951 may be related in the end because the conditions on when exactly we emit what parts of debug info is quite intricate in dwarf2out. Now, for this bug I guess we should choose to piggy-back on that, making should_emit_struct_debug return false for DINFO_LEVEL_TERSE or initializing debug_struct_{generic,ordinary} accordingly. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index b1fa6f5ff7c..378a27394e8 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -399,6 +399,9 @@ get_full_len (const wide_int &op) static bool should_emit_struct_debug (tree type, enum debug_info_usage usage) { + if (debug_info_level <= DINFO_LEVEL_TERSE) + return false; + enum debug_struct_file criterion; tree type_decl; bool generic = lang_hooks.types.generic_p (type); thoughts? The DWARF we generate for the testcase at -g1 is then <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) <c> DW_AT_producer : (indirect string, offset: 0x0): GNU C++14 10.0.1 2 0200325 (experimental) -mtune=generic -march=x86-64 -g1 <10> DW_AT_language : 4 (C++) <11> DW_AT_name : (indirect string, offset: 0x4a): t.ii <15> DW_AT_comp_dir : (indirect string, offset: 0x4f): /home/rguenther/ obj/gcc <19> DW_AT_ranges : 0x0 <1d> DW_AT_low_pc : 0x0 <25> DW_AT_stmt_list : 0x0 <1><29>: Abbrev Number: 2 (DW_TAG_variable) <2a> DW_AT_name : b <2c> DW_AT_decl_file : 1 <2d> DW_AT_decl_line : 3 <2e> DW_AT_decl_column : 12 <2f> DW_AT_external : 1 <2f> DW_AT_declaration : 1 <1><2f>: Abbrev Number: 3 (DW_TAG_variable) <30> DW_AT_specification: <0x29> <34> DW_AT_decl_line : 4 <35> DW_AT_decl_column : 5 <36> DW_AT_location : 9 byte block: 3 0 0 0 0 0 0 0 0 (DW_OP_addr: 0) <1><40>: Abbrev Number: 4 (DW_TAG_subprogram) <41> DW_AT_external : 1 <41> DW_AT_name : c <43> DW_AT_decl_file : 1 <44> DW_AT_decl_line : 2 <45> DW_AT_decl_column : 16 <46> DW_AT_linkage_name: (indirect string, offset: 0x67): _ZN1a1cEv <4a> DW_AT_virtuality : 1 (virtual) <4b> DW_AT_vtable_elem_location: 2 byte block: 10 0 (DW_OP_constu: 0) <4e> DW_AT_accessibility: 3 (private) <4f> DW_AT_low_pc : 0x0 <57> DW_AT_high_pc : 0xb <5f> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa) <61> DW_AT_GNU_all_call_sites: 1 <1><61>: Abbrev Number: 0