Index: source/Plugins/SymbolFile/PDB/SymbolFilePDB.h =================================================================== --- source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -219,6 +219,8 @@ void GetCompileUnitIndex(const llvm::pdb::PDBSymbolCompiland &pdb_compiland, uint32_t &index); + lldb::LanguageType GetLanguageForSymIndexId(uint32_t uid); + PDBASTParser *GetPDBAstParser(); std::unique_ptr @@ -242,6 +244,7 @@ uint32_t GetCompilandId(const llvm::pdb::PDBSymbolData &data); llvm::DenseMap m_comp_units; + llvm::DenseMap m_symid_to_cu; llvm::DenseMap m_types; llvm::DenseMap m_variables; llvm::DenseMap m_public_names; Index: source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp =================================================================== --- source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -547,25 +547,43 @@ return num_added; } +lldb::LanguageType SymbolFilePDB::GetLanguageForSymIndexId(uint32_t uid) { + auto find_result = m_symid_to_cu.find(uid); + if (find_result != m_symid_to_cu.end()) + return ParseLanguage(*find_result->getSecond().get()); + + for (auto& id_cu_pair : m_comp_units) { + auto cu_sp = id_cu_pair.getSecond(); + auto pdb_compiland_up = GetPDBCompilandByUID(cu_sp->GetID()); + auto children_enumerator_up = pdb_compiland_up->findAllChildren(); + if (children_enumerator_up && children_enumerator_up->getChildCount() > 0) { + while (auto child = children_enumerator_up->getNext()) { + m_symid_to_cu.insert(std::make_pair(uid, cu_sp)); + if (child->getSymIndexId() == uid) { + return ParseLanguage(*cu_sp.get()); + } + } + } + } +} + lldb_private::Type *SymbolFilePDB::ResolveTypeUID(lldb::user_id_t type_uid) { auto find_result = m_types.find(type_uid); if (find_result != m_types.end()) return find_result->second.get(); - TypeSystem *type_system = - GetTypeSystemForLanguage(lldb::eLanguageTypeC_plus_plus); - ClangASTContext *clang_type_system = - llvm::dyn_cast_or_null(type_system); - if (!clang_type_system) - return nullptr; - PDBASTParser *pdb = clang_type_system->GetPDBParser(); - if (!pdb) - return nullptr; - auto pdb_type = m_session_up->getSymbolById(type_uid); if (pdb_type == nullptr) return nullptr; + auto lang = GetLanguageForSymIndexId(type_uid); + TypeSystem *type_system = GetTypeSystemForLanguage(lang); + if (!type_system) + return nullptr; + PDBASTParser *pdb = type_system->GetPDBParser(); + if (!pdb) + return nullptr; + lldb::TypeSP result = pdb->CreateLLDBTypeFromPDBType(*pdb_type); if (result) { m_types.insert(std::make_pair(type_uid, result));