10b57cec5SDimitry Andric //===-- SymbolFilePDB.h -------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "lldb/Core/UniqueCStringMap.h" 130b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h" 140b57cec5SDimitry Andric #include "lldb/Symbol/VariableList.h" 150b57cec5SDimitry Andric #include "lldb/Utility/UserID.h" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h" 180b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/IPDBSession.h" 190b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDB.h" 200b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" 21bdd1243dSDimitry Andric #include <optional> 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric class PDBASTParser; 240b57cec5SDimitry Andric 2581ad6265SDimitry Andric class SymbolFilePDB : public lldb_private::SymbolFileCommon { 26480093f4SDimitry Andric /// LLVM RTTI support. 27480093f4SDimitry Andric static char ID; 28480093f4SDimitry Andric 290b57cec5SDimitry Andric public: 30480093f4SDimitry Andric /// LLVM RTTI support. 31480093f4SDimitry Andric /// \{ isA(const void * ClassID)32480093f4SDimitry Andric bool isA(const void *ClassID) const override { 3381ad6265SDimitry Andric return ClassID == &ID || SymbolFileCommon::isA(ClassID); 34480093f4SDimitry Andric } classof(const SymbolFile * obj)35480093f4SDimitry Andric static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } 36480093f4SDimitry Andric /// \} 37480093f4SDimitry Andric 380b57cec5SDimitry Andric // Static Functions 390b57cec5SDimitry Andric static void Initialize(); 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric static void Terminate(); 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric static void DebuggerInitialize(lldb_private::Debugger &debugger); 440b57cec5SDimitry Andric GetPluginNameStatic()45349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "pdb"; } 460b57cec5SDimitry Andric 47349cc55cSDimitry Andric static llvm::StringRef GetPluginDescriptionStatic(); 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric static lldb_private::SymbolFile * 509dba64beSDimitry Andric CreateInstance(lldb::ObjectFileSP objfile_sp); 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric // Constructors and Destructors 539dba64beSDimitry Andric SymbolFilePDB(lldb::ObjectFileSP objfile_sp); 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric ~SymbolFilePDB() override; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric uint32_t CalculateAbilities() override; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric void InitializeObject() override; 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric // Compile Unit function calls 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric lldb::LanguageType 640b57cec5SDimitry Andric ParseLanguage(lldb_private::CompileUnit &comp_unit) override; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override; 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric bool ParseDebugMacros(lldb_private::CompileUnit &comp_unit) override; 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit, 73*1db9f3b2SDimitry Andric lldb_private::SupportFileList &support_files) override; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric bool ParseImportedModules( 780b57cec5SDimitry Andric const lldb_private::SymbolContext &sc, 790b57cec5SDimitry Andric std::vector<lldb_private::SourceModule> &imported_modules) override; 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric size_t ParseBlocksRecursive(lldb_private::Function &func) override; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric size_t 840b57cec5SDimitry Andric ParseVariablesForContext(const lldb_private::SymbolContext &sc) override; 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override; 87bdd1243dSDimitry Andric std::optional<ArrayInfo> GetDynamicArrayInfoForUID( 880b57cec5SDimitry Andric lldb::user_id_t type_uid, 890b57cec5SDimitry Andric const lldb_private::ExecutionContext *exe_ctx) override; 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric bool CompleteType(lldb_private::CompilerType &compiler_type) override; 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric lldb_private::CompilerDeclContext 960b57cec5SDimitry Andric GetDeclContextForUID(lldb::user_id_t uid) override; 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric lldb_private::CompilerDeclContext 990b57cec5SDimitry Andric GetDeclContextContainingUID(lldb::user_id_t uid) override; 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric void 1020b57cec5SDimitry Andric ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override; 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr, 1050b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1060b57cec5SDimitry Andric lldb_private::SymbolContext &sc) override; 1070b57cec5SDimitry Andric 108fe6060f1SDimitry Andric uint32_t ResolveSymbolContext( 109fe6060f1SDimitry Andric const lldb_private::SourceLocationSpec &src_location_spec, 1100b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1110b57cec5SDimitry Andric lldb_private::SymbolContextList &sc_list) override; 1120b57cec5SDimitry Andric 1139dba64beSDimitry Andric void 1140b57cec5SDimitry Andric FindGlobalVariables(lldb_private::ConstString name, 1155ffd83dbSDimitry Andric const lldb_private::CompilerDeclContext &parent_decl_ctx, 1160b57cec5SDimitry Andric uint32_t max_matches, 1170b57cec5SDimitry Andric lldb_private::VariableList &variables) override; 1180b57cec5SDimitry Andric 1199dba64beSDimitry Andric void FindGlobalVariables(const lldb_private::RegularExpression ®ex, 1200b57cec5SDimitry Andric uint32_t max_matches, 1210b57cec5SDimitry Andric lldb_private::VariableList &variables) override; 1220b57cec5SDimitry Andric 123bdd1243dSDimitry Andric void FindFunctions(const lldb_private::Module::LookupInfo &lookup_info, 1245ffd83dbSDimitry Andric const lldb_private::CompilerDeclContext &parent_decl_ctx, 1259dba64beSDimitry Andric bool include_inlines, 1269dba64beSDimitry Andric lldb_private::SymbolContextList &sc_list) override; 1270b57cec5SDimitry Andric 1289dba64beSDimitry Andric void FindFunctions(const lldb_private::RegularExpression ®ex, 1299dba64beSDimitry Andric bool include_inlines, 1300b57cec5SDimitry Andric lldb_private::SymbolContextList &sc_list) override; 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric void GetMangledNamesForFunction( 1330b57cec5SDimitry Andric const std::string &scope_qualified_name, 1340b57cec5SDimitry Andric std::vector<lldb_private::ConstString> &mangled_names) override; 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric void AddSymbols(lldb_private::Symtab &symtab) override; 1375f757f3fSDimitry Andric void FindTypes(const lldb_private::TypeQuery &match, 1385f757f3fSDimitry Andric lldb_private::TypeResults &results) override; 1390b57cec5SDimitry Andric void FindTypesByRegex(const lldb_private::RegularExpression ®ex, 1400b57cec5SDimitry Andric uint32_t max_matches, lldb_private::TypeMap &types); 1410b57cec5SDimitry Andric 1429dba64beSDimitry Andric void GetTypes(lldb_private::SymbolContextScope *sc_scope, 1430b57cec5SDimitry Andric lldb::TypeClass type_mask, 1440b57cec5SDimitry Andric lldb_private::TypeList &type_list) override; 1450b57cec5SDimitry Andric 146bdd1243dSDimitry Andric llvm::Expected<lldb::TypeSystemSP> 1470b57cec5SDimitry Andric GetTypeSystemForLanguage(lldb::LanguageType language) override; 1480b57cec5SDimitry Andric 14906c3fb27SDimitry Andric lldb_private::CompilerDeclContext 15006c3fb27SDimitry Andric FindNamespace(lldb_private::ConstString name, 15106c3fb27SDimitry Andric const lldb_private::CompilerDeclContext &parent_decl_ctx, 15206c3fb27SDimitry Andric bool only_root_namespaces) override; 1530b57cec5SDimitry Andric GetPluginName()154349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric llvm::pdb::IPDBSession &GetPDBSession(); 1570b57cec5SDimitry Andric 1580b57cec5SDimitry Andric const llvm::pdb::IPDBSession &GetPDBSession() const; 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric void DumpClangAST(lldb_private::Stream &s) override; 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric private: 1630b57cec5SDimitry Andric struct SecContribInfo { 1640b57cec5SDimitry Andric uint32_t Offset; 1650b57cec5SDimitry Andric uint32_t Size; 1660b57cec5SDimitry Andric uint32_t CompilandId; 1670b57cec5SDimitry Andric }; 1680b57cec5SDimitry Andric using SecContribsMap = std::map<uint32_t, std::vector<SecContribInfo>>; 1690b57cec5SDimitry Andric 1709dba64beSDimitry Andric uint32_t CalculateNumCompileUnits() override; 1719dba64beSDimitry Andric 1729dba64beSDimitry Andric lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; 1739dba64beSDimitry Andric 1740b57cec5SDimitry Andric lldb::CompUnitSP ParseCompileUnitForUID(uint32_t id, 1750b57cec5SDimitry Andric uint32_t index = UINT32_MAX); 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andric bool ParseCompileUnitLineTable(lldb_private::CompileUnit &comp_unit, 1780b57cec5SDimitry Andric uint32_t match_line); 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric void BuildSupportFileIdToSupportFileIndexMap( 1810b57cec5SDimitry Andric const llvm::pdb::PDBSymbolCompiland &pdb_compiland, 1820b57cec5SDimitry Andric llvm::DenseMap<uint32_t, uint32_t> &index_map) const; 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric void FindTypesByName(llvm::StringRef name, 1855ffd83dbSDimitry Andric const lldb_private::CompilerDeclContext &parent_decl_ctx, 1860b57cec5SDimitry Andric uint32_t max_matches, lldb_private::TypeMap &types); 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric std::string GetMangledForPDBData(const llvm::pdb::PDBSymbolData &pdb_data); 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric lldb::VariableSP 1910b57cec5SDimitry Andric ParseVariableForPDBData(const lldb_private::SymbolContext &sc, 1920b57cec5SDimitry Andric const llvm::pdb::PDBSymbolData &pdb_data); 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric size_t ParseVariables(const lldb_private::SymbolContext &sc, 1950b57cec5SDimitry Andric const llvm::pdb::PDBSymbol &pdb_data, 1960b57cec5SDimitry Andric lldb_private::VariableList *variable_list = nullptr); 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric lldb::CompUnitSP 1990b57cec5SDimitry Andric GetCompileUnitContainsAddress(const lldb_private::Address &so_addr); 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andric typedef std::vector<lldb_private::Type *> TypeCollection; 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric void GetTypesForPDBSymbol(const llvm::pdb::PDBSymbol &pdb_symbol, 2040b57cec5SDimitry Andric uint32_t type_mask, 2050b57cec5SDimitry Andric TypeCollection &type_collection); 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andric lldb_private::Function * 2080b57cec5SDimitry Andric ParseCompileUnitFunctionForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func, 2090b57cec5SDimitry Andric lldb_private::CompileUnit &comp_unit); 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric void GetCompileUnitIndex(const llvm::pdb::PDBSymbolCompiland &pdb_compiland, 2120b57cec5SDimitry Andric uint32_t &index); 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric PDBASTParser *GetPDBAstParser(); 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andric std::unique_ptr<llvm::pdb::PDBSymbolCompiland> 2170b57cec5SDimitry Andric GetPDBCompilandByUID(uint32_t uid); 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andric lldb_private::Mangled 2200b57cec5SDimitry Andric GetMangledForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func); 2210b57cec5SDimitry Andric 2220b57cec5SDimitry Andric bool ResolveFunction(const llvm::pdb::PDBSymbolFunc &pdb_func, 2230b57cec5SDimitry Andric bool include_inlines, 2240b57cec5SDimitry Andric lldb_private::SymbolContextList &sc_list); 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric bool ResolveFunction(uint32_t uid, bool include_inlines, 2270b57cec5SDimitry Andric lldb_private::SymbolContextList &sc_list); 2280b57cec5SDimitry Andric 2290b57cec5SDimitry Andric void CacheFunctionNames(); 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric bool DeclContextMatchesThisSymbolFile( 2325ffd83dbSDimitry Andric const lldb_private::CompilerDeclContext &decl_ctx); 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andric uint32_t GetCompilandId(const llvm::pdb::PDBSymbolData &data); 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric llvm::DenseMap<uint32_t, lldb::CompUnitSP> m_comp_units; 2370b57cec5SDimitry Andric llvm::DenseMap<uint32_t, lldb::TypeSP> m_types; 2380b57cec5SDimitry Andric llvm::DenseMap<uint32_t, lldb::VariableSP> m_variables; 2390b57cec5SDimitry Andric llvm::DenseMap<uint64_t, std::string> m_public_names; 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric SecContribsMap m_sec_contribs; 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric std::vector<lldb::TypeSP> m_builtin_types; 2440b57cec5SDimitry Andric std::unique_ptr<llvm::pdb::IPDBSession> m_session_up; 2450b57cec5SDimitry Andric std::unique_ptr<llvm::pdb::PDBSymbolExe> m_global_scope_up; 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andric lldb_private::UniqueCStringMap<uint32_t> m_func_full_names; 2480b57cec5SDimitry Andric lldb_private::UniqueCStringMap<uint32_t> m_func_base_names; 2490b57cec5SDimitry Andric lldb_private::UniqueCStringMap<uint32_t> m_func_method_names; 2500b57cec5SDimitry Andric }; 2510b57cec5SDimitry Andric 2525ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 253