1 //===-- 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 
17 class SymbolFilePDB;
18 
19 namespace clang {
20 class CharUnits;
21 class CXXRecordDecl;
22 class FieldDecl;
23 class RecordDecl;
24 } // namespace clang
25 
26 namespace lldb_private {
27 class ClangASTContext;
28 class CompilerType;
29 } // namespace lldb_private
30 
31 namespace llvm {
32 namespace pdb {
33 template <typename ChildType> class ConcreteSymbolEnumerator;
34 
35 class PDBSymbol;
36 class PDBSymbolData;
37 class PDBSymbolFunc;
38 class PDBSymbolTypeBaseClass;
39 class PDBSymbolTypeBuiltin;
40 class PDBSymbolTypeUDT;
41 } // namespace pdb
42 } // namespace llvm
43 
44 class PDBASTParser {
45 public:
46   PDBASTParser(lldb_private::ClangASTContext &ast);
47   ~PDBASTParser();
48 
49   lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type);
50   bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type);
51 
52   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 
GetClangASTImporter()64   lldb_private::ClangASTImporter &GetClangASTImporter() {
65     return m_ast_importer;
66   }
67 
68 private:
69   typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
70       CXXRecordDeclToUidMap;
71   typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
72   typedef std::set<clang::NamespaceDecl *> NamespacesSet;
73   typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet>
74       ParentToNamespacesMap;
75   typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
76       DeclContextToUidMap;
77   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData>
78       PDBDataSymbolEnumerator;
79   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass>
80       PDBBaseClassSymbolEnumerator;
81   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc>
82       PDBFuncSymbolEnumerator;
83 
84   bool AddEnumValue(lldb_private::CompilerType enum_type,
85                     const llvm::pdb::PDBSymbolData &data);
86   bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file,
87                            lldb_private::CompilerType &compiler_type,
88                            llvm::pdb::PDBSymbolTypeUDT &udt);
89   void
90   AddRecordMembers(lldb_private::SymbolFile &symbol_file,
91                    lldb_private::CompilerType &record_type,
92                    PDBDataSymbolEnumerator &members_enum,
93                    lldb_private::ClangASTImporter::LayoutInfo &layout_info);
94   void
95   AddRecordBases(lldb_private::SymbolFile &symbol_file,
96                  lldb_private::CompilerType &record_type, int record_kind,
97                  PDBBaseClassSymbolEnumerator &bases_enum,
98                  lldb_private::ClangASTImporter::LayoutInfo &layout_info) const;
99   void AddRecordMethods(lldb_private::SymbolFile &symbol_file,
100                         lldb_private::CompilerType &record_type,
101                         PDBFuncSymbolEnumerator &methods_enum);
102   clang::CXXMethodDecl *
103   AddRecordMethod(lldb_private::SymbolFile &symbol_file,
104                   lldb_private::CompilerType &record_type,
105                   const llvm::pdb::PDBSymbolFunc &method) const;
106 
107   lldb_private::ClangASTContext &m_ast;
108   lldb_private::ClangASTImporter m_ast_importer;
109 
110   CXXRecordDeclToUidMap m_forward_decl_to_uid;
111   UidToDeclMap m_uid_to_decl;
112   ParentToNamespacesMap m_parent_to_namespaces;
113   NamespacesSet m_namespaces;
114   DeclContextToUidMap m_decl_context_to_uid;
115 };
116 
117 #endif // LLDB_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
118