1061da546Spatrick //===-- PdbAstBuilder.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 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H 11061da546Spatrick 12061da546Spatrick #include "llvm/ADT/DenseMap.h" 13061da546Spatrick #include "llvm/ADT/StringRef.h" 14*f6aab3d8Srobert #include "llvm/Support/Threading.h" 15061da546Spatrick 16dda28197Spatrick #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h" 17061da546Spatrick 18061da546Spatrick #include "PdbIndex.h" 19061da546Spatrick #include "PdbSymUid.h" 20*f6aab3d8Srobert #include <optional> 21061da546Spatrick 22061da546Spatrick namespace clang { 23061da546Spatrick class TagDecl; 24061da546Spatrick class DeclContext; 25061da546Spatrick class Decl; 26061da546Spatrick class QualType; 27061da546Spatrick class FunctionDecl; 28061da546Spatrick class NamespaceDecl; 29061da546Spatrick } // namespace clang 30061da546Spatrick 31061da546Spatrick namespace llvm { 32061da546Spatrick namespace codeview { 33061da546Spatrick class ProcSym; 34061da546Spatrick } 35061da546Spatrick } // namespace llvm 36061da546Spatrick 37061da546Spatrick namespace lldb_private { 38061da546Spatrick class ClangASTImporter; 39061da546Spatrick class ObjectFile; 40061da546Spatrick 41061da546Spatrick namespace npdb { 42061da546Spatrick class PdbIndex; 43061da546Spatrick struct VariableInfo; 44061da546Spatrick 45061da546Spatrick struct DeclStatus { 46061da546Spatrick DeclStatus() = default; DeclStatusDeclStatus47061da546Spatrick DeclStatus(lldb::user_id_t uid, bool resolved) 48061da546Spatrick : uid(uid), resolved(resolved) {} 49061da546Spatrick lldb::user_id_t uid = 0; 50061da546Spatrick bool resolved = false; 51061da546Spatrick }; 52061da546Spatrick 53061da546Spatrick class PdbAstBuilder { 54061da546Spatrick public: 55061da546Spatrick // Constructors and Destructors 56*f6aab3d8Srobert PdbAstBuilder(TypeSystemClang &clang); 57061da546Spatrick 58061da546Spatrick lldb_private::CompilerDeclContext GetTranslationUnitDecl(); 59061da546Spatrick 60*f6aab3d8Srobert std::optional<lldb_private::CompilerDecl> 61061da546Spatrick GetOrCreateDeclForUid(PdbSymUid uid); 62061da546Spatrick clang::DeclContext *GetOrCreateDeclContextForUid(PdbSymUid uid); 63061da546Spatrick clang::DeclContext *GetParentDeclContext(PdbSymUid uid); 64061da546Spatrick 65061da546Spatrick clang::FunctionDecl *GetOrCreateFunctionDecl(PdbCompilandSymId func_id); 66*f6aab3d8Srobert clang::FunctionDecl * 67*f6aab3d8Srobert GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id); 68061da546Spatrick clang::BlockDecl *GetOrCreateBlockDecl(PdbCompilandSymId block_id); 69061da546Spatrick clang::VarDecl *GetOrCreateVariableDecl(PdbCompilandSymId scope_id, 70061da546Spatrick PdbCompilandSymId var_id); 71061da546Spatrick clang::VarDecl *GetOrCreateVariableDecl(PdbGlobalSymId var_id); 72061da546Spatrick clang::TypedefNameDecl *GetOrCreateTypedefDecl(PdbGlobalSymId id); 73061da546Spatrick void ParseDeclsForContext(clang::DeclContext &context); 74061da546Spatrick 75061da546Spatrick clang::QualType GetBasicType(lldb::BasicType type); 76061da546Spatrick clang::QualType GetOrCreateType(PdbTypeSymId type); 77061da546Spatrick 78061da546Spatrick bool CompleteTagDecl(clang::TagDecl &tag); 79061da546Spatrick bool CompleteType(clang::QualType qt); 80061da546Spatrick 81061da546Spatrick CompilerDecl ToCompilerDecl(clang::Decl &decl); 82061da546Spatrick CompilerType ToCompilerType(clang::QualType qt); 83061da546Spatrick CompilerDeclContext ToCompilerDeclContext(clang::DeclContext &context); 84061da546Spatrick clang::Decl *FromCompilerDecl(CompilerDecl decl); 85061da546Spatrick clang::DeclContext *FromCompilerDeclContext(CompilerDeclContext context); 86061da546Spatrick clang()87dda28197Spatrick TypeSystemClang &clang() { return m_clang; } GetClangASTImporter()88*f6aab3d8Srobert ClangASTImporter &GetClangASTImporter() { return m_importer; } 89061da546Spatrick 90061da546Spatrick void Dump(Stream &stream); 91061da546Spatrick 92061da546Spatrick private: 93061da546Spatrick clang::Decl *TryGetDecl(PdbSymUid uid) const; 94061da546Spatrick 95061da546Spatrick using TypeIndex = llvm::codeview::TypeIndex; 96061da546Spatrick 97061da546Spatrick clang::QualType 98061da546Spatrick CreatePointerType(const llvm::codeview::PointerRecord &pointer); 99061da546Spatrick clang::QualType 100061da546Spatrick CreateModifierType(const llvm::codeview::ModifierRecord &modifier); 101061da546Spatrick clang::QualType CreateArrayType(const llvm::codeview::ArrayRecord &array); 102061da546Spatrick clang::QualType CreateRecordType(PdbTypeSymId id, 103061da546Spatrick const llvm::codeview::TagRecord &record); 104061da546Spatrick clang::QualType CreateEnumType(PdbTypeSymId id, 105061da546Spatrick const llvm::codeview::EnumRecord &record); 106061da546Spatrick clang::QualType 107061da546Spatrick CreateFunctionType(TypeIndex args_type_idx, TypeIndex return_type_idx, 108061da546Spatrick llvm::codeview::CallingConvention calling_convention); 109061da546Spatrick clang::QualType CreateType(PdbTypeSymId type); 110061da546Spatrick 111061da546Spatrick void CreateFunctionParameters(PdbCompilandSymId func_id, 112061da546Spatrick clang::FunctionDecl &function_decl, 113061da546Spatrick uint32_t param_count); 114061da546Spatrick clang::Decl *GetOrCreateSymbolForId(PdbCompilandSymId id); 115061da546Spatrick clang::VarDecl *CreateVariableDecl(PdbSymUid uid, 116061da546Spatrick llvm::codeview::CVSymbol sym, 117061da546Spatrick clang::DeclContext &scope); 118061da546Spatrick clang::NamespaceDecl *GetOrCreateNamespaceDecl(const char *name, 119061da546Spatrick clang::DeclContext &context); 120*f6aab3d8Srobert clang::FunctionDecl *CreateFunctionDeclFromId(PdbTypeSymId func_tid, 121*f6aab3d8Srobert PdbCompilandSymId func_sid); 122*f6aab3d8Srobert clang::FunctionDecl * 123*f6aab3d8Srobert CreateFunctionDecl(PdbCompilandSymId func_id, llvm::StringRef func_name, 124*f6aab3d8Srobert TypeIndex func_ti, CompilerType func_ct, 125*f6aab3d8Srobert uint32_t param_count, clang::StorageClass func_storage, 126*f6aab3d8Srobert bool is_inline, clang::DeclContext *parent); 127*f6aab3d8Srobert void ParseNamespace(clang::DeclContext &parent); 128*f6aab3d8Srobert void ParseAllTypes(); 129*f6aab3d8Srobert void ParseAllFunctionsAndNonLocalVars(); 130061da546Spatrick void ParseDeclsForSimpleContext(clang::DeclContext &context); 131061da546Spatrick void ParseBlockChildren(PdbCompilandSymId block_id); 132061da546Spatrick 133061da546Spatrick std::pair<clang::DeclContext *, std::string> 134061da546Spatrick CreateDeclInfoForType(const llvm::codeview::TagRecord &record, TypeIndex ti); 135061da546Spatrick std::pair<clang::DeclContext *, std::string> 136061da546Spatrick CreateDeclInfoForUndecoratedName(llvm::StringRef uname); 137061da546Spatrick clang::QualType CreateSimpleType(TypeIndex ti); 138061da546Spatrick 139dda28197Spatrick TypeSystemClang &m_clang; 140061da546Spatrick 141061da546Spatrick ClangASTImporter m_importer; 142*f6aab3d8Srobert llvm::once_flag m_parse_functions_and_non_local_vars; 143*f6aab3d8Srobert llvm::once_flag m_parse_all_types; 144061da546Spatrick llvm::DenseMap<clang::Decl *, DeclStatus> m_decl_to_status; 145061da546Spatrick llvm::DenseMap<lldb::user_id_t, clang::Decl *> m_uid_to_decl; 146061da546Spatrick llvm::DenseMap<lldb::user_id_t, clang::QualType> m_uid_to_type; 147*f6aab3d8Srobert 148*f6aab3d8Srobert // From class/struct's opaque_compiler_type_t to a set containing the pairs of 149*f6aab3d8Srobert // method's name and CompilerType. 150*f6aab3d8Srobert llvm::DenseMap<lldb::opaque_compiler_type_t, 151*f6aab3d8Srobert llvm::SmallSet<std::pair<llvm::StringRef, CompilerType>, 8>> 152*f6aab3d8Srobert m_cxx_record_map; 153*f6aab3d8Srobert llvm::DenseSet<clang::NamespaceDecl *> m_parsed_namespaces; 154061da546Spatrick }; 155061da546Spatrick 156061da546Spatrick } // namespace npdb 157061da546Spatrick } // namespace lldb_private 158061da546Spatrick 159dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H 160