Coverage Report

Created: 2017-10-03 07:32

/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
Line
Count
Source (jump to first uncovered line)
1
//===- TypeDeserializer.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 LLVM_DEBUGINFO_CODEVIEW_TYPEDESERIALIZER_H
11
#define LLVM_DEBUGINFO_CODEVIEW_TYPEDESERIALIZER_H
12
13
#include "llvm/ADT/ArrayRef.h"
14
#include "llvm/ADT/STLExtras.h"
15
#include "llvm/DebugInfo/CodeView/CodeView.h"
16
#include "llvm/DebugInfo/CodeView/TypeRecord.h"
17
#include "llvm/DebugInfo/CodeView/TypeRecordMapping.h"
18
#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
19
#include "llvm/Support/BinaryByteStream.h"
20
#include "llvm/Support/BinaryStreamReader.h"
21
#include "llvm/Support/Error.h"
22
#include <cassert>
23
#include <cstdint>
24
#include <memory>
25
26
namespace llvm {
27
namespace codeview {
28
29
class TypeDeserializer : public TypeVisitorCallbacks {
30
  struct MappingInfo {
31
    explicit MappingInfo(ArrayRef<uint8_t> RecordData)
32
        : Stream(RecordData, llvm::support::little), Reader(Stream),
33
5.04k
          Mapping(Reader) {}
34
35
    BinaryByteStream Stream;
36
    BinaryStreamReader Reader;
37
    TypeRecordMapping Mapping;
38
  };
39
40
public:
41
2.33k
  TypeDeserializer() = default;
42
43
  template <typename T> static Error deserializeAs(CVType &CVT, T &Record) {
44
    Record.Kind = static_cast<TypeRecordKind>(CVT.kind());
45
    MappingInfo I(CVT.content());
46
    if (auto EC = I.Mapping.visitTypeBegin(CVT))
47
      return EC;
48
    if (auto EC = I.Mapping.visitKnownRecord(CVT, Record))
49
      return EC;
50
    if (auto EC = I.Mapping.visitTypeEnd(CVT))
51
      return EC;
52
    return Error::success();
53
  }
54
55
  template <typename T>
56
  static Expected<T> deserializeAs(ArrayRef<uint8_t> Data) {
57
    const RecordPrefix *Prefix =
58
        reinterpret_cast<const RecordPrefix *>(Data.data());
59
    TypeRecordKind K =
60
        static_cast<TypeRecordKind>(uint16_t(Prefix->RecordKind));
61
    T Record(K);
62
    CVType CVT(static_cast<TypeLeafKind>(K), Data);
63
    if (auto EC = deserializeAs<T>(CVT, Record))
64
      return std::move(EC);
65
    return Record;
66
  }
67
68
4.44k
  Error visitTypeBegin(CVType &Record) override {
69
4.44k
    assert(!Mapping && "Already in a type mapping!");
70
4.44k
    Mapping = llvm::make_unique<MappingInfo>(Record.content());
71
4.44k
    return Mapping->Mapping.visitTypeBegin(Record);
72
4.44k
  }
73
74
4.42k
  Error visitTypeBegin(CVType &Record, TypeIndex Index) override {
75
4.42k
    return visitTypeBegin(Record);
76
4.42k
  }
77
78
4.44k
  Error visitTypeEnd(CVType &Record) override {
79
4.44k
    assert(Mapping && "Not in a type mapping!");
80
4.44k
    auto EC = Mapping->Mapping.visitTypeEnd(Record);
81
4.44k
    Mapping.reset();
82
4.44k
    return EC;
83
4.44k
  }
84
85
#define TYPE_RECORD(EnumName, EnumVal, Name)                                   \
86
4.44k
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
4.44k
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
4.44k
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::PointerRecord&)
Line
Count
Source
86
493
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
493
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
493
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ModifierRecord&)
Line
Count
Source
86
111
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
111
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
111
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ProcedureRecord&)
Line
Count
Source
86
307
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
307
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
307
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::MemberFunctionRecord&)
Line
Count
Source
86
443
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
443
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
443
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::LabelRecord&)
Line
Count
Source
86
1
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
1
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
1
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ArgListRecord&)
Line
Count
Source
86
491
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
491
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
491
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::FieldListRecord&)
Line
Count
Source
86
462
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
462
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
462
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ArrayRecord&)
Line
Count
Source
86
67
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
67
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
67
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ClassRecord&)
Line
Count
Source
86
635
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
635
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
635
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::UnionRecord&)
Line
Count
Source
86
19
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
19
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
19
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::EnumRecord&)
Line
Count
Source
86
170
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
170
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
170
  }
Unexecuted instantiation: llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::TypeServer2Record&)
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::VFTableRecord&)
Line
Count
Source
86
11
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
11
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
11
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::VFTableShapeRecord&)
Line
Count
Source
86
32
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
32
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
32
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::BitFieldRecord&)
Line
Count
Source
86
14
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
14
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
14
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::FuncIdRecord&)
Line
Count
Source
86
333
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
333
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
333
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::MemberFuncIdRecord&)
Line
Count
Source
86
69
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
69
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
69
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::BuildInfoRecord&)
Line
Count
Source
86
41
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
41
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
41
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::StringListRecord&)
Line
Count
Source
86
40
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
40
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
40
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::StringIdRecord&)
Line
Count
Source
86
375
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
375
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
375
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::UdtSourceLineRecord&)
Line
Count
Source
86
195
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
195
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
195
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::UdtModSourceLineRecord&)
Line
Count
Source
86
8
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
8
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
8
  }
llvm::codeview::TypeDeserializer::visitKnownRecord(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::MethodOverloadListRecord&)
Line
Count
Source
86
125
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override {         \
87
125
    return visitKnownRecordImpl<Name##Record>(CVR, Record);                    \
88
125
  }
89
#define MEMBER_RECORD(EnumName, EnumVal, Name)
90
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
91
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
92
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
93
94
private:
95
  template <typename RecordType>
96
4.44k
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
4.44k
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
4.44k
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::MethodOverloadListRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::MethodOverloadListRecord&)
Line
Count
Source
96
125
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
125
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
125
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::ProcedureRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ProcedureRecord&)
Line
Count
Source
96
307
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
307
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
307
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::UdtModSourceLineRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::UdtModSourceLineRecord&)
Line
Count
Source
96
8
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
8
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
8
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::UdtSourceLineRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::UdtSourceLineRecord&)
Line
Count
Source
96
195
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
195
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
195
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::StringIdRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::StringIdRecord&)
Line
Count
Source
96
375
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
375
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
375
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::StringListRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::StringListRecord&)
Line
Count
Source
96
40
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
40
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
40
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::BuildInfoRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::BuildInfoRecord&)
Line
Count
Source
96
41
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
41
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
41
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::MemberFuncIdRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::MemberFuncIdRecord&)
Line
Count
Source
96
69
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
69
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
69
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::FuncIdRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::FuncIdRecord&)
Line
Count
Source
96
333
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
333
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
333
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::BitFieldRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::BitFieldRecord&)
Line
Count
Source
96
14
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
14
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
14
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::VFTableShapeRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::VFTableShapeRecord&)
Line
Count
Source
96
32
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
32
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
32
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::VFTableRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::VFTableRecord&)
Line
Count
Source
96
11
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
11
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
11
  }
Unexecuted instantiation: llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::TypeServer2Record>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::TypeServer2Record&)
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::EnumRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::EnumRecord&)
Line
Count
Source
96
170
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
170
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
170
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::UnionRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::UnionRecord&)
Line
Count
Source
96
19
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
19
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
19
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::ClassRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ClassRecord&)
Line
Count
Source
96
635
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
635
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
635
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::ArrayRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ArrayRecord&)
Line
Count
Source
96
67
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
67
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
67
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::FieldListRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::FieldListRecord&)
Line
Count
Source
96
462
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
462
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
462
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::ArgListRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ArgListRecord&)
Line
Count
Source
96
491
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
491
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
491
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::LabelRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::LabelRecord&)
Line
Count
Source
96
1
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
1
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
1
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::PointerRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::PointerRecord&)
Line
Count
Source
96
493
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
493
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
493
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::ModifierRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::ModifierRecord&)
Line
Count
Source
96
111
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
111
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
111
  }
llvm::Error llvm::codeview::TypeDeserializer::visitKnownRecordImpl<llvm::codeview::MemberFunctionRecord>(llvm::codeview::CVRecord<llvm::codeview::TypeLeafKind>&, llvm::codeview::MemberFunctionRecord&)
Line
Count
Source
96
443
  Error visitKnownRecordImpl(CVType &CVR, RecordType &Record) {
97
443
    return Mapping->Mapping.visitKnownRecord(CVR, Record);
98
443
  }
99
100
  std::unique_ptr<MappingInfo> Mapping;
101
};
102
103
class FieldListDeserializer : public TypeVisitorCallbacks {
104
  struct MappingInfo {
105
    explicit MappingInfo(BinaryStreamReader &R)
106
350
        : Reader(R), Mapping(Reader), StartOffset(0) {}
107
108
    BinaryStreamReader &Reader;
109
    TypeRecordMapping Mapping;
110
    uint32_t StartOffset;
111
  };
112
113
public:
114
350
  explicit FieldListDeserializer(BinaryStreamReader &Reader) : Mapping(Reader) {
115
350
    CVType FieldList;
116
350
    FieldList.Type = TypeLeafKind::LF_FIELDLIST;
117
350
    consumeError(Mapping.Mapping.visitTypeBegin(FieldList));
118
350
  }
119
120
350
  ~FieldListDeserializer() override {
121
350
    CVType FieldList;
122
350
    FieldList.Type = TypeLeafKind::LF_FIELDLIST;
123
350
    consumeError(Mapping.Mapping.visitTypeEnd(FieldList));
124
350
  }
125
126
7.44k
  Error visitMemberBegin(CVMemberRecord &Record) override {
127
7.44k
    Mapping.StartOffset = Mapping.Reader.getOffset();
128
7.44k
    return Mapping.Mapping.visitMemberBegin(Record);
129
7.44k
  }
130
131
7.44k
  Error visitMemberEnd(CVMemberRecord &Record) override {
132
7.44k
    if (auto EC = Mapping.Mapping.visitMemberEnd(Record))
133
0
      return EC;
134
7.44k
    return Error::success();
135
7.44k
  }
136
137
#define TYPE_RECORD(EnumName, EnumVal, Name)
138
#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
139
7.44k
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
7.44k
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
7.44k
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::VirtualBaseClassRecord&)
Line
Count
Source
139
17
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
17
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
17
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::BaseClassRecord&)
Line
Count
Source
139
26
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
26
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
26
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::VFPtrRecord&)
Line
Count
Source
139
14
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
14
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
14
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::StaticDataMemberRecord&)
Line
Count
Source
139
8
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
8
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
8
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::OverloadedMethodRecord&)
Line
Count
Source
139
112
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
112
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
112
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::DataMemberRecord&)
Line
Count
Source
139
507
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
507
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
507
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::NestedTypeRecord&)
Line
Count
Source
139
133
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
133
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
133
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::OneMethodRecord&)
Line
Count
Source
139
105
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
105
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
105
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::EnumeratorRecord&)
Line
Count
Source
139
6.52k
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
6.52k
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
6.52k
  }
llvm::codeview::FieldListDeserializer::visitKnownMember(llvm::codeview::CVMemberRecord&, llvm::codeview::ListContinuationRecord&)
Line
Count
Source
139
4
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
140
4
    return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
141
4
  }
142
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
143
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
144
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
145
146
private:
147
  template <typename RecordType>
148
7.44k
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
7.44k
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
7.44k
152
7.44k
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
7.44k
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
7.44k
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
7.44k
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
7.44k
    assert(Mapping.Reader.getOffset() == EndOffset);
158
7.44k
    return Error::success();
159
7.44k
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::ListContinuationRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::ListContinuationRecord&)
Line
Count
Source
148
4
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
4
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
4
152
4
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
4
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
4
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
4
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
4
    assert(Mapping.Reader.getOffset() == EndOffset);
158
4
    return Error::success();
159
4
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::VirtualBaseClassRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::VirtualBaseClassRecord&)
Line
Count
Source
148
17
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
17
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
17
152
17
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
17
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
17
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
17
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
17
    assert(Mapping.Reader.getOffset() == EndOffset);
158
17
    return Error::success();
159
17
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::VFPtrRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::VFPtrRecord&)
Line
Count
Source
148
14
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
14
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
14
152
14
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
14
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
14
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
14
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
14
    assert(Mapping.Reader.getOffset() == EndOffset);
158
14
    return Error::success();
159
14
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::StaticDataMemberRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::StaticDataMemberRecord&)
Line
Count
Source
148
8
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
8
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
8
152
8
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
8
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
8
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
8
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
8
    assert(Mapping.Reader.getOffset() == EndOffset);
158
8
    return Error::success();
159
8
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::OverloadedMethodRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::OverloadedMethodRecord&)
Line
Count
Source
148
112
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
112
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
112
152
112
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
112
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
112
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
112
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
112
    assert(Mapping.Reader.getOffset() == EndOffset);
158
112
    return Error::success();
159
112
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::DataMemberRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::DataMemberRecord&)
Line
Count
Source
148
507
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
507
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
507
152
507
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
507
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
507
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
507
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
507
    assert(Mapping.Reader.getOffset() == EndOffset);
158
507
    return Error::success();
159
507
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::NestedTypeRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::NestedTypeRecord&)
Line
Count
Source
148
133
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
133
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
133
152
133
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
133
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
133
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
133
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
133
    assert(Mapping.Reader.getOffset() == EndOffset);
158
133
    return Error::success();
159
133
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::OneMethodRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::OneMethodRecord&)
Line
Count
Source
148
105
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
105
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
105
152
105
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
105
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
105
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
105
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
105
    assert(Mapping.Reader.getOffset() == EndOffset);
158
105
    return Error::success();
159
105
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::EnumeratorRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::EnumeratorRecord&)
Line
Count
Source
148
6.52k
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
6.52k
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
6.52k
152
6.52k
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
6.52k
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
6.52k
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
6.52k
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
6.52k
    assert(Mapping.Reader.getOffset() == EndOffset);
158
6.52k
    return Error::success();
159
6.52k
  }
llvm::Error llvm::codeview::FieldListDeserializer::visitKnownMemberImpl<llvm::codeview::BaseClassRecord>(llvm::codeview::CVMemberRecord&, llvm::codeview::BaseClassRecord&)
Line
Count
Source
148
26
  Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {
149
26
    if (auto EC = Mapping.Mapping.visitKnownMember(CVR, Record))
150
0
      return EC;
151
26
152
26
    uint32_t EndOffset = Mapping.Reader.getOffset();
153
26
    uint32_t RecordLength = EndOffset - Mapping.StartOffset;
154
26
    Mapping.Reader.setOffset(Mapping.StartOffset);
155
26
    if (auto EC = Mapping.Reader.readBytes(CVR.Data, RecordLength))
156
0
      return EC;
157
26
    assert(Mapping.Reader.getOffset() == EndOffset);
158
26
    return Error::success();
159
26
  }
160
  MappingInfo Mapping;
161
};
162
163
} // end namespace codeview
164
} // end namespace llvm
165
166
#endif // LLVM_DEBUGINFO_CODEVIEW_TYPEDESERIALIZER_H