Changeset View
Changeset View
Standalone View
Standalone View
lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
Show First 20 Lines • Show All 501 Lines • ▼ Show 20 Lines | else | ||||
GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError( | GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError( | ||||
"Failed to extract range list table at offset 0x%" PRIx64 ": %s", | "Failed to extract range list table at offset 0x%" PRIx64 ": %s", | ||||
m_ranges_base, toString(table_or_error.takeError()).c_str()); | m_ranges_base, toString(table_or_error.takeError()).c_str()); | ||||
} | } | ||||
return m_rnglist_table; | return m_rnglist_table; | ||||
} | } | ||||
// This function is called only for DW_FORM_rnglistx. | // This function is called only for DW_FORM_rnglistx. | ||||
llvm::Optional<uint64_t> DWARFUnit::GetRnglistOffset(uint32_t Index) { | llvm::Expected<uint64_t> DWARFUnit::GetRnglistOffset(uint32_t Index) { | ||||
if (!GetRnglist()) | if (!GetRnglist()) | ||||
return llvm::None; | return llvm::createStringError(errc::invalid_argument, | ||||
if (!m_ranges_base) { | "missing or invalid range list table"); | ||||
GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError( | if (!m_ranges_base) | ||||
"%8.8x: DW_FORM_rnglistx cannot be used without DW_AT_rnglists_base", | return llvm::createStringError(errc::invalid_argument, | ||||
"DW_FORM_rnglistx cannot be used without " | |||||
"DW_AT_rnglists_base for CU at 0x%8.8x", | |||||
GetOffset()); | GetOffset()); | ||||
return llvm::None; | |||||
} | |||||
if (llvm::Optional<uint64_t> off = GetRnglist()->getOffsetEntry( | if (llvm::Optional<uint64_t> off = GetRnglist()->getOffsetEntry( | ||||
m_dwarf.GetDWARFContext().getOrLoadRngListsData().GetAsLLVM(), Index)) | m_dwarf.GetDWARFContext().getOrLoadRngListsData().GetAsLLVM(), Index)) | ||||
return *off + m_ranges_base; | return *off + m_ranges_base; | ||||
return llvm::None; | return llvm::createStringError( | ||||
errc::invalid_argument, | |||||
"invalid range list table index %u; OffsetEntryCount is %u, " | |||||
"DW_AT_rnglists_base is %" PRIu64, | |||||
Index, GetRnglist()->getOffsetEntryCount(), m_ranges_base); | |||||
} | } | ||||
void DWARFUnit::SetStrOffsetsBase(dw_offset_t str_offsets_base) { | void DWARFUnit::SetStrOffsetsBase(dw_offset_t str_offsets_base) { | ||||
m_str_offsets_base = str_offsets_base; | m_str_offsets_base = str_offsets_base; | ||||
} | } | ||||
// It may be called only with m_die_array_mutex held R/W. | // It may be called only with m_die_array_mutex held R/W. | ||||
void DWARFUnit::ClearDIEsRWLocked() { | void DWARFUnit::ClearDIEsRWLocked() { | ||||
▲ Show 20 Lines • Show All 460 Lines • ▼ Show 20 Lines | for (const llvm::DWARFAddressRange &llvm_range : *llvm_ranges) { | ||||
ranges.Append(DWARFRangeList::Entry(llvm_range.LowPC, | ranges.Append(DWARFRangeList::Entry(llvm_range.LowPC, | ||||
llvm_range.HighPC - llvm_range.LowPC)); | llvm_range.HighPC - llvm_range.LowPC)); | ||||
} | } | ||||
return ranges; | return ranges; | ||||
} | } | ||||
llvm::Expected<DWARFRangeList> | llvm::Expected<DWARFRangeList> | ||||
DWARFUnit::FindRnglistFromIndex(uint32_t index) { | DWARFUnit::FindRnglistFromIndex(uint32_t index) { | ||||
if (llvm::Optional<uint64_t> offset = GetRnglistOffset(index)) | llvm::Expected<uint64_t> maybe_offset = GetRnglistOffset(index); | ||||
return FindRnglistFromOffset(*offset); | if (!maybe_offset) | ||||
if (GetRnglist()) | return maybe_offset.takeError(); | ||||
return llvm::createStringError(errc::invalid_argument, | return FindRnglistFromOffset(*maybe_offset); | ||||
"invalid range list table index %d", index); | |||||
return llvm::createStringError(errc::invalid_argument, | |||||
"missing or invalid range list table"); | |||||
} | } |