aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2022-08-01 14:00:59 +0200
committerTom de Vries <tdevries@suse.de>2022-08-01 14:00:59 +0200
commit75337cbc1476b7eb403fe0e73c52bf080b5996c8 (patch)
tree51dd95c41ff2e84e5ff53a3800385259a9352bfd /gdb/dwarf2
parente4971956eab2d3091e21918b175cb999a836c057 (diff)
downloadgdb-75337cbc1476b7eb403fe0e73c52bf080b5996c8.zip
gdb-75337cbc1476b7eb403fe0e73c52bf080b5996c8.tar.gz
gdb-75337cbc1476b7eb403fe0e73c52bf080b5996c8.tar.bz2
[gdb/symtab] Fix .debug_aranges duplicate offset warning
The function read_addrmap_from_aranges contains code to issue a warning: ... if (!insertpair.second) { warning (_("Section .debug_aranges in %s has duplicate " "debug_info_offset %s, ignoring .debug_aranges."), objfile_name (objfile), sect_offset_str (per_cu->sect_off)); return false; } ... but the warning is in fact activated when all_comp_units has duplicate entries, which is very misleading. Fix this by: - adding a test-case that should trigger the warning, - replacing the current implementation of the warning with an assert that all_comp_units should not contain duplicates, and - properly re-implementing the warning, such that it is triggered by the test-case. Tested on x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29381
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r--gdb/dwarf2/read.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index ae0b5d7..8c66cb8 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -2347,15 +2347,13 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
const auto insertpair
= debug_info_offset_to_per_cu.emplace (per_cu->sect_off,
per_cu.get ());
- if (!insertpair.second)
- {
- warning (_("Section .debug_aranges in %s has duplicate "
- "debug_info_offset %s, ignoring .debug_aranges."),
- objfile_name (objfile), sect_offset_str (per_cu->sect_off));
- return false;
- }
+
+ /* Assume no duplicate offsets in all_comp_units. */
+ gdb_assert (insertpair.second);
}
+ std::set<sect_offset> debug_info_offset_seen;
+
section->read (objfile);
const bfd_endian dwarf5_byte_order = gdbarch_byte_order (gdbarch);
@@ -2413,6 +2411,16 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
pulongest (debug_info_offset));
return false;
}
+ const auto insertpair
+ = debug_info_offset_seen.insert (sect_offset (debug_info_offset));
+ if (!insertpair.second)
+ {
+ warning (_("Section .debug_aranges in %s has duplicate "
+ "debug_info_offset %s, ignoring .debug_aranges."),
+ objfile_name (objfile),
+ sect_offset_str (sect_offset (debug_info_offset)));
+ return false;
+ }
dwarf2_per_cu_data *const per_cu = per_cu_it->second;
const uint8_t address_size = *addr++;