LLVM 17.0.0git
TypeDumpVisitor.cpp
Go to the documentation of this file.
1//===-- TypeDumpVisitor.cpp - CodeView type info dumper ----------*- C++-*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "llvm/ADT/ArrayRef.h"
20
21using namespace llvm;
22using namespace llvm::codeview;
23
25#define CV_TYPE(enum, val) {#enum, enum},
26#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
27};
28
29#define ENUM_ENTRY(enum_class, enum) \
30 { #enum, std::underlying_type_t<enum_class>(enum_class::enum) }
31
45};
46
50};
51
58};
59
68};
69
84};
85
92};
93
104};
105
109};
110
136};
137
142};
143
146};
147
148#undef ENUM_ENTRY
149
151 switch (LT) {
152#define TYPE_RECORD(ename, value, name) \
153 case ename: \
154 return #name;
155#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
156 default:
157 break;
158 }
159 return "UnknownLeaf";
160}
161
163 codeview::printTypeIndex(*W, FieldName, TI, TpiTypes);
164}
165
167 codeview::printTypeIndex(*W, FieldName, TI, getSourceTypes());
168}
169
172}
173
175 W->startLine() << getLeafTypeName(Record.kind());
176 W->getOStream() << " (" << HexNumber(Index.getIndex()) << ")";
177 W->getOStream() << " {\n";
178 W->indent();
179 W->printEnum("TypeLeafKind", unsigned(Record.kind()),
181 return Error::success();
182}
183
185 if (PrintRecordBytes)
186 W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.content()));
187
188 W->unindent();
189 W->startLine() << "}\n";
190 return Error::success();
191}
192
194 W->startLine() << getLeafTypeName(Record.Kind);
195 W->getOStream() << " {\n";
196 W->indent();
197 W->printEnum("TypeLeafKind", unsigned(Record.Kind), ArrayRef(LeafTypeNames));
198 return Error::success();
199}
200
202 if (PrintRecordBytes)
203 W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.Data));
204
205 W->unindent();
206 W->startLine() << "}\n";
207 return Error::success();
208}
209
210Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
212 if (auto EC = codeview::visitMemberRecordStream(FieldList.Data, *this))
213 return EC;
214
215 return Error::success();
216}
217
218Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, StringIdRecord &String) {
219 printItemIndex("Id", String.getId());
220 W->printString("StringData", String.getString());
221 return Error::success();
222}
223
224Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ArgListRecord &Args) {
225 auto Indices = Args.getIndices();
226 uint32_t Size = Indices.size();
227 W->printNumber("NumArgs", Size);
228 ListScope Arguments(*W, "Arguments");
229 for (uint32_t I = 0; I < Size; ++I) {
230 printTypeIndex("ArgType", Indices[I]);
231 }
232 return Error::success();
233}
234
235Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, StringListRecord &Strs) {
236 auto Indices = Strs.getIndices();
237 uint32_t Size = Indices.size();
238 W->printNumber("NumStrings", Size);
239 ListScope Arguments(*W, "Strings");
240 for (uint32_t I = 0; I < Size; ++I) {
241 printItemIndex("String", Indices[I]);
242 }
243 return Error::success();
244}
245
246Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ClassRecord &Class) {
247 uint16_t Props = static_cast<uint16_t>(Class.getOptions());
248 W->printNumber("MemberCount", Class.getMemberCount());
249 W->printFlags("Properties", Props, ArrayRef(ClassOptionNames));
250 printTypeIndex("FieldList", Class.getFieldList());
251 printTypeIndex("DerivedFrom", Class.getDerivationList());
252 printTypeIndex("VShape", Class.getVTableShape());
253 W->printNumber("SizeOf", Class.getSize());
254 W->printString("Name", Class.getName());
256 W->printString("LinkageName", Class.getUniqueName());
257 return Error::success();
258}
259
260Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, UnionRecord &Union) {
261 uint16_t Props = static_cast<uint16_t>(Union.getOptions());
262 W->printNumber("MemberCount", Union.getMemberCount());
263 W->printFlags("Properties", Props, ArrayRef(ClassOptionNames));
264 printTypeIndex("FieldList", Union.getFieldList());
265 W->printNumber("SizeOf", Union.getSize());
266 W->printString("Name", Union.getName());
268 W->printString("LinkageName", Union.getUniqueName());
269 return Error::success();
270}
271
272Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {
273 uint16_t Props = static_cast<uint16_t>(Enum.getOptions());
274 W->printNumber("NumEnumerators", Enum.getMemberCount());
275 W->printFlags("Properties", uint16_t(Enum.getOptions()),
277 printTypeIndex("UnderlyingType", Enum.getUnderlyingType());
278 printTypeIndex("FieldListType", Enum.getFieldList());
279 W->printString("Name", Enum.getName());
281 W->printString("LinkageName", Enum.getUniqueName());
282 return Error::success();
283}
284
285Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ArrayRecord &AT) {
286 printTypeIndex("ElementType", AT.getElementType());
287 printTypeIndex("IndexType", AT.getIndexType());
288 W->printNumber("SizeOf", AT.getSize());
289 W->printString("Name", AT.getName());
290 return Error::success();
291}
292
293Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, VFTableRecord &VFT) {
294 printTypeIndex("CompleteClass", VFT.getCompleteClass());
295 printTypeIndex("OverriddenVFTable", VFT.getOverriddenVTable());
296 W->printHex("VFPtrOffset", VFT.getVFPtrOffset());
297 W->printString("VFTableName", VFT.getName());
298 for (auto N : VFT.getMethodNames())
299 W->printString("MethodName", N);
300 return Error::success();
301}
302
303Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, MemberFuncIdRecord &Id) {
304 printTypeIndex("ClassType", Id.getClassType());
305 printTypeIndex("FunctionType", Id.getFunctionType());
306 W->printString("Name", Id.getName());
307 return Error::success();
308}
309
310Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ProcedureRecord &Proc) {
311 printTypeIndex("ReturnType", Proc.getReturnType());
312 W->printEnum("CallingConvention", uint8_t(Proc.getCallConv()),
314 W->printFlags("FunctionOptions", uint8_t(Proc.getOptions()),
316 W->printNumber("NumParameters", Proc.getParameterCount());
317 printTypeIndex("ArgListType", Proc.getArgumentList());
318 return Error::success();
319}
320
321Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, MemberFunctionRecord &MF) {
322 printTypeIndex("ReturnType", MF.getReturnType());
323 printTypeIndex("ClassType", MF.getClassType());
324 printTypeIndex("ThisType", MF.getThisType());
325 W->printEnum("CallingConvention", uint8_t(MF.getCallConv()),
327 W->printFlags("FunctionOptions", uint8_t(MF.getOptions()),
329 W->printNumber("NumParameters", MF.getParameterCount());
330 printTypeIndex("ArgListType", MF.getArgumentList());
331 W->printNumber("ThisAdjustment", MF.getThisPointerAdjustment());
332 return Error::success();
333}
334
335Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
336 MethodOverloadListRecord &MethodList) {
337 for (const auto &M : MethodList.getMethods()) {
338 ListScope S(*W, "Method");
339 printMemberAttributes(M.getAccess(), M.getMethodKind(), M.getOptions());
340 printTypeIndex("Type", M.getType());
341 if (M.isIntroducingVirtual())
342 W->printHex("VFTableOffset", M.getVFTableOffset());
343 }
344 return Error::success();
345}
346
347Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, FuncIdRecord &Func) {
348 printItemIndex("ParentScope", Func.getParentScope());
349 printTypeIndex("FunctionType", Func.getFunctionType());
350 W->printString("Name", Func.getName());
351 return Error::success();
352}
353
354Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) {
355 W->printString("Guid", formatv("{0}", TS.getGuid()).str());
356 W->printNumber("Age", TS.getAge());
357 W->printString("Name", TS.getName());
358 return Error::success();
359}
360
361Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) {
362 printTypeIndex("PointeeType", Ptr.getReferentType());
363 W->printEnum("PtrType", unsigned(Ptr.getPointerKind()),
365 W->printEnum("PtrMode", unsigned(Ptr.getMode()), ArrayRef(PtrModeNames));
366
367 W->printNumber("IsFlat", Ptr.isFlat());
368 W->printNumber("IsConst", Ptr.isConst());
369 W->printNumber("IsVolatile", Ptr.isVolatile());
370 W->printNumber("IsUnaligned", Ptr.isUnaligned());
371 W->printNumber("IsRestrict", Ptr.isRestrict());
372 W->printNumber("IsThisPtr&", Ptr.isLValueReferenceThisPtr());
373 W->printNumber("IsThisPtr&&", Ptr.isRValueReferenceThisPtr());
374 W->printNumber("SizeOf", Ptr.getSize());
375
376 if (Ptr.isPointerToMember()) {
377 const MemberPointerInfo &MI = Ptr.getMemberInfo();
378
379 printTypeIndex("ClassType", MI.getContainingType());
380 W->printEnum("Representation", uint16_t(MI.getRepresentation()),
382 }
383
384 return Error::success();
385}
386
387Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ModifierRecord &Mod) {
388 uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
389 printTypeIndex("ModifiedType", Mod.getModifiedType());
390 W->printFlags("Modifiers", Mods, ArrayRef(TypeModifierNames));
391
392 return Error::success();
393}
394
395Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, BitFieldRecord &BitField) {
396 printTypeIndex("Type", BitField.getType());
397 W->printNumber("BitSize", BitField.getBitSize());
398 W->printNumber("BitOffset", BitField.getBitOffset());
399 return Error::success();
400}
401
402Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
403 VFTableShapeRecord &Shape) {
404 W->printNumber("VFEntryCount", Shape.getEntryCount());
405 return Error::success();
406}
407
408Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
410 printTypeIndex("UDT", Line.getUDT());
411 printItemIndex("SourceFile", Line.getSourceFile());
412 W->printNumber("LineNumber", Line.getLineNumber());
413 return Error::success();
414}
415
416Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
418 printTypeIndex("UDT", Line.getUDT());
419 printItemIndex("SourceFile", Line.getSourceFile());
420 W->printNumber("LineNumber", Line.getLineNumber());
421 W->printNumber("Module", Line.getModule());
422 return Error::success();
423}
424
425Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, BuildInfoRecord &Args) {
426 W->printNumber("NumArgs", static_cast<uint32_t>(Args.getArgs().size()));
427
428 ListScope Arguments(*W, "Arguments");
429 for (auto Arg : Args.getArgs()) {
430 printItemIndex("ArgType", Arg);
431 }
432 return Error::success();
433}
434
435void TypeDumpVisitor::printMemberAttributes(MemberAttributes Attrs) {
436 return printMemberAttributes(Attrs.getAccess(), Attrs.getMethodKind(),
437 Attrs.getFlags());
438}
439
440void TypeDumpVisitor::printMemberAttributes(MemberAccess Access,
441 MethodKind Kind,
443 W->printEnum("AccessSpecifier", uint8_t(Access), ArrayRef(MemberAccessNames));
444 // Data members will be vanilla. Don't try to print a method kind for them.
445 if (Kind != MethodKind::Vanilla)
446 W->printEnum("MethodKind", unsigned(Kind), ArrayRef(MemberKindNames));
448 W->printFlags("MethodOptions", unsigned(Options),
450 }
451}
452
454 W->printHex("UnknownMember", unsigned(Record.Kind));
455 return Error::success();
456}
457
459 W->printEnum("Kind", uint16_t(Record.kind()), ArrayRef(LeafTypeNames));
460 W->printNumber("Length", uint32_t(Record.content().size()));
461 return Error::success();
462}
463
464Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
466 printTypeIndex("Type", Nested.getNestedType());
467 W->printString("Name", Nested.getName());
468 return Error::success();
469}
470
471Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
472 OneMethodRecord &Method) {
473 MethodKind K = Method.getMethodKind();
474 printMemberAttributes(Method.getAccess(), K, Method.getOptions());
475 printTypeIndex("Type", Method.getType());
476 // If virtual, then read the vftable offset.
477 if (Method.isIntroducingVirtual())
478 W->printHex("VFTableOffset", Method.getVFTableOffset());
479 W->printString("Name", Method.getName());
480 return Error::success();
481}
482
483Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
484 OverloadedMethodRecord &Method) {
485 W->printHex("MethodCount", Method.getNumOverloads());
486 printTypeIndex("MethodListIndex", Method.getMethodList());
487 W->printString("Name", Method.getName());
488 return Error::success();
489}
490
491Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
493 printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
495 printTypeIndex("Type", Field.getType());
496 W->printHex("FieldOffset", Field.getFieldOffset());
497 W->printString("Name", Field.getName());
498 return Error::success();
499}
500
501Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
503 printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
505 printTypeIndex("Type", Field.getType());
506 W->printString("Name", Field.getName());
507 return Error::success();
508}
509
510Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
511 VFPtrRecord &VFTable) {
512 printTypeIndex("Type", VFTable.getType());
513 return Error::success();
514}
515
516Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
517 EnumeratorRecord &Enum) {
518 printMemberAttributes(Enum.getAccess(), MethodKind::Vanilla,
520 W->printNumber("EnumValue", Enum.getValue());
521 W->printString("Name", Enum.getName());
522 return Error::success();
523}
524
525Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
527 printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
529 printTypeIndex("BaseType", Base.getBaseType());
530 W->printHex("BaseOffset", Base.getBaseOffset());
531 return Error::success();
532}
533
534Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
536 printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
538 printTypeIndex("BaseType", Base.getBaseType());
539 printTypeIndex("VBPtrType", Base.getVBPtrType());
540 W->printHex("VBPtrOffset", Base.getVBPtrOffset());
541 W->printHex("VBTableIndex", Base.getVTableIndex());
542 return Error::success();
543}
544
545Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
547 printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
548 return Error::success();
549}
550
551Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, LabelRecord &LR) {
552 W->printEnum("Mode", uint16_t(LR.Mode), ArrayRef(LabelTypeEnum));
553 return Error::success();
554}
555
556Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
557 PrecompRecord &Precomp) {
558 W->printHex("StartIndex", Precomp.getStartTypeIndex());
559 W->printHex("Count", Precomp.getTypesCount());
560 W->printHex("Signature", Precomp.getSignature());
561 W->printString("PrecompFile", Precomp.getPrecompFilePath());
562 return Error::success();
563}
564
565Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
566 EndPrecompRecord &EndPrecomp) {
567 W->printHex("Signature", EndPrecomp.getSignature());
568 return Error::success();
569}
@ Generic
amdgpu Simplify well known AMD library false FunctionCallee Value * Arg
AMDGPU Lower Kernel Arguments
static const EnumEntry< uint16_t > MemberKindNames[]
Definition: EnumTables.cpp:344
static const EnumEntry< uint16_t > TypeModifierNames[]
Definition: EnumTables.cpp:392
static const EnumEntry< uint16_t > PtrMemberRepNames[]
Definition: EnumTables.cpp:378
static const EnumEntry< uint8_t > CallingConventions[]
Definition: EnumTables.cpp:398
static const EnumEntry< uint8_t > FunctionOptionEnum[]
Definition: EnumTables.cpp:425
static const EnumEntry< uint16_t > LabelTypeEnum[]
Definition: EnumTables.cpp:431
static const EnumEntry< uint16_t > MethodOptionNames[]
Definition: EnumTables.cpp:336
static const EnumEntry< uint8_t > MemberAccessNames[]
Definition: EnumTables.cpp:329
static const EnumEntry< uint8_t > PtrModeNames[]
Definition: EnumTables.cpp:370
static const EnumEntry< uint16_t > ClassOptionNames[]
Definition: EnumTables.cpp:314
static const EnumEntry< uint8_t > PtrKindNames[]
Definition: EnumTables.cpp:354
uint64_t Size
IRTranslator LLVM IR MI
static LVOptions Options
Definition: LVOptions.cpp:25
#define I(x, y, z)
Definition: MD5.cpp:58
static const EnumEntry< uint16_t > MemberKindNames[]
static const EnumEntry< uint16_t > TypeModifierNames[]
static const EnumEntry< uint16_t > PtrMemberRepNames[]
static const EnumEntry< uint8_t > CallingConventions[]
static const EnumEntry< uint8_t > FunctionOptionEnum[]
static const EnumEntry< uint16_t > LabelTypeEnum[]
static const EnumEntry< uint16_t > MethodOptionNames[]
static const EnumEntry< uint8_t > MemberAccessNames[]
#define ENUM_ENTRY(enum_class, enum)
static StringRef getLeafTypeName(TypeLeafKind LT)
static const EnumEntry< uint8_t > PtrModeNames[]
static const EnumEntry< uint16_t > ClassOptionNames[]
static const EnumEntry< TypeLeafKind > LeafTypeNames[]
static const EnumEntry< uint8_t > PtrKindNames[]
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Lightweight error class with error context and mandatory checking.
Definition: Error.h:156
static ErrorSuccess success()
Create a success value.
Definition: Error.h:330
virtual void printString(StringRef Value)
void printBinaryBlock(StringRef Label, ArrayRef< uint8_t > Value, uint32_t StartOffset)
void indent(int Levels=1)
void unindent(int Levels=1)
void printEnum(StringRef Label, T Value, ArrayRef< EnumEntry< TEnum > > EnumValues)
void printFlags(StringRef Label, T Value, ArrayRef< EnumEntry< TFlag > > Flags, TFlag EnumMask1={}, TFlag EnumMask2={}, TFlag EnumMask3={})
virtual raw_ostream & getOStream()
virtual raw_ostream & startLine()
void printHex(StringRef Label, T Value)
virtual void printNumber(StringRef Label, uint64_t Value)
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
TypeIndex getElementType() const
Definition: TypeRecord.h:405
TypeIndex getIndexType() const
Definition: TypeRecord.h:406
uint64_t getSize() const
Definition: TypeRecord.h:407
StringRef getName() const
Definition: TypeRecord.h:408
LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST records together.
Definition: TypeRecord.h:915
int32_t getThisPointerAdjustment() const
Definition: TypeRecord.h:193
FunctionOptions getOptions() const
Definition: TypeRecord.h:190
CallingConvention getCallConv() const
Definition: TypeRecord.h:189
ArrayRef< OneMethodRecord > getMethods() const
Definition: TypeRecord.h:759
int32_t getVFTableOffset() const
Definition: TypeRecord.h:737
MemberAccess getAccess() const
Definition: TypeRecord.h:736
MethodOptions getOptions() const
Definition: TypeRecord.h:735
MethodKind getMethodKind() const
Definition: TypeRecord.h:734
For method overload sets. LF_METHOD.
Definition: TypeRecord.h:765
uint32_t getSignature() const
Definition: TypeRecord.h:936
StringRef getPrecompFilePath() const
Definition: TypeRecord.h:937
uint32_t getTypesCount() const
Definition: TypeRecord.h:935
uint32_t getStartTypeIndex() const
Definition: TypeRecord.h:934
TypeIndex getReturnType() const
Definition: TypeRecord.h:157
TypeIndex getArgumentList() const
Definition: TypeRecord.h:161
uint16_t getParameterCount() const
Definition: TypeRecord.h:160
FunctionOptions getOptions() const
Definition: TypeRecord.h:159
CallingConvention getCallConv() const
Definition: TypeRecord.h:158
ArrayRef< TypeIndex > getIndices() const
Definition: TypeRecord.h:258
virtual uint32_t size()=0
Error visitTypeEnd(CVType &Record) override
void printTypeIndex(StringRef FieldName, TypeIndex TI) const
Error visitUnknownMember(CVMemberRecord &Record) override
Error visitMemberEnd(CVMemberRecord &Record) override
Error visitUnknownType(CVType &Record) override
Action to take on unknown types. By default, they are ignored.
void printItemIndex(StringRef FieldName, TypeIndex TI) const
Error visitTypeBegin(CVType &Record) override
Paired begin/end actions for all types.
Error visitMemberBegin(CVMemberRecord &Record) override
A 32-bit type reference.
Definition: TypeIndex.h:96
static TypeIndex fromArrayIndex(uint32_t Index)
Definition: TypeIndex.h:123
const GUID & getGuid() const
Definition: TypeRecord.h:585
TypeIndex getType() const
Definition: TypeRecord.h:858
uint32_t getVFPtrOffset() const
Definition: TypeRecord.h:706
TypeIndex getOverriddenVTable() const
Definition: TypeRecord.h:705
ArrayRef< StringRef > getMethodNames() const
Definition: TypeRecord.h:709
StringRef getName() const
Definition: TypeRecord.h:707
TypeIndex getCompleteClass() const
Definition: TypeRecord.h:704
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
PointerMode
Equivalent to CV_ptrmode_e.
Definition: CodeView.h:353
MethodKind
Part of member attribute flags. (CV_methodprop_e)
Definition: CodeView.h:270
PointerKind
Equivalent to CV_ptrtype_e.
Definition: CodeView.h:336
PointerToMemberRepresentation
Equivalent to CV_pmtype_e.
Definition: CodeView.h:376
Error visitMemberRecordStream(ArrayRef< uint8_t > FieldList, TypeVisitorCallbacks &Callbacks)
MethodOptions
Equivalent to CV_fldattr_t bitfield.
Definition: CodeView.h:281
StringRef getBytesAsCharacters(ArrayRef< uint8_t > LeafData)
Reinterpret a byte array as an array of characters.
MemberAccess
Source-level access specifier. (CV_access_e)
Definition: CodeView.h:262
TypeLeafKind
Duplicate copy of the above enum, but using the official CV names.
Definition: CodeView.h:33
ModifierOptions
Equivalent to CV_modifier_t.
Definition: CodeView.h:301
LabelType
Equivalent to CV_LABEL_TYPE_e.
Definition: CodeView.h:294
void printTypeIndex(ScopedPrinter &Printer, StringRef FieldName, TypeIndex TI, TypeCollection &Types)
Definition: TypeIndex.cpp:93
CallingConvention
Definition: Dwarf.h:413
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto formatv(const char *Fmt, Ts &&... Vals) -> formatv_object< decltype(std::make_tuple(detail::build_format_adapter(std::forward< Ts >(Vals))...))>
@ Mod
The access may modify the value stored in memory.
constexpr std::nullopt_t None
Definition: None.h:28
#define N
Equvalent to CV_fldattr_t in cvinfo.h.
Definition: TypeRecord.h:40