1 //===-- SymbolFilePDB.h -------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 11 12 #include "lldb/Core/UniqueCStringMap.h" 13 #include "lldb/Symbol/SymbolFile.h" 14 #include "lldb/Symbol/VariableList.h" 15 #include "lldb/Utility/UserID.h" 16 17 #include "llvm/ADT/DenseMap.h" 18 #include "llvm/DebugInfo/PDB/IPDBSession.h" 19 #include "llvm/DebugInfo/PDB/PDB.h" 20 #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" 21 22 class PDBASTParser; 23 24 class SymbolFilePDB : public lldb_private::SymbolFile { 25 /// LLVM RTTI support. 26 static char ID; 27 28 public: 29 /// LLVM RTTI support. 30 /// \{ 31 bool isA(const void *ClassID) const override { 32 return ClassID == &ID || SymbolFile::isA(ClassID); 33 } 34 static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } 35 /// \} 36 37 // Static Functions 38 static void Initialize(); 39 40 static void Terminate(); 41 42 static void DebuggerInitialize(lldb_private::Debugger &debugger); 43 44 static lldb_private::ConstString GetPluginNameStatic(); 45 46 static const char *GetPluginDescriptionStatic(); 47 48 static lldb_private::SymbolFile * 49 CreateInstance(lldb::ObjectFileSP objfile_sp); 50 51 // Constructors and Destructors 52 SymbolFilePDB(lldb::ObjectFileSP objfile_sp); 53 54 ~SymbolFilePDB() override; 55 56 uint32_t CalculateAbilities() override; 57 58 void InitializeObject() override; 59 60 // Compile Unit function calls 61 62 lldb::LanguageType 63 ParseLanguage(lldb_private::CompileUnit &comp_unit) override; 64 65 size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override; 66 67 bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override; 68 69 bool ParseDebugMacros(lldb_private::CompileUnit &comp_unit) override; 70 71 bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit, 72 lldb_private::FileSpecList &support_files) override; 73 74 size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override; 75 76 bool ParseImportedModules( 77 const lldb_private::SymbolContext &sc, 78 std::vector<lldb_private::SourceModule> &imported_modules) override; 79 80 size_t ParseBlocksRecursive(lldb_private::Function &func) override; 81 82 size_t 83 ParseVariablesForContext(const lldb_private::SymbolContext &sc) override; 84 85 lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override; 86 llvm::Optional<ArrayInfo> GetDynamicArrayInfoForUID( 87 lldb::user_id_t type_uid, 88 const lldb_private::ExecutionContext *exe_ctx) override; 89 90 bool CompleteType(lldb_private::CompilerType &compiler_type) override; 91 92 lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; 93 94 lldb_private::CompilerDeclContext 95 GetDeclContextForUID(lldb::user_id_t uid) override; 96 97 lldb_private::CompilerDeclContext 98 GetDeclContextContainingUID(lldb::user_id_t uid) override; 99 100 void 101 ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override; 102 103 uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr, 104 lldb::SymbolContextItem resolve_scope, 105 lldb_private::SymbolContext &sc) override; 106 107 uint32_t ResolveSymbolContext( 108 const lldb_private::SourceLocationSpec &src_location_spec, 109 lldb::SymbolContextItem resolve_scope, 110 lldb_private::SymbolContextList &sc_list) override; 111 112 void 113 FindGlobalVariables(lldb_private::ConstString name, 114 const lldb_private::CompilerDeclContext &parent_decl_ctx, 115 uint32_t max_matches, 116 lldb_private::VariableList &variables) override; 117 118 void FindGlobalVariables(const lldb_private::RegularExpression ®ex, 119 uint32_t max_matches, 120 lldb_private::VariableList &variables) override; 121 122 void FindFunctions(lldb_private::ConstString name, 123 const lldb_private::CompilerDeclContext &parent_decl_ctx, 124 lldb::FunctionNameType name_type_mask, 125 bool include_inlines, 126 lldb_private::SymbolContextList &sc_list) override; 127 128 void FindFunctions(const lldb_private::RegularExpression ®ex, 129 bool include_inlines, 130 lldb_private::SymbolContextList &sc_list) override; 131 132 void GetMangledNamesForFunction( 133 const std::string &scope_qualified_name, 134 std::vector<lldb_private::ConstString> &mangled_names) override; 135 136 void AddSymbols(lldb_private::Symtab &symtab) override; 137 138 void 139 FindTypes(lldb_private::ConstString name, 140 const lldb_private::CompilerDeclContext &parent_decl_ctx, 141 uint32_t max_matches, 142 llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, 143 lldb_private::TypeMap &types) override; 144 145 void FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern, 146 lldb_private::LanguageSet languages, 147 llvm::DenseSet<SymbolFile *> &searched_symbol_files, 148 lldb_private::TypeMap &types) override; 149 150 void FindTypesByRegex(const lldb_private::RegularExpression ®ex, 151 uint32_t max_matches, lldb_private::TypeMap &types); 152 153 void GetTypes(lldb_private::SymbolContextScope *sc_scope, 154 lldb::TypeClass type_mask, 155 lldb_private::TypeList &type_list) override; 156 157 llvm::Expected<lldb_private::TypeSystem &> 158 GetTypeSystemForLanguage(lldb::LanguageType language) override; 159 160 lldb_private::CompilerDeclContext FindNamespace( 161 lldb_private::ConstString name, 162 const lldb_private::CompilerDeclContext &parent_decl_ctx) override; 163 164 lldb_private::ConstString GetPluginName() override; 165 166 uint32_t GetPluginVersion() override; 167 168 llvm::pdb::IPDBSession &GetPDBSession(); 169 170 const llvm::pdb::IPDBSession &GetPDBSession() const; 171 172 void DumpClangAST(lldb_private::Stream &s) override; 173 174 private: 175 struct SecContribInfo { 176 uint32_t Offset; 177 uint32_t Size; 178 uint32_t CompilandId; 179 }; 180 using SecContribsMap = std::map<uint32_t, std::vector<SecContribInfo>>; 181 182 uint32_t CalculateNumCompileUnits() override; 183 184 lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; 185 186 lldb::CompUnitSP ParseCompileUnitForUID(uint32_t id, 187 uint32_t index = UINT32_MAX); 188 189 bool ParseCompileUnitLineTable(lldb_private::CompileUnit &comp_unit, 190 uint32_t match_line); 191 192 void BuildSupportFileIdToSupportFileIndexMap( 193 const llvm::pdb::PDBSymbolCompiland &pdb_compiland, 194 llvm::DenseMap<uint32_t, uint32_t> &index_map) const; 195 196 void FindTypesByName(llvm::StringRef name, 197 const lldb_private::CompilerDeclContext &parent_decl_ctx, 198 uint32_t max_matches, lldb_private::TypeMap &types); 199 200 std::string GetMangledForPDBData(const llvm::pdb::PDBSymbolData &pdb_data); 201 202 lldb::VariableSP 203 ParseVariableForPDBData(const lldb_private::SymbolContext &sc, 204 const llvm::pdb::PDBSymbolData &pdb_data); 205 206 size_t ParseVariables(const lldb_private::SymbolContext &sc, 207 const llvm::pdb::PDBSymbol &pdb_data, 208 lldb_private::VariableList *variable_list = nullptr); 209 210 lldb::CompUnitSP 211 GetCompileUnitContainsAddress(const lldb_private::Address &so_addr); 212 213 typedef std::vector<lldb_private::Type *> TypeCollection; 214 215 void GetTypesForPDBSymbol(const llvm::pdb::PDBSymbol &pdb_symbol, 216 uint32_t type_mask, 217 TypeCollection &type_collection); 218 219 lldb_private::Function * 220 ParseCompileUnitFunctionForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func, 221 lldb_private::CompileUnit &comp_unit); 222 223 void GetCompileUnitIndex(const llvm::pdb::PDBSymbolCompiland &pdb_compiland, 224 uint32_t &index); 225 226 PDBASTParser *GetPDBAstParser(); 227 228 std::unique_ptr<llvm::pdb::PDBSymbolCompiland> 229 GetPDBCompilandByUID(uint32_t uid); 230 231 lldb_private::Mangled 232 GetMangledForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func); 233 234 bool ResolveFunction(const llvm::pdb::PDBSymbolFunc &pdb_func, 235 bool include_inlines, 236 lldb_private::SymbolContextList &sc_list); 237 238 bool ResolveFunction(uint32_t uid, bool include_inlines, 239 lldb_private::SymbolContextList &sc_list); 240 241 void CacheFunctionNames(); 242 243 bool DeclContextMatchesThisSymbolFile( 244 const lldb_private::CompilerDeclContext &decl_ctx); 245 246 uint32_t GetCompilandId(const llvm::pdb::PDBSymbolData &data); 247 248 llvm::DenseMap<uint32_t, lldb::CompUnitSP> m_comp_units; 249 llvm::DenseMap<uint32_t, lldb::TypeSP> m_types; 250 llvm::DenseMap<uint32_t, lldb::VariableSP> m_variables; 251 llvm::DenseMap<uint64_t, std::string> m_public_names; 252 253 SecContribsMap m_sec_contribs; 254 255 std::vector<lldb::TypeSP> m_builtin_types; 256 std::unique_ptr<llvm::pdb::IPDBSession> m_session_up; 257 std::unique_ptr<llvm::pdb::PDBSymbolExe> m_global_scope_up; 258 259 lldb_private::UniqueCStringMap<uint32_t> m_func_full_names; 260 lldb_private::UniqueCStringMap<uint32_t> m_func_base_names; 261 lldb_private::UniqueCStringMap<uint32_t> m_func_method_names; 262 }; 263 264 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_SYMBOLFILEPDB_H 265