1061da546Spatrick //===-- SymbolFilePDB.h -------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 11061da546Spatrick 12061da546Spatrick #include "lldb/Core/UniqueCStringMap.h" 13061da546Spatrick #include "lldb/Symbol/SymbolFile.h" 14061da546Spatrick #include "lldb/Symbol/VariableList.h" 15061da546Spatrick #include "lldb/Utility/UserID.h" 16061da546Spatrick 17061da546Spatrick #include "llvm/ADT/DenseMap.h" 18061da546Spatrick #include "llvm/DebugInfo/PDB/IPDBSession.h" 19061da546Spatrick #include "llvm/DebugInfo/PDB/PDB.h" 20061da546Spatrick #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" 21*f6aab3d8Srobert #include <optional> 22061da546Spatrick 23061da546Spatrick class PDBASTParser; 24061da546Spatrick 25*f6aab3d8Srobert class SymbolFilePDB : public lldb_private::SymbolFileCommon { 26061da546Spatrick /// LLVM RTTI support. 27061da546Spatrick static char ID; 28061da546Spatrick 29061da546Spatrick public: 30061da546Spatrick /// LLVM RTTI support. 31061da546Spatrick /// \{ isA(const void * ClassID)32061da546Spatrick bool isA(const void *ClassID) const override { 33*f6aab3d8Srobert return ClassID == &ID || SymbolFileCommon::isA(ClassID); 34061da546Spatrick } classof(const SymbolFile * obj)35061da546Spatrick static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } 36061da546Spatrick /// \} 37061da546Spatrick 38061da546Spatrick // Static Functions 39061da546Spatrick static void Initialize(); 40061da546Spatrick 41061da546Spatrick static void Terminate(); 42061da546Spatrick 43061da546Spatrick static void DebuggerInitialize(lldb_private::Debugger &debugger); 44061da546Spatrick GetPluginNameStatic()45*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "pdb"; } 46061da546Spatrick 47*f6aab3d8Srobert static llvm::StringRef GetPluginDescriptionStatic(); 48061da546Spatrick 49061da546Spatrick static lldb_private::SymbolFile * 50061da546Spatrick CreateInstance(lldb::ObjectFileSP objfile_sp); 51061da546Spatrick 52061da546Spatrick // Constructors and Destructors 53061da546Spatrick SymbolFilePDB(lldb::ObjectFileSP objfile_sp); 54061da546Spatrick 55061da546Spatrick ~SymbolFilePDB() override; 56061da546Spatrick 57061da546Spatrick uint32_t CalculateAbilities() override; 58061da546Spatrick 59061da546Spatrick void InitializeObject() override; 60061da546Spatrick 61061da546Spatrick // Compile Unit function calls 62061da546Spatrick 63061da546Spatrick lldb::LanguageType 64061da546Spatrick ParseLanguage(lldb_private::CompileUnit &comp_unit) override; 65061da546Spatrick 66061da546Spatrick size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override; 67061da546Spatrick 68061da546Spatrick bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override; 69061da546Spatrick 70061da546Spatrick bool ParseDebugMacros(lldb_private::CompileUnit &comp_unit) override; 71061da546Spatrick 72061da546Spatrick bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit, 73061da546Spatrick lldb_private::FileSpecList &support_files) override; 74061da546Spatrick 75061da546Spatrick size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override; 76061da546Spatrick 77061da546Spatrick bool ParseImportedModules( 78061da546Spatrick const lldb_private::SymbolContext &sc, 79061da546Spatrick std::vector<lldb_private::SourceModule> &imported_modules) override; 80061da546Spatrick 81061da546Spatrick size_t ParseBlocksRecursive(lldb_private::Function &func) override; 82061da546Spatrick 83061da546Spatrick size_t 84061da546Spatrick ParseVariablesForContext(const lldb_private::SymbolContext &sc) override; 85061da546Spatrick 86061da546Spatrick lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override; 87*f6aab3d8Srobert std::optional<ArrayInfo> GetDynamicArrayInfoForUID( 88061da546Spatrick lldb::user_id_t type_uid, 89061da546Spatrick const lldb_private::ExecutionContext *exe_ctx) override; 90061da546Spatrick 91061da546Spatrick bool CompleteType(lldb_private::CompilerType &compiler_type) override; 92061da546Spatrick 93061da546Spatrick lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; 94061da546Spatrick 95061da546Spatrick lldb_private::CompilerDeclContext 96061da546Spatrick GetDeclContextForUID(lldb::user_id_t uid) override; 97061da546Spatrick 98061da546Spatrick lldb_private::CompilerDeclContext 99061da546Spatrick GetDeclContextContainingUID(lldb::user_id_t uid) override; 100061da546Spatrick 101061da546Spatrick void 102061da546Spatrick ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override; 103061da546Spatrick 104061da546Spatrick uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr, 105061da546Spatrick lldb::SymbolContextItem resolve_scope, 106061da546Spatrick lldb_private::SymbolContext &sc) override; 107061da546Spatrick 108be691f3bSpatrick uint32_t ResolveSymbolContext( 109be691f3bSpatrick const lldb_private::SourceLocationSpec &src_location_spec, 110061da546Spatrick lldb::SymbolContextItem resolve_scope, 111061da546Spatrick lldb_private::SymbolContextList &sc_list) override; 112061da546Spatrick 113061da546Spatrick void 114061da546Spatrick FindGlobalVariables(lldb_private::ConstString name, 115dda28197Spatrick const lldb_private::CompilerDeclContext &parent_decl_ctx, 116061da546Spatrick uint32_t max_matches, 117061da546Spatrick lldb_private::VariableList &variables) override; 118061da546Spatrick 119061da546Spatrick void FindGlobalVariables(const lldb_private::RegularExpression ®ex, 120061da546Spatrick uint32_t max_matches, 121061da546Spatrick lldb_private::VariableList &variables) override; 122061da546Spatrick 123*f6aab3d8Srobert void FindFunctions(const lldb_private::Module::LookupInfo &lookup_info, 124dda28197Spatrick const lldb_private::CompilerDeclContext &parent_decl_ctx, 125061da546Spatrick bool include_inlines, 126061da546Spatrick lldb_private::SymbolContextList &sc_list) override; 127061da546Spatrick 128061da546Spatrick void FindFunctions(const lldb_private::RegularExpression ®ex, 129061da546Spatrick bool include_inlines, 130061da546Spatrick lldb_private::SymbolContextList &sc_list) override; 131061da546Spatrick 132061da546Spatrick void GetMangledNamesForFunction( 133061da546Spatrick const std::string &scope_qualified_name, 134061da546Spatrick std::vector<lldb_private::ConstString> &mangled_names) override; 135061da546Spatrick 136061da546Spatrick void AddSymbols(lldb_private::Symtab &symtab) override; 137061da546Spatrick 138061da546Spatrick void 139061da546Spatrick FindTypes(lldb_private::ConstString name, 140dda28197Spatrick const lldb_private::CompilerDeclContext &parent_decl_ctx, 141061da546Spatrick uint32_t max_matches, 142061da546Spatrick llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, 143061da546Spatrick lldb_private::TypeMap &types) override; 144061da546Spatrick 145061da546Spatrick void FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern, 146061da546Spatrick lldb_private::LanguageSet languages, 147061da546Spatrick llvm::DenseSet<SymbolFile *> &searched_symbol_files, 148061da546Spatrick lldb_private::TypeMap &types) override; 149061da546Spatrick 150061da546Spatrick void FindTypesByRegex(const lldb_private::RegularExpression ®ex, 151061da546Spatrick uint32_t max_matches, lldb_private::TypeMap &types); 152061da546Spatrick 153061da546Spatrick void GetTypes(lldb_private::SymbolContextScope *sc_scope, 154061da546Spatrick lldb::TypeClass type_mask, 155061da546Spatrick lldb_private::TypeList &type_list) override; 156061da546Spatrick 157*f6aab3d8Srobert llvm::Expected<lldb::TypeSystemSP> 158061da546Spatrick GetTypeSystemForLanguage(lldb::LanguageType language) override; 159061da546Spatrick 160061da546Spatrick lldb_private::CompilerDeclContext FindNamespace( 161061da546Spatrick lldb_private::ConstString name, 162dda28197Spatrick const lldb_private::CompilerDeclContext &parent_decl_ctx) override; 163061da546Spatrick GetPluginName()164*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 165061da546Spatrick 166061da546Spatrick llvm::pdb::IPDBSession &GetPDBSession(); 167061da546Spatrick 168061da546Spatrick const llvm::pdb::IPDBSession &GetPDBSession() const; 169061da546Spatrick 170061da546Spatrick void DumpClangAST(lldb_private::Stream &s) override; 171061da546Spatrick 172061da546Spatrick private: 173061da546Spatrick struct SecContribInfo { 174061da546Spatrick uint32_t Offset; 175061da546Spatrick uint32_t Size; 176061da546Spatrick uint32_t CompilandId; 177061da546Spatrick }; 178061da546Spatrick using SecContribsMap = std::map<uint32_t, std::vector<SecContribInfo>>; 179061da546Spatrick 180061da546Spatrick uint32_t CalculateNumCompileUnits() override; 181061da546Spatrick 182061da546Spatrick lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; 183061da546Spatrick 184061da546Spatrick lldb::CompUnitSP ParseCompileUnitForUID(uint32_t id, 185061da546Spatrick uint32_t index = UINT32_MAX); 186061da546Spatrick 187061da546Spatrick bool ParseCompileUnitLineTable(lldb_private::CompileUnit &comp_unit, 188061da546Spatrick uint32_t match_line); 189061da546Spatrick 190061da546Spatrick void BuildSupportFileIdToSupportFileIndexMap( 191061da546Spatrick const llvm::pdb::PDBSymbolCompiland &pdb_compiland, 192061da546Spatrick llvm::DenseMap<uint32_t, uint32_t> &index_map) const; 193061da546Spatrick 194061da546Spatrick void FindTypesByName(llvm::StringRef name, 195dda28197Spatrick const lldb_private::CompilerDeclContext &parent_decl_ctx, 196061da546Spatrick uint32_t max_matches, lldb_private::TypeMap &types); 197061da546Spatrick 198061da546Spatrick std::string GetMangledForPDBData(const llvm::pdb::PDBSymbolData &pdb_data); 199061da546Spatrick 200061da546Spatrick lldb::VariableSP 201061da546Spatrick ParseVariableForPDBData(const lldb_private::SymbolContext &sc, 202061da546Spatrick const llvm::pdb::PDBSymbolData &pdb_data); 203061da546Spatrick 204061da546Spatrick size_t ParseVariables(const lldb_private::SymbolContext &sc, 205061da546Spatrick const llvm::pdb::PDBSymbol &pdb_data, 206061da546Spatrick lldb_private::VariableList *variable_list = nullptr); 207061da546Spatrick 208061da546Spatrick lldb::CompUnitSP 209061da546Spatrick GetCompileUnitContainsAddress(const lldb_private::Address &so_addr); 210061da546Spatrick 211061da546Spatrick typedef std::vector<lldb_private::Type *> TypeCollection; 212061da546Spatrick 213061da546Spatrick void GetTypesForPDBSymbol(const llvm::pdb::PDBSymbol &pdb_symbol, 214061da546Spatrick uint32_t type_mask, 215061da546Spatrick TypeCollection &type_collection); 216061da546Spatrick 217061da546Spatrick lldb_private::Function * 218061da546Spatrick ParseCompileUnitFunctionForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func, 219061da546Spatrick lldb_private::CompileUnit &comp_unit); 220061da546Spatrick 221061da546Spatrick void GetCompileUnitIndex(const llvm::pdb::PDBSymbolCompiland &pdb_compiland, 222061da546Spatrick uint32_t &index); 223061da546Spatrick 224061da546Spatrick PDBASTParser *GetPDBAstParser(); 225061da546Spatrick 226061da546Spatrick std::unique_ptr<llvm::pdb::PDBSymbolCompiland> 227061da546Spatrick GetPDBCompilandByUID(uint32_t uid); 228061da546Spatrick 229061da546Spatrick lldb_private::Mangled 230061da546Spatrick GetMangledForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func); 231061da546Spatrick 232061da546Spatrick bool ResolveFunction(const llvm::pdb::PDBSymbolFunc &pdb_func, 233061da546Spatrick bool include_inlines, 234061da546Spatrick lldb_private::SymbolContextList &sc_list); 235061da546Spatrick 236061da546Spatrick bool ResolveFunction(uint32_t uid, bool include_inlines, 237061da546Spatrick lldb_private::SymbolContextList &sc_list); 238061da546Spatrick 239061da546Spatrick void CacheFunctionNames(); 240061da546Spatrick 241061da546Spatrick bool DeclContextMatchesThisSymbolFile( 242dda28197Spatrick const lldb_private::CompilerDeclContext &decl_ctx); 243061da546Spatrick 244061da546Spatrick uint32_t GetCompilandId(const llvm::pdb::PDBSymbolData &data); 245061da546Spatrick 246061da546Spatrick llvm::DenseMap<uint32_t, lldb::CompUnitSP> m_comp_units; 247061da546Spatrick llvm::DenseMap<uint32_t, lldb::TypeSP> m_types; 248061da546Spatrick llvm::DenseMap<uint32_t, lldb::VariableSP> m_variables; 249061da546Spatrick llvm::DenseMap<uint64_t, std::string> m_public_names; 250061da546Spatrick 251061da546Spatrick SecContribsMap m_sec_contribs; 252061da546Spatrick 253061da546Spatrick std::vector<lldb::TypeSP> m_builtin_types; 254061da546Spatrick std::unique_ptr<llvm::pdb::IPDBSession> m_session_up; 255061da546Spatrick std::unique_ptr<llvm::pdb::PDBSymbolExe> m_global_scope_up; 256061da546Spatrick 257061da546Spatrick lldb_private::UniqueCStringMap<uint32_t> m_func_full_names; 258061da546Spatrick lldb_private::UniqueCStringMap<uint32_t> m_func_base_names; 259061da546Spatrick lldb_private::UniqueCStringMap<uint32_t> m_func_method_names; 260061da546Spatrick }; 261061da546Spatrick 262dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 263