From f0e4034c425dd947f5373a29ebbf8b8912da01e8 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Thu, 12 Jun 2014 18:52:35 +0000 Subject: [PATCH] [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. llvm-svn: 210809 --- llvm/lib/DebugInfo/DWARFUnit.cpp | 12 +++++++++--- llvm/test/DebugInfo/Inputs/fission-ranges.cc | 17 +++++++++++++++++ llvm/test/DebugInfo/Inputs/fission-ranges.elf-x86_64 | Bin 0 -> 8693 bytes llvm/test/DebugInfo/llvm-symbolizer.test | 4 ++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 llvm/test/DebugInfo/Inputs/fission-ranges.cc create mode 100755 llvm/test/DebugInfo/Inputs/fission-ranges.elf-x86_64 diff --git a/llvm/lib/DebugInfo/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARFUnit.cpp index f5f5072..0278277 100644 --- a/llvm/lib/DebugInfo/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARFUnit.cpp @@ -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; } diff --git a/llvm/test/DebugInfo/Inputs/fission-ranges.cc b/llvm/test/DebugInfo/Inputs/fission-ranges.cc new file mode 100644 index 0000000..a585bf9 --- /dev/null +++ b/llvm/test/DebugInfo/Inputs/fission-ranges.cc @@ -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 +// $ objcopy --remove-section=.debug_aranges diff --git a/llvm/test/DebugInfo/Inputs/fission-ranges.elf-x86_64 b/llvm/test/DebugInfo/Inputs/fission-ranges.elf-x86_64 new file mode 100755 index 0000000000000000000000000000000000000000..3d2fd79dd74745dafb70c7ccf17c5745d2f63fa2 GIT binary patch literal 8693 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 %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 -- 2.7.4