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 
64   lldb_private::ClangASTImporter &GetClangASTImporter() {
65     return m_ast_importer;
66   }
67 
68   static std::string PDBNameDropScope(const std::string &name);
69 
70 private:
71   typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t>
72       CXXRecordDeclToUidMap;
73   typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap;
74   typedef llvm::DenseMap<clang::DeclContext *, std::set<clang::NamespaceDecl *>>
75       ParentToNamespacesMap;
76   typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t>
77       DeclContextToUidMap;
78   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData>
79       PDBDataSymbolEnumerator;
80   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass>
81       PDBBaseClassSymbolEnumerator;
82   typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc>
83       PDBFuncSymbolEnumerator;
84 
85   bool AddEnumValue(lldb_private::CompilerType enum_type,
86                     const llvm::pdb::PDBSymbolData &data);
87   bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file,
88                            lldb_private::CompilerType &compiler_type,
89                            llvm::pdb::PDBSymbolTypeUDT &udt);
90   void
91   AddRecordMembers(lldb_private::SymbolFile &symbol_file,
92                    lldb_private::CompilerType &record_type,
93                    PDBDataSymbolEnumerator &members_enum,
94                    lldb_private::ClangASTImporter::LayoutInfo &layout_info);
95   void
96   AddRecordBases(lldb_private::SymbolFile &symbol_file,
97                  lldb_private::CompilerType &record_type, int record_kind,
98                  PDBBaseClassSymbolEnumerator &bases_enum,
99                  lldb_private::ClangASTImporter::LayoutInfo &layout_info) const;
100   void AddRecordMethods(lldb_private::SymbolFile &symbol_file,
101                         lldb_private::CompilerType &record_type,
102                         PDBFuncSymbolEnumerator &methods_enum);
103 
104   lldb_private::ClangASTContext &m_ast;
105   lldb_private::ClangASTImporter m_ast_importer;
106 
107   CXXRecordDeclToUidMap m_forward_decl_to_uid;
108   UidToDeclMap m_uid_to_decl;
109   ParentToNamespacesMap m_parent_to_namespaces;
110   DeclContextToUidMap m_decl_context_to_uid;
111 };
112 
113 #endif // LLDB_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H
114