[llvm] r374957 - [dsymutil] Support and relocate base address selection entries for debug_loc

Jonas Devlieghere via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 15 16:43:37 PDT 2019


Author: jdevlieghere
Date: Tue Oct 15 16:43:37 2019
New Revision: 374957

URL: http://llvm.org/viewvc/llvm-project?rev=374957&view=rev
Log:
[dsymutil] Support and relocate base address selection entries for debug_loc

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!

Differential revision: https://reviews.llvm.org/D69005

Added:
    llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/
    llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o   (with props)
    llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.x86_64   (with props)
    llvm/trunk/test/tools/dsymutil/X86/debug-loc-base-addr.test
Modified:
    llvm/trunk/tools/dsymutil/DwarfStreamer.cpp

Added: llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o?rev=374957&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.x86_64?rev=374957&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.x86_64
------------------------------------------------------------------------------
    svn:executable = *

Propchange: llvm/trunk/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.x86_64
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/dsymutil/X86/debug-loc-base-addr.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/X86/debug-loc-base-addr.test?rev=374957&view=auto
==============================================================================
--- llvm/trunk/test/tools/dsymutil/X86/debug-loc-base-addr.test (added)
+++ llvm/trunk/test/tools/dsymutil/X86/debug-loc-base-addr.test Tue Oct 15 16:43:37 2019
@@ -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

Modified: llvm/trunk/tools/dsymutil/DwarfStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfStreamer.cpp?rev=374957&r1=374956&r2=374957&view=diff
==============================================================================
--- llvm/trunk/tools/dsymutil/DwarfStreamer.cpp (original)
+++ llvm/trunk/tools/dsymutil/DwarfStreamer.cpp Tue Oct 15 16:43:37 2019
@@ -399,6 +399,9 @@ void DwarfStreamer::emitLocationsForUnit
   MS->SwitchSection(MC->getObjectFileInfo()->getDwarfLocSection());
 
   unsigned AddressSize = Unit.getOrigUnit().getAddressByteSize();
+  uint64_t BaseAddressMarker = (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 @@ void DwarfStreamer::emitLocationsForUnit
       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 == BaseAddressMarker) {
+        Asm->OutStreamer->EmitIntValue(BaseAddressMarker, 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);




More information about the llvm-commits mailing list