From: David Blaikie Date: Tue, 1 Oct 2019 00:29:13 +0000 (+0000) Subject: DebugInfo: Add parsing support for debug_loc base address specifiers X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=374a09dd02d5787a41cb4d8cb5f03bd8124ba68f;p=llvm DebugInfo: Add parsing support for debug_loc base address specifiers git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373278 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h b/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h index dcc47346fa4..f65a20af0cb 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h +++ b/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h @@ -68,7 +68,7 @@ public: /// Return the location list at the given offset or nullptr. LocationList const *getLocationListAtOffset(uint64_t Offset) const; - static Expected + Expected parseOneLocationList(const DWARFDataExtractor &Data, uint64_t *Offset); }; diff --git a/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp b/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp index 5507448ff59..f25431321bb 100644 --- a/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp +++ b/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp @@ -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 index 00000000000..fde942b2ebf --- /dev/null +++ b/test/tools/llvm-dwarfdump/debug_loc_base_address.s @@ -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: