1 //===-- UdtRecordCompleter.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_NATIVEPDB_UDTRECORDCOMPLETER_H 10 #define LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H 11 12 #include "lldb/Symbol/ClangASTImporter.h" 13 #include "llvm/DebugInfo/CodeView/CVRecord.h" 14 #include "llvm/DebugInfo/CodeView/TypeRecord.h" 15 #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h" 16 17 #include "PdbSymUid.h" 18 19 namespace clang { 20 class CXXBaseSpecifier; 21 class QualType; 22 class TagDecl; 23 } // namespace clang 24 25 namespace llvm { 26 namespace pdb { 27 class TpiStream; 28 } 29 } // namespace llvm 30 31 namespace lldb_private { 32 class Type; 33 class CompilerType; 34 namespace npdb { 35 class PdbAstBuilder; 36 37 class UdtRecordCompleter : public llvm::codeview::TypeVisitorCallbacks { 38 using IndexedBase = 39 std::pair<uint64_t, std::unique_ptr<clang::CXXBaseSpecifier>>; 40 41 union UdtTagRecord { 42 UdtTagRecord() {} 43 llvm::codeview::UnionRecord ur; 44 llvm::codeview::ClassRecord cr; 45 llvm::codeview::EnumRecord er; 46 } m_cvr; 47 48 PdbTypeSymId m_id; 49 CompilerType &m_derived_ct; 50 clang::TagDecl &m_tag_decl; 51 PdbAstBuilder &m_ast_builder; 52 llvm::pdb::TpiStream &m_tpi; 53 std::vector<IndexedBase> m_bases; 54 ClangASTImporter::LayoutInfo m_layout; 55 56 public: 57 UdtRecordCompleter(PdbTypeSymId id, CompilerType &derived_ct, 58 clang::TagDecl &tag_decl, PdbAstBuilder &ast_builder, 59 llvm::pdb::TpiStream &tpi); 60 61 #define MEMBER_RECORD(EnumName, EnumVal, Name) \ 62 llvm::Error visitKnownMember(llvm::codeview::CVMemberRecord &CVR, \ 63 llvm::codeview::Name##Record &Record) override; 64 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) 65 #include "llvm/DebugInfo/CodeView/CodeViewTypes.def" 66 67 void complete(); 68 69 private: 70 clang::QualType AddBaseClassForTypeIndex( 71 llvm::codeview::TypeIndex ti, llvm::codeview::MemberAccess access, 72 llvm::Optional<uint64_t> vtable_idx = llvm::Optional<uint64_t>()); 73 void AddMethod(llvm::StringRef name, llvm::codeview::TypeIndex type_idx, 74 llvm::codeview::MemberAccess access, 75 llvm::codeview::MethodOptions options, 76 llvm::codeview::MemberAttributes attrs); 77 }; 78 79 } // namespace npdb 80 } // namespace lldb_private 81 82 #endif // LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H 83