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