]> granicus.if.org Git - llvm/commitdiff
DebugInfo: Add parsing support for debug_loc base address specifiers
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 1 Oct 2019 00:29:13 +0000 (00:29 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 1 Oct 2019 00:29:13 +0000 (00:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373278 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
test/tools/llvm-dwarfdump/debug_loc_base_address.s [new file with mode: 0644]

index dcc47346fa4d5755902590ecd44ecc730598086b..f65a20af0cb1cec98fb743ba9f8b330ec9d01800 100644 (file)
@@ -68,7 +68,7 @@ public:
   /// Return the location list at the given offset or nullptr.
   LocationList const *getLocationListAtOffset(uint64_t Offset) const;
 
-  static Expected<LocationList>
+  Expected<LocationList>
   parseOneLocationList(const DWARFDataExtractor &Data, uint64_t *Offset);
 };
 
index 5507448ff598661df7af953141077e29845084b3..f25431321bbc9ca353c18a512503cc6cccca466e 100644 (file)
@@ -101,6 +101,7 @@ DWARFDebugLoc::parseOneLocationList(const DWARFDataExtractor &Data,
 
     if (Error Err = C.takeError())
       return std::move(Err);
+
     // The end of any given location list is marked by an end of list entry,
     // which consists of a 0 for the beginning address offset and a 0 for the
     // ending address offset.
@@ -109,9 +110,12 @@ DWARFDebugLoc::parseOneLocationList(const DWARFDataExtractor &Data,
       return LL;
     }
 
-    unsigned Bytes = Data.getU16(C);
-    // A single location description describing the location of the object...
-    Data.getU8(C, E.Loc, Bytes);
+    if (E.Begin != (AddressSize == 4 ? -1U : -1ULL)) {
+      unsigned Bytes = Data.getU16(C);
+      // A single location description describing the location of the object...
+      Data.getU8(C, E.Loc, Bytes);
+    }
+
     LL.Entries.push_back(std::move(E));
   }
 }
diff --git a/test/tools/llvm-dwarfdump/debug_loc_base_address.s b/test/tools/llvm-dwarfdump/debug_loc_base_address.s
new file mode 100644 (file)
index 0000000..fde942b
--- /dev/null
@@ -0,0 +1,34 @@
+# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o %t.o
+# RUN: llvm-dwarfdump --debug-loc %t.o | FileCheck %s
+
+# CHECK:         .debug_loc contents:
+# CHECK-NEXT:    0x00000000:
+# CHECK-NEXT:    [0xffffffffffffffff, 0x000000000000002a):
+# CHECK-NEXT:    [0x0000000000000003, 0x0000000000000007): DW_OP_consts +3, DW_OP_stack_value
+
+       .section        .debug_loc,"",@progbits
+       .quad   0xffffffffffffffff
+       .quad   42
+       .quad   3
+       .quad   7
+       .short  3                       # Loc expr size
+       .byte   17                      # DW_OP_consts
+       .byte   3                       # 3
+       .byte   159                     # DW_OP_stack_value
+       .quad   0
+       .quad   0
+       .section        .debug_abbrev,"",@progbits
+       .byte   1                       # Abbreviation Code
+       .byte   17                      # DW_TAG_compile_unit
+       .byte   0                       # DW_CHILDREN_no
+       .byte   0                       # EOM(1)
+       .byte   0                       # EOM(2)
+       .byte   0                       # EOM(3)
+       .section        .debug_info,"",@progbits
+       .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+       .short  4                       # DWARF version number
+       .long   .debug_abbrev           # Offset Into Abbrev. Section
+       .byte   8                       # Address Size (in bytes)
+       .byte   1                       # Abbrev [1] DW_TAG_compile_unit
+.Ldebug_info_end0: