blob: 04bba4704f541805bd0bcfd30be8341362bb8e2c [file] [log] [blame]
Zachary Turner74e08ca2016-03-02 22:05:52 +00001//===-- 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
Aaron Smith7ac1c782018-02-09 05:31:28 +000013#include "lldb/Core/UniqueCStringMap.h"
Zachary Turner74e08ca2016-03-02 22:05:52 +000014#include "lldb/Symbol/SymbolFile.h"
Aaron Smithcab0d232018-05-23 01:52:42 +000015#include "lldb/Symbol/VariableList.h"
Zachary Turnerfb1a0a02017-03-06 18:34:25 +000016#include "lldb/Utility/UserID.h"
Zachary Turner74e08ca2016-03-02 22:05:52 +000017
Zachary Turner42dff792016-04-15 00:21:26 +000018#include "llvm/ADT/DenseMap.h"
Zachary Turner74e08ca2016-03-02 22:05:52 +000019#include "llvm/DebugInfo/PDB/IPDBSession.h"
20#include "llvm/DebugInfo/PDB/PDB.h"
Aaron Smith10a02572018-01-13 06:58:18 +000021#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
Zachary Turner74e08ca2016-03-02 22:05:52 +000022
Kate Stoneb9c1b512016-09-06 20:57:50 +000023class SymbolFilePDB : public lldb_private::SymbolFile {
Zachary Turner74e08ca2016-03-02 22:05:52 +000024public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000025 //------------------------------------------------------------------
26 // Static Functions
27 //------------------------------------------------------------------
28 static void Initialize();
Zachary Turner74e08ca2016-03-02 22:05:52 +000029
Kate Stoneb9c1b512016-09-06 20:57:50 +000030 static void Terminate();
Zachary Turner74e08ca2016-03-02 22:05:52 +000031
Kate Stoneb9c1b512016-09-06 20:57:50 +000032 static void DebuggerInitialize(lldb_private::Debugger &debugger);
Zachary Turner74e08ca2016-03-02 22:05:52 +000033
Kate Stoneb9c1b512016-09-06 20:57:50 +000034 static lldb_private::ConstString GetPluginNameStatic();
Zachary Turner74e08ca2016-03-02 22:05:52 +000035
Kate Stoneb9c1b512016-09-06 20:57:50 +000036 static const char *GetPluginDescriptionStatic();
Zachary Turner74e08ca2016-03-02 22:05:52 +000037
Kate Stoneb9c1b512016-09-06 20:57:50 +000038 static lldb_private::SymbolFile *
39 CreateInstance(lldb_private::ObjectFile *obj_file);
Zachary Turner74e08ca2016-03-02 22:05:52 +000040
Kate Stoneb9c1b512016-09-06 20:57:50 +000041 //------------------------------------------------------------------
42 // Constructors and Destructors
43 //------------------------------------------------------------------
44 SymbolFilePDB(lldb_private::ObjectFile *ofile);
Zachary Turner74e08ca2016-03-02 22:05:52 +000045
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 ~SymbolFilePDB() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 uint32_t CalculateAbilities() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000049
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 void InitializeObject() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 //------------------------------------------------------------------
53 // Compile Unit function calls
54 //------------------------------------------------------------------
Zachary Turner74e08ca2016-03-02 22:05:52 +000055
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 uint32_t GetNumCompileUnits() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000059
Kate Stoneb9c1b512016-09-06 20:57:50 +000060 lldb::LanguageType
61 ParseCompileUnitLanguage(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 size_t
64 ParseCompileUnitFunctions(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000065
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 bool
67 ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000068
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 bool
70 ParseCompileUnitDebugMacros(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000071
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 bool ParseCompileUnitSupportFiles(
73 const lldb_private::SymbolContext &sc,
74 lldb_private::FileSpecList &support_files) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 bool ParseImportedModules(
77 const lldb_private::SymbolContext &sc,
78 std::vector<lldb_private::ConstString> &imported_modules) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000079
Kate Stoneb9c1b512016-09-06 20:57:50 +000080 size_t ParseFunctionBlocks(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000081
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 size_t ParseTypes(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000083
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 size_t
85 ParseVariablesForContext(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000086
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000088
Kate Stoneb9c1b512016-09-06 20:57:50 +000089 bool CompleteType(lldb_private::CompilerType &compiler_type) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000090
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000092
Kate Stoneb9c1b512016-09-06 20:57:50 +000093 lldb_private::CompilerDeclContext
94 GetDeclContextForUID(lldb::user_id_t uid) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000095
Kate Stoneb9c1b512016-09-06 20:57:50 +000096 lldb_private::CompilerDeclContext
97 GetDeclContextContainingUID(lldb::user_id_t uid) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 void
100 ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr,
103 uint32_t resolve_scope,
104 lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 uint32_t
107 ResolveSymbolContext(const lldb_private::FileSpec &file_spec, uint32_t line,
108 bool check_inlines, uint32_t resolve_scope,
109 lldb_private::SymbolContextList &sc_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 uint32_t
112 FindGlobalVariables(const lldb_private::ConstString &name,
113 const lldb_private::CompilerDeclContext *parent_decl_ctx,
Pavel Labath34cda142018-05-31 09:46:26 +0000114 uint32_t max_matches,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115 lldb_private::VariableList &variables) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000116
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117 uint32_t FindGlobalVariables(const lldb_private::RegularExpression &regex,
Pavel Labath34cda142018-05-31 09:46:26 +0000118 uint32_t max_matches,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 lldb_private::VariableList &variables) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000120
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 uint32_t
122 FindFunctions(const lldb_private::ConstString &name,
123 const lldb_private::CompilerDeclContext *parent_decl_ctx,
124 uint32_t name_type_mask, bool include_inlines, bool append,
125 lldb_private::SymbolContextList &sc_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 uint32_t FindFunctions(const lldb_private::RegularExpression &regex,
128 bool include_inlines, bool append,
129 lldb_private::SymbolContextList &sc_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 void GetMangledNamesForFunction(
132 const std::string &scope_qualified_name,
133 std::vector<lldb_private::ConstString> &mangled_names) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 uint32_t
136 FindTypes(const lldb_private::SymbolContext &sc,
137 const lldb_private::ConstString &name,
138 const lldb_private::CompilerDeclContext *parent_decl_ctx,
139 bool append, uint32_t max_matches,
140 llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
141 lldb_private::TypeMap &types) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 size_t FindTypes(const std::vector<lldb_private::CompilerContext> &context,
144 bool append, lldb_private::TypeMap &types) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000145
Aaron Smith364cbfe2017-12-28 06:29:59 +0000146 void FindTypesByRegex(const lldb_private::RegularExpression &regex,
Aaron Smithc8316ed2018-03-22 03:44:51 +0000147 uint32_t max_matches, lldb_private::TypeMap &types);
Aaron Smith364cbfe2017-12-28 06:29:59 +0000148
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149 lldb_private::TypeList *GetTypeList() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 size_t GetTypes(lldb_private::SymbolContextScope *sc_scope,
152 uint32_t type_mask,
153 lldb_private::TypeList &type_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155 lldb_private::TypeSystem *
156 GetTypeSystemForLanguage(lldb::LanguageType language) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158 lldb_private::CompilerDeclContext FindNamespace(
159 const lldb_private::SymbolContext &sc,
160 const lldb_private::ConstString &name,
161 const lldb_private::CompilerDeclContext *parent_decl_ctx) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000162
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163 lldb_private::ConstString GetPluginName() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165 uint32_t GetPluginVersion() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 llvm::pdb::IPDBSession &GetPDBSession();
Zachary Turner42dff792016-04-15 00:21:26 +0000168
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169 const llvm::pdb::IPDBSession &GetPDBSession() const;
Zachary Turner42dff792016-04-15 00:21:26 +0000170
Zachary Turner74e08ca2016-03-02 22:05:52 +0000171private:
Aaron Smithc8316ed2018-03-22 03:44:51 +0000172 lldb::CompUnitSP ParseCompileUnitForUID(uint32_t id,
173 uint32_t index = UINT32_MAX);
Zachary Turner74e08ca2016-03-02 22:05:52 +0000174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 bool ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc,
176 uint32_t match_line);
Zachary Turner74e08ca2016-03-02 22:05:52 +0000177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 void BuildSupportFileIdToSupportFileIndexMap(
Aaron Smith10a02572018-01-13 06:58:18 +0000179 const llvm::pdb::PDBSymbolCompiland &pdb_compiland,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 llvm::DenseMap<uint32_t, uint32_t> &index_map) const;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000181
Aleksandr Urakov709426b2018-09-10 08:08:43 +0000182 void FindTypesByName(const std::string &name,
183 const lldb_private::CompilerDeclContext *parent_decl_ctx,
184 uint32_t max_matches, lldb_private::TypeMap &types);
Zachary Turner42dff792016-04-15 00:21:26 +0000185
Aaron Smithcab0d232018-05-23 01:52:42 +0000186 std::string GetMangledForPDBData(const llvm::pdb::PDBSymbolData &pdb_data);
187
188 lldb::VariableSP
189 ParseVariableForPDBData(const lldb_private::SymbolContext &sc,
190 const llvm::pdb::PDBSymbolData &pdb_data);
191
192 size_t ParseVariables(const lldb_private::SymbolContext &sc,
193 const llvm::pdb::PDBSymbol &pdb_data,
194 lldb_private::VariableList *variable_list = nullptr);
195
Aaron Smith7ac1c782018-02-09 05:31:28 +0000196 lldb::CompUnitSP
197 GetCompileUnitContainsAddress(const lldb_private::Address &so_addr);
198
Aaron Smithc8316ed2018-03-22 03:44:51 +0000199 typedef std::vector<lldb_private::Type *> TypeCollection;
Aaron Smith7ac1c782018-02-09 05:31:28 +0000200
Aaron Smithc8316ed2018-03-22 03:44:51 +0000201 void GetTypesForPDBSymbol(const llvm::pdb::PDBSymbol &pdb_symbol,
202 uint32_t type_mask,
203 TypeCollection &type_collection);
Aaron Smith7ac1c782018-02-09 05:31:28 +0000204
Aaron Smithc8316ed2018-03-22 03:44:51 +0000205 lldb_private::Function *
206 ParseCompileUnitFunctionForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func,
207 const lldb_private::SymbolContext &sc);
Aaron Smith7ac1c782018-02-09 05:31:28 +0000208
Aaron Smithe664b5d2018-03-19 21:14:19 +0000209 void GetCompileUnitIndex(const llvm::pdb::PDBSymbolCompiland &pdb_compiland,
Aaron Smith10a02572018-01-13 06:58:18 +0000210 uint32_t &index);
211
Aaron Smith10a02572018-01-13 06:58:18 +0000212 std::unique_ptr<llvm::pdb::PDBSymbolCompiland>
213 GetPDBCompilandByUID(uint32_t uid);
214
Aaron Smith7ac1c782018-02-09 05:31:28 +0000215 lldb_private::Mangled
Aaron Smithe664b5d2018-03-19 21:14:19 +0000216 GetMangledForPDBFunc(const llvm::pdb::PDBSymbolFunc &pdb_func);
Aaron Smith7ac1c782018-02-09 05:31:28 +0000217
Aaron Smithe664b5d2018-03-19 21:14:19 +0000218 bool ResolveFunction(const llvm::pdb::PDBSymbolFunc &pdb_func,
Aaron Smith7ac1c782018-02-09 05:31:28 +0000219 bool include_inlines,
220 lldb_private::SymbolContextList &sc_list);
221
222 bool ResolveFunction(uint32_t uid, bool include_inlines,
223 lldb_private::SymbolContextList &sc_list);
224
225 void CacheFunctionNames();
226
227 bool DeclContextMatchesThisSymbolFile(
228 const lldb_private::CompilerDeclContext *decl_ctx);
229
Kate Stoneb9c1b512016-09-06 20:57:50 +0000230 llvm::DenseMap<uint32_t, lldb::CompUnitSP> m_comp_units;
231 llvm::DenseMap<uint32_t, lldb::TypeSP> m_types;
Aaron Smithcab0d232018-05-23 01:52:42 +0000232 llvm::DenseMap<uint32_t, lldb::VariableSP> m_variables;
Zachary Turner42dff792016-04-15 00:21:26 +0000233
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234 std::vector<lldb::TypeSP> m_builtin_types;
235 std::unique_ptr<llvm::pdb::IPDBSession> m_session_up;
Aaron Smith10a02572018-01-13 06:58:18 +0000236 std::unique_ptr<llvm::pdb::PDBSymbolExe> m_global_scope_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000237 uint32_t m_cached_compile_unit_count;
238 std::unique_ptr<lldb_private::CompilerDeclContext> m_tu_decl_ctx_up;
Aaron Smith7ac1c782018-02-09 05:31:28 +0000239
240 lldb_private::UniqueCStringMap<uint32_t> m_func_full_names;
241 lldb_private::UniqueCStringMap<uint32_t> m_func_base_names;
242 lldb_private::UniqueCStringMap<uint32_t> m_func_method_names;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000243};
244
245#endif // lldb_Plugins_SymbolFile_PDB_SymbolFilePDB_h_