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:
parent
7a99e30464
commit
bb57d88283
@ -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");
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user