[llvm] a3af3ac - [DWARFDebugLoclists] Add support for other DW_LLE encodings
Pavel Labath via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 4 01:38:09 PST 2019
Author: Pavel Labath
Date: 2019-12-04T10:38:21+01:00
New Revision: a3af3ac39301929b5c3f79b44c44c57d16a6c6f6
URL: https://github.com/llvm/llvm-project/commit/a3af3ac39301929b5c3f79b44c44c57d16a6c6f6
DIFF: https://github.com/llvm/llvm-project/commit/a3af3ac39301929b5c3f79b44c44c57d16a6c6f6.diff
LOG: [DWARFDebugLoclists] Add support for other DW_LLE encodings
Summary:
lldb's loclists parser has support for DW_LLE_start_end(x) encodings. To
avoid regressing when switching the implementation to llvm's, I add
parsing support for all previously unsupported location list encodings.
Reviewers: dblaikie, JDevlieghere, aprantl, SouraVX
Subscribers: hiraditya, probinson, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D70949
Added:
Modified:
llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
Removed:
################################################################################
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
index 8f373e2f551b..8aed9ab653a1 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
@@ -57,6 +57,17 @@ DWARFLocationInterpreter::Interpret(const DWARFLocationEntry &E) {
return createResolverError(E.Value0, E.Kind);
return None;
}
+ case dwarf::DW_LLE_startx_endx: {
+ Optional<SectionedAddress> LowPC = LookupAddr(E.Value0);
+ if (!LowPC)
+ return createResolverError(E.Value0, E.Kind);
+ Optional<SectionedAddress> HighPC = LookupAddr(E.Value1);
+ if (!HighPC)
+ return createResolverError(E.Value1, E.Kind);
+ return DWARFLocationExpression{
+ DWARFAddressRange{LowPC->Address, HighPC->Address, LowPC->SectionIndex},
+ E.Loc};
+ }
case dwarf::DW_LLE_startx_length: {
Optional<SectionedAddress> LowPC = LookupAddr(E.Value0);
if (!LowPC)
@@ -78,9 +89,14 @@ DWARFLocationInterpreter::Interpret(const DWARFLocationEntry &E) {
Range.SectionIndex = E.SectionIndex;
return DWARFLocationExpression{Range, E.Loc};
}
+ case dwarf::DW_LLE_default_location:
+ return DWARFLocationExpression{None, E.Loc};
case dwarf::DW_LLE_base_address:
Base = SectionedAddress{E.Value0, E.SectionIndex};
return None;
+ case dwarf::DW_LLE_start_end:
+ return DWARFLocationExpression{
+ DWARFAddressRange{E.Value0, E.Value1, E.SectionIndex}, E.Loc};
case dwarf::DW_LLE_start_length:
return DWARFLocationExpression{
DWARFAddressRange{E.Value0, E.Value0 + E.Value1, E.SectionIndex},
@@ -127,7 +143,10 @@ bool DWARFLocationTable::dumpLocationList(uint64_t *Offset, raw_ostream &OS,
DIDumpOptions RangeDumpOpts(DumpOpts);
RangeDumpOpts.DisplayRawContents = false;
- Loc.get()->Range->dump(OS, Data.getAddressSize(), RangeDumpOpts, &Obj);
+ if (Loc.get()->Range)
+ Loc.get()->Range->dump(OS, Data.getAddressSize(), RangeDumpOpts, &Obj);
+ else
+ OS << "<default>";
}
if (!Loc)
consumeError(Loc.takeError());
@@ -269,6 +288,10 @@ Error DWARFDebugLoclists::visitLocationList(
case dwarf::DW_LLE_base_addressx:
E.Value0 = Data.getULEB128(C);
break;
+ case dwarf::DW_LLE_startx_endx:
+ E.Value0 = Data.getULEB128(C);
+ E.Value1 = Data.getULEB128(C);
+ break;
case dwarf::DW_LLE_startx_length:
E.Value0 = Data.getULEB128(C);
// Pre-DWARF 5 has
diff erent interpretation of the length field. We have
@@ -283,16 +306,19 @@ Error DWARFDebugLoclists::visitLocationList(
E.Value1 = Data.getULEB128(C);
E.SectionIndex = SectionedAddress::UndefSection;
break;
+ case dwarf::DW_LLE_default_location:
+ break;
case dwarf::DW_LLE_base_address:
E.Value0 = Data.getRelocatedAddress(C, &E.SectionIndex);
break;
+ case dwarf::DW_LLE_start_end:
+ E.Value0 = Data.getRelocatedAddress(C, &E.SectionIndex);
+ E.Value1 = Data.getRelocatedAddress(C);
+ break;
case dwarf::DW_LLE_start_length:
E.Value0 = Data.getRelocatedAddress(C, &E.SectionIndex);
E.Value1 = Data.getULEB128(C);
break;
- case dwarf::DW_LLE_startx_endx:
- case dwarf::DW_LLE_default_location:
- case dwarf::DW_LLE_start_end:
default:
cantFail(C.takeError());
return createStringError(errc::illegal_byte_sequence,
@@ -333,9 +359,14 @@ void DWARFDebugLoclists::dumpRawEntry(const DWARFLocationEntry &Entry,
OS << format("%-*s(", MaxEncodingStringLength, EncodingString.data());
unsigned FieldSize = 2 + 2 * Data.getAddressSize();
switch (Entry.Kind) {
+ case dwarf::DW_LLE_end_of_list:
+ case dwarf::DW_LLE_default_location:
+ break;
+ case dwarf::DW_LLE_startx_endx:
case dwarf::DW_LLE_startx_length:
- case dwarf::DW_LLE_start_length:
case dwarf::DW_LLE_offset_pair:
+ case dwarf::DW_LLE_start_end:
+ case dwarf::DW_LLE_start_length:
OS << format_hex(Entry.Value0, FieldSize) << ", "
<< format_hex(Entry.Value1, FieldSize);
break;
@@ -343,13 +374,12 @@ void DWARFDebugLoclists::dumpRawEntry(const DWARFLocationEntry &Entry,
case dwarf::DW_LLE_base_address:
OS << format_hex(Entry.Value0, FieldSize);
break;
- case dwarf::DW_LLE_end_of_list:
- break;
}
OS << ')';
switch (Entry.Kind) {
- case dwarf::DW_LLE_start_length:
case dwarf::DW_LLE_base_address:
+ case dwarf::DW_LLE_start_end:
+ case dwarf::DW_LLE_start_length:
DWARFFormValue::dumpAddressSection(Obj, OS, DumpOpts, Entry.SectionIndex);
break;
default:
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
index fa2fcb47b999..ffd8f2ece78f 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
@@ -16,25 +16,49 @@
# REGULAR-NEXT: [0x0000000000000002, 0x0000000000000003): DW_OP_reg2 RCX
# VERBOSE-NEXT: [0x0000000000000002, 0x0000000000000003) ".text": DW_OP_reg2 RCX
-# REGULAR-NEXT: [0x0000000000000003, 0x0000000000000004): DW_OP_reg3 RBX
-# VERBOSE-NEXT: [0x0000000000000003, 0x0000000000000004) ".text": DW_OP_reg3 RBX
+# BOTH-NEXT: <default>: DW_OP_reg3 RBX
-# BOTH-NEXT: DW_LLE_startx_length (0x000000000000dead, 0x0000000000000001): DW_OP_reg4 RSI)
+# REGULAR-NEXT: [0x0000000000000004, 0x0000000000000005): DW_OP_reg4 RSI
+# VERBOSE-NEXT: [0x0000000000000004, 0x0000000000000005) ".text": DW_OP_reg4 RSI
-# BOTH: locations list header: length = 0x00000034, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
+# REGULAR-NEXT: [0x0000000000000005, 0x0000000000000006): DW_OP_reg5 RDI
+# VERBOSE-NEXT: [0x0000000000000005, 0x0000000000000006) ".text": DW_OP_reg5 RDI
+
+# REGULAR-NEXT: [0x0000000000000006, 0x0000000000000007): DW_OP_reg6 RBP
+# VERBOSE-NEXT: [0x0000000000000006, 0x0000000000000007) ".text": DW_OP_reg6 RBP
+
+# REGULAR-NEXT: [0x0000000000000007, 0x0000000000000008): DW_OP_reg7 RSP
+# VERBOSE-NEXT: [0x0000000000000007, 0x0000000000000008) ".text": DW_OP_reg7 RSP
+
+# BOTH-NEXT: DW_LLE_startx_length (0x000000000000dead, 0x0000000000000001): DW_OP_reg4 RSI)
+
+# BOTH: locations list header: length = 0x00000056, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
# BOTH-NEXT: 0x0000000c:
-# BOTH-NEXT: DW_LLE_startx_length (0x0000000000000000, 0x0000000000000001): DW_OP_reg0 RAX
-# BOTH-NEXT: DW_LLE_offset_pair (0x0000000000000001, 0x0000000000000002): DW_OP_reg1 RDX
+# BOTH-NEXT: DW_LLE_startx_endx (0x0000000000000000, 0x0000000000000001): DW_OP_reg0 RAX
+# BOTH-NEXT: DW_LLE_startx_length (0x0000000000000001, 0x0000000000000001): DW_OP_reg1 RDX
+# BOTH-NEXT: DW_LLE_offset_pair (0x0000000000000002, 0x0000000000000003): DW_OP_reg2 RCX
+
+# REGULAR-NEXT: <default>: DW_OP_reg3 RBX
+# VERBOSE-NEXT: DW_LLE_default_location()
+# VERBOSE-NEXT: => <default>: DW_OP_reg3 RBX
-# REGULAR-NEXT: [0x0000000000000002, 0x0000000000000003): DW_OP_reg2 RCX
-# VERBOSE-NEXT: DW_LLE_start_length (0x0000000000000002, 0x0000000000000001) ".text"
-# VERBOSE-NEXT: => [0x0000000000000002, 0x0000000000000003) ".text": DW_OP_reg2 RCX
+# REGULAR-NEXT: [0x0000000000000004, 0x0000000000000005): DW_OP_reg4 RSI
+# VERBOSE-NEXT: DW_LLE_start_end (0x0000000000000004, 0x0000000000000005) ".text"
+# VERBOSE-NEXT: => [0x0000000000000004, 0x0000000000000005) ".text": DW_OP_reg4 RSI
-# VERBOSE-NEXT: DW_LLE_base_address (0x0000000000000003) ".text"
+# REGULAR-NEXT: [0x0000000000000005, 0x0000000000000006): DW_OP_reg5 RDI
+# VERBOSE-NEXT: DW_LLE_start_length (0x0000000000000005, 0x0000000000000001) ".text"
+# VERBOSE-NEXT: => [0x0000000000000005, 0x0000000000000006) ".text": DW_OP_reg5 RDI
-# REGULAR-NEXT: [0x0000000000000003, 0x0000000000000004): DW_OP_reg3 RBX
+# BOTH-NEXT: DW_LLE_base_addressx (0x0000000000000002)
+
+# BOTH-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000001): DW_OP_reg6 RBP
+
+# VERBOSE-NEXT: DW_LLE_base_address (0x0000000000000007) ".text"
+
+# REGULAR-NEXT: [0x0000000000000007, 0x0000000000000008): DW_OP_reg7 RSP
# VERBOSE-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000001)
-# VERBOSE-NEXT: => [0x0000000000000003, 0x0000000000000004) ".text": DW_OP_reg3 RBX
+# VERBOSE-NEXT: => [0x0000000000000007, 0x0000000000000008) ".text": DW_OP_reg7 RSP
# BOTH-NEXT: DW_LLE_startx_length (0x000000000000dead, 0x0000000000000001): DW_OP_reg4 RSI
@@ -52,6 +76,14 @@ f: # @f
.Lf3:
nop
.Lf4:
+ nop
+.Lf5:
+ nop
+.Lf6:
+ nop
+.Lf7:
+ nop
+.Lf8:
.Lfend:
# -- End function
.section .debug_loclists,"", at progbits
@@ -63,33 +95,64 @@ f: # @f
.long 0 # Offset entry count
.Lloclists_table_base0:
.Ldebug_loc0:
- .byte 3 # DW_LLE_startx_length
+ .byte 2 # DW_LLE_startx_endx
.uleb128 0 # start idx
- .uleb128 .Lf1-.Lf0 # length
+ .uleb128 1 # end idx
.byte 1 # Loc expr size
.byte 80 # super-register DW_OP_reg0
- .byte 4 # DW_LLE_offset_pair
- .uleb128 .Lf1-.Lf0 # starting offset
- .uleb128 .Lf2-.Lf0 # ending offset
+
+ .byte 3 # DW_LLE_startx_length
+ .uleb128 1 # start idx
+ .uleb128 .Lf2-.Lf1 # length
.byte 1 # Loc expr size
.byte 81 # super-register DW_OP_reg1
- .byte 8 # DW_LLE_start_length
- .quad .Lf2 # starting offset
- .uleb128 .Lf3-.Lf2 # length
+
+ .byte 4 # DW_LLE_offset_pair
+ .uleb128 .Lf2-.Lf0 # starting offset
+ .uleb128 .Lf3-.Lf0 # ending offset
.byte 1 # Loc expr size
.byte 82 # super-register DW_OP_reg2
+
+ .byte 5 # DW_LLE_default_location
+ .byte 1 # Loc expr size
+ .byte 83 # super-register DW_OP_reg3
+
+ .byte 7 # DW_LLE_start_end
+ .quad .Lf4 # starting offset
+ .quad .Lf5 # ending offset
+ .byte 1 # Loc expr size
+ .byte 84 # super-register DW_OP_reg4
+
+ .byte 8 # DW_LLE_start_length
+ .quad .Lf5 # starting offset
+ .uleb128 .Lf6-.Lf5 # length
+ .byte 1 # Loc expr size
+ .byte 85 # super-register DW_OP_reg5
+
+ .byte 1 # DW_LLE_base_addressx
+ .uleb128 2 # base address
+
+ .byte 4 # DW_LLE_offset_pair
+ .uleb128 .Lf6-.Lf6 # starting offset
+ .uleb128 .Lf7-.Lf6 # ending offset
+ .byte 1 # Loc expr size
+ .byte 86 # super-register DW_OP_reg6
+
.byte 6 # DW_LLE_base_address
- .quad .Lf3 # base address
+ .quad .Lf7 # base address
+
.byte 4 # DW_LLE_offset_pair
- .uleb128 .Lf3-.Lf3 # starting offset
- .uleb128 .Lf4-.Lf3 # ending offset
+ .uleb128 .Lf7-.Lf7 # starting offset
+ .uleb128 .Lf8-.Lf7 # ending offset
.byte 1 # Loc expr size
- .byte 83 # super-register DW_OP_reg3
+ .byte 87 # super-register DW_OP_reg7
+
.byte 3 # DW_LLE_startx_length
.uleb128 0xdead # start idx
.uleb128 .Lf1-.Lf0 # length
.byte 1 # Loc expr size
.byte 84 # super-register DW_OP_reg4
+
.byte 0 # DW_LLE_end_of_list
.Ldebug_loclist_table_end0:
@@ -154,4 +217,6 @@ f: # @f
.byte 0 # Segment selector size
.Laddr_table_base0:
.quad .Lf0
+ .quad .Lf1
+ .quad .Lf6
.Ldebug_addr_end0:
More information about the llvm-commits
mailing list