LLVM: lib/DebugInfo/CodeView/CVTypeVisitor.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
10
19
20using namespace llvm;
22
23
24template
27 T KnownRecord(RK);
28 if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
29 return EC;
31}
32
33template
37 T KnownRecord(RK);
38 if (auto EC = Callbacks.visitKnownMember(Record, KnownRecord))
39 return EC;
41}
42
46 return EC;
47
48 switch (Record.Kind) {
49 default:
51 return EC;
52 break;
53#define MEMBER_RECORD(EnumName, EnumVal, Name) \
54 case EnumName: { \
55 if (auto EC = visitKnownMember<Name##Record>(Record, Callbacks)) \
56 return EC; \
57 break; \
58 }
59#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
60 MEMBER_RECORD(EnumVal, EnumVal, AliasName)
61#define TYPE_RECORD(EnumName, EnumVal, Name)
62#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
63#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
64 }
65
67 return EC;
68
70}
71
72namespace {
73
74class CVTypeVisitor {
75public:
76 explicit CVTypeVisitor(TypeVisitorCallbacks &Callbacks);
77
80
81
85
87 Error visitFieldListMemberStream(BinaryStreamReader &Stream);
88
89private:
91
92
93 TypeVisitorCallbacks &Callbacks;
94};
95
97 : Callbacks(Callbacks) {}
98
100 switch (Record.kind()) {
101 default:
103 return EC;
104 break;
105#define TYPE_RECORD(EnumName, EnumVal, Name) \
106 case EnumName: { \
107 if (auto EC = visitKnownRecord<Name##Record>(Record, Callbacks)) \
108 return EC; \
109 break; \
110 }
111#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
112 TYPE_RECORD(EnumVal, EnumVal, AliasName)
113#define MEMBER_RECORD(EnumName, EnumVal, Name)
114#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
115#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
116 }
117
119 return EC;
120
122}
123
124Error CVTypeVisitor::visitTypeRecord(CVType &Record, TypeIndex Index) {
126 return EC;
127
129}
130
131Error CVTypeVisitor::visitTypeRecord(CVType &Record) {
133 return EC;
134
136}
137
138Error CVTypeVisitor::visitMemberRecord(CVMemberRecord Record) {
139 return ::visitMemberRecord(Record, Callbacks);
140}
141
142
143Error CVTypeVisitor::visitTypeStream(const CVTypeArray &Types) {
144 for (auto I : Types) {
146 return EC;
147 }
149}
150
152 for (auto I : Types) {
154 return EC;
155 }
157}
158
159Error CVTypeVisitor::visitTypeStream(TypeCollection &Types) {
160 std::optional I = Types.getFirst();
161 while (I) {
164 return EC;
166 }
168}
169
170Error CVTypeVisitor::visitFieldListMemberStream(BinaryStreamReader &Reader) {
172 while (!Reader.empty()) {
174 return EC;
175
176 CVMemberRecord Record;
177 Record.Kind = Leaf;
179 return EC;
180 }
181
183}
184
185struct FieldListVisitHelper {
186 FieldListVisitHelper(TypeVisitorCallbacks &Callbacks, ArrayRef<uint8_t> Data,
189 Deserializer(Reader),
194 }
195 }
196
197 BinaryByteStream Stream;
198 BinaryStreamReader Reader;
199 FieldListDeserializer Deserializer;
200 TypeVisitorCallbackPipeline Pipeline;
201 CVTypeVisitor Visitor;
202};
203
204struct VisitHelper {
205 VisitHelper(TypeVisitorCallbacks &Callbacks, VisitorDataSource Source)
210 }
211 }
212
213 TypeDeserializer Deserializer;
214 TypeVisitorCallbackPipeline Pipeline;
215 CVTypeVisitor Visitor;
216};
217}
218
222 VisitHelper V(Callbacks, Source);
223 return V.Visitor.visitTypeRecord(Record, Index);
224}
225
229 VisitHelper V(Callbacks, Source);
230 return V.Visitor.visitTypeRecord(Record);
231}
232
236 VisitHelper V(Callbacks, Source);
237 return V.Visitor.visitTypeStream(Types);
238}
239
243 return V.Visitor.visitTypeStream(Types);
244}
245
248
249
250
252 return V.Visitor.visitTypeStream(Types);
253}
254
258 FieldListVisitHelper V(Callbacks, Record.Data, Source);
259 return V.Visitor.visitMemberRecord(Record);
260}
261
270
274 return V.Visitor.visitFieldListMemberStream(V.Reader);
275}
static Error finishVisitation(CVSymbol &Record, SymbolVisitorCallbacks &Callbacks)
static Error visitKnownRecord(CVType &Record, TypeVisitorCallbacks &Callbacks)
Definition CVTypeVisitor.cpp:25
static Error visitKnownMember(CVMemberRecord &Record, TypeVisitorCallbacks &Callbacks)
Definition CVTypeVisitor.cpp:34
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Error readEnum(T &Dest)
Similar to readInteger.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
void addCallbackToPipeline(TypeVisitorCallbacks &Callbacks)
virtual Error visitUnknownMember(CVMemberRecord &Record)
virtual Error visitUnknownType(CVType &Record)
Action to take on unknown types. By default, they are ignored.
virtual Error visitTypeEnd(CVType &Record)
virtual Error visitMemberEnd(CVMemberRecord &Record)
virtual Error visitMemberBegin(CVMemberRecord &Record)
virtual Error visitTypeBegin(CVType &Record)
Paired begin/end actions for all types.
LLVM_ABI Error visitMemberRecord(CVMemberRecord Record, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source=VDS_BytesPresent)
Definition CVTypeVisitor.cpp:255
iterator_range< CVTypeArray::Iterator > CVTypeRange
CVRecord< TypeLeafKind > CVType
VarStreamArray< CVType > CVTypeArray
LLVM_ABI Error visitMemberRecordStream(ArrayRef< uint8_t > FieldList, TypeVisitorCallbacks &Callbacks)
Definition CVTypeVisitor.cpp:271
LLVM_ABI Error visitTypeStream(const CVTypeArray &Types, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source=VDS_BytesPresent)
Definition CVTypeVisitor.cpp:233
TypeLeafKind
Duplicate copy of the above enum, but using the official CV names.
TypeRecordKind
Distinguishes individual records in .debug$T or .debug$P section or PDB type stream.
LLVM_ABI Error visitTypeRecord(CVType &Record, TypeIndex Index, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source=VDS_BytesPresent)
Definition CVTypeVisitor.cpp:219
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr uintptr_t uintptr_t Data