blob: 28de07fd8cd8cc060e764e763e27ee63e1a15059 [file] [log] [blame]
Zachary Turner42dff792016-04-15 00:21:26 +00001//===-- PDBASTParser.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_PDBASTPARSER_H
11#define LLDB_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
12
13#include "lldb/lldb-forward.h"
14
15#include "lldb/Symbol/ClangASTImporter.h"
16
Aleksandr Urakov709426b2018-09-10 08:08:43 +000017class SymbolFilePDB;
18
Kate Stoneb9c1b512016-09-06 20:57:50 +000019namespace clang {
Zachary Turner42dff792016-04-15 00:21:26 +000020class CharUnits;
21class CXXRecordDecl;
22class FieldDecl;
23class RecordDecl;
Aaron Smithc8316ed2018-03-22 03:44:51 +000024} // namespace clang
Zachary Turner42dff792016-04-15 00:21:26 +000025
Kate Stoneb9c1b512016-09-06 20:57:50 +000026namespace lldb_private {
Zachary Turner42dff792016-04-15 00:21:26 +000027class ClangASTContext;
28class CompilerType;
Aaron Smithc8316ed2018-03-22 03:44:51 +000029} // namespace lldb_private
Zachary Turner42dff792016-04-15 00:21:26 +000030
Kate Stoneb9c1b512016-09-06 20:57:50 +000031namespace llvm {
32namespace pdb {
Aleksandr Urakov7d2a74f2018-08-14 07:57:44 +000033template <typename ChildType> class ConcreteSymbolEnumerator;
34
Zachary Turner42dff792016-04-15 00:21:26 +000035class PDBSymbol;
36class PDBSymbolData;
Aleksandr Urakov7d2a74f2018-08-14 07:57:44 +000037class PDBSymbolFunc;
38class PDBSymbolTypeBaseClass;
Zachary Turner42dff792016-04-15 00:21:26 +000039class PDBSymbolTypeBuiltin;
Aleksandr Urakov7d2a74f2018-08-14 07:57:44 +000040class PDBSymbolTypeUDT;
Aaron Smithc8316ed2018-03-22 03:44:51 +000041} // namespace pdb
42} // namespace llvm
Zachary Turner42dff792016-04-15 00:21:26 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044class PDBASTParser {
Zachary Turner42dff792016-04-15 00:21:26 +000045public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 PDBASTParser(lldb_private::ClangASTContext &ast);
47 ~PDBASTParser();
Zachary Turner42dff792016-04-15 00:21:26 +000048
Kate Stoneb9c1b512016-09-06 20:57:50 +000049 lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type);
Aleksandr Urakov7d2a74f2018-08-14 07:57:44 +000050 bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type);
51
Aleksandr Urakov709426b2018-09-10 08:08:43 +000052 clang::Decl *GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol);
53
54 clang::DeclContext *
55 GetDeclContextForSymbol(const llvm::pdb::PDBSymbol &symbol);
56 clang::DeclContext *
57 GetDeclContextContainingSymbol(const llvm::pdb::PDBSymbol &symbol);
58
59 void ParseDeclsForDeclContext(const clang::DeclContext *decl_context);
60
61 clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent,
62 llvm::StringRef name);
63
Aleksandr Urakov7d2a74f2018-08-14 07:57:44 +000064 lldb_private::ClangASTImporter &GetClangASTImporter() {
65 return m_ast_importer;
66 }
Zachary Turner42dff792016-04-15 00:21:26 +000067
68private:
Aleksandr Urakov709426b2018-09-10 08:08:43 +000069 typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
70 CXXRecordDeclToUidMap;
71 typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
72 typedef llvm::DenseMap<clang::DeclContext *, std::set<clang::NamespaceDecl *>>
73 ParentToNamespacesMap;
74 typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
75 DeclContextToUidMap;
Aleksandr Urakov7d2a74f2018-08-14 07:57:44 +000076 typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData>
77 PDBDataSymbolEnumerator;
78 typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass>
79 PDBBaseClassSymbolEnumerator;
80 typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc>
81 PDBFuncSymbolEnumerator;
82
Kate Stoneb9c1b512016-09-06 20:57:50 +000083 bool AddEnumValue(lldb_private::CompilerType enum_type,
Aleksandr Urakov709426b2018-09-10 08:08:43 +000084 const llvm::pdb::PDBSymbolData &data);
Aleksandr Urakov7d2a74f2018-08-14 07:57:44 +000085 bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file,
86 lldb_private::CompilerType &compiler_type,
87 llvm::pdb::PDBSymbolTypeUDT &udt);
Aleksandr Urakov709426b2018-09-10 08:08:43 +000088 void
89 AddRecordMembers(lldb_private::SymbolFile &symbol_file,
90 lldb_private::CompilerType &record_type,
91 PDBDataSymbolEnumerator &members_enum,
92 lldb_private::ClangASTImporter::LayoutInfo &layout_info);
93 void
94 AddRecordBases(lldb_private::SymbolFile &symbol_file,
95 lldb_private::CompilerType &record_type, int record_kind,
96 PDBBaseClassSymbolEnumerator &bases_enum,
97 lldb_private::ClangASTImporter::LayoutInfo &layout_info) const;
98 void AddRecordMethods(lldb_private::SymbolFile &symbol_file,
99 lldb_private::CompilerType &record_type,
100 PDBFuncSymbolEnumerator &methods_enum);
Aleksandr Urakovc1e530e2018-11-06 08:02:55 +0000101 clang::CXXMethodDecl *
102 AddRecordMethod(lldb_private::SymbolFile &symbol_file,
103 lldb_private::CompilerType &record_type,
104 const llvm::pdb::PDBSymbolFunc &method) const;
Zachary Turner42dff792016-04-15 00:21:26 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 lldb_private::ClangASTContext &m_ast;
107 lldb_private::ClangASTImporter m_ast_importer;
Aleksandr Urakov709426b2018-09-10 08:08:43 +0000108
109 CXXRecordDeclToUidMap m_forward_decl_to_uid;
110 UidToDeclMap m_uid_to_decl;
111 ParentToNamespacesMap m_parent_to_namespaces;
112 DeclContextToUidMap m_decl_context_to_uid;
Zachary Turner42dff792016-04-15 00:21:26 +0000113};
114
Aaron Smithc8316ed2018-03-22 03:44:51 +0000115#endif // LLDB_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H