On Wed, Aug 26, 2020 at 2:38 PM Mark Wielaard <m...@klomp.org> wrote: > > Hi gcc hackers, binutils hackers, > > Nick, Jakub and I were discussing the gcc patch below and all the ways > it is wrong. Most things can be fixed in the spec. Like only passing > -gdwarf if we are generating DWARF and passing the right DWARF version > as -gdwarf-N for the version that gcc itself creates. But whether or > not we want gas to generate .debug_line info is a bit tricky. But when > giving -gdwarf-N gas will always try to generate a .debug_line section > and error out when there is already one. > > Would it be possible to have something like the following in gas, so > that it doesn't try generating a .debug_line section if there already > is one, even when -gdwarf-N is given (unless the assembly also > contains .loc directives because that shows the user is really > confused)? > > diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c > index e4ba56d82ba..c0c09f4e9d0 100644 > --- a/gas/dwarf2dbg.c > +++ b/gas/dwarf2dbg.c > @@ -2626,7 +2626,7 @@ dwarf2_init (void) > > > /* Finish the dwarf2 debug sections. We emit .debug.line if there > - were any .file/.loc directives, or --gdwarf2 was given, or if the > + were any .file/.loc directives, or --gdwarf2 was given, and if the > file has a non-empty .debug_info section and an empty .debug_line > section. If we emit .debug_line, and the .debug_info section is > empty, we also emit .debug_info, .debug_aranges and .debug_abbrev. > @@ -2650,9 +2650,16 @@ dwarf2_finish (void) > empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg); > > /* We can't construct a new debug_line section if we already have one. > - Give an error. */ > + Give an error if we have seen any .loc, otherwise trust the user > + knows what they are doing and want to generate the .debug_line > + (and all other debug sections) themselves. */ > if (all_segs && !empty_debug_line) > - as_fatal ("duplicate .debug_line sections"); > + { > + if (dwarf2_loc_directive_seen) > + as_fatal ("duplicate .debug_line sections"); > + else > + return; > + } > > if ((!all_segs && emit_other_sections) > || (!emit_other_sections && !empty_debug_line)) >
I have run into this issue before. "as -g" shouldn't silently generate incorrect debug info when input assembly codes already contain debug directives. AS should either issue an error or ignore -g. In either case, we need a testcase to verify it. -- H.J.