diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 4b5499304664b..1be3323f715be 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -412,6 +412,15 @@ class SymbolFile : public PluginInterface { virtual bool GetDebugInfoHadFrameVariableErrors() const = 0; virtual void SetDebugInfoHadFrameVariableErrors() = 0; + virtual lldb::TypeSP + MakeType(lldb::user_id_t uid, ConstString name, + std::optional byte_size, SymbolContextScope *context, + lldb::user_id_t encoding_uid, + Type::EncodingDataType encoding_uid_type, const Declaration &decl, + const CompilerType &compiler_qual_type, + Type::ResolveState compiler_type_resolve_state, + uint32_t opaque_payload = 0) = 0; + protected: void AssertModuleLock(); @@ -492,6 +501,26 @@ class SymbolFileCommon : public SymbolFile { m_debug_info_had_variable_errors = true; } + /// This function is used to create types that belong to a SymbolFile. The + /// symbol file will own a strong reference to the type in an internal type + /// list. + lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, + std::optional byte_size, + SymbolContextScope *context, + lldb::user_id_t encoding_uid, + Type::EncodingDataType encoding_uid_type, + const Declaration &decl, + const CompilerType &compiler_qual_type, + Type::ResolveState compiler_type_resolve_state, + uint32_t opaque_payload = 0) override { + lldb::TypeSP type_sp (new Type( + uid, this, name, byte_size, context, encoding_uid, + encoding_uid_type, decl, compiler_qual_type, + compiler_type_resolve_state, opaque_payload)); + m_type_list.Insert(type_sp); + return type_sp; + } + protected: virtual uint32_t CalculateNumCompileUnits() = 0; virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t idx) = 0; diff --git a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h index 1f5b0c0902b3c..b615356246c64 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -227,6 +227,20 @@ class SymbolFileOnDemand : public lldb_private::SymbolFile { return m_sym_file_impl->SetDebugInfoHadFrameVariableErrors(); } + lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, + std::optional byte_size, + SymbolContextScope *context, + lldb::user_id_t encoding_uid, + Type::EncodingDataType encoding_uid_type, + const Declaration &decl, + const CompilerType &compiler_qual_type, + Type::ResolveState compiler_type_resolve_state, + uint32_t opaque_payload = 0) override { + return m_sym_file_impl->MakeType( + uid, name, byte_size, context, encoding_uid, encoding_uid_type, decl, + compiler_qual_type, compiler_type_resolve_state, opaque_payload); + } + private: Log *GetLog() const { return ::lldb_private::GetLog(LLDBLog::OnDemand); } diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h index d04a0fecd421f..fa494172219c9 100644 --- a/lldb/include/lldb/Symbol/Type.h +++ b/lldb/include/lldb/Symbol/Type.h @@ -22,6 +22,7 @@ #include namespace lldb_private { +class SymbolFileCommon; /// CompilerContext allows an array of these items to be passed to perform /// detailed lookups in SymbolVendor and SymbolFile functions. @@ -101,16 +102,6 @@ class Type : public std::enable_shared_from_this, public UserID { Full = 3 }; - Type(lldb::user_id_t uid, SymbolFile *symbol_file, ConstString name, - std::optional byte_size, SymbolContextScope *context, - lldb::user_id_t encoding_uid, EncodingDataType encoding_uid_type, - const Declaration &decl, const CompilerType &compiler_qual_type, - ResolveState compiler_type_resolve_state, uint32_t opaque_payload = 0); - - // This makes an invalid type. Used for functions that return a Type when - // they get an error. - Type(); - void Dump(Stream *s, bool show_context, lldb::DescriptionLevel level = lldb::eDescriptionLevelFull); @@ -234,6 +225,22 @@ class Type : public std::enable_shared_from_this, public UserID { Type *GetEncodingType(); bool ResolveCompilerType(ResolveState compiler_type_resolve_state); +private: + /// Only allow Symbol File to create types, as they should own them by keeping + /// them in their TypeList. \see SymbolFileCommon::MakeType() reference in the + /// header documentation here so users will know what function to use if the + /// get a compile error. + friend class lldb_private::SymbolFileCommon; + + Type(lldb::user_id_t uid, SymbolFile *symbol_file, ConstString name, + std::optional byte_size, SymbolContextScope *context, + lldb::user_id_t encoding_uid, EncodingDataType encoding_uid_type, + const Declaration &decl, const CompilerType &compiler_qual_type, + ResolveState compiler_type_resolve_state, uint32_t opaque_payload = 0); + + // This makes an invalid type. Used for functions that return a Type when + // they get an error. + Type(); }; // the two classes here are used by the public API as a backend to the SBType diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index b50c974f9b89f..9ebc49417138b 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -198,14 +198,11 @@ TypeSP DWARFASTParserClang::ParseTypeFromClangModule(const SymbolContext &sc, GetClangASTImporter().RequireCompleteType(ClangUtil::GetQualType(type)); SymbolFileDWARF *dwarf = die.GetDWARF(); - TypeSP type_sp(new Type(die.GetID(), dwarf, pcm_type_sp->GetName(), - pcm_type_sp->GetByteSize(nullptr), nullptr, - LLDB_INVALID_UID, Type::eEncodingInvalid, - &pcm_type_sp->GetDeclaration(), type, - Type::ResolveState::Forward, - TypePayloadClang(GetOwningClangModule(die)))); - - dwarf->GetTypeList().Insert(type_sp); + auto type_sp = dwarf->MakeType( + die.GetID(), pcm_type_sp->GetName(), pcm_type_sp->GetByteSize(nullptr), + nullptr, LLDB_INVALID_UID, Type::eEncodingInvalid, + &pcm_type_sp->GetDeclaration(), type, Type::ResolveState::Forward, + TypePayloadClang(GetOwningClangModule(die))); dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); clang::TagDecl *tag_decl = TypeSystemClang::GetAsTagDecl(type); if (tag_decl) { @@ -734,8 +731,8 @@ DWARFASTParserClang::ParseTypeModifier(const SymbolContext &sc, } } - type_sp = std::make_shared( - die.GetID(), dwarf, attrs.name, attrs.byte_size, nullptr, + type_sp = dwarf->MakeType( + die.GetID(), attrs.name, attrs.byte_size, nullptr, dwarf->GetUID(attrs.type.Reference()), encoding_data_type, &attrs.decl, clang_type, resolve_state, TypePayloadClang(GetOwningClangModule(die))); @@ -856,11 +853,11 @@ TypeSP DWARFASTParserClang::ParseEnum(const SymbolContext &sc, LinkDeclContextToDIE(TypeSystemClang::GetDeclContextForType(clang_type), die); - type_sp = std::make_shared( - die.GetID(), dwarf, attrs.name, attrs.byte_size, nullptr, - dwarf->GetUID(attrs.type.Reference()), Type::eEncodingIsUID, &attrs.decl, - clang_type, Type::ResolveState::Forward, - TypePayloadClang(GetOwningClangModule(die))); + type_sp = dwarf->MakeType(die.GetID(), attrs.name, attrs.byte_size, nullptr, + dwarf->GetUID(attrs.type.Reference()), + Type::eEncodingIsUID, &attrs.decl, clang_type, + Type::ResolveState::Forward, + TypePayloadClang(GetOwningClangModule(die))); if (TypeSystemClang::StartTagDeclarationDefinition(clang_type)) { if (die.HasChildren()) { @@ -1306,8 +1303,8 @@ TypeSP DWARFASTParserClang::ParseSubroutine(const DWARFDIE &die, } } } - return std::make_shared( - die.GetID(), dwarf, attrs.name, std::nullopt, nullptr, LLDB_INVALID_UID, + return dwarf->MakeType( + die.GetID(), attrs.name, std::nullopt, nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID, &attrs.decl, clang_type, Type::ResolveState::Full); } @@ -1356,10 +1353,10 @@ DWARFASTParserClang::ParseArrayType(const DWARFDIE &die, m_ast.CreateArrayType(array_element_type, 0, attrs.is_vector); } ConstString empty_name; - TypeSP type_sp = std::make_shared( - die.GetID(), dwarf, empty_name, array_element_bit_stride / 8, nullptr, - dwarf->GetUID(type_die), Type::eEncodingIsUID, &attrs.decl, clang_type, - Type::ResolveState::Full); + TypeSP type_sp = + dwarf->MakeType(die.GetID(), empty_name, array_element_bit_stride / 8, + nullptr, dwarf->GetUID(type_die), Type::eEncodingIsUID, + &attrs.decl, clang_type, Type::ResolveState::Full); type_sp->SetEncodingType(element_type); const clang::Type *type = ClangUtil::GetQualType(clang_type).getTypePtr(); m_ast.SetMetadataAsUserID(type, die.GetID()); @@ -1381,10 +1378,9 @@ TypeSP DWARFASTParserClang::ParsePointerToMemberType( if (std::optional clang_type_size = clang_type.GetByteSize(nullptr)) { - return std::make_shared(die.GetID(), dwarf, attrs.name, - *clang_type_size, nullptr, LLDB_INVALID_UID, - Type::eEncodingIsUID, nullptr, clang_type, - Type::ResolveState::Forward); + return dwarf->MakeType(die.GetID(), attrs.name, *clang_type_size, nullptr, + LLDB_INVALID_UID, Type::eEncodingIsUID, nullptr, + clang_type, Type::ResolveState::Forward); } return nullptr; } @@ -1831,9 +1827,9 @@ DWARFASTParserClang::ParseStructureLikeDIE(const SymbolContext &sc, // parameters in any class methods need it for the clang types for // function prototypes. LinkDeclContextToDIE(m_ast.GetDeclContextForType(clang_type), die); - type_sp = std::make_shared( - die.GetID(), dwarf, attrs.name, attrs.byte_size, nullptr, - LLDB_INVALID_UID, Type::eEncodingIsUID, &attrs.decl, clang_type, + type_sp = dwarf->MakeType( + die.GetID(), attrs.name, attrs.byte_size, nullptr, LLDB_INVALID_UID, + Type::eEncodingIsUID, &attrs.decl, clang_type, Type::ResolveState::Forward, TypePayloadClang(OptionalClangModuleID(), attrs.is_complete_objc_class)); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index c65a63c12b29b..544c9e08d504f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -3122,8 +3122,6 @@ TypeSP SymbolFileDWARF::ParseType(const SymbolContext &sc, const DWARFDIE &die, TypeSP type_sp = dwarf_ast->ParseTypeFromDWARF(sc, die, type_is_new_ptr); if (type_sp) { - GetTypeList().Insert(type_sp); - if (die.Tag() == DW_TAG_subprogram) { std::string scope_qualified_name(GetDeclContextForUID(die.GetID()) .GetScopeQualifiedName() diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index c634352f58a29..82d3707acfa4b 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -552,10 +552,10 @@ lldb::TypeSP SymbolFileNativePDB::CreateModifierType(PdbTypeSymId type_id, Declaration decl; lldb::TypeSP modified_type = GetOrCreateType(mr.ModifiedType); - return std::make_shared(toOpaqueUid(type_id), this, ConstString(name), - modified_type->GetByteSize(nullptr), nullptr, - LLDB_INVALID_UID, Type::eEncodingIsUID, decl, - ct, Type::ResolveState::Full); + return MakeType(toOpaqueUid(type_id), ConstString(name), + modified_type->GetByteSize(nullptr), nullptr, + LLDB_INVALID_UID, Type::eEncodingIsUID, decl, ct, + Type::ResolveState::Full); } lldb::TypeSP @@ -572,10 +572,9 @@ SymbolFileNativePDB::CreatePointerType(PdbTypeSymId type_id, } Declaration decl; - return std::make_shared(toOpaqueUid(type_id), this, ConstString(), - pr.getSize(), nullptr, LLDB_INVALID_UID, - Type::eEncodingIsUID, decl, ct, - Type::ResolveState::Full); + return MakeType(toOpaqueUid(type_id), ConstString(), pr.getSize(), nullptr, + LLDB_INVALID_UID, Type::eEncodingIsUID, decl, ct, + Type::ResolveState::Full); } lldb::TypeSP SymbolFileNativePDB::CreateSimpleType(TypeIndex ti, @@ -583,9 +582,9 @@ lldb::TypeSP SymbolFileNativePDB::CreateSimpleType(TypeIndex ti, uint64_t uid = toOpaqueUid(PdbTypeSymId(ti, false)); if (ti == TypeIndex::NullptrT()) { Declaration decl; - return std::make_shared( - uid, this, ConstString("std::nullptr_t"), 0, nullptr, LLDB_INVALID_UID, - Type::eEncodingIsUID, decl, ct, Type::ResolveState::Full); + return MakeType(uid, ConstString("std::nullptr_t"), 0, nullptr, + LLDB_INVALID_UID, Type::eEncodingIsUID, decl, ct, + Type::ResolveState::Full); } if (ti.getSimpleMode() != SimpleTypeMode::Direct) { @@ -604,9 +603,8 @@ lldb::TypeSP SymbolFileNativePDB::CreateSimpleType(TypeIndex ti, return nullptr; } Declaration decl; - return std::make_shared( - uid, this, ConstString(), pointer_size, nullptr, LLDB_INVALID_UID, - Type::eEncodingIsUID, decl, ct, Type::ResolveState::Full); + return MakeType(uid, ConstString(), pointer_size, nullptr, LLDB_INVALID_UID, + Type::eEncodingIsUID, decl, ct, Type::ResolveState::Full); } if (ti.getSimpleKind() == SimpleTypeKind::NotTranslated) @@ -616,9 +614,8 @@ lldb::TypeSP SymbolFileNativePDB::CreateSimpleType(TypeIndex ti, llvm::StringRef type_name = GetSimpleTypeName(ti.getSimpleKind()); Declaration decl; - return std::make_shared(uid, this, ConstString(type_name), size, - nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID, - decl, ct, Type::ResolveState::Full); + return MakeType(uid, ConstString(type_name), size, nullptr, LLDB_INVALID_UID, + Type::eEncodingIsUID, decl, ct, Type::ResolveState::Full); } static std::string GetUnqualifiedTypeName(const TagRecord &record) { @@ -649,10 +646,9 @@ SymbolFileNativePDB::CreateClassStructUnion(PdbTypeSymId type_id, // FIXME: Search IPI stream for LF_UDT_MOD_SRC_LINE. Declaration decl; - return std::make_shared(toOpaqueUid(type_id), this, ConstString(uname), - size, nullptr, LLDB_INVALID_UID, - Type::eEncodingIsUID, decl, ct, - Type::ResolveState::Forward); + return MakeType(toOpaqueUid(type_id), ConstString(uname), size, nullptr, + LLDB_INVALID_UID, Type::eEncodingIsUID, decl, ct, + Type::ResolveState::Forward); } lldb::TypeSP SymbolFileNativePDB::CreateTagType(PdbTypeSymId type_id, @@ -675,11 +671,10 @@ lldb::TypeSP SymbolFileNativePDB::CreateTagType(PdbTypeSymId type_id, Declaration decl; TypeSP underlying_type = GetOrCreateType(er.UnderlyingType); - return std::make_shared( - toOpaqueUid(type_id), this, ConstString(uname), - underlying_type->GetByteSize(nullptr), nullptr, LLDB_INVALID_UID, - lldb_private::Type::eEncodingIsUID, decl, ct, - lldb_private::Type::ResolveState::Forward); + return MakeType(toOpaqueUid(type_id), ConstString(uname), + underlying_type->GetByteSize(nullptr), nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, + ct, lldb_private::Type::ResolveState::Forward); } TypeSP SymbolFileNativePDB::CreateArrayType(PdbTypeSymId type_id, @@ -688,33 +683,30 @@ TypeSP SymbolFileNativePDB::CreateArrayType(PdbTypeSymId type_id, TypeSP element_type = GetOrCreateType(ar.ElementType); Declaration decl; - TypeSP array_sp = std::make_shared( - toOpaqueUid(type_id), this, ConstString(), ar.Size, nullptr, - LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, ct, - lldb_private::Type::ResolveState::Full); + TypeSP array_sp = + MakeType(toOpaqueUid(type_id), ConstString(), ar.Size, nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, ct, + lldb_private::Type::ResolveState::Full); array_sp->SetEncodingType(element_type.get()); return array_sp; } - TypeSP SymbolFileNativePDB::CreateFunctionType(PdbTypeSymId type_id, const MemberFunctionRecord &mfr, CompilerType ct) { Declaration decl; - return std::make_shared( - toOpaqueUid(type_id), this, ConstString(), 0, nullptr, LLDB_INVALID_UID, - lldb_private::Type::eEncodingIsUID, decl, ct, - lldb_private::Type::ResolveState::Full); + return MakeType(toOpaqueUid(type_id), ConstString(), 0, nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, + ct, lldb_private::Type::ResolveState::Full); } TypeSP SymbolFileNativePDB::CreateProcedureType(PdbTypeSymId type_id, const ProcedureRecord &pr, CompilerType ct) { Declaration decl; - return std::make_shared( - toOpaqueUid(type_id), this, ConstString(), 0, nullptr, LLDB_INVALID_UID, - lldb_private::Type::eEncodingIsUID, decl, ct, - lldb_private::Type::ResolveState::Full); + return MakeType(toOpaqueUid(type_id), ConstString(), 0, nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, + ct, lldb_private::Type::ResolveState::Full); } TypeSP SymbolFileNativePDB::CreateType(PdbTypeSymId type_id, CompilerType ct) { @@ -1892,11 +1884,10 @@ TypeSP SymbolFileNativePDB::CreateTypedef(PdbGlobalSymId id) { ts->GetNativePDBParser()->GetOrCreateTypedefDecl(id); Declaration decl; - return std::make_shared( - toOpaqueUid(id), this, ConstString(udt.Name), - target_type->GetByteSize(nullptr), nullptr, target_type->GetID(), - lldb_private::Type::eEncodingIsTypedefUID, decl, - target_type->GetForwardCompilerType(), + return MakeType( + toOpaqueUid(id), ConstString(udt.Name), target_type->GetByteSize(nullptr), + nullptr, target_type->GetID(), lldb_private::Type::eEncodingIsTypedefUID, + decl, target_type->GetForwardCompilerType(), lldb_private::Type::ResolveState::Forward); } diff --git a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp index b452333726432..c9236da4842cf 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp @@ -465,10 +465,9 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { clang_type = clang_type.AddVolatileModifier(); GetDeclarationForSymbol(type, decl); - return std::make_shared( - type.getSymIndexId(), m_ast.GetSymbolFile(), ConstString(name), - udt->getLength(), nullptr, LLDB_INVALID_UID, - lldb_private::Type::eEncodingIsUID, decl, clang_type, + return m_ast.GetSymbolFile()->MakeType( + type.getSymIndexId(), ConstString(name), udt->getLength(), nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, clang_type, type_resolve_state); } break; case PDB_SymType::Enum: { @@ -535,10 +534,10 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { ast_enum = ast_enum.AddVolatileModifier(); GetDeclarationForSymbol(type, decl); - return std::make_shared( - type.getSymIndexId(), m_ast.GetSymbolFile(), ConstString(name), bytes, - nullptr, LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, - ast_enum, lldb_private::Type::ResolveState::Full); + return m_ast.GetSymbolFile()->MakeType( + type.getSymIndexId(), ConstString(name), bytes, nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, ast_enum, + lldb_private::Type::ResolveState::Full); } break; case PDB_SymType::Typedef: { auto type_def = llvm::dyn_cast(&type); @@ -584,11 +583,10 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { std::optional size; if (type_def->getLength()) size = type_def->getLength(); - return std::make_shared( - type_def->getSymIndexId(), m_ast.GetSymbolFile(), ConstString(name), - size, nullptr, target_type->GetID(), - lldb_private::Type::eEncodingIsTypedefUID, decl, ast_typedef, - lldb_private::Type::ResolveState::Full); + return m_ast.GetSymbolFile()->MakeType( + type_def->getSymIndexId(), ConstString(name), size, nullptr, + target_type->GetID(), lldb_private::Type::eEncodingIsTypedefUID, decl, + ast_typedef, lldb_private::Type::ResolveState::Full); } break; case PDB_SymType::Function: case PDB_SymType::FunctionSig: { @@ -662,11 +660,10 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { arg_list.size(), is_variadic, type_quals, cc); GetDeclarationForSymbol(type, decl); - return std::make_shared( - type.getSymIndexId(), m_ast.GetSymbolFile(), ConstString(name), - std::nullopt, nullptr, LLDB_INVALID_UID, - lldb_private::Type::eEncodingIsUID, decl, func_sig_ast_type, - lldb_private::Type::ResolveState::Full); + return m_ast.GetSymbolFile()->MakeType( + type.getSymIndexId(), ConstString(name), std::nullopt, nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, + func_sig_ast_type, lldb_private::Type::ResolveState::Full); } break; case PDB_SymType::ArrayType: { auto array_type = llvm::dyn_cast(&type); @@ -700,10 +697,10 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { } CompilerType array_ast_type = m_ast.CreateArrayType( element_ast_type, num_elements, /*is_gnu_vector*/ false); - TypeSP type_sp = std::make_shared( - array_type->getSymIndexId(), m_ast.GetSymbolFile(), ConstString(), - bytes, nullptr, LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, - decl, array_ast_type, lldb_private::Type::ResolveState::Full); + TypeSP type_sp = m_ast.GetSymbolFile()->MakeType( + array_type->getSymIndexId(), ConstString(), bytes, nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, + array_ast_type, lldb_private::Type::ResolveState::Full); type_sp->SetEncodingType(element_type); return type_sp; } break; @@ -729,9 +726,9 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { auto type_name = GetPDBBuiltinTypeName(*builtin_type, builtin_ast_type); - return std::make_shared( - builtin_type->getSymIndexId(), m_ast.GetSymbolFile(), type_name, bytes, - nullptr, LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, + return m_ast.GetSymbolFile()->MakeType( + builtin_type->getSymIndexId(), type_name, bytes, nullptr, + LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, builtin_ast_type, lldb_private::Type::ResolveState::Full); } break; case PDB_SymType::PointerType: { @@ -759,8 +756,8 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { pointee_type->GetForwardCompilerType()); assert(pointer_ast_type); - return std::make_shared( - pointer_type->getSymIndexId(), m_ast.GetSymbolFile(), ConstString(), + return m_ast.GetSymbolFile()->MakeType( + pointer_type->getSymIndexId(), ConstString(), pointer_type->getLength(), nullptr, LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, pointer_ast_type, lldb_private::Type::ResolveState::Forward); @@ -784,11 +781,10 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) { if (pointer_type->isRestrictedType()) pointer_ast_type = pointer_ast_type.AddRestrictModifier(); - return std::make_shared( - pointer_type->getSymIndexId(), m_ast.GetSymbolFile(), ConstString(), - pointer_type->getLength(), nullptr, LLDB_INVALID_UID, - lldb_private::Type::eEncodingIsUID, decl, pointer_ast_type, - lldb_private::Type::ResolveState::Full); + return m_ast.GetSymbolFile()->MakeType( + pointer_type->getSymIndexId(), ConstString(), pointer_type->getLength(), + nullptr, LLDB_INVALID_UID, lldb_private::Type::eEncodingIsUID, decl, + pointer_ast_type, lldb_private::Type::ResolveState::Full); } break; default: break; diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index c1557806e733e..cb75dd59d3668 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -586,7 +586,6 @@ lldb_private::Type *SymbolFilePDB::ResolveTypeUID(lldb::user_id_t type_uid) { lldb::TypeSP result = pdb->CreateLLDBTypeFromPDBType(*pdb_type); if (result) { m_types.insert(std::make_pair(type_uid, result)); - GetTypeList().Insert(result); } return result.get(); } diff --git a/lldb/unittests/Symbol/TestTypeSystemClang.cpp b/lldb/unittests/Symbol/TestTypeSystemClang.cpp index 4668ff6612917..257ae49178bdc 100644 --- a/lldb/unittests/Symbol/TestTypeSystemClang.cpp +++ b/lldb/unittests/Symbol/TestTypeSystemClang.cpp @@ -969,13 +969,10 @@ TEST(TestScratchTypeSystemClang, InferSubASTFromLangOpts) { ScratchTypeSystemClang::InferIsolatedASTKindFromLangOpts(lang_opts)); } -TEST_F(TestTypeSystemClang, GetExeModuleWhenMissingSymbolFile) { - CompilerType compiler_type = m_ast->GetBasicTypeFromAST(lldb::eBasicTypeInt); - lldb_private::Type t(0, nullptr, ConstString("MyType"), std::nullopt, nullptr, - 0, {}, {}, compiler_type, - lldb_private::Type::ResolveState::Full); - // Test that getting the execution module when no type system is present - // is handled gracefully. - ModuleSP module = t.GetExeModule(); - EXPECT_EQ(module.get(), nullptr); +TEST_F(TestTypeSystemClang, GetDeclContextByNameWhenMissingSymbolFile) { + // Test that a type system without a symbol file is handled gracefully. + std::vector decls = + m_ast->DeclContextFindDeclByName(nullptr, ConstString("SomeName"), true); + + EXPECT_TRUE(decls.empty()); }