1 //===-- SymbolFilePDB.h -------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef lldb_Plugins_SymbolFile_PDB_SymbolFilePDB_h_
11 #define lldb_Plugins_SymbolFile_PDB_SymbolFilePDB_h_
12 
13 #include <unordered_map>
14 
15 #include "lldb/Core/UserID.h"
16 #include "lldb/Symbol/SymbolFile.h"
17 
18 #include "llvm/DebugInfo/PDB/IPDBSession.h"
19 #include "llvm/DebugInfo/PDB/PDB.h"
20 
21 class SymbolFilePDB : public lldb_private::SymbolFile
22 {
23 public:
24     //------------------------------------------------------------------
25     // Static Functions
26     //------------------------------------------------------------------
27     static void
28     Initialize();
29 
30     static void
31     Terminate();
32 
33     static void
34     DebuggerInitialize(lldb_private::Debugger &debugger);
35 
36     static lldb_private::ConstString
37     GetPluginNameStatic();
38 
39     static const char *
40     GetPluginDescriptionStatic();
41 
42     static lldb_private::SymbolFile *
43     CreateInstance(lldb_private::ObjectFile *obj_file);
44 
45     //------------------------------------------------------------------
46     // Constructors and Destructors
47     //------------------------------------------------------------------
48     SymbolFilePDB(lldb_private::ObjectFile *ofile);
49 
50     ~SymbolFilePDB() override;
51 
52     uint32_t
53     CalculateAbilities() override;
54 
55     void
56     InitializeObject() override;
57 
58     //------------------------------------------------------------------
59     // Compile Unit function calls
60     //------------------------------------------------------------------
61 
62     uint32_t
63     GetNumCompileUnits() override;
64 
65     lldb::CompUnitSP
66     ParseCompileUnitAtIndex(uint32_t index) override;
67 
68     lldb::LanguageType
69     ParseCompileUnitLanguage(const lldb_private::SymbolContext &sc) override;
70 
71     size_t
72     ParseCompileUnitFunctions(const lldb_private::SymbolContext &sc) override;
73 
74     bool
75     ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc) override;
76 
77     bool
78     ParseCompileUnitDebugMacros(const lldb_private::SymbolContext &sc) override;
79 
80     bool
81     ParseCompileUnitSupportFiles(const lldb_private::SymbolContext &sc,
82                                  lldb_private::FileSpecList &support_files) override;
83 
84     bool
85     ParseImportedModules(const lldb_private::SymbolContext &sc,
86                          std::vector<lldb_private::ConstString> &imported_modules) override;
87 
88     size_t
89     ParseFunctionBlocks(const lldb_private::SymbolContext &sc) override;
90 
91     size_t
92     ParseTypes(const lldb_private::SymbolContext &sc) override;
93 
94     size_t
95     ParseVariablesForContext(const lldb_private::SymbolContext &sc) override;
96 
97     lldb_private::Type *
98     ResolveTypeUID(lldb::user_id_t type_uid) override;
99 
100     bool
101     CompleteType(lldb_private::CompilerType &compiler_type) override;
102 
103     lldb_private::CompilerDecl
104     GetDeclForUID(lldb::user_id_t uid) override;
105 
106     lldb_private::CompilerDeclContext
107     GetDeclContextForUID(lldb::user_id_t uid) override;
108 
109     lldb_private::CompilerDeclContext
110     GetDeclContextContainingUID(lldb::user_id_t uid) override;
111 
112     void
113     ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override;
114 
115     uint32_t
116     ResolveSymbolContext(const lldb_private::Address &so_addr, uint32_t resolve_scope,
117                          lldb_private::SymbolContext &sc) override;
118 
119     uint32_t
120     ResolveSymbolContext(const lldb_private::FileSpec &file_spec, uint32_t line, bool check_inlines,
121                          uint32_t resolve_scope, lldb_private::SymbolContextList &sc_list) override;
122 
123     uint32_t
124     FindGlobalVariables(const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx,
125                         bool append, uint32_t max_matches, lldb_private::VariableList &variables) override;
126 
127     uint32_t
128     FindGlobalVariables(const lldb_private::RegularExpression &regex, bool append, uint32_t max_matches,
129                         lldb_private::VariableList &variables) override;
130 
131     uint32_t
132     FindFunctions(const lldb_private::ConstString &name, const lldb_private::CompilerDeclContext *parent_decl_ctx,
133                   uint32_t name_type_mask, bool include_inlines, bool append,
134                   lldb_private::SymbolContextList &sc_list) override;
135 
136     uint32_t
137     FindFunctions(const lldb_private::RegularExpression &regex, bool include_inlines, bool append,
138                   lldb_private::SymbolContextList &sc_list) override;
139 
140     void
141     GetMangledNamesForFunction(const std::string &scope_qualified_name,
142                                std::vector<lldb_private::ConstString> &mangled_names) override;
143 
144     uint32_t
145     FindTypes(const lldb_private::SymbolContext &sc, const lldb_private::ConstString &name,
146               const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches,
147               llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, lldb_private::TypeMap &types) override;
148 
149     size_t
150     FindTypes(const std::vector<lldb_private::CompilerContext> &context, bool append,
151               lldb_private::TypeMap &types) override;
152 
153     lldb_private::TypeList *
154     GetTypeList() override;
155 
156     size_t
157     GetTypes(lldb_private::SymbolContextScope *sc_scope, uint32_t type_mask,
158              lldb_private::TypeList &type_list) override;
159 
160     lldb_private::TypeSystem *
161     GetTypeSystemForLanguage(lldb::LanguageType language) override;
162 
163     lldb_private::CompilerDeclContext
164     FindNamespace(const lldb_private::SymbolContext &sc, const lldb_private::ConstString &name,
165                   const lldb_private::CompilerDeclContext *parent_decl_ctx) override;
166 
167     lldb_private::ConstString
168     GetPluginName() override;
169 
170     uint32_t
171     GetPluginVersion() override;
172 
173 private:
174     lldb::CompUnitSP
175     ParseCompileUnitForSymIndex(uint32_t id);
176 
177     bool
178     ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc, uint32_t match_line);
179 
180     void
181     BuildSupportFileIdToSupportFileIndexMap(const llvm::PDBSymbolCompiland &cu,
182                                             std::unordered_map<uint32_t, uint32_t> &index_map) const;
183 
184     std::unordered_map<uint32_t, lldb::CompUnitSP> m_comp_units;
185 
186     std::unique_ptr<llvm::IPDBSession> m_session_up;
187     uint32_t m_cached_compile_unit_count;
188 };
189 
190 #endif // lldb_Plugins_SymbolFile_PDB_SymbolFilePDB_h_
191