aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2022-04-14 09:36:09 -0600
committerTom Tromey <tromey@adacore.com>2022-04-14 12:22:07 -0600
commit1a7c41d5ece7d0d1aa77d8019ee46f03181854fa (patch)
tree3fb5ec6ef8a926426c5ce78bd3b5768540244343 /gdb/dwarf2
parent8bbdbd6985d8d7615bab69f97f07e8bb78fb98f8 (diff)
downloadgdb-1a7c41d5ece7d0d1aa77d8019ee46f03181854fa.zip
gdb-1a7c41d5ece7d0d1aa77d8019ee46f03181854fa.tar.gz
gdb-1a7c41d5ece7d0d1aa77d8019ee46f03181854fa.tar.bz2
Ignore 0,0 entries in .debug_aranges
When running the internal AdaCore test suite against the new DWARF indexer, I found one regression on RISC-V. The test in question uses --gc-sections, and winds up with an entry in the middle of a .debug_aranges that has both address and length of 0. In this scenario, gdb assumes the entries are terminated and then proceeds to reject the section because it reads a subsequent entry as if it were a header. It seems to me that, because each header describes the size of each .debug_aranges CU, it's better to simply ignore 0,0 entries and simply read to the end. That is what this patch does. I've patched an existing test to provide a regression test for this.
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r--gdb/dwarf2/read.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 6987202..6dcd446 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -2469,7 +2469,7 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
bytes. */
addr += (entry_end - addr) % (2 * address_size);
- for (;;)
+ while (addr < entry_end)
{
if (addr + 2 * address_size > entry_end)
{
@@ -2487,7 +2487,14 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
dwarf5_byte_order);
addr += address_size;
if (start == 0 && length == 0)
- break;
+ {
+ /* This can happen on some targets with --gc-sections.
+ This pair of values is also used to mark the end of
+ the entries for a given CU, but we ignore it and
+ instead handle termination using the check at the top
+ of the loop. */
+ continue;
+ }
if (start == 0 && !per_bfd->has_section_at_zero)
{
/* Symbol was eliminated due to a COMDAT group. */