blob: 2e5918328ff0a02ed01bba017cb17d27a14684d8 [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
Zachary Turner74e08ca2016-03-02 22:05:52 +000013#include "lldb/Core/UserID.h"
14#include "lldb/Symbol/SymbolFile.h"
15
Zachary Turner42dff792016-04-15 00:21:26 +000016#include "llvm/ADT/DenseMap.h"
Zachary Turner74e08ca2016-03-02 22:05:52 +000017#include "llvm/DebugInfo/PDB/IPDBSession.h"
18#include "llvm/DebugInfo/PDB/PDB.h"
19
Kate Stoneb9c1b512016-09-06 20:57:50 +000020class SymbolFilePDB : public lldb_private::SymbolFile {
Zachary Turner74e08ca2016-03-02 22:05:52 +000021public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000022 //------------------------------------------------------------------
23 // Static Functions
24 //------------------------------------------------------------------
25 static void Initialize();
Zachary Turner74e08ca2016-03-02 22:05:52 +000026
Kate Stoneb9c1b512016-09-06 20:57:50 +000027 static void Terminate();
Zachary Turner74e08ca2016-03-02 22:05:52 +000028
Kate Stoneb9c1b512016-09-06 20:57:50 +000029 static void DebuggerInitialize(lldb_private::Debugger &debugger);
Zachary Turner74e08ca2016-03-02 22:05:52 +000030
Kate Stoneb9c1b512016-09-06 20:57:50 +000031 static lldb_private::ConstString GetPluginNameStatic();
Zachary Turner74e08ca2016-03-02 22:05:52 +000032
Kate Stoneb9c1b512016-09-06 20:57:50 +000033 static const char *GetPluginDescriptionStatic();
Zachary Turner74e08ca2016-03-02 22:05:52 +000034
Kate Stoneb9c1b512016-09-06 20:57:50 +000035 static lldb_private::SymbolFile *
36 CreateInstance(lldb_private::ObjectFile *obj_file);
Zachary Turner74e08ca2016-03-02 22:05:52 +000037
Kate Stoneb9c1b512016-09-06 20:57:50 +000038 //------------------------------------------------------------------
39 // Constructors and Destructors
40 //------------------------------------------------------------------
41 SymbolFilePDB(lldb_private::ObjectFile *ofile);
Zachary Turner74e08ca2016-03-02 22:05:52 +000042
Kate Stoneb9c1b512016-09-06 20:57:50 +000043 ~SymbolFilePDB() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000044
Kate Stoneb9c1b512016-09-06 20:57:50 +000045 uint32_t CalculateAbilities() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000046
Kate Stoneb9c1b512016-09-06 20:57:50 +000047 void InitializeObject() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000048
Kate Stoneb9c1b512016-09-06 20:57:50 +000049 //------------------------------------------------------------------
50 // Compile Unit function calls
51 //------------------------------------------------------------------
Zachary Turner74e08ca2016-03-02 22:05:52 +000052
Kate Stoneb9c1b512016-09-06 20:57:50 +000053 uint32_t GetNumCompileUnits() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000054
Kate Stoneb9c1b512016-09-06 20:57:50 +000055 lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000056
Kate Stoneb9c1b512016-09-06 20:57:50 +000057 lldb::LanguageType
58 ParseCompileUnitLanguage(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000059
Kate Stoneb9c1b512016-09-06 20:57:50 +000060 size_t
61 ParseCompileUnitFunctions(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 bool
64 ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000065
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 bool
67 ParseCompileUnitDebugMacros(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000068
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 bool ParseCompileUnitSupportFiles(
70 const lldb_private::SymbolContext &sc,
71 lldb_private::FileSpecList &support_files) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000072
Kate Stoneb9c1b512016-09-06 20:57:50 +000073 bool ParseImportedModules(
74 const lldb_private::SymbolContext &sc,
75 std::vector<lldb_private::ConstString> &imported_modules) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000076
Kate Stoneb9c1b512016-09-06 20:57:50 +000077 size_t ParseFunctionBlocks(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000078
Kate Stoneb9c1b512016-09-06 20:57:50 +000079 size_t ParseTypes(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000080
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 size_t
82 ParseVariablesForContext(const lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000083
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000085
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 bool CompleteType(lldb_private::CompilerType &compiler_type) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000089
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 lldb_private::CompilerDeclContext
91 GetDeclContextForUID(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 GetDeclContextContainingUID(lldb::user_id_t uid) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000095
Kate Stoneb9c1b512016-09-06 20:57:50 +000096 void
97 ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr,
100 uint32_t resolve_scope,
101 lldb_private::SymbolContext &sc) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103 uint32_t
104 ResolveSymbolContext(const lldb_private::FileSpec &file_spec, uint32_t line,
105 bool check_inlines, uint32_t resolve_scope,
106 lldb_private::SymbolContextList &sc_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 uint32_t
109 FindGlobalVariables(const lldb_private::ConstString &name,
110 const lldb_private::CompilerDeclContext *parent_decl_ctx,
111 bool append, uint32_t max_matches,
112 lldb_private::VariableList &variables) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000113
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114 uint32_t FindGlobalVariables(const lldb_private::RegularExpression &regex,
115 bool append, uint32_t max_matches,
116 lldb_private::VariableList &variables) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000117
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 uint32_t
119 FindFunctions(const lldb_private::ConstString &name,
120 const lldb_private::CompilerDeclContext *parent_decl_ctx,
121 uint32_t name_type_mask, bool include_inlines, bool append,
122 lldb_private::SymbolContextList &sc_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000123
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 uint32_t FindFunctions(const lldb_private::RegularExpression &regex,
125 bool include_inlines, bool append,
126 lldb_private::SymbolContextList &sc_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 void GetMangledNamesForFunction(
129 const std::string &scope_qualified_name,
130 std::vector<lldb_private::ConstString> &mangled_names) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 uint32_t
133 FindTypes(const lldb_private::SymbolContext &sc,
134 const lldb_private::ConstString &name,
135 const lldb_private::CompilerDeclContext *parent_decl_ctx,
136 bool append, uint32_t max_matches,
137 llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
138 lldb_private::TypeMap &types) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 size_t FindTypes(const std::vector<lldb_private::CompilerContext> &context,
141 bool append, lldb_private::TypeMap &types) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 lldb_private::TypeList *GetTypeList() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 size_t GetTypes(lldb_private::SymbolContextScope *sc_scope,
146 uint32_t type_mask,
147 lldb_private::TypeList &type_list) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000148
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149 lldb_private::TypeSystem *
150 GetTypeSystemForLanguage(lldb::LanguageType language) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000151
Kate Stoneb9c1b512016-09-06 20:57:50 +0000152 lldb_private::CompilerDeclContext FindNamespace(
153 const lldb_private::SymbolContext &sc,
154 const lldb_private::ConstString &name,
155 const lldb_private::CompilerDeclContext *parent_decl_ctx) override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000156
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157 lldb_private::ConstString GetPluginName() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000158
Kate Stoneb9c1b512016-09-06 20:57:50 +0000159 uint32_t GetPluginVersion() override;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 llvm::pdb::IPDBSession &GetPDBSession();
Zachary Turner42dff792016-04-15 00:21:26 +0000162
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163 const llvm::pdb::IPDBSession &GetPDBSession() const;
Zachary Turner42dff792016-04-15 00:21:26 +0000164
Zachary Turner74e08ca2016-03-02 22:05:52 +0000165private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166 lldb::CompUnitSP ParseCompileUnitForSymIndex(uint32_t id);
Zachary Turner74e08ca2016-03-02 22:05:52 +0000167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168 bool ParseCompileUnitLineTable(const lldb_private::SymbolContext &sc,
169 uint32_t match_line);
Zachary Turner74e08ca2016-03-02 22:05:52 +0000170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 void BuildSupportFileIdToSupportFileIndexMap(
172 const llvm::pdb::PDBSymbolCompiland &cu,
173 llvm::DenseMap<uint32_t, uint32_t> &index_map) const;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 void FindTypesByRegex(const std::string &regex, uint32_t max_matches,
176 lldb_private::TypeMap &types);
Zachary Turner74e08ca2016-03-02 22:05:52 +0000177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 void FindTypesByName(const std::string &name, uint32_t max_matches,
179 lldb_private::TypeMap &types);
Zachary Turner42dff792016-04-15 00:21:26 +0000180
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181 llvm::DenseMap<uint32_t, lldb::CompUnitSP> m_comp_units;
182 llvm::DenseMap<uint32_t, lldb::TypeSP> m_types;
Zachary Turner42dff792016-04-15 00:21:26 +0000183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184 std::vector<lldb::TypeSP> m_builtin_types;
185 std::unique_ptr<llvm::pdb::IPDBSession> m_session_up;
186 uint32_t m_cached_compile_unit_count;
187 std::unique_ptr<lldb_private::CompilerDeclContext> m_tu_decl_ctx_up;
Zachary Turner74e08ca2016-03-02 22:05:52 +0000188};
189
190#endif // lldb_Plugins_SymbolFile_PDB_SymbolFilePDB_h_