[llvm-symbolizer] Fix parsing DW_AT_ranges in Fission skeleton compile unit DIEs.

Turns out that DW_AT_ranges_base attribute sets the offset for
DW_AT_ranges values specified in the .dwo file, but not for DW_AT_ranges specified
in the skeleton compile unit DIE in the main executable. This is extremely confusing,
and would hopefully be fixed in DWARF-5 when it's finalized. For now this
behavior makes sense, as otherwise Fission would break DWARF consumers who
doesn't know anything about DW_AT_ranges_base.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210809 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alexey Samsonov
2014-06-12 18:52:35 +00:00
parent 7c3436d941
commit 4dfa6812d7
4 changed files with 30 additions and 3 deletions

View File

@ -225,8 +225,12 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) {
setBaseAddress(BaseAddr);
AddrOffsetSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
this, DW_AT_GNU_addr_base, 0);
RangeSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
this, DW_AT_GNU_ranges_base, 0);
// Users of old DWARF may not know about DW_AT_ranges_base, so it is ignored
// for skeleton CU DIE (e.g. DW_AT_ranges are *not* relative to it).
if (Version > 4) {
RangeSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
this, DW_AT_GNU_ranges_base, 0);
}
}
setDIERelations();
@ -272,7 +276,9 @@ bool DWARFUnit::parseDWO() {
}
// Share .debug_addr and .debug_ranges section with compile unit in .dwo
DWOCU->setAddrOffsetSection(AddrOffsetSection, AddrOffsetSectionBase);
DWOCU->setRangesSection(RangeSection, RangeSectionBase);
uint32_t DWORangesBase = DieArray[0].getAttributeValueAsSectionOffset(
this, DW_AT_GNU_ranges_base, 0);
DWOCU->setRangesSection(RangeSection, DWORangesBase);
return true;
}