/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 |