mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-27 14:24:40 +00:00
[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:
@ -225,8 +225,12 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) {
|
|||||||
setBaseAddress(BaseAddr);
|
setBaseAddress(BaseAddr);
|
||||||
AddrOffsetSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
|
AddrOffsetSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
|
||||||
this, DW_AT_GNU_addr_base, 0);
|
this, DW_AT_GNU_addr_base, 0);
|
||||||
RangeSectionBase = DieArray[0].getAttributeValueAsSectionOffset(
|
// Users of old DWARF may not know about DW_AT_ranges_base, so it is ignored
|
||||||
this, DW_AT_GNU_ranges_base, 0);
|
// 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();
|
setDIERelations();
|
||||||
@ -272,7 +276,9 @@ bool DWARFUnit::parseDWO() {
|
|||||||
}
|
}
|
||||||
// Share .debug_addr and .debug_ranges section with compile unit in .dwo
|
// Share .debug_addr and .debug_ranges section with compile unit in .dwo
|
||||||
DWOCU->setAddrOffsetSection(AddrOffsetSection, AddrOffsetSectionBase);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
17
test/DebugInfo/Inputs/fission-ranges.cc
Normal file
17
test/DebugInfo/Inputs/fission-ranges.cc
Normal 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>
|
BIN
test/DebugInfo/Inputs/fission-ranges.elf-x86_64
Executable file
BIN
test/DebugInfo/Inputs/fission-ranges.elf-x86_64
Executable file
Binary file not shown.
@ -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:i386 0x1f67" >> %t.input
|
||||||
RUN: echo "%p/Inputs/macho-universal:x86_64 0x100000f05" >> %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/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: llvm-symbolizer --functions=linkage --inlining --demangle=false \
|
||||||
RUN: --default-arch=i386 < %t.input | FileCheck %s
|
RUN: --default-arch=i386 < %t.input | FileCheck %s
|
||||||
@ -90,6 +91,9 @@ CHECK: _Z3inci
|
|||||||
CHECK: main
|
CHECK: main
|
||||||
CHECK-NEXT: llvm-symbolizer-dwo-test.cc:11
|
CHECK-NEXT: llvm-symbolizer-dwo-test.cc:11
|
||||||
|
|
||||||
|
CHECK: main
|
||||||
|
CHECK-NEXT: {{.*}}fission-ranges.cc:6
|
||||||
|
|
||||||
RUN: echo "unexisting-file 0x1234" > %t.input2
|
RUN: echo "unexisting-file 0x1234" > %t.input2
|
||||||
RUN: llvm-symbolizer < %t.input2
|
RUN: llvm-symbolizer < %t.input2
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user