This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA] Ignore DW_AT_ranges starting at zero if !has_section_at_zero
- From: dje at google dot com (Doug Evans)
- To: gdb-patches at sourceware dot org
- Date: Thu, 12 Jul 2012 15:50:36 -0700 (PDT)
- Subject: [RFA] Ignore DW_AT_ranges starting at zero if !has_section_at_zero
Hi.
I was root-causing an instance of
"pc 0x2a in read in psymtab, but not in symtab"
and found that it was caused by an address range of 0-75 being
recorded in the psymtab addrmap but not the symtab addrmap.
The discrepancy between the two addrmaps is a separate patch,
as is whether we can just have one addrmap instead of two.
This patch ignores address ranges that begin at zero if there
is no section at zero to avoid populating the tables with bad data.
Ok to check in?
2012-07-12 Doug Evans <dje@google.com>
* dwarf2read.c (dwarf2_ranges_read): Ignore ranges starting at zero if
there's no section at address zero.
(dwarf2_record_block_ranges): Ditto.
Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.684
diff -u -p -r1.684 dwarf2read.c
--- dwarf2read.c 10 Jul 2012 20:28:32 -0000 1.684
+++ dwarf2read.c 12 Jul 2012 22:43:38 -0000
@@ -9051,6 +9051,17 @@ dwarf2_ranges_read (unsigned offset, COR
range_beginning += base;
range_end += base;
+ /* A not-uncommon case of bad debug info.
+ Don't pollute the addrmap with bad data. */
+ if (range_beginning + baseaddr == 0
+ && !dwarf2_per_objfile->has_section_at_zero)
+ {
+ complaint (&symfile_complaints,
+ _(".debug_ranges entry has start address of zero"
+ " [in module %s]"), objfile->name);
+ continue;
+ }
+
if (ranges_pst != NULL)
addrmap_set_empty (objfile->psymtabs_addrmap,
range_beginning + baseaddr,
@@ -9366,9 +9377,20 @@ dwarf2_record_block_ranges (struct die_i
if (start == end)
continue;
- record_block_range (block,
- baseaddr + base + start,
- baseaddr + base + end - 1);
+ start += base + baseaddr;
+ end += base + baseaddr;
+
+ /* A not-uncommon case of bad debug info.
+ Don't pollute the addrmap with bad data. */
+ if (start == 0 && !dwarf2_per_objfile->has_section_at_zero)
+ {
+ complaint (&symfile_complaints,
+ _(".debug_ranges entry has start address of zero"
+ " [in module %s]"), objfile->name);
+ continue;
+ }
+
+ record_block_range (block, start, end - 1);
}
}
}