[PATCH] D69005: [dsymutil] Support and relocate base address selection entries for debug_loc

Jonas Devlieghere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 15 13:55:49 PDT 2019


JDevlieghere created this revision.
JDevlieghere added reviewers: friss, aprantl, dblaikie, labath.
Herald added a project: LLVM.

Since r374600 clang emits base address selection entries. Currently dsymutil does not support these entries and incorrectly interprets them as location list entries.

This patch adds support for base address selection entries in dsymutil and makes sure they are relocated correctly.

Thanks to Dave for coming up with the test case!


Repository:
  rL LLVM

https://reviews.llvm.org/D69005

Files:
  llvm/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o
  llvm/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.x86_64
  llvm/test/tools/dsymutil/X86/debug-loc-base-addr.test
  llvm/tools/dsymutil/DwarfStreamer.cpp


Index: llvm/tools/dsymutil/DwarfStreamer.cpp
===================================================================
--- llvm/tools/dsymutil/DwarfStreamer.cpp
+++ llvm/tools/dsymutil/DwarfStreamer.cpp
@@ -399,6 +399,9 @@
   MS->SwitchSection(MC->getObjectFileInfo()->getDwarfLocSection());
 
   unsigned AddressSize = Unit.getOrigUnit().getAddressByteSize();
+  uint64_t LargestRepresentable = (AddressSize == 8)
+                                      ? std::numeric_limits<uint64_t>::max()
+                                      : std::numeric_limits<uint32_t>::max();
   const DWARFSection &InputSec = Dwarf.getDWARFObj().getLocSection();
   DataExtractor Data(InputSec.Data, Dwarf.isLittleEndian(), AddressSize);
   DWARFUnit &OrigUnit = Unit.getOrigUnit();
@@ -418,11 +421,20 @@
       uint64_t Low = Data.getUnsigned(&Offset, AddressSize);
       uint64_t High = Data.getUnsigned(&Offset, AddressSize);
       LocSectionSize += 2 * AddressSize;
+      // End of list entry.
       if (Low == 0 && High == 0) {
         Asm->OutStreamer->EmitIntValue(0, AddressSize);
         Asm->OutStreamer->EmitIntValue(0, AddressSize);
         break;
       }
+      // Base address selection entry.
+      if (Low == LargestRepresentable) {
+        Asm->OutStreamer->EmitIntValue(LargestRepresentable, AddressSize);
+        Asm->OutStreamer->EmitIntValue(High + Attr.second, AddressSize);
+        LocPcOffset = 0;
+        continue;
+      }
+      // Location list entry.
       Asm->OutStreamer->EmitIntValue(Low + LocPcOffset, AddressSize);
       Asm->OutStreamer->EmitIntValue(High + LocPcOffset, AddressSize);
       uint64_t Length = Data.getU16(&Offset);
Index: llvm/test/tools/dsymutil/X86/debug-loc-base-addr.test
===================================================================
--- /dev/null
+++ llvm/test/tools/dsymutil/X86/debug-loc-base-addr.test
@@ -0,0 +1,29 @@
+RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/baseaddr/loc1.x86_64 -f -o - | llvm-dwarfdump -debug-loc - | FileCheck %s
+
+The test was compiled from a single source:
+$ cat loc1.cpp
+int f1(int i, int j) {
+  int x = 5;
+  int y = 3;
+  int r = i + j;
+  int undef;
+  x = undef;
+  y = 4;
+  return r;
+}
+__attribute__((nodebug)) void f2() {
+}
+int main() {
+  return 0;
+}
+
+CHECK: .debug_loc contents:
+CHECK: [0xffffffffffffffff,  0x0000000100000f90):
+CHECK: [0x0000000000000004,  0x0000000000000007): DW_OP_consts +3, DW_OP_stack_value
+CHECK: [0x0000000000000007,  0x0000000000000009): DW_OP_consts +4, DW_OP_stack_value
+
+CHECK: [0xffffffffffffffff,  0x0000000100000f90):
+CHECK: [0x0000000000000004,  0x0000000000000007): DW_OP_consts +5, DW_OP_stack_value
+
+CHECK: [0xffffffffffffffff,  0x0000000100000f90):
+CHECK: [0x0000000000000007,  0x0000000000000009): DW_OP_reg0 RAX


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69005.225111.patch
Type: text/x-patch
Size: 2790 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191015/1161c2df/attachment.bin>


More information about the llvm-commits mailing list