]> granicus.if.org Git - llvm/commitdiff
DebugInfo: Test & handle (differently) non-zero DW_AT_ranges_base
authorDavid Blaikie <dblaikie@gmail.com>
Wed, 2 Aug 2017 20:16:22 +0000 (20:16 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Wed, 2 Aug 2017 20:16:22 +0000 (20:16 +0000)
Followup to r309570, fixing it slightly differently (ranges_base and
addr_base should never be read from a DWO file - so there shouldn't be
any issue with 'overriding' the values - conditionalize the code and
assert that the values aren't being overriden).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309879 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/DWARF/DWARFUnit.h
lib/DebugInfo/DWARF/DWARFUnit.cpp
test/DebugInfo/Inputs/split-dwarf-dwp.cpp
test/DebugInfo/Inputs/split-dwarf-dwp.o
test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp
test/DebugInfo/llvm-symbolizer.test

index b4e3f008f31cb28266f6bdc25dfeb861f1cc716d..c39fc4c974436a59bb586b3fbfb16e830efc2b88 100644 (file)
@@ -123,7 +123,7 @@ class DWARFUnit {
   const DWARFSection &StringOffsetSection;
   uint64_t StringOffsetSectionBase = 0;
   const DWARFSection *AddrOffsetSection;
-  uint32_t AddrOffsetSectionBase;
+  uint32_t AddrOffsetSectionBase = 0;
   bool isLittleEndian;
   bool isDWO;
   const DWARFUnitSectionBase &UnitSection;
index 0a12fb2ecaa66e3aa30ebdc910a9546b190ca90a..5b0b3f65f6c30639cba6578479dbee25ef438805 100644 (file)
@@ -245,12 +245,13 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) {
     auto BaseAddr = toAddress(UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc}));
     if (BaseAddr)
       setBaseAddress(*BaseAddr);
-    Optional<DWARFFormValue> AddrBase = UnitDie.find(DW_AT_GNU_addr_base);
-    if (AddrBase)
-      AddrOffsetSectionBase = *toSectionOffset(AddrBase);
-    Optional<DWARFFormValue> RngListsBase = UnitDie.find(DW_AT_rnglists_base);
-    if (RngListsBase)
-      RangeSectionBase = *toSectionOffset(RngListsBase);
+    if (!isDWO) {
+      assert(AddrOffsetSectionBase == 0);
+      assert(RangeSectionBase == 0);
+      AddrOffsetSectionBase =
+          toSectionOffset(UnitDie.find(DW_AT_GNU_addr_base), 0);
+      RangeSectionBase = toSectionOffset(UnitDie.find(DW_AT_rnglists_base), 0);
+    }
 
     // In general, we derive the offset of the unit's contibution to the
     // debug_str_offsets{.dwo} section from the unit DIE's
index b07a1537d6bfe97e0d0f1422ff2ece171edb4f0f..ced32e41008152cab02ecf0b91c8e91aef80c7c7 100644 (file)
@@ -1,12 +1,22 @@
-void f1();
-__attribute__((always_inline)) void f2() {
+__attribute__((optnone)) void f1() {}
+inline __attribute__((always_inline)) void f2() {
   f1();
 }
-void f3() {
+// throw a gap in the address range to force use of DW_AT_ranges, ranges_base,
+// range contribution in the .dwo file, etc.
+__attribute__((nodebug)) void gap() {
+}
+int main() {
   f2();
 }
 
-To produce split-dwarf-dwp.o{,dwp}, run:
-
-  $ clang++ split-dwarf-dwp.cpp -gsplit-dwarf -c -Xclang -fdebug-compilation-dir=Output -fno-split-dwarf-inlining
-  $ llvm-dwp split-dwarf-dwp.dwo -o split-dwarf-dwp.o.dwp
+// To produce split-dwarf-dwp.o{,dwp}, Create another file that has ranges, so
+// the ranges_base of the CU for split-dwarf-dwp.cpp is non-zero.
+//
+//   $ cat > other.cpp
+//   void other1() {}
+//   __attribute__((nodebug)) void other2() {}
+//   void other3() {}
+//   $ clang++ other.cpp split-dwarf-dwp.cpp -gsplit-dwarf -c -Xclang -fdebug-compilation-dir -Xclang Output -fno-split-dwarf-inlining
+//   $ llvm-dwp other.dwo other.dwo split-dwarf-dwp.dwo -o test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp
+//   $ ld -r other.o split-dwarf-dwp.o -o test/DebugInfo/Inputs/split-dwarf-dwp.o
index 614c62040dec63fc13b815d42ca1ea408e9cbcfa..2bf4fe3e494f042e30490666b7a58e58a7dc3c98 100644 (file)
Binary files a/test/DebugInfo/Inputs/split-dwarf-dwp.o and b/test/DebugInfo/Inputs/split-dwarf-dwp.o differ
index 16a0af8c062f3c5c18997352081cefe736489fad..20eff18217faacd7f5f4823ae406d48c551fd133 100644 (file)
Binary files a/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp and b/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp differ
index 342c1a9e925c2dbd6b96bd4384959e78daedfdae..a25e251b62cc539917211c81a2a6d14fbf0508e9 100644 (file)
@@ -51,7 +51,7 @@ RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \
 RUN:    --default-arch=i386 < %t.input | FileCheck --check-prefix=SPLIT --check-prefix=NODWO %s
 
 RUN: cp %p/Inputs/split-dwarf-dwp.o %T/split-dwarf-dwp-different-name.o
-RUN: echo "%T/split-dwarf-dwp-different-name.o 0x4" > %t.input
+RUN: echo "%T/split-dwarf-dwp-different-name.o 0x54" > %t.input
 RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \
 RUN:    --default-arch=i386 --dwp=%p/Inputs/split-dwarf-dwp.o.dwp < %t.input | FileCheck --check-prefix=DWP %s
 
@@ -158,8 +158,8 @@ CHECK-NEXT: split-dwarf-addr-object-relocation.cpp:6:0
 
 DWP:      f2
 DWP-NEXT: split-dwarf-dwp.cpp:3:3
-DWP-NEXT: f3
-DWP-NEXT: split-dwarf-dwp.cpp:6:0
+DWP-NEXT: main
+DWP-NEXT: split-dwarf-dwp.cpp:10:0
 
 RUN: echo "unexisting-file 0x1234" > %t.input2
 RUN: llvm-symbolizer < %t.input2 2>&1 | FileCheck %s --check-prefix=MISSING-FILE