mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-24 12:20:00 +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:
parent
7c3436d941
commit
4dfa6812d7
@ -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;
|
||||
}
|
||||
|
||||
|
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: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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user