1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

llvm-dwarfdump: Add support for DW_RLE_startx_endx

This commit is contained in:
David Blaikie 2020-10-04 17:50:24 -07:00
parent 7a99e30464
commit bb57d88283
3 changed files with 62 additions and 27 deletions

View File

@ -37,12 +37,9 @@ Error RangeListEntry::extract(DWARFDataExtractor Data, uint64_t *OffsetPtr) {
break;
}
case dwarf::DW_RLE_startx_endx:
consumeError(C.takeError());
return createStringError(
errc::not_supported,
"unsupported rnglists encoding DW_RLE_startx_endx at "
"offset 0x%" PRIx64,
Offset);
Value0 = Data.getULEB128(C);
Value1 = Data.getULEB128(C);
break;
case dwarf::DW_RLE_startx_length: {
Value0 = Data.getULEB128(C);
Value1 = Data.getULEB128(C);
@ -150,6 +147,19 @@ DWARFAddressRangesVector DWARFDebugRnglist::getAbsoluteRanges(
E.HighPC = E.LowPC + RLE.Value1;
break;
}
case dwarf::DW_RLE_startx_endx: {
auto Start = LookupPooledAddress(RLE.Value0);
if (!Start)
Start = {0, -1ULL};
auto End = LookupPooledAddress(RLE.Value1);
if (!End)
End = {0, -1ULL};
// FIXME: Some error handling if Start.SectionIndex != End.SectionIndex
E.SectionIndex = Start->SectionIndex;
E.LowPC = Start->Address;
E.HighPC = End->Address;
break;
}
default:
// Unsupported encodings should have been reported during extraction,
// so we should not run into any here.
@ -235,6 +245,17 @@ void RangeListEntry::dump(
DWARFAddressRange(Start, Start + Value1).dump(OS, AddrSize, DumpOpts);
break;
}
case dwarf::DW_RLE_startx_endx: {
PrintRawEntry(OS, *this, AddrSize, DumpOpts);
uint64_t Start = 0;
if (auto SA = LookupPooledAddress(Value0))
Start = SA->Address;
uint64_t End = 0;
if (auto SA = LookupPooledAddress(Value1))
End = SA->Address;
DWARFAddressRange(Start, End).dump(OS, AddrSize, DumpOpts);
break;
}
default:
llvm_unreachable("Unsupported range list encoding");
}

View File

@ -1,8 +1,8 @@
# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o %t.o
# RUN: not llvm-dwarfdump --debug-rnglists %t.o 2> %t.err | FileCheck %s --check-prefixes=TERSE,BOTH
# RUN: FileCheck %s --input-file %t.err --check-prefix=ERR
# RUN: not llvm-dwarfdump -v --debug-rnglists %t.o 2> %t.err | FileCheck %s --check-prefixes=VERBOSE,BOTH
# RUN: FileCheck %s --input-file %t.err --check-prefix=ERR
# RUN: llvm-dwarfdump --debug-rnglists %t.o 2> %t.err | FileCheck %s --check-prefixes=TERSE,BOTH
# RUN: FileCheck %s --allow-empty --input-file %t.err --check-prefix=ERR
# RUN: llvm-dwarfdump -v --debug-rnglists %t.o 2> %t.err | FileCheck %s --check-prefixes=VERBOSE,BOTH
# RUN: FileCheck %s --allow-empty --input-file %t.err --check-prefix=ERR
# BOTH: .debug_rnglists contents:
# TERSE-NEXT: range list header: length = 0x00000037, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
@ -74,6 +74,18 @@
# VERBOSE-NEXT: 0x{{[0-9a-f]*}}:
# VERBOSE-SAME: range list header: length = 0x0000000c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
# BOTH-NEXT: ranges:
# TERSE-NEXT: [0x0000000000000000, 0x0000000000000000)
# TERSE-NEXT: <End of list>
# VERBOSE-NEXT: 0x00000091: [DW_RLE_startx_endx]: 0x0000000000000001, 0x000000000000000a => [0x0000000000000000, 0x0000000000000000)
# VERBOSE-NEXT: 0x00000094: [DW_RLE_end_of_list]
# TERSE-NEXT: range list header: length = 0x0000000c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
# VERBOSE-NEXT: 0x{{[0-9a-f]*}}:
# VERBOSE-SAME: range list header: length = 0x0000000c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
# BOTH-NEXT: ranges:
# TERSE-NEXT: [0x0000000000000000, 0x000000000000002a)
# TERSE-NEXT: <End of list>
@ -110,8 +122,6 @@
# BOTH-NOT: range list header:
# ERR-NOT: error:
# ERR: error: unsupported rnglists encoding DW_RLE_startx_endx at offset 0x91
# ERR-NOT: error:
.section .debug_rnglists,"",@progbits

View File

@ -24,6 +24,7 @@
# CHECK-NEXT: [0x00000042, 0x00000048)
# CHECK-NEXT: [0x00000042, 0x00000048)
# CHECK-NEXT: [0x00000042, 0x00000048)
# CHECK-NEXT: [0x00000042, 0x00000042)
# CHECK-NEXT: [0x00000042, 0x00000048)
# CHECK-NEXT: [0x00000042, 0x00000048))
# CHECK: DW_TAG_subprogram
@ -48,10 +49,11 @@
# entire rnglists contribution (since there's no way to know where such a
# contribution starts) - rather than assuming one starts at 0.
# CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000057)
# CHECK: DW_AT_ranges
# [0x0000000000000042, 0x0000000000000048)
# [0x0000000000000042, 0x0000000000000048)
# [0x0000000000000042, 0x0000000000000048)
# [0x0000000000000042, 0x0000000000000042)
# [0x0000000000000042, 0x0000000000000048)
# [0x0000000000000042, 0x0000000000000048))
# CHECK: DW_TAG_subprogram
@ -127,6 +129,8 @@
# CHECK-NEXT: [DW_RLE_startx_length]: 0x00000001, 0x00000006
# CHECK-NEXT: [DW_RLE_start_end ]: [0xffffffff, 0xffffffff)
# CHECK-NEXT: [DW_RLE_start_end ]: [0x00000042, 0x00000048)
# CHECK-NEXT: [DW_RLE_startx_endx ]: 0x00000000, 0x00000000
# CHECK-NEXT: [DW_RLE_startx_endx ]: 0x00000001, 0x00000001
# CHECK-NEXT: [DW_RLE_base_address ]: 0x00000040
# CHECK-NEXT: [DW_RLE_offset_pair ]: 0x00000002, 0x00000008 => [0x00000042, 0x00000048)
# CHECK-NEXT: [DW_RLE_base_address ]: 0xffffffff
@ -146,6 +150,8 @@
# CHECK-NEXT: [DW_RLE_startx_length]: 0x0000000000000001, 0x0000000000000006
# CHECK-NEXT: [DW_RLE_start_end ]: [0xffffffffffffffff, 0xffffffffffffffff)
# CHECK-NEXT: [DW_RLE_start_end ]: [0x0000000000000042, 0x0000000000000048)
# CHECK-NEXT: [DW_RLE_startx_endx ]: 0x0000000000000000, 0x0000000000000000
# CHECK-NEXT: [DW_RLE_startx_endx ]: 0x0000000000000001, 0x0000000000000001
# CHECK-NEXT: [DW_RLE_base_address ]: 0x0000000000000040
# CHECK-NEXT: [DW_RLE_offset_pair ]: 0x0000000000000002, 0x0000000000000008 => [0x0000000000000042, 0x0000000000000048)
# CHECK-NEXT: [DW_RLE_base_address ]: 0xffffffffffffffff
@ -304,13 +310,12 @@
.byte 6 # DW_RLE_start_end
.long 0x42 # start address
.long 0x48 # length
# FIXME: RLE_startx_endx unsupported by llvm-dwarfdump
# .byte 2 # DW_RLE_startx_endx
# .uleb128 0 # start address
# .uleb128 0 # length
# .byte 2 # DW_RLE_startx_endx
# .uleb128 1 # start address
# .uleb128 1 # length
.byte 2 # DW_RLE_startx_endx
.uleb128 0 # start index
.uleb128 0 # end index
.byte 2 # DW_RLE_startx_endx
.uleb128 1 # start index
.uleb128 1 # end index
.byte 5 # DW_RLE_base_address
.long 0x40 # address
.byte 4 # DW_RLE_offset_pair
@ -358,13 +363,12 @@
.byte 6 # DW_RLE_start_end
.quad 0x42 # start address
.quad 0x48 # length
# FIXME: RLE_startx_endx unsupported by llvm-dwarfdump
# .byte 2 # DW_RLE_startx_endx
# .uleb128 0 # start address
# .uleb128 0 # length
# .byte 2 # DW_RLE_startx_endx
# .uleb128 1 # start address
# .uleb128 1 # length
.byte 2 # DW_RLE_startx_endx
.uleb128 0 # start index
.uleb128 0 # end index
.byte 2 # DW_RLE_startx_endx
.uleb128 1 # start index
.uleb128 1 # end index
.byte 5 # DW_RLE_base_address
.quad 0x40 # address
.byte 4 # DW_RLE_offset_pair