/// an entry in the rangelist table's offset array and is supplied by
/// DW_FORM_rnglistx.
Optional<uint64_t> getRnglistOffset(uint32_t Index) {
- if (RngListTable)
- return RngListTable->getOffsetEntry(Index);
+ if (!RngListTable)
+ return None;
+ if (Optional<uint64_t> Off = RngListTable->getOffsetEntry(Index))
+ return *Off + RangeSectionBase;
return None;
}
Optional<uint64_t> getLoclistOffset(uint32_t Index) {
- if (LoclistTableHeader)
- return LoclistTableHeader->getOffsetEntry(Index);
+ if (!LoclistTableHeader)
+ return None;
+ if (Optional<uint64_t> Off = LoclistTableHeader->getOffsetEntry(Index))
+ return *Off + getLocSectionBase();
return None;
}
Expected<DWARFAddressRangesVector> collectAddressRanges();
FormValue.dump(OS, DumpOpts);
if (auto LoclistOffset = U->getLoclistOffset(Offset))
- Offset = *LoclistOffset + U->getLocSectionBase();
+ Offset = *LoclistOffset;
else
return;
}
Expected<DWARFAddressRangesVector>
DWARFUnit::findRnglistFromIndex(uint32_t Index) {
if (auto Offset = getRnglistOffset(Index))
- return findRnglistFromOffset(*Offset + RangeSectionBase);
+ return findRnglistFromOffset(*Offset);
if (RngListTable)
return createStringError(errc::invalid_argument,
# CHECK-NOT: Compile Unit:
# CHECK: DW_TAG_compile_unit
# CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x00000014)
-# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000020
+# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000034
# CHECK-NEXT: [0x0000002a, 0x00000034) ".text")
# CHECK: .debug_info.dwo contents:
# CHECK: Compile Unit:
# CHECK-NOT: contents:
# CHECK: DW_TAG_compile_unit
-# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000011
+# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000025
# CHECK-NEXT: [0x0000002a, 0x00000034))
#ERR: error: parsing a range list table: did not detect a valid list table with base = 0x8
# CHECK-NOT: Compile Unit:
# CHECK: DW_TAG_compile_unit
# CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000c)
-# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000018
+# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000024
# CHECK-NEXT: [0x0000002a, 0x00000034) ".text")
# CHECK: .debug_info.dwo contents:
# CHECK: Compile Unit:
# CHECK-NOT: contents:
# CHECK: DW_TAG_compile_unit
-# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000009
+# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000015
# CHECK-NEXT: [0x0000002a, 0x00000034))
#ERR: error: parsing a range list table: did not detect a valid list table with base = 0x8
; CHECK: .debug_info contents:
; CHECK: .debug_info.dwo contents:
-; CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000004
+; CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000010
; CHECK: [0x0000000000000001, 0x000000000000000c) ".text"
; CHECK: [0x000000000000000e, 0x0000000000000013) ".text")
## Ensure bogus empty section names are not printed when dumping
## rnglists that reference debug_addr when it is not present (such as in .dwo files)
-# CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000004
+# CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000010
# CHECK-NEXT: [0x0000000000000000, 0x0000000000000001)
# CHECK-NEXT: [0x0000000000000000, 0x0000000000000002))