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_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 10#define LLDB_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 11 12#include "lldb/lldb-forward.h" 13 14#include "lldb/Symbol/ClangASTImporter.h" 15 16class SymbolFilePDB; 17 18namespace clang { 19class CharUnits; 20class CXXRecordDecl; 21class FieldDecl; 22class RecordDecl; 23} // namespace clang 24 25namespace lldb_private { 26class ClangASTContext; 27class CompilerType; 28} // namespace lldb_private 29 30namespace llvm { 31namespace pdb { 32template <typename ChildType> class ConcreteSymbolEnumerator; 33 34class PDBSymbol; 35class PDBSymbolData; 36class PDBSymbolFunc; 37class PDBSymbolTypeBaseClass; 38class PDBSymbolTypeBuiltin; 39class PDBSymbolTypeUDT; 40} // namespace pdb 41} // namespace llvm 42 43class PDBASTParser { 44public: 45 PDBASTParser(lldb_private::ClangASTContext &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 63 lldb_private::ClangASTImporter &GetClangASTImporter() { 64 return m_ast_importer; 65 } 66 67private: 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::ClangASTContext &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_PLUGINS_SYMBOLFILE_PDB_PDBASTPARSER_H 117