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