10b57cec5SDimitry Andric //===-- PDBASTParser.h ------------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 9*5ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 10*5ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "lldb/lldb-forward.h" 130b57cec5SDimitry Andric 14*5ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h" 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric class SymbolFilePDB; 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric namespace clang { 190b57cec5SDimitry Andric class CharUnits; 200b57cec5SDimitry Andric class CXXRecordDecl; 210b57cec5SDimitry Andric class FieldDecl; 220b57cec5SDimitry Andric class RecordDecl; 230b57cec5SDimitry Andric } // namespace clang 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace lldb_private { 26*5ffd83dbSDimitry Andric class TypeSystemClang; 270b57cec5SDimitry Andric class CompilerType; 280b57cec5SDimitry Andric } // namespace lldb_private 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric namespace llvm { 310b57cec5SDimitry Andric namespace pdb { 320b57cec5SDimitry Andric template <typename ChildType> class ConcreteSymbolEnumerator; 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric class PDBSymbol; 350b57cec5SDimitry Andric class PDBSymbolData; 360b57cec5SDimitry Andric class PDBSymbolFunc; 370b57cec5SDimitry Andric class PDBSymbolTypeBaseClass; 380b57cec5SDimitry Andric class PDBSymbolTypeBuiltin; 390b57cec5SDimitry Andric class PDBSymbolTypeUDT; 400b57cec5SDimitry Andric } // namespace pdb 410b57cec5SDimitry Andric } // namespace llvm 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric class PDBASTParser { 440b57cec5SDimitry Andric public: 45*5ffd83dbSDimitry Andric PDBASTParser(lldb_private::TypeSystemClang &ast); 460b57cec5SDimitry Andric ~PDBASTParser(); 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric lldb::TypeSP CreateLLDBTypeFromPDBType(const llvm::pdb::PDBSymbol &type); 490b57cec5SDimitry Andric bool CompleteTypeFromPDB(lldb_private::CompilerType &compiler_type); 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric clang::Decl *GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol); 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric clang::DeclContext * 540b57cec5SDimitry Andric GetDeclContextForSymbol(const llvm::pdb::PDBSymbol &symbol); 550b57cec5SDimitry Andric clang::DeclContext * 560b57cec5SDimitry Andric GetDeclContextContainingSymbol(const llvm::pdb::PDBSymbol &symbol); 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric void ParseDeclsForDeclContext(const clang::DeclContext *decl_context); 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent, 610b57cec5SDimitry Andric llvm::StringRef name); 620b57cec5SDimitry Andric GetClangASTImporter()630b57cec5SDimitry Andric lldb_private::ClangASTImporter &GetClangASTImporter() { 640b57cec5SDimitry Andric return m_ast_importer; 650b57cec5SDimitry Andric } 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric private: 680b57cec5SDimitry Andric typedef llvm::DenseMap<clang::CXXRecordDecl *, lldb::user_id_t> 690b57cec5SDimitry Andric CXXRecordDeclToUidMap; 700b57cec5SDimitry Andric typedef llvm::DenseMap<lldb::user_id_t, clang::Decl *> UidToDeclMap; 710b57cec5SDimitry Andric typedef std::set<clang::NamespaceDecl *> NamespacesSet; 720b57cec5SDimitry Andric typedef llvm::DenseMap<clang::DeclContext *, NamespacesSet> 730b57cec5SDimitry Andric ParentToNamespacesMap; 740b57cec5SDimitry Andric typedef llvm::DenseMap<clang::DeclContext *, lldb::user_id_t> 750b57cec5SDimitry Andric DeclContextToUidMap; 760b57cec5SDimitry Andric typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolData> 770b57cec5SDimitry Andric PDBDataSymbolEnumerator; 780b57cec5SDimitry Andric typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolTypeBaseClass> 790b57cec5SDimitry Andric PDBBaseClassSymbolEnumerator; 800b57cec5SDimitry Andric typedef llvm::pdb::ConcreteSymbolEnumerator<llvm::pdb::PDBSymbolFunc> 810b57cec5SDimitry Andric PDBFuncSymbolEnumerator; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric bool AddEnumValue(lldb_private::CompilerType enum_type, 840b57cec5SDimitry Andric const llvm::pdb::PDBSymbolData &data); 850b57cec5SDimitry Andric bool CompleteTypeFromUDT(lldb_private::SymbolFile &symbol_file, 860b57cec5SDimitry Andric lldb_private::CompilerType &compiler_type, 870b57cec5SDimitry Andric llvm::pdb::PDBSymbolTypeUDT &udt); 880b57cec5SDimitry Andric void 890b57cec5SDimitry Andric AddRecordMembers(lldb_private::SymbolFile &symbol_file, 900b57cec5SDimitry Andric lldb_private::CompilerType &record_type, 910b57cec5SDimitry Andric PDBDataSymbolEnumerator &members_enum, 920b57cec5SDimitry Andric lldb_private::ClangASTImporter::LayoutInfo &layout_info); 930b57cec5SDimitry Andric void 940b57cec5SDimitry Andric AddRecordBases(lldb_private::SymbolFile &symbol_file, 950b57cec5SDimitry Andric lldb_private::CompilerType &record_type, int record_kind, 960b57cec5SDimitry Andric PDBBaseClassSymbolEnumerator &bases_enum, 970b57cec5SDimitry Andric lldb_private::ClangASTImporter::LayoutInfo &layout_info) const; 980b57cec5SDimitry Andric void AddRecordMethods(lldb_private::SymbolFile &symbol_file, 990b57cec5SDimitry Andric lldb_private::CompilerType &record_type, 1000b57cec5SDimitry Andric PDBFuncSymbolEnumerator &methods_enum); 1010b57cec5SDimitry Andric clang::CXXMethodDecl * 1020b57cec5SDimitry Andric AddRecordMethod(lldb_private::SymbolFile &symbol_file, 1030b57cec5SDimitry Andric lldb_private::CompilerType &record_type, 1040b57cec5SDimitry Andric const llvm::pdb::PDBSymbolFunc &method) const; 1050b57cec5SDimitry Andric 106*5ffd83dbSDimitry Andric lldb_private::TypeSystemClang &m_ast; 1070b57cec5SDimitry Andric lldb_private::ClangASTImporter m_ast_importer; 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric CXXRecordDeclToUidMap m_forward_decl_to_uid; 1100b57cec5SDimitry Andric UidToDeclMap m_uid_to_decl; 1110b57cec5SDimitry Andric ParentToNamespacesMap m_parent_to_namespaces; 1120b57cec5SDimitry Andric NamespacesSet m_namespaces; 1130b57cec5SDimitry Andric DeclContextToUidMap m_decl_context_to_uid; 1140b57cec5SDimitry Andric }; 1150b57cec5SDimitry Andric 116*5ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 117