diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index aaec1600dacff..8be6dd196c07c 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1719,19 +1719,23 @@ void SymbolFileNativePDB::ParseInlineSite(PdbCompilandSymId id, } // Get the inlined function name. - CVType inlinee_cvt = m_index->ipi().getType(inline_site.Inlinee); std::string inlinee_name; - if (inlinee_cvt.kind() == LF_MFUNC_ID) { + llvm::Expected inlinee_cvt = + m_index->ipi().typeCollection().getTypeOrError(inline_site.Inlinee); + if (!inlinee_cvt) { + inlinee_name = "[error reading function name: " + + llvm::toString(inlinee_cvt.takeError()) + "]"; + } else if (inlinee_cvt->kind() == LF_MFUNC_ID) { MemberFuncIdRecord mfr; cantFail( - TypeDeserializer::deserializeAs(inlinee_cvt, mfr)); + TypeDeserializer::deserializeAs(*inlinee_cvt, mfr)); LazyRandomTypeCollection &types = m_index->tpi().typeCollection(); inlinee_name.append(std::string(types.getTypeName(mfr.ClassType))); inlinee_name.append("::"); inlinee_name.append(mfr.getName().str()); - } else if (inlinee_cvt.kind() == LF_FUNC_ID) { + } else if (inlinee_cvt->kind() == LF_FUNC_ID) { FuncIdRecord fir; - cantFail(TypeDeserializer::deserializeAs(inlinee_cvt, fir)); + cantFail(TypeDeserializer::deserializeAs(*inlinee_cvt, fir)); TypeIndex parent_idx = fir.getParentScope(); if (!parent_idx.isNoneType()) { LazyRandomTypeCollection &ids = m_index->ipi().typeCollection(); diff --git a/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h b/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h index 5b23ac9f862a0..da18339b8662b 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h +++ b/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h @@ -70,7 +70,7 @@ class LLVM_ABI LazyRandomTypeCollection : public TypeCollection { uint32_t getOffsetOfType(TypeIndex Index); std::optional tryGetType(TypeIndex Index); - + llvm::Expected getTypeOrError(TypeIndex Index); CVType getType(TypeIndex Index) override; StringRef getTypeName(TypeIndex Index) override; bool contains(TypeIndex Index) override; diff --git a/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp b/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp index 23ab5344df1ed..0b36c5085c086 100644 --- a/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp +++ b/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp @@ -93,20 +93,25 @@ CVType LazyRandomTypeCollection::getType(TypeIndex Index) { return Records[Index.toArrayIndex()].Type; } -std::optional LazyRandomTypeCollection::tryGetType(TypeIndex Index) { +llvm::Expected +LazyRandomTypeCollection::getTypeOrError(TypeIndex Index) { if (Index.isSimple()) - return std::nullopt; + return llvm::createStringError("Type index too low (%d)", Index.getIndex()); if (auto EC = ensureTypeExists(Index)) { - consumeError(std::move(EC)); - return std::nullopt; + return EC; } if (!contains(Index)) - return std::nullopt; + return llvm::createStringError("Type index too high (%d)", + Index.getIndex()); return Records[Index.toArrayIndex()].Type; } +std::optional LazyRandomTypeCollection::tryGetType(TypeIndex Index) { + return llvm::expectedToOptional(getTypeOrError(Index)); +} + StringRef LazyRandomTypeCollection::getTypeName(TypeIndex Index) { if (Index.isNoneType() || Index.isSimple()) return TypeIndex::simpleTypeName(Index);