diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h @@ -286,7 +286,7 @@ const llvm::Optional &GetRnglistTable(); - lldb_private::DWARFDataExtractor GetRnglistData() const; + lldb_private::DWARFDataExtractor GetRnglistData(uint32_t &Offset) const; SymbolFileDWARF &m_dwarf; std::shared_ptr m_dwo; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -513,14 +513,16 @@ return data; } -DWARFDataExtractor DWARFUnit::GetRnglistData() const { +DWARFDataExtractor DWARFUnit::GetRnglistData(uint32_t &Offset) const { DWARFContext &Ctx = GetSymbolFileDWARF().GetDWARFContext(); const DWARFDataExtractor &data = Ctx.getOrLoadRngListsData(); if (const llvm::DWARFUnitIndex::Entry *entry = m_header.GetIndexEntry()) { if (const auto *contribution = - entry->getContribution(llvm::DW_SECT_RNGLISTS)) + entry->getContribution(llvm::DW_SECT_RNGLISTS)) { + Offset = contribution->Offset; return DWARFDataExtractor(data, contribution->Offset, contribution->Length); + } GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError( "Failed to find range list contribution for CU with signature " "0x%" PRIx64, @@ -541,14 +543,18 @@ DWARFUnit::GetRnglistTable() { if (GetVersion() >= 5 && !m_rnglist_table_done) { m_rnglist_table_done = true; + uint32_t contribution_off; if (auto table_or_error = ParseListTableHeader( - GetRnglistData().GetAsLLVM(), m_ranges_base, DWARF32)) + GetRnglistData(contribution_off).GetAsLLVM(), m_ranges_base, + DWARF32)) m_rnglist_table = std::move(table_or_error.get()); else GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError( - "Failed to extract range list table at offset 0x%" PRIx64 ": %s", - m_ranges_base, toString(table_or_error.takeError()).c_str()); + "Failed to extract range list table at offset 0x%" PRIx64 + " (DW_AT_rnglists_base is %" PRIu64 "): %s", + m_ranges_base + contribution_off, m_ranges_base, + toString(table_or_error.takeError()).c_str()); } return m_rnglist_table; } @@ -563,14 +569,17 @@ "DW_FORM_rnglistx cannot be used without " "DW_AT_rnglists_base for CU at 0x%8.8x", GetOffset()); + uint32_t contribution_off; if (llvm::Optional off = GetRnglistTable()->getOffsetEntry( - GetRnglistData().GetAsLLVM(), Index)) + GetRnglistData(contribution_off).GetAsLLVM(), Index)) return *off + m_ranges_base; return llvm::createStringError( errc::invalid_argument, "invalid range list table index %u; OffsetEntryCount is %u, " - "DW_AT_rnglists_base is %" PRIu64, - Index, GetRnglistTable()->getOffsetEntryCount(), m_ranges_base); + "DW_AT_rnglists_base is %" PRIu64 + ", offset to range list table is 0x%" PRIx64, + Index, GetRnglistTable()->getOffsetEntryCount(), m_ranges_base, + m_ranges_base + contribution_off); } void DWARFUnit::SetStrOffsetsBase(dw_offset_t str_offsets_base) { @@ -1018,7 +1027,9 @@ return llvm::createStringError(errc::invalid_argument, "missing or invalid range list table"); - llvm::DWARFDataExtractor data = GetRnglistData().GetAsLLVM(); + uint32_t contribution_offset; + llvm::DWARFDataExtractor data = + GetRnglistData(contribution_offset).GetAsLLVM(); // As DW_AT_rnglists_base may be missing we need to call setAddressSize. data.setAddressSize(m_header.GetAddressByteSize()); diff --git a/lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s b/lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s --- a/lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s +++ b/lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s @@ -29,7 +29,7 @@ # RUN: -o exit 2>&1 | FileCheck --check-prefix=RNGLISTBASE %s # RNGLISTBASE-LABEL: image lookup -v -s lookup_rnglists -# RNGLISTBASE: error: {{.*}}-rnglistbase {0x00000043}: DIE has DW_AT_ranges(DW_FORM_rnglistx 0x0) attribute, but range extraction failed (invalid range list table index 0; OffsetEntryCount is 0, DW_AT_rnglists_base is 24), please file a bug and attach the file at the start of this error message +# RNGLISTBASE: error: DW_AT_range-DW_FORM_sec_offset.s.tmp-rnglistbase {0x00000043}: DIE has DW_AT_ranges(DW_FORM_rnglistx 0x0) attribute, but range extraction failed (invalid range list table index 0; OffsetEntryCount is 0, DW_AT_rnglists_base is 24, offset to range list table is 0x18), please file a bug and attach the file at the start of this error message .text rnglists: