Index: include/lldb/Symbol/SymbolFile.h =================================================================== --- include/lldb/Symbol/SymbolFile.h +++ include/lldb/Symbol/SymbolFile.h @@ -161,6 +161,9 @@ virtual uint32_t FindFunctions(const RegularExpression ®ex, bool include_inlines, bool append, SymbolContextList &sc_list); + virtual size_t FindPublicSymbols(const ConstString &name, + lldb::SymbolType type, bool append, + SymbolContextList &sc_list); virtual uint32_t FindTypes(const SymbolContext &sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, Index: include/lldb/Symbol/SymbolVendor.h =================================================================== --- include/lldb/Symbol/SymbolVendor.h +++ include/lldb/Symbol/SymbolVendor.h @@ -97,6 +97,10 @@ bool include_inlines, bool append, SymbolContextList &sc_list); + virtual size_t FindPublicSymbols(const ConstString &name, + lldb::SymbolType type, bool append, + SymbolContextList &sc_list); + virtual size_t FindTypes(const SymbolContext &sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, Index: include/lldb/lldb-forward.h =================================================================== --- include/lldb/lldb-forward.h +++ include/lldb/lldb-forward.h @@ -441,6 +441,7 @@ StructuredDataPluginSP; typedef std::weak_ptr StructuredDataPluginWP; +typedef std::shared_ptr SymbolSP; typedef std::shared_ptr SymbolFileSP; typedef std::shared_ptr SymbolFileTypeSP; typedef std::weak_ptr SymbolFileTypeWP; Index: source/Core/Module.cpp =================================================================== --- source/Core/Module.cpp +++ source/Core/Module.cpp @@ -1366,6 +1366,8 @@ const size_t initial_size = sc_list.GetSize(); SymbolVendor *sym_vendor = GetSymbolVendor(); if (sym_vendor) { + sym_vendor->FindPublicSymbols(name, symbol_type, true, sc_list); + Symtab *symtab = sym_vendor->GetSymtab(); if (symtab) { std::vector symbol_indexes; Index: source/Plugins/SymbolFile/PDB/SymbolFilePDB.h =================================================================== --- source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -132,6 +132,10 @@ const std::string &scope_qualified_name, std::vector &mangled_names) override; + size_t FindPublicSymbols(const lldb_private::ConstString &name, + lldb::SymbolType type, bool append, + lldb_private::SymbolContextList &sc_list) override; + uint32_t FindTypes(const lldb_private::SymbolContext &sc, const lldb_private::ConstString &name, @@ -227,9 +231,13 @@ bool DeclContextMatchesThisSymbolFile( const lldb_private::CompilerDeclContext *decl_ctx); + lldb_private::Symbol * + GetPublicSymbol(const llvm::pdb::PDBSymbolPublicSymbol &pub_symbol); + llvm::DenseMap m_comp_units; llvm::DenseMap m_types; llvm::DenseMap m_variables; + llvm::DenseMap m_public_symbols; std::vector m_builtin_types; std::unique_ptr m_session_up; Index: source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp =================================================================== --- source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1339,6 +1339,42 @@ const std::string &scope_qualified_name, std::vector &mangled_names) {} +size_t +SymbolFilePDB::FindPublicSymbols(const lldb_private::ConstString &name, + lldb::SymbolType type, bool append, + lldb_private::SymbolContextList &sc_list) { + if (!append) + sc_list.Clear(); + + auto results = m_global_scope_up->findChildren( + PDB_SymType::PublicSymbol, name.GetStringRef(), NS_Default); + if (!results) + return 0; + + size_t count = 0; + while (auto symbol = results->getNext()) { + auto pub_symbol = + llvm::dyn_cast_or_null(symbol.get()); + if (!pub_symbol) + continue; + + auto symbol_ptr = GetPublicSymbol(*pub_symbol); + if (!symbol_ptr) + continue; + + if (type != eSymbolTypeAny && symbol_ptr->GetType() != type) + continue; + + SymbolContext sc; + sc.symbol = symbol_ptr; + sc_list.Append(sc); + + count++; + } + + return count; +} + uint32_t SymbolFilePDB::FindTypes( const lldb_private::SymbolContext &sc, const lldb_private::ConstString &name, @@ -1882,3 +1918,45 @@ return false; } + +lldb_private::Symbol *SymbolFilePDB::GetPublicSymbol( + const llvm::pdb::PDBSymbolPublicSymbol &pub_symbol) { + auto it = m_public_symbols.find(pub_symbol.getSymIndexId()); + if (it != m_public_symbols.end()) + return it->second.get(); + + auto section_list = m_obj_file->GetSectionList(); + if (!section_list) + return nullptr; + + auto section_idx = pub_symbol.getAddressSection() - 1; + if (section_idx >= section_list->GetSize()) + return nullptr; + + auto section = section_list->GetSectionAtIndex(section_idx); + if (!section) + return nullptr; + + auto size = pub_symbol.getLength(); + + auto symbol_sp = std::make_shared( + pub_symbol.getSymIndexId(), // symID + pub_symbol.getName().c_str(), // name + true, // name_is_mangled + pub_symbol.isCode() ? eSymbolTypeCode : eSymbolTypeData, // type + true, // external + false, // is_debug + false, // is_trampoline + false, // is_artificial + section, // section_sp + pub_symbol.getAddressOffset(), // value + size, // size + size != 0, // size_is_valid + false, // contains_linker_annotations + 0 // flags + ); + + m_public_symbols[pub_symbol.getSymIndexId()] = symbol_sp; + + return symbol_sp.get(); +} Index: source/Symbol/SymbolFile.cpp =================================================================== --- source/Symbol/SymbolFile.cpp +++ source/Symbol/SymbolFile.cpp @@ -127,6 +127,14 @@ return 0; } +size_t SymbolFile::FindPublicSymbols(const ConstString &name, + lldb::SymbolType type, bool append, + SymbolContextList &sc_list) { + if (!append) + sc_list.Clear(); + return 0; +} + void SymbolFile::GetMangledNamesForFunction( const std::string &scope_qualified_name, std::vector &mangled_names) { Index: source/Symbol/SymbolVendor.cpp =================================================================== --- source/Symbol/SymbolVendor.cpp +++ source/Symbol/SymbolVendor.cpp @@ -314,6 +314,18 @@ return 0; } +size_t SymbolVendor::FindPublicSymbols(const ConstString &name, + lldb::SymbolType type, bool append, + SymbolContextList &sc_list) { + ModuleSP module_sp(GetModule()); + if (module_sp) { + std::lock_guard guard(module_sp->GetMutex()); + if (m_sym_file_ap.get()) + return m_sym_file_ap->FindPublicSymbols(name, type, append, sc_list); + } + return 0; +} + size_t SymbolVendor::FindTypes( const SymbolContext &sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, size_t max_matches, Index: unittests/SymbolFile/PDB/SymbolFilePDBTests.cpp =================================================================== --- unittests/SymbolFile/PDB/SymbolFilePDBTests.cpp +++ unittests/SymbolFile/PDB/SymbolFilePDBTests.cpp @@ -615,3 +615,20 @@ EXPECT_EQ(0u, num_results); EXPECT_EQ(0u, results.GetSize()); } + +TEST_F(SymbolFilePDBTests, TestFindSymbolsWithNameAndType) { + FileSpec fspec(m_pdb_test_exe.c_str(), false); + ArchSpec aspec("i686-pc-windows"); + lldb::ModuleSP module = std::make_shared(fspec, aspec); + + SymbolContextList sc_list; + EXPECT_EQ(1u, + module->FindSymbolsWithNameAndType(ConstString("?foo@@YAHH@Z"), + lldb::eSymbolTypeAny, sc_list)); + EXPECT_EQ(1u, sc_list.GetSize()); + + SymbolContext sc; + EXPECT_TRUE(sc_list.GetContextAtIndex(0, sc)); + EXPECT_STREQ("int foo(int)", + sc.GetFunctionName(Mangled::ePreferDemangled).AsCString()); +}