blob: 2a5b5471a1d53bfd6e4de9645ab7f72d103415e2 [file] [log] [blame]
Zachary Turner307f5ae2018-10-12 19:47:13 +00001//===-- SymbolFileNativePDB.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
Zachary Turnerb96181c2018-10-22 16:19:07 +000010#ifndef LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_SYMBOLFILENATIVEPDB_H
11#define LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_SYMBOLFILENATIVEPDB_H
Zachary Turner307f5ae2018-10-12 19:47:13 +000012
Zachary Turner307f5ae2018-10-12 19:47:13 +000013#include "lldb/Symbol/SymbolFile.h"
Zachary Turner307f5ae2018-10-12 19:47:13 +000014
15#include "llvm/ADT/DenseMap.h"
Zachary Turner307f5ae2018-10-12 19:47:13 +000016#include "llvm/DebugInfo/CodeView/CVRecord.h"
Zachary Turner307f5ae2018-10-12 19:47:13 +000017#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
Zachary Turner307f5ae2018-10-12 19:47:13 +000018#include "llvm/DebugInfo/PDB/PDBTypes.h"
19
20#include "CompileUnitIndex.h"
21#include "PdbIndex.h"
22
Zachary Turnerb96181c2018-10-22 16:19:07 +000023namespace clang {
24class TagDecl;
25}
Zachary Turner307f5ae2018-10-12 19:47:13 +000026
27namespace llvm {
Zachary Turnerb96181c2018-10-22 16:19:07 +000028namespace codeview {
29class ClassRecord;
30class EnumRecord;
31class ModifierRecord;
32class PointerRecord;
33struct UnionRecord;
34} // namespace codeview
Zachary Turner307f5ae2018-10-12 19:47:13 +000035} // namespace llvm
36
37namespace lldb_private {
Zachary Turnerb96181c2018-10-22 16:19:07 +000038class ClangASTImporter;
39
Zachary Turner307f5ae2018-10-12 19:47:13 +000040namespace npdb {
41
Zachary Turnerb96181c2018-10-22 16:19:07 +000042struct DeclStatus {
43 DeclStatus() = default;
44 DeclStatus(lldb::user_id_t uid, Type::ResolveStateTag status)
45 : uid(uid), status(status) {}
46 lldb::user_id_t uid = 0;
47 Type::ResolveStateTag status = Type::eResolveStateForward;
48};
49
50class SymbolFileNativePDB : public SymbolFile {
51 friend class UdtRecordCompleter;
52
Zachary Turner307f5ae2018-10-12 19:47:13 +000053public:
54 //------------------------------------------------------------------
55 // Static Functions
56 //------------------------------------------------------------------
57 static void Initialize();
58
59 static void Terminate();
60
Zachary Turnerb96181c2018-10-22 16:19:07 +000061 static void DebuggerInitialize(Debugger &debugger);
Zachary Turner307f5ae2018-10-12 19:47:13 +000062
Zachary Turnerb96181c2018-10-22 16:19:07 +000063 static ConstString GetPluginNameStatic();
Zachary Turner307f5ae2018-10-12 19:47:13 +000064
65 static const char *GetPluginDescriptionStatic();
66
Zachary Turnerb96181c2018-10-22 16:19:07 +000067 static SymbolFile *CreateInstance(ObjectFile *obj_file);
Zachary Turner307f5ae2018-10-12 19:47:13 +000068
69 //------------------------------------------------------------------
70 // Constructors and Destructors
71 //------------------------------------------------------------------
Zachary Turnerb96181c2018-10-22 16:19:07 +000072 SymbolFileNativePDB(ObjectFile *ofile);
Zachary Turner307f5ae2018-10-12 19:47:13 +000073
74 ~SymbolFileNativePDB() override;
75
76 uint32_t CalculateAbilities() override;
77
78 void InitializeObject() override;
79
80 //------------------------------------------------------------------
81 // Compile Unit function calls
82 //------------------------------------------------------------------
83
84 uint32_t GetNumCompileUnits() override;
85
86 lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override;
87
Zachary Turnerb96181c2018-10-22 16:19:07 +000088 lldb::LanguageType ParseCompileUnitLanguage(const SymbolContext &sc) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +000089
Zachary Turnerb96181c2018-10-22 16:19:07 +000090 size_t ParseCompileUnitFunctions(const SymbolContext &sc) override;
91
92 bool ParseCompileUnitLineTable(const SymbolContext &sc) override;
93
94 bool ParseCompileUnitDebugMacros(const SymbolContext &sc) override;
95
96 bool ParseCompileUnitSupportFiles(const SymbolContext &sc,
97 FileSpecList &support_files) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +000098
99 bool
Zachary Turnerb96181c2018-10-22 16:19:07 +0000100 ParseImportedModules(const SymbolContext &sc,
101 std::vector<ConstString> &imported_modules) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000102
Zachary Turnerb96181c2018-10-22 16:19:07 +0000103 size_t ParseFunctionBlocks(const SymbolContext &sc) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000104
Zachary Turnerb96181c2018-10-22 16:19:07 +0000105 size_t ParseTypes(const SymbolContext &sc) override;
106 size_t ParseVariablesForContext(const SymbolContext &sc) override {
Zachary Turner307f5ae2018-10-12 19:47:13 +0000107 return 0;
108 }
Zachary Turnerb96181c2018-10-22 16:19:07 +0000109 Type *ResolveTypeUID(lldb::user_id_t type_uid) override;
110 bool CompleteType(CompilerType &compiler_type) override;
111 uint32_t ResolveSymbolContext(const Address &so_addr, uint32_t resolve_scope,
112 SymbolContext &sc) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000113
Zachary Turnerb96181c2018-10-22 16:19:07 +0000114 size_t GetTypes(SymbolContextScope *sc_scope, uint32_t type_mask,
115 TypeList &type_list) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000116
Zachary Turnerb96181c2018-10-22 16:19:07 +0000117 uint32_t FindFunctions(const ConstString &name,
118 const CompilerDeclContext *parent_decl_ctx,
119 uint32_t name_type_mask, bool include_inlines,
120 bool append, SymbolContextList &sc_list) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000121
Zachary Turnerb96181c2018-10-22 16:19:07 +0000122 uint32_t FindFunctions(const RegularExpression &regex, bool include_inlines,
123 bool append, SymbolContextList &sc_list) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000124
Zachary Turnerb96181c2018-10-22 16:19:07 +0000125 uint32_t FindTypes(const SymbolContext &sc, const ConstString &name,
126 const CompilerDeclContext *parent_decl_ctx, bool append,
127 uint32_t max_matches,
128 llvm::DenseSet<SymbolFile *> &searched_symbol_files,
129 TypeMap &types) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000130
Zachary Turnerb96181c2018-10-22 16:19:07 +0000131 size_t FindTypes(const std::vector<CompilerContext> &context, bool append,
132 TypeMap &types) override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000133
Zachary Turnerb96181c2018-10-22 16:19:07 +0000134 TypeSystem *GetTypeSystemForLanguage(lldb::LanguageType language) override;
135
136 CompilerDeclContext
137 FindNamespace(const SymbolContext &sc, const ConstString &name,
138 const CompilerDeclContext *parent_decl_ctx) override;
139
140 ConstString GetPluginName() override;
Zachary Turner307f5ae2018-10-12 19:47:13 +0000141
142 uint32_t GetPluginVersion() override;
143
144 llvm::pdb::PDBFile &GetPDBFile() { return m_index->pdb(); }
145 const llvm::pdb::PDBFile &GetPDBFile() const { return m_index->pdb(); }
146
147private:
148 lldb::FunctionSP GetOrCreateFunction(PdbSymUid func_uid,
149 const SymbolContext &sc);
150 lldb::CompUnitSP GetOrCreateCompileUnit(const CompilandIndexItem &cci);
151
152 lldb::FunctionSP CreateFunction(PdbSymUid func_uid, const SymbolContext &sc);
153 lldb::CompUnitSP CreateCompileUnit(const CompilandIndexItem &cci);
154
155 llvm::BumpPtrAllocator m_allocator;
156
157 lldb::addr_t m_obj_load_address = 0;
158
159 std::unique_ptr<PdbIndex> m_index;
160
161 llvm::DenseMap<lldb::user_id_t, lldb::FunctionSP> m_functions;
162 llvm::DenseMap<lldb::user_id_t, lldb::CompUnitSP> m_compilands;
163};
164
165} // namespace npdb
166} // namespace lldb_private
167
168#endif // lldb_Plugins_SymbolFile_PDB_SymbolFilePDB_h_