On Mon, 26 Jul 2021, Bernd Edlinger wrote: > Ignored functions decls that are compiled at the start of > the assembly have bogus line numbers until the first .file > directive, as reported in PR101575. > > The work around for this issue is to emit a dummy .file > directive when the first function is DECL_IGNORED_P, when > that is not already done, mostly for -fdwarf-4.
I wonder if it makes sense to unconditionally announce the TU with a .file directive at the beginning. ISTR this is what we now do with -gdwarf-5. Note get_AT_string (comp_unit_die (), DW_AT_name) doesn't work with LTO, you'll get <dummy> then. Is the dwarf assembler bug reported/fixed? Can you include a reference please? Thanks, Richard. > 2021-07-24 Bernd Edlinger <bernd.edlin...@hotmail.de> > > PR ada/101575 > * dwarf2out.c (dwarf2out_begin_prologue): Move init > of fde->ignored_debug to dwarf2out_set_ignored_loc. > (dwarf2out_set_ignored_loc): This is now also called > when no .loc statement is to be generated, in that case > we emit a dummy .file statement when needed. > * final.c (final_start_function_1, > final_scan_insn_1): Call debug_hooks->set_ignored_loc > for all DECL_IGNORED_P functions. > --- > gcc/dwarf2out.c | 29 +++++++++++++++++++++++++---- > gcc/final.c | 5 ++--- > 2 files changed, 27 insertions(+), 7 deletions(-) > > diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c > index 884f1e1..8de0d6f 100644 > --- a/gcc/dwarf2out.c > +++ b/gcc/dwarf2out.c > @@ -1115,7 +1115,6 @@ dwarf2out_begin_prologue (unsigned int line > ATTRIBUTE_UNUSED, > fde->dw_fde_current_label = dup_label; > fde->in_std_section = (fnsec == text_section > || (cold_text_section && fnsec == cold_text_section)); > - fde->ignored_debug = DECL_IGNORED_P (current_function_decl); > in_text_section_p = fnsec == text_section; > > /* We only want to output line number information for the genuine dwarf2 > @@ -28546,10 +28545,32 @@ dwarf2out_set_ignored_loc (unsigned int line, > unsigned int column, > { > dw_fde_ref fde = cfun->fde; > > - fde->ignored_debug = false; > - set_cur_line_info_table (function_section (fde->decl)); > + if (filename) > + { > + set_cur_line_info_table (function_section (fde->decl)); > + > + dwarf2out_source_line (line, column, filename, 0, true); > + } > + else > + { > + fde->ignored_debug = true; > + > + /* Work around for PR101575: output a dummy .file directive. */ > + if (in_first_function_p > + && debug_info_level >= DINFO_LEVEL_TERSE > + && dwarf_debuginfo_p () > +#if defined(HAVE_AS_GDWARF_5_DEBUG_FLAG) && > defined(HAVE_AS_WORKING_DWARF_N_FLAG) > + && dwarf_version <= 4 > +#endif > + && output_asm_line_debug_info ()) > + { > + const char *filename0 = get_AT_string (comp_unit_die (), DW_AT_name); > > - dwarf2out_source_line (line, column, filename, 0, true); > + if (filename0 == NULL) > + filename0 = "<dummy>"; > + maybe_emit_file (lookup_filename (filename0)); > + } > + } > } > > /* Record the beginning of a new source file. */ > diff --git a/gcc/final.c b/gcc/final.c > index ac6892d..82a5767 100644 > --- a/gcc/final.c > +++ b/gcc/final.c > @@ -1725,7 +1725,7 @@ final_start_function_1 (rtx_insn **firstp, FILE *file, > int *seen, > if (!dwarf2_debug_info_emitted_p (current_function_decl)) > dwarf2out_begin_prologue (0, 0, NULL); > > - if (DECL_IGNORED_P (current_function_decl) && last_linenum && > last_filename) > + if (DECL_IGNORED_P (current_function_decl)) > debug_hooks->set_ignored_loc (last_linenum, last_columnnum, > last_filename); > > #ifdef LEAF_REG_REMAP > @@ -2205,8 +2205,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int > optimize_p ATTRIBUTE_UNUSED, > } > else if (!DECL_IGNORED_P (current_function_decl)) > debug_hooks->switch_text_section (); > - if (DECL_IGNORED_P (current_function_decl) && last_linenum > - && last_filename) > + if (DECL_IGNORED_P (current_function_decl)) > debug_hooks->set_ignored_loc (last_linenum, last_columnnum, > last_filename); > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)