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