diff options
author | Mark Wielaard <mark@klomp.org> | 2020-09-07 14:25:25 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2020-09-11 19:18:44 +0200 |
commit | edc7a80a9c04667dfa74f90f74bd39827bc372b7 (patch) | |
tree | 7b3047fb76bf8068810aaed3ee31e2f30bb5d0a4 /gas/dwarf2dbg.c | |
parent | 548f5275787a2328b5c1ea041e13a53e67d4accb (diff) | |
download | fsf-binutils-gdb-edc7a80a9c04667dfa74f90f74bd39827bc372b7.zip fsf-binutils-gdb-edc7a80a9c04667dfa74f90f74bd39827bc372b7.tar.gz fsf-binutils-gdb-edc7a80a9c04667dfa74f90f74bd39827bc372b7.tar.bz2 |
gas: Don't error when .debug_line already exists, unless .loc was used
When -g was used to generate DWARF gas would error out when a .debug_line
already exists. But when a .debug_info section already exists it would
simply skip generating one without warning or error. Do the same for
.debug_line. It is only an error when the user explicitly uses .loc
directives and also generates the .debug_line table itself.
The tests are unfortunately arch specific because the line table is only
generated when actual instructions have been emitted. Use i386 because
that is probably the most used architecture. Before this patch the new
dwarf-line-2 testcase would fail, with this patch it succeeds (and doesn't
try to add its own line table).
gas/ChangeLog:
* as.texi (-g): Explicitly mention when .debug_info and .debug_line
are generated for the DWARF format.
(Loc): Add that it is an error to both use a .loc directive and
generate a .debug_line yourself.
* dwarf2dbg.c (dwarf2_any_loc_directive_seen): New static variable.
(dwarf2_directive_loc): Set dwarf2_any_loc_directive_seen to TRUE.
(dwarf2_finish): Check dwarf2_any_loc_directive_seen before emitting
an error. Only create .debug_line if it is empty (or doesn't exist).
* testsuite/gas/i386/i386.exp: Add dwarf2-line-{1,2,3,4} when testing
an elf target.
* testsuite/gas/i386/dwarf2-line-{1,2,3,4}.{s,d,l}: New test files.
Diffstat (limited to 'gas/dwarf2dbg.c')
-rw-r--r-- | gas/dwarf2dbg.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index e0ea399..1c21d58 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -226,9 +226,15 @@ static unsigned int dirs_in_use = 0; static unsigned int dirs_allocated = 0; /* TRUE when we've seen a .loc directive recently. Used to avoid - doing work when there's nothing to do. */ + doing work when there's nothing to do. Will be reset by + dwarf2_consume_line_info. */ bfd_boolean dwarf2_loc_directive_seen; +/* TRUE when we've seen any .loc directive at any time during parsing. + Indicates the user wants us to generate a .debug_line section. + Used in dwarf2_finish as sanity check. */ +static bfd_boolean dwarf2_any_loc_directive_seen; + /* TRUE when we're supposed to set the basic block mark whenever a label is seen. */ bfd_boolean dwarf2_loc_mark_labels; @@ -1290,7 +1296,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED) } demand_empty_rest_of_line (); - dwarf2_loc_directive_seen = TRUE; + dwarf2_any_loc_directive_seen = dwarf2_loc_directive_seen = TRUE; debug_type = DEBUG_NONE; /* If we were given a view id, emit the row right away. */ @@ -2737,7 +2743,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. @@ -2761,8 +2767,10 @@ 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. */ - if (all_segs && !empty_debug_line) + 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 && dwarf2_any_loc_directive_seen) as_fatal ("duplicate .debug_line sections"); if ((!all_segs && emit_other_sections) @@ -2776,8 +2784,12 @@ dwarf2_finish (void) sizeof_address = DWARF2_ADDR_SIZE (stdoutput); /* Create and switch to the line number section. */ - line_seg = subseg_new (".debug_line", 0); - bfd_set_section_flags (line_seg, SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS); + if (empty_debug_line) + { + line_seg = subseg_new (".debug_line", 0); + bfd_set_section_flags (line_seg, + SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS); + } /* For each subsection, chain the debug entries together. */ for (s = all_segs; s; s = s->next) @@ -2803,7 +2815,8 @@ dwarf2_finish (void) } } - out_debug_line (line_seg); + if (empty_debug_line) + out_debug_line (line_seg); /* If this is assembler generated line info, and there is no debug_info already, we need .debug_info, .debug_abbrev and |