28 if (
auto EC = Callbacks.visitKnownRecord(
Record, KnownRecord))
38 if (
auto EC = Callbacks.visitKnownMember(
Record, KnownRecord))
53#define MEMBER_RECORD(EnumName, EnumVal, Name) \
55 if (auto EC = visitKnownMember<Name##Record>(Record, Callbacks)) \
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"
76 explicit CVTypeVisitor(TypeVisitorCallbacks &Callbacks);
87 Error visitFieldListMemberStream(BinaryStreamReader &Stream);
93 TypeVisitorCallbacks &Callbacks;
97 : Callbacks(Callbacks) {}
100 switch (Record.
kind()) {
105#define TYPE_RECORD(EnumName, EnumVal, Name) \
107 if (auto EC = visitKnownRecord<Name##Record>(Record, Callbacks)) \
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"
124Error CVTypeVisitor::visitTypeRecord(
CVType &Record, TypeIndex Index) {
131Error CVTypeVisitor::visitTypeRecord(
CVType &Record) {
138Error CVTypeVisitor::visitMemberRecord(CVMemberRecord Record) {
139 return ::visitMemberRecord(Record, Callbacks);
144 for (
auto I : Types) {
152 for (
auto I : Types) {
159Error CVTypeVisitor::visitTypeStream(TypeCollection &Types) {
160 std::optional<TypeIndex>
I =
Types.getFirst();
170Error CVTypeVisitor::visitFieldListMemberStream(BinaryStreamReader &Reader) {
172 while (!Reader.
empty()) {
176 CVMemberRecord Record;
185struct FieldListVisitHelper {
186 FieldListVisitHelper(TypeVisitorCallbacks &Callbacks, ArrayRef<uint8_t>
Data,
189 Deserializer(Reader),
197 BinaryByteStream Stream;
198 BinaryStreamReader Reader;
199 FieldListDeserializer Deserializer;
200 TypeVisitorCallbackPipeline Pipeline;
201 CVTypeVisitor Visitor;
213 TypeDeserializer Deserializer;
214 TypeVisitorCallbackPipeline Pipeline;
215 CVTypeVisitor Visitor;
222 VisitHelper V(Callbacks, Source);
223 return V.Visitor.visitTypeRecord(
Record, Index);
229 VisitHelper V(Callbacks, Source);
230 return V.Visitor.visitTypeRecord(
Record);
236 VisitHelper V(Callbacks, Source);
237 return V.Visitor.visitTypeStream(Types);
243 return V.Visitor.visitTypeStream(Types);
252 return V.Visitor.visitTypeStream(Types);
258 FieldListVisitHelper V(Callbacks,
Record.Data, Source);
259 return V.Visitor.visitMemberRecord(
Record);
274 return V.Visitor.visitFieldListMemberStream(V.Reader);
static Error finishVisitation(CVSymbol &Record, SymbolVisitorCallbacks &Callbacks)
static Error visitKnownRecord(CVType &Record, TypeVisitorCallbacks &Callbacks)
static Error visitKnownMember(CVMemberRecord &Record, TypeVisitorCallbacks &Callbacks)
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)
iterator_range< CVTypeArray::Iterator > CVTypeRange
CVRecord< TypeLeafKind > CVType
VarStreamArray< CVType > CVTypeArray
LLVM_ABI Error visitMemberRecordStream(ArrayRef< uint8_t > FieldList, TypeVisitorCallbacks &Callbacks)
LLVM_ABI Error visitTypeStream(const CVTypeArray &Types, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source=VDS_BytesPresent)
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)
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr uintptr_t uintptr_t Data