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 @@ -235,6 +237,8 @@ lldb_private::SymbolContextList &sc_list); void CacheFunctionNames(); + void CacheCompileUnits(); + void CacheLanguageForCompUnitSyms(lldb::CompUnitSP comp_unit); bool DeclContextMatchesThisSymbolFile( const lldb_private::CompilerDeclContext *decl_ctx); @@ -242,6 +246,7 @@ uint32_t GetCompilandId(const llvm::pdb::PDBSymbolData &data); llvm::DenseMap m_comp_units; + llvm::DenseMap m_symid_to_lang; 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 @@ -539,25 +539,45 @@ return num_added; } +void SymbolFilePDB::CacheLanguageForCompUnitSyms(lldb::CompUnitSP comp_unit) { + LanguageType lang = ParseLanguage(*comp_unit.get()); + auto pdb_compiland_up = GetPDBCompilandByUID(comp_unit->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_lang.try_emplace(child->getSymIndexId(), lang); + } +} + +lldb::LanguageType SymbolFilePDB::GetLanguageForSymIndexId(uint32_t uid) { + CacheCompileUnits(); + auto find_result = m_symid_to_lang.find(uid); + if (find_result != m_symid_to_lang.end()) + return find_result->getSecond(); + + // Builtin types don't map to a compile unit - default to c++ + m_symid_to_lang.insert(std::make_pair(uid, lldb::eLanguageTypeC_plus_plus)); + return lldb::eLanguageTypeC_plus_plus; +} + 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)); @@ -1145,6 +1165,17 @@ return ResolveFunction(*pdb_func_up, include_inlines, sc_list); } +void SymbolFilePDB::CacheCompileUnits() { + if (m_comp_units.size() == GetNumCompileUnits()) + return; + + if (auto results_up = m_global_scope_up->findAllChildren()) { + while (auto pdb_compiland_up = results_up->getNext()) { + ParseCompileUnitForUID(pdb_compiland_up->getSymIndexId()); + } + } +} + void SymbolFilePDB::CacheFunctionNames() { if (!m_func_full_names.IsEmpty()) return; @@ -1695,6 +1726,8 @@ return CompUnitSP(); m_comp_units.insert(std::make_pair(id, cu_sp)); + CacheLanguageForCompUnitSyms(cu_sp); + if (index == UINT32_MAX) GetCompileUnitIndex(*compiland_up, index); lldbassert(index != UINT32_MAX);