]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h
Merge ^/vendor/lldb/dist up to its last change, and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lldb / source / Plugins / SymbolFile / NativePDB / SymbolFileNativePDB.h
1 //===-- SymbolFileNativePDB.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_PLUGINS_SYMBOLFILE_NATIVEPDB_SYMBOLFILENATIVEPDB_H
10 #define LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_SYMBOLFILENATIVEPDB_H
11
12 #include "lldb/Symbol/SymbolFile.h"
13
14 #include "llvm/ADT/DenseMap.h"
15 #include "llvm/DebugInfo/CodeView/CVRecord.h"
16 #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
17 #include "llvm/DebugInfo/PDB/PDBTypes.h"
18
19 #include "CompileUnitIndex.h"
20 #include "PdbIndex.h"
21
22 namespace clang {
23 class TagDecl;
24 }
25
26 namespace llvm {
27 namespace codeview {
28 class ClassRecord;
29 class EnumRecord;
30 class ModifierRecord;
31 class PointerRecord;
32 struct UnionRecord;
33 } // namespace codeview
34 } // namespace llvm
35
36 namespace lldb_private {
37
38 namespace npdb {
39 class PdbAstBuilder;
40
41 class SymbolFileNativePDB : public SymbolFile {
42   friend class UdtRecordCompleter;
43
44 public:
45   // Static Functions
46   static void Initialize();
47
48   static void Terminate();
49
50   static void DebuggerInitialize(Debugger &debugger);
51
52   static ConstString GetPluginNameStatic();
53
54   static const char *GetPluginDescriptionStatic();
55
56   static SymbolFile *CreateInstance(lldb::ObjectFileSP objfile_sp);
57
58   // Constructors and Destructors
59   SymbolFileNativePDB(lldb::ObjectFileSP objfile_sp);
60
61   ~SymbolFileNativePDB() override;
62
63   uint32_t CalculateAbilities() override;
64
65   void InitializeObject() override;
66
67   // Compile Unit function calls
68
69   void
70   ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override;
71
72   lldb::LanguageType
73   ParseLanguage(lldb_private::CompileUnit &comp_unit) override;
74
75   size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override;
76
77   bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override;
78
79   bool ParseDebugMacros(lldb_private::CompileUnit &comp_unit) override;
80
81   bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit,
82                          FileSpecList &support_files) override;
83   size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override;
84
85   bool ParseImportedModules(
86       const SymbolContext &sc,
87       std::vector<lldb_private::SourceModule> &imported_modules) override;
88
89   size_t ParseBlocksRecursive(Function &func) override;
90
91   void FindGlobalVariables(ConstString name,
92                            const CompilerDeclContext *parent_decl_ctx,
93                            uint32_t max_matches,
94                            VariableList &variables) override;
95
96   size_t ParseVariablesForContext(const SymbolContext &sc) override;
97
98   void AddSymbols(Symtab &symtab) override;
99
100   CompilerDecl GetDeclForUID(lldb::user_id_t uid) override;
101   CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid) override;
102   CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid) override;
103   Type *ResolveTypeUID(lldb::user_id_t type_uid) override;
104   llvm::Optional<ArrayInfo> GetDynamicArrayInfoForUID(
105       lldb::user_id_t type_uid,
106       const lldb_private::ExecutionContext *exe_ctx) override;
107
108   bool CompleteType(CompilerType &compiler_type) override;
109   uint32_t ResolveSymbolContext(const Address &so_addr,
110                                 lldb::SymbolContextItem resolve_scope,
111                                 SymbolContext &sc) override;
112   uint32_t ResolveSymbolContext(const FileSpec &file_spec, uint32_t line,
113                                 bool check_inlines,
114                                 lldb::SymbolContextItem resolve_scope,
115                                 SymbolContextList &sc_list) override;
116
117   void GetTypes(SymbolContextScope *sc_scope, lldb::TypeClass type_mask,
118                 TypeList &type_list) override;
119
120   void FindFunctions(ConstString name,
121                      const CompilerDeclContext *parent_decl_ctx,
122                      lldb::FunctionNameType name_type_mask,
123                      bool include_inlines, SymbolContextList &sc_list) override;
124
125   void FindFunctions(const RegularExpression &regex, bool include_inlines,
126                      SymbolContextList &sc_list) override;
127
128   void FindTypes(ConstString name, const CompilerDeclContext *parent_decl_ctx,
129                  uint32_t max_matches,
130                  llvm::DenseSet<SymbolFile *> &searched_symbol_files,
131                  TypeMap &types) override;
132
133   void FindTypes(llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
134                  TypeMap &types) override;
135
136   llvm::Expected<TypeSystem &>
137   GetTypeSystemForLanguage(lldb::LanguageType language) override;
138
139   CompilerDeclContext
140   FindNamespace(ConstString name,
141                 const CompilerDeclContext *parent_decl_ctx) override;
142
143   ConstString GetPluginName() override;
144
145   uint32_t GetPluginVersion() override;
146
147   llvm::pdb::PDBFile &GetPDBFile() { return m_index->pdb(); }
148   const llvm::pdb::PDBFile &GetPDBFile() const { return m_index->pdb(); }
149
150   void DumpClangAST(Stream &s) override;
151
152 private:
153   uint32_t CalculateNumCompileUnits() override;
154
155   lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
156
157   void FindTypesByName(llvm::StringRef name, uint32_t max_matches,
158                        TypeMap &types);
159
160   lldb::TypeSP CreateModifierType(PdbTypeSymId type_id,
161                                   const llvm::codeview::ModifierRecord &mr,
162                                   CompilerType ct);
163   lldb::TypeSP CreatePointerType(PdbTypeSymId type_id,
164                                  const llvm::codeview::PointerRecord &pr,
165                                  CompilerType ct);
166   lldb::TypeSP CreateSimpleType(llvm::codeview::TypeIndex ti, CompilerType ct);
167   lldb::TypeSP CreateTagType(PdbTypeSymId type_id,
168                              const llvm::codeview::ClassRecord &cr,
169                              CompilerType ct);
170   lldb::TypeSP CreateTagType(PdbTypeSymId type_id,
171                              const llvm::codeview::EnumRecord &er,
172                              CompilerType ct);
173   lldb::TypeSP CreateTagType(PdbTypeSymId type_id,
174                              const llvm::codeview::UnionRecord &ur,
175                              CompilerType ct);
176   lldb::TypeSP CreateArrayType(PdbTypeSymId type_id,
177                                const llvm::codeview::ArrayRecord &ar,
178                                CompilerType ct);
179   lldb::TypeSP CreateFunctionType(PdbTypeSymId type_id,
180                                   const llvm::codeview::MemberFunctionRecord &pr,
181                                   CompilerType ct);
182   lldb::TypeSP CreateProcedureType(PdbTypeSymId type_id,
183                                    const llvm::codeview::ProcedureRecord &pr,
184                                    CompilerType ct);
185   lldb::TypeSP CreateClassStructUnion(PdbTypeSymId type_id,
186                                       const llvm::codeview::TagRecord &record,
187                                       size_t size, CompilerType ct);
188
189   lldb::FunctionSP GetOrCreateFunction(PdbCompilandSymId func_id,
190                                        CompileUnit &comp_unit);
191   lldb::CompUnitSP GetOrCreateCompileUnit(const CompilandIndexItem &cci);
192   lldb::TypeSP GetOrCreateType(PdbTypeSymId type_id);
193   lldb::TypeSP GetOrCreateType(llvm::codeview::TypeIndex ti);
194   lldb::VariableSP GetOrCreateGlobalVariable(PdbGlobalSymId var_id);
195   Block &GetOrCreateBlock(PdbCompilandSymId block_id);
196   lldb::VariableSP GetOrCreateLocalVariable(PdbCompilandSymId scope_id,
197                                             PdbCompilandSymId var_id,
198                                             bool is_param);
199   lldb::TypeSP GetOrCreateTypedef(PdbGlobalSymId id);
200
201   lldb::FunctionSP CreateFunction(PdbCompilandSymId func_id,
202                                   CompileUnit &comp_unit);
203   Block &CreateBlock(PdbCompilandSymId block_id);
204   lldb::VariableSP CreateLocalVariable(PdbCompilandSymId scope_id,
205                                        PdbCompilandSymId var_id, bool is_param);
206   lldb::TypeSP CreateTypedef(PdbGlobalSymId id);
207   lldb::CompUnitSP CreateCompileUnit(const CompilandIndexItem &cci);
208   lldb::TypeSP CreateType(PdbTypeSymId type_id, CompilerType ct);
209   lldb::TypeSP CreateAndCacheType(PdbTypeSymId type_id);
210   lldb::VariableSP CreateGlobalVariable(PdbGlobalSymId var_id);
211   lldb::VariableSP CreateConstantSymbol(PdbGlobalSymId var_id,
212                                         const llvm::codeview::CVSymbol &cvs);
213   size_t ParseVariablesForCompileUnit(CompileUnit &comp_unit,
214                                       VariableList &variables);
215   size_t ParseVariablesForBlock(PdbCompilandSymId block_id);
216
217   llvm::BumpPtrAllocator m_allocator;
218
219   lldb::addr_t m_obj_load_address = 0;
220   bool m_done_full_type_scan = false;
221
222   std::unique_ptr<PdbIndex> m_index;
223
224   std::unique_ptr<PdbAstBuilder> m_ast;
225
226   llvm::DenseMap<lldb::user_id_t, lldb::VariableSP> m_global_vars;
227   llvm::DenseMap<lldb::user_id_t, lldb::VariableSP> m_local_variables;
228   llvm::DenseMap<lldb::user_id_t, lldb::BlockSP> m_blocks;
229   llvm::DenseMap<lldb::user_id_t, lldb::FunctionSP> m_functions;
230   llvm::DenseMap<lldb::user_id_t, lldb::CompUnitSP> m_compilands;
231   llvm::DenseMap<lldb::user_id_t, lldb::TypeSP> m_types;
232 };
233
234 } // namespace npdb
235 } // namespace lldb_private
236
237 #endif // lldb_Plugins_SymbolFile_PDB_SymbolFilePDB_h_