diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -427,14 +427,18 @@ /// an entry in the rangelist table's offset array and is supplied by /// DW_FORM_rnglistx. Optional getRnglistOffset(uint32_t Index) { - if (RngListTable) - return RngListTable->getOffsetEntry(Index); + if (!RngListTable) + return None; + if (Optional Off = RngListTable->getOffsetEntry(Index)) + return *Off + RangeSectionBase; return None; } Optional getLoclistOffset(uint32_t Index) { - if (LoclistTableHeader) - return LoclistTableHeader->getOffsetEntry(Index); + if (!LoclistTableHeader) + return None; + if (Optional Off = LoclistTableHeader->getOffsetEntry(Index)) + return *Off + getLocSectionBase(); return None; } Expected collectAddressRanges(); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -91,7 +91,7 @@ FormValue.dump(OS, DumpOpts); if (auto LoclistOffset = U->getLoclistOffset(Offset)) - Offset = *LoclistOffset + U->getLocSectionBase(); + Offset = *LoclistOffset; else return; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -629,7 +629,7 @@ Expected DWARFUnit::findRnglistFromIndex(uint32_t Index) { if (auto Offset = getRnglistOffset(Index)) - return findRnglistFromOffset(*Offset + RangeSectionBase); + return findRnglistFromOffset(*Offset); if (RngListTable) return createStringError(errc::invalid_argument, diff --git a/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s b/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s --- a/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s @@ -196,14 +196,14 @@ # 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 diff --git a/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s b/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s --- a/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s @@ -192,14 +192,14 @@ # 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 diff --git a/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll b/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll --- a/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll +++ b/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll @@ -3,7 +3,7 @@ ; 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") diff --git a/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s b/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s --- a/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s @@ -4,7 +4,7 @@ ## 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))