[llvm] r328662 - [DWARF][DWARF v5]: Adding support for dumping DW_RLE_offset_pair and DW_RLE_base_address
Wolfgang Pieb via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 27 13:27:37 PDT 2018
Author: wolfgangp
Date: Tue Mar 27 13:27:36 2018
New Revision: 328662
URL: http://llvm.org/viewvc/llvm-project?rev=328662&view=rev
Log:
[DWARF][DWARF v5]: Adding support for dumping DW_RLE_offset_pair and DW_RLE_base_address
Reviewers: dblakie, aprantl
Differential Revision: https://reviews.llvm.org/D44811
Modified:
llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp
llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp?rev=328662&r1=328661&r2=328662&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugRnglists.cpp Tue Mar 27 13:27:36 2018
@@ -114,14 +114,27 @@ Error DWARFDebugRnglists::extract(DWARFD
return createError("unsupported rnglists encoding DW_RLE_startx_length "
"at offset 0x%" PRIx32,
*OffsetPtr - 1);
- case dwarf::DW_RLE_offset_pair:
- return createError("unsupported rnglists encoding DW_RLE_offset_pair at "
- "offset 0x%" PRIx32,
- *OffsetPtr - 1);
- case dwarf::DW_RLE_base_address:
- return createError("unsupported rnglists encoding DW_RLE_base_address at "
- "offset 0x%" PRIx32,
- *OffsetPtr - 1);
+ case dwarf::DW_RLE_offset_pair: {
+ uint32_t PreviousOffset = *OffsetPtr - 1;
+ uint64_t StartingOffset = Data.getULEB128(OffsetPtr);
+ uint64_t EndingOffset = Data.getULEB128(OffsetPtr);
+ if (End < *OffsetPtr)
+ return createError("read past end of table when reading "
+ "DW_RLE_offset_pair encoding at offset 0x%" PRIx32,
+ PreviousOffset);
+ CurrentRanges.push_back(
+ RangeListEntry{EntryOffset, Encoding, StartingOffset, EndingOffset});
+ break;
+ }
+ case dwarf::DW_RLE_base_address: {
+ if ((End - *OffsetPtr) < HeaderData.AddrSize)
+ return createError("insufficient space remaining in table for "
+ "DW_RLE_base_address encoding at offset 0x%" PRIx32,
+ *OffsetPtr - 1);
+ uint64_t Base = Data.getAddress(OffsetPtr);
+ CurrentRanges.push_back(RangeListEntry{EntryOffset, Encoding, Base, 0});
+ break;
+ }
case dwarf::DW_RLE_start_end: {
if ((End - *OffsetPtr) < unsigned(HeaderData.AddrSize * 2))
return createError("insufficient space remaining in table for "
@@ -173,7 +186,18 @@ Error DWARFDebugRnglists::extract(DWARFD
static void dumpRangeEntry(raw_ostream &OS,
DWARFDebugRnglists::RangeListEntry Entry,
uint8_t AddrSize, uint8_t MaxEncodingStringLength,
- DIDumpOptions DumpOpts) {
+ uint64_t &CurrentBase, DIDumpOptions DumpOpts) {
+ auto PrintRawEntry = [](raw_ostream &OS,
+ DWARFDebugRnglists::RangeListEntry Entry,
+ uint8_t AddrSize, DIDumpOptions DumpOpts) {
+ if (DumpOpts.Verbose) {
+ DumpOpts.DisplayRawContents = true;
+ DWARFAddressRange(Entry.Value0, Entry.Value1)
+ .dump(OS, AddrSize, DumpOpts);
+ OS << " => ";
+ }
+ };
+
if (DumpOpts.Verbose) {
// Print the section offset in verbose mode.
OS << format("0x%8.8" PRIx32 ":", Entry.Offset);
@@ -190,19 +214,23 @@ static void dumpRangeEntry(raw_ostream &
case dwarf::DW_RLE_end_of_list:
OS << (DumpOpts.Verbose ? "" : "<End of list>");
break;
+ case dwarf::DW_RLE_base_address:
+ // In non-verbose mode we do not print anything for this entry.
+ CurrentBase = Entry.Value0;
+ if (!DumpOpts.Verbose)
+ return;
+ OS << format(" 0x%*.*" PRIx64, AddrSize * 2, AddrSize * 2, Entry.Value0);
+ break;
case dwarf::DW_RLE_start_length:
- if (DumpOpts.Verbose) {
- // Make the address range display its contents in raw form rather than
- // as an interval (i.e. without brackets).
- DumpOpts.DisplayRawContents = true;
- DWARFAddressRange(Entry.Value0, Entry.Value1)
- .dump(OS, AddrSize, DumpOpts);
- OS << " => ";
- }
- DumpOpts.DisplayRawContents = false;
+ PrintRawEntry(OS, Entry, AddrSize, DumpOpts);
DWARFAddressRange(Entry.Value0, Entry.Value0 + Entry.Value1)
.dump(OS, AddrSize, DumpOpts);
break;
+ case dwarf::DW_RLE_offset_pair:
+ PrintRawEntry(OS, Entry, AddrSize, DumpOpts);
+ DWARFAddressRange(Entry.Value0 + CurrentBase, Entry.Value1 + CurrentBase)
+ .dump(OS, AddrSize, DumpOpts);
+ break;
case dwarf::DW_RLE_start_end:
DWARFAddressRange(Entry.Value0, Entry.Value1).dump(OS, AddrSize, DumpOpts);
break;
@@ -235,10 +263,11 @@ void DWARFDebugRnglists::dump(raw_ostrea
}
OS << "Ranges:\n";
+ uint64_t CurrentBase = 0;
for (const auto &List : Ranges)
for (const auto &Entry : List)
dumpRangeEntry(OS, Entry, HeaderData.AddrSize, MaxEncodingStringLength,
- DumpOpts);
+ CurrentBase, DumpOpts);
}
uint32_t DWARFDebugRnglists::length() const {
Modified: llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s?rev=328662&r1=328661&r2=328662&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s (original)
+++ llvm/trunk/test/tools/llvm-dwarfdump/X86/debug_rnglists.s Tue Mar 27 13:27:36 2018
@@ -56,14 +56,40 @@
# BOTH-NOT: Offsets:
# BOTH: Ranges:
# BOTH-NOT: [
+
+# TERSE-NEXT: Range List Header: length = 0x0000000e, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
+
+# VERBOSE-NEXT: 0x{{[0-9a-f]*}}:
+# VERBOSE-SAME: Range List Header: length = 0x0000000e, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
+
+# BOTH-NEXT: Ranges:
+# TERSE-NEXT: [0x0000000000000800, 0x0000000000001000)
+# TERSE-NEXT: <End of list>
+
+# VERBOSE-NEXT: 0x000000b1: [DW_RLE_offset_pair]: 0x0000000000000800, 0x0000000000001000 =>
+# VERBOSE-SAME: [0x0000000000000800, 0x0000000000001000)
+# VERBOSE-NEXT: 0x000000b6: [DW_RLE_end_of_list]
+
+# TERSE-NEXT: Range List Header: length = 0x00000017, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
+
+# VERBOSE-NEXT: 0x{{[0-9a-f]*}}:
+# VERBOSE-SAME: Range List Header: length = 0x00000017, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
+
+# BOTH-NEXT: Ranges:
+# TERSE-NEXT: [0x0000000000001800, 0x0000000000002000)
+# TERSE-NEXT: <End of list>
+
+# VERBOSE-NEXT: 0x000000c3: [DW_RLE_base_address]: 0x0000000000001000
+# VERBOSE-NEXT: 0x000000cc: [DW_RLE_offset_pair ]: 0x0000000000000800, 0x0000000000001000 =>
+# VERBOSE-SAME: [0x0000000000001800, 0x0000000000002000)
+# VERBOSE-NEXT: 0x000000d1: [DW_RLE_end_of_list ]
+
# BOTH-NOT: Range List Header:
# ERR-NOT: error:
# ERR: error: unsupported rnglists encoding DW_RLE_base_addressx at offset 0x82
# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_startx_endx at offset 0x91
# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_startx_length at offset 0xa1
-# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_offset_pair at offset 0xb1
-# ERR-NEXT: error: unsupported rnglists encoding DW_RLE_base_address at offset 0xc
# ERR-NOT: error:
.section .debug_rnglists,"", at progbits
@@ -161,7 +187,7 @@
.byte 0 # DW_RLE_end_of_list
# Seventh table (testing DW_RLE_offset_pair)
-.long 12 # Table length
+.long 14 # Table length
.short 5 # Version
.byte 8 # Address size
.byte 0 # Segment selector size
@@ -169,12 +195,13 @@
# First range list
.byte 4 # DW_RLE_offset_pair
-.byte 3 # Start offset (index in .debug_addr)
-.byte 19 # End offset (index in .debug_addr)
+.byte 0x80, 0x10 # Start offset
+.byte 0x80, 0x20 # End offset (index in .debug_addr)
.byte 0 # DW_RLE_end_of_list
-# Eigth table (testing DW_RLE_base_address)
-.long 18 # Table length
+# Eigth table (testing DW_RLE_base_address and its impact
+# on DW_RLE_offset_pair)
+.long 23 # Table length
.short 5 # Version
.byte 8 # Address size
.byte 0 # Segment selector size
@@ -183,4 +210,7 @@
# First range list
.byte 5 # DW_RLE_base_address
.quad 0x1000 # Base address
+.byte 4 # DW_RLE_offset_pair
+.byte 0x80, 0x10 # Start offset
+.byte 0x80, 0x20 # End offset
.byte 0 # DW_RLE_end_of_list
More information about the llvm-commits
mailing list