[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;
}

View File

@ -0,0 +1,17 @@
static inline int inlined_f() {
volatile int x = 2;
return x;
}
int main() {
return inlined_f();
}
// Build instructions:
// $ mkdir /tmp/dbginfo
// $ cp fission-ranges.cc /tmp/dbginfo/
// $ cd /tmp/dbginfo
// $ gcc -gsplit-dwarf -O2 -fPIC fission-ranges.cc -c -o obj2.o
// $ clang -gsplit-dwarf -O2 -fsanitize=address -fPIC -Dmain=foo fission-ranges.cc -c -o obj1.o
// $ gcc obj1.o obj2.o -shared -o <output>
// $ objcopy --remove-section=.debug_aranges <output>

Binary file not shown.

View File

@ -17,6 +17,7 @@ RUN: echo "%p/Inputs/macho-universal 0x1f84" >> %t.input
RUN: echo "%p/Inputs/macho-universal:i386 0x1f67" >> %t.input
RUN: echo "%p/Inputs/macho-universal:x86_64 0x100000f05" >> %t.input
RUN: echo "%p/Inputs/llvm-symbolizer-dwo-test 0x400514" >> %t.input
RUN: echo "%p/Inputs/fission-ranges.elf-x86_64 0x720" >> %t.input
RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \
RUN: --default-arch=i386 < %t.input | FileCheck %s
@ -90,6 +91,9 @@ CHECK: _Z3inci
CHECK: main
CHECK-NEXT: llvm-symbolizer-dwo-test.cc:11
CHECK: main
CHECK-NEXT: {{.*}}fission-ranges.cc:6
RUN: echo "unexisting-file 0x1234" > %t.input2
RUN: llvm-symbolizer < %t.input2