diff options
author | Tom de Vries <tdevries@suse.de> | 2022-08-01 14:00:59 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2022-08-01 14:00:59 +0200 |
commit | 75337cbc1476b7eb403fe0e73c52bf080b5996c8 (patch) | |
tree | 51dd95c41ff2e84e5ff53a3800385259a9352bfd /gdb/dwarf2 | |
parent | e4971956eab2d3091e21918b175cb999a836c057 (diff) | |
download | gdb-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.c | 22 |
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++; |