1 //===-- PDBASTParser.h ------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 11 12 #include "lldb/lldb-forward.h" 13 14 #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h" 15 16 class SymbolFilePDB; 17 18 namespace clang { 19 class CharUnits; 20 class CXXRecordDecl; 21 class FieldDecl; 22 class RecordDecl; 23 } // namespace clang 24 25 namespace lldb_private { 26 class TypeSystemClang; 27 class CompilerType; 28 } // namespace lldb_private 29 30 namespace llvm { 31 namespace pdb { 32 template <typename ChildType> class ConcreteSymbolEnumerator; 33 34 class PDBSymbol; 35 class PDBSymbolData; 36 class PDBSymbolFunc; 37 class PDBSymbolTypeBaseClass; 38 class PDBSymbolTypeBuiltin; 39 class PDBSymbolTypeUDT; 40 } // namespace pdb 41 } // namespace llvm 42 43 class PDBASTParser { 44 public: 45 PDBASTParser(lldb_private::TypeSystemClang &ast); 46 ~PDBASTParser(); 47 48 lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type); 49 bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type); 50 51 clang::Decl *GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol); 52 53 clang::DeclContext * 54 GetDeclContextForSymbol(const llvm::pdb::PDBSymbol &symbol); 55 clang::DeclContext * 56 GetDeclContextContainingSymbol(const llvm::pdb::PDBSymbol &symbol); 57 58 void ParseDeclsForDeclContext(const clang::DeclContext *decl_context); 59 60 clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent, 61 llvm::StringRef name); 62 GetClangASTImporter()63 lldb_private::ClangASTImporter &GetClangASTImporter() { 64 return m_ast_importer; 65 } 66 67 private: 68 typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t> 69 CXXRecordDeclToUidMap; 70 typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap; 71 typedef std::set<clang::NamespaceDecl *> NamespacesSet; 72 typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet> 73 ParentToNamespacesMap; 74 typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t> 75 DeclContextToUidMap; 76 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 83 bool AddEnumValue(lldb_private::CompilerType enum_type, 84 const llvm::pdb::PDBSymbolData &data); 85 bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file, 86 lldb_private::CompilerType &compiler_type, 87 llvm::pdb::PDBSymbolTypeUDT &udt); 88 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); 101 clang::CXXMethodDecl * 102 AddRecordMethod(lldb_private::SymbolFile &symbol_file, 103 lldb_private::CompilerType &record_type, 104 const llvm::pdb::PDBSymbolFunc &method) const; 105 106 lldb_private::TypeSystemClang &m_ast; 107 lldb_private::ClangASTImporter m_ast_importer; 108 109 CXXRecordDeclToUidMap m_forward_decl_to_uid; 110 UidToDeclMap m_uid_to_decl; 111 ParentToNamespacesMap m_parent_to_namespaces; 112 NamespacesSet m_namespaces; 113 DeclContextToUidMap m_decl_context_to_uid; 114 }; 115 116 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 117