1061da546Spatrick //===-- PDBASTParser.h ------------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9*dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 10*dda28197Spatrick #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 11061da546Spatrick 12061da546Spatrick #include "lldb/lldb-forward.h" 13061da546Spatrick 14*dda28197Spatrick #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h" 15061da546Spatrick 16061da546Spatrick class SymbolFilePDB; 17061da546Spatrick 18061da546Spatrick namespace clang { 19061da546Spatrick class CharUnits; 20061da546Spatrick class CXXRecordDecl; 21061da546Spatrick class FieldDecl; 22061da546Spatrick class RecordDecl; 23061da546Spatrick } // namespace clang 24061da546Spatrick 25061da546Spatrick namespace lldb_private { 26*dda28197Spatrick class TypeSystemClang; 27061da546Spatrick class CompilerType; 28061da546Spatrick } // namespace lldb_private 29061da546Spatrick 30061da546Spatrick namespace llvm { 31061da546Spatrick namespace pdb { 32061da546Spatrick template <typename ChildType> class ConcreteSymbolEnumerator; 33061da546Spatrick 34061da546Spatrick class PDBSymbol; 35061da546Spatrick class PDBSymbolData; 36061da546Spatrick class PDBSymbolFunc; 37061da546Spatrick class PDBSymbolTypeBaseClass; 38061da546Spatrick class PDBSymbolTypeBuiltin; 39061da546Spatrick class PDBSymbolTypeUDT; 40061da546Spatrick } // namespace pdb 41061da546Spatrick } // namespace llvm 42061da546Spatrick 43061da546Spatrick class PDBASTParser { 44061da546Spatrick public: 45*dda28197Spatrick PDBASTParser(lldb_private::TypeSystemClang &ast); 46061da546Spatrick ~PDBASTParser(); 47061da546Spatrick 48061da546Spatrick lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type); 49061da546Spatrick bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type); 50061da546Spatrick 51061da546Spatrick clang::Decl *GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol); 52061da546Spatrick 53061da546Spatrick clang::DeclContext * 54061da546Spatrick GetDeclContextForSymbol(const llvm::pdb::PDBSymbol &symbol); 55061da546Spatrick clang::DeclContext * 56061da546Spatrick GetDeclContextContainingSymbol(const llvm::pdb::PDBSymbol &symbol); 57061da546Spatrick 58061da546Spatrick void ParseDeclsForDeclContext(const clang::DeclContext *decl_context); 59061da546Spatrick 60061da546Spatrick clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent, 61061da546Spatrick llvm::StringRef name); 62061da546Spatrick GetClangASTImporter()63061da546Spatrick lldb_private::ClangASTImporter &GetClangASTImporter() { 64061da546Spatrick return m_ast_importer; 65061da546Spatrick } 66061da546Spatrick 67061da546Spatrick private: 68061da546Spatrick typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t> 69061da546Spatrick CXXRecordDeclToUidMap; 70061da546Spatrick typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap; 71061da546Spatrick typedef std::set<clang::NamespaceDecl *> NamespacesSet; 72061da546Spatrick typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet> 73061da546Spatrick ParentToNamespacesMap; 74061da546Spatrick typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t> 75061da546Spatrick DeclContextToUidMap; 76061da546Spatrick typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData> 77061da546Spatrick PDBDataSymbolEnumerator; 78061da546Spatrick typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass> 79061da546Spatrick PDBBaseClassSymbolEnumerator; 80061da546Spatrick typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc> 81061da546Spatrick PDBFuncSymbolEnumerator; 82061da546Spatrick 83061da546Spatrick bool AddEnumValue(lldb_private::CompilerType enum_type, 84061da546Spatrick const llvm::pdb::PDBSymbolData &data); 85061da546Spatrick bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file, 86061da546Spatrick lldb_private::CompilerType &compiler_type, 87061da546Spatrick llvm::pdb::PDBSymbolTypeUDT &udt); 88061da546Spatrick void 89061da546Spatrick AddRecordMembers(lldb_private::SymbolFile &symbol_file, 90061da546Spatrick lldb_private::CompilerType &record_type, 91061da546Spatrick PDBDataSymbolEnumerator &members_enum, 92061da546Spatrick lldb_private::ClangASTImporter::LayoutInfo &layout_info); 93061da546Spatrick void 94061da546Spatrick AddRecordBases(lldb_private::SymbolFile &symbol_file, 95061da546Spatrick lldb_private::CompilerType &record_type, int record_kind, 96061da546Spatrick PDBBaseClassSymbolEnumerator &bases_enum, 97061da546Spatrick lldb_private::ClangASTImporter::LayoutInfo &layout_info) const; 98061da546Spatrick void AddRecordMethods(lldb_private::SymbolFile &symbol_file, 99061da546Spatrick lldb_private::CompilerType &record_type, 100061da546Spatrick PDBFuncSymbolEnumerator &methods_enum); 101061da546Spatrick clang::CXXMethodDecl * 102061da546Spatrick AddRecordMethod(lldb_private::SymbolFile &symbol_file, 103061da546Spatrick lldb_private::CompilerType &record_type, 104061da546Spatrick const llvm::pdb::PDBSymbolFunc &method) const; 105061da546Spatrick 106*dda28197Spatrick lldb_private::TypeSystemClang &m_ast; 107061da546Spatrick lldb_private::ClangASTImporter m_ast_importer; 108061da546Spatrick 109061da546Spatrick CXXRecordDeclToUidMap m_forward_decl_to_uid; 110061da546Spatrick UidToDeclMap m_uid_to_decl; 111061da546Spatrick ParentToNamespacesMap m_parent_to_namespaces; 112061da546Spatrick NamespacesSet m_namespaces; 113061da546Spatrick DeclContextToUidMap m_decl_context_to_uid; 114061da546Spatrick }; 115061da546Spatrick 116*dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 117