1 //===-- SymbolFileNativePDB.h -----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
11 #define LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
12 
13 #include "lldb/Symbol/ClangASTImporter.h"
14 #include "llvm/DebugInfo/CodeView/CVRecord.h"
15 #include "llvm/DebugInfo/CodeView/TypeRecord.h"
16 #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
17 
18 #include "PdbSymUid.h"
19 
20 namespace clang {
21 class CXXBaseSpecifier;
22 class TagDecl;
23 } // namespace clang
24 
25 namespace lldb_private {
26 class Type;
27 class CompilerType;
28 namespace npdb {
29 class SymbolFileNativePDB;
30 
31 class UdtRecordCompleter : public llvm::codeview::TypeVisitorCallbacks {
32   union UdtTagRecord {
33     UdtTagRecord() {}
34     llvm::codeview::UnionRecord ur;
35     llvm::codeview::ClassRecord cr;
36     llvm::codeview::EnumRecord er;
37   } m_cvr;
38 
39   PdbSymUid m_uid;
40   CompilerType &m_derived_ct;
41   clang::TagDecl &m_tag_decl;
42   SymbolFileNativePDB &m_symbol_file;
43   std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> m_bases;
44   ClangASTImporter::LayoutInfo m_layout;
45 
46 public:
47   UdtRecordCompleter(PdbSymUid uid, CompilerType &derived_ct,
48                      clang::TagDecl &tag_decl,
49                      SymbolFileNativePDB &symbol_file);
50 
51 #define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
52   llvm::Error visitKnownMember(llvm::codeview::CVMemberRecord &CVR,            \
53                                llvm::codeview::Name##Record &Record) override;
54 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
55 #include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
56 
57   void complete();
58 
59 private:
60   lldb::opaque_compiler_type_t
61   AddBaseClassForTypeIndex(llvm::codeview::TypeIndex ti,
62                            llvm::codeview::MemberAccess access);
63 };
64 
65 } // namespace npdb
66 } // namespace lldb_private
67 
68 #endif // LLDB_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
69