xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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 &regex,
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 &regex,
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 &regex,
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