LLVM  7.0.0svn
TypeDumpVisitor.cpp
Go to the documentation of this file.
1 //===-- TypeDumpVisitor.cpp - CodeView type info dumper ----------*- 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 
11 
12 #include "llvm/ADT/SmallString.h"
20 
21 using namespace llvm;
22 using 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 < enum_class > ::type(enum_class::enum) }
31 
45 };
46 
50 };
51 
53  ENUM_ENTRY(MethodOptions, Pseudo),
58 };
59 
63  ENUM_ENTRY(MethodKind, Static),
68 };
69 
70 static const EnumEntry<uint8_t> PtrKindNames[] = {
84 };
85 
86 static const EnumEntry<uint8_t> PtrModeNames[] = {
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 
171  return visitTypeBegin(Record, TypeIndex::fromArrayIndex(TpiTypes.size()));
172 }
173 
175  W->startLine() << getLeafTypeName(Record.Type);
176  W->getOStream() << " (" << HexNumber(Index.getIndex()) << ")";
177  W->getOStream() << " {\n";
178  W->indent();
179  W->printEnum("TypeLeafKind", unsigned(Record.Type),
180  makeArrayRef(LeafTypeNames));
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),
198  makeArrayRef(LeafTypeNames));
199  return Error::success();
200 }
201 
203  if (PrintRecordBytes)
204  W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.Data));
205 
206  W->unindent();
207  W->startLine() << "}\n";
208  return Error::success();
209 }
210 
213  if (auto EC = codeview::visitMemberRecordStream(FieldList.Data, *this))
214  return EC;
215 
216  return Error::success();
217 }
218 
220  printItemIndex("Id", String.getId());
221  W->printString("StringData", String.getString());
222  return Error::success();
223 }
224 
226  auto Indices = Args.getIndices();
227  uint32_t Size = Indices.size();
228  W->printNumber("NumArgs", Size);
229  ListScope Arguments(*W, "Arguments");
230  for (uint32_t I = 0; I < Size; ++I) {
231  printTypeIndex("ArgType", Indices[I]);
232  }
233  return Error::success();
234 }
235 
237  auto Indices = Strs.getIndices();
238  uint32_t Size = Indices.size();
239  W->printNumber("NumStrings", Size);
240  ListScope Arguments(*W, "Strings");
241  for (uint32_t I = 0; I < Size; ++I) {
242  printItemIndex("String", Indices[I]);
243  }
244  return Error::success();
245 }
246 
248  uint16_t Props = static_cast<uint16_t>(Class.getOptions());
249  W->printNumber("MemberCount", Class.getMemberCount());
250  W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
251  printTypeIndex("FieldList", Class.getFieldList());
252  printTypeIndex("DerivedFrom", Class.getDerivationList());
253  printTypeIndex("VShape", Class.getVTableShape());
254  W->printNumber("SizeOf", Class.getSize());
255  W->printString("Name", Class.getName());
256  if (Props & uint16_t(ClassOptions::HasUniqueName))
257  W->printString("LinkageName", Class.getUniqueName());
258  return Error::success();
259 }
260 
262  uint16_t Props = static_cast<uint16_t>(Union.getOptions());
263  W->printNumber("MemberCount", Union.getMemberCount());
264  W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
265  printTypeIndex("FieldList", Union.getFieldList());
266  W->printNumber("SizeOf", Union.getSize());
267  W->printString("Name", Union.getName());
268  if (Props & uint16_t(ClassOptions::HasUniqueName))
269  W->printString("LinkageName", Union.getUniqueName());
270  return Error::success();
271 }
272 
274  uint16_t Props = static_cast<uint16_t>(Enum.getOptions());
275  W->printNumber("NumEnumerators", Enum.getMemberCount());
276  W->printFlags("Properties", uint16_t(Enum.getOptions()),
277  makeArrayRef(ClassOptionNames));
278  printTypeIndex("UnderlyingType", Enum.getUnderlyingType());
279  printTypeIndex("FieldListType", Enum.getFieldList());
280  W->printString("Name", Enum.getName());
281  if (Props & uint16_t(ClassOptions::HasUniqueName))
282  W->printString("LinkageName", Enum.getUniqueName());
283  return Error::success();
284 }
285 
287  printTypeIndex("ElementType", AT.getElementType());
288  printTypeIndex("IndexType", AT.getIndexType());
289  W->printNumber("SizeOf", AT.getSize());
290  W->printString("Name", AT.getName());
291  return Error::success();
292 }
293 
295  printTypeIndex("CompleteClass", VFT.getCompleteClass());
296  printTypeIndex("OverriddenVFTable", VFT.getOverriddenVTable());
297  W->printHex("VFPtrOffset", VFT.getVFPtrOffset());
298  W->printString("VFTableName", VFT.getName());
299  for (auto N : VFT.getMethodNames())
300  W->printString("MethodName", N);
301  return Error::success();
302 }
303 
305  printTypeIndex("ClassType", Id.getClassType());
306  printTypeIndex("FunctionType", Id.getFunctionType());
307  W->printString("Name", Id.getName());
308  return Error::success();
309 }
310 
312  printTypeIndex("ReturnType", Proc.getReturnType());
313  W->printEnum("CallingConvention", uint8_t(Proc.getCallConv()),
314  makeArrayRef(CallingConventions));
315  W->printFlags("FunctionOptions", uint8_t(Proc.getOptions()),
316  makeArrayRef(FunctionOptionEnum));
317  W->printNumber("NumParameters", Proc.getParameterCount());
318  printTypeIndex("ArgListType", Proc.getArgumentList());
319  return Error::success();
320 }
321 
323  printTypeIndex("ReturnType", MF.getReturnType());
324  printTypeIndex("ClassType", MF.getClassType());
325  printTypeIndex("ThisType", MF.getThisType());
326  W->printEnum("CallingConvention", uint8_t(MF.getCallConv()),
327  makeArrayRef(CallingConventions));
328  W->printFlags("FunctionOptions", uint8_t(MF.getOptions()),
329  makeArrayRef(FunctionOptionEnum));
330  W->printNumber("NumParameters", MF.getParameterCount());
331  printTypeIndex("ArgListType", MF.getArgumentList());
332  W->printNumber("ThisAdjustment", MF.getThisPointerAdjustment());
333  return Error::success();
334 }
335 
337  MethodOverloadListRecord &MethodList) {
338  for (auto &M : MethodList.getMethods()) {
339  ListScope S(*W, "Method");
340  printMemberAttributes(M.getAccess(), M.getMethodKind(), M.getOptions());
341  printTypeIndex("Type", M.getType());
342  if (M.isIntroducingVirtual())
343  W->printHex("VFTableOffset", M.getVFTableOffset());
344  }
345  return Error::success();
346 }
347 
349  printItemIndex("ParentScope", Func.getParentScope());
350  printTypeIndex("FunctionType", Func.getFunctionType());
351  W->printString("Name", Func.getName());
352  return Error::success();
353 }
354 
356  W->printString("Guid", formatv("{0}", TS.getGuid()).str());
357  W->printNumber("Age", TS.getAge());
358  W->printString("Name", TS.getName());
359  return Error::success();
360 }
361 
363  printTypeIndex("PointeeType", Ptr.getReferentType());
364  W->printHex("PointerAttributes", uint32_t(Ptr.getOptions()));
365  W->printEnum("PtrType", unsigned(Ptr.getPointerKind()),
366  makeArrayRef(PtrKindNames));
367  W->printEnum("PtrMode", unsigned(Ptr.getMode()), makeArrayRef(PtrModeNames));
368 
369  W->printNumber("IsFlat", Ptr.isFlat());
370  W->printNumber("IsConst", Ptr.isConst());
371  W->printNumber("IsVolatile", Ptr.isVolatile());
372  W->printNumber("IsUnaligned", Ptr.isUnaligned());
373  W->printNumber("SizeOf", Ptr.getSize());
374 
375  if (Ptr.isPointerToMember()) {
376  const MemberPointerInfo &MI = Ptr.getMemberInfo();
377 
378  printTypeIndex("ClassType", MI.getContainingType());
379  W->printEnum("Representation", uint16_t(MI.getRepresentation()),
380  makeArrayRef(PtrMemberRepNames));
381  }
382 
383  return Error::success();
384 }
385 
387  uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
388  printTypeIndex("ModifiedType", Mod.getModifiedType());
389  W->printFlags("Modifiers", Mods, makeArrayRef(TypeModifierNames));
390 
391  return Error::success();
392 }
393 
395  printTypeIndex("Type", BitField.getType());
396  W->printNumber("BitSize", BitField.getBitSize());
397  W->printNumber("BitOffset", BitField.getBitOffset());
398  return Error::success();
399 }
400 
402  VFTableShapeRecord &Shape) {
403  W->printNumber("VFEntryCount", Shape.getEntryCount());
404  return Error::success();
405 }
406 
409  printTypeIndex("UDT", Line.getUDT());
410  printItemIndex("SourceFile", Line.getSourceFile());
411  W->printNumber("LineNumber", Line.getLineNumber());
412  return Error::success();
413 }
414 
416  UdtModSourceLineRecord &Line) {
417  printTypeIndex("UDT", Line.getUDT());
418  printItemIndex("SourceFile", Line.getSourceFile());
419  W->printNumber("LineNumber", Line.getLineNumber());
420  W->printNumber("Module", Line.getModule());
421  return Error::success();
422 }
423 
425  W->printNumber("NumArgs", static_cast<uint32_t>(Args.getArgs().size()));
426 
427  ListScope Arguments(*W, "Arguments");
428  for (auto Arg : Args.getArgs()) {
429  printItemIndex("ArgType", Arg);
430  }
431  return Error::success();
432 }
433 
434 void TypeDumpVisitor::printMemberAttributes(MemberAttributes Attrs) {
435  return printMemberAttributes(Attrs.getAccess(), Attrs.getMethodKind(),
436  Attrs.getFlags());
437 }
438 
439 void TypeDumpVisitor::printMemberAttributes(MemberAccess Access,
441  MethodOptions Options) {
442  W->printEnum("AccessSpecifier", uint8_t(Access),
443  makeArrayRef(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), makeArrayRef(MemberKindNames));
447  if (Options != MethodOptions::None) {
448  W->printFlags("MethodOptions", unsigned(Options),
449  makeArrayRef(MethodOptionNames));
450  }
451 }
452 
454  W->printHex("UnknownMember", unsigned(Record.Kind));
455  return Error::success();
456 }
457 
459  W->printEnum("Kind", uint16_t(Record.kind()), makeArrayRef(LeafTypeNames));
460  W->printNumber("Length", uint32_t(Record.content().size()));
461  return Error::success();
462 }
463 
466  printTypeIndex("Type", Nested.getNestedType());
467  W->printString("Name", Nested.getName());
468  return Error::success();
469 }
470 
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 
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 
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 
502  StaticDataMemberRecord &Field) {
503  printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
505  printTypeIndex("Type", Field.getType());
506  W->printString("Name", Field.getName());
507  return Error::success();
508 }
509 
511  VFPtrRecord &VFTable) {
512  printTypeIndex("Type", VFTable.getType());
513  return Error::success();
514 }
515 
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 
527  printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
529  printTypeIndex("BaseType", Base.getBaseType());
530  W->printHex("BaseOffset", Base.getBaseOffset());
531  return Error::success();
532 }
533 
535  VirtualBaseClassRecord &Base) {
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 
546  ListContinuationRecord &Cont) {
547  printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
548  return Error::success();
549 }
550 
552  W->printEnum("Mode", uint16_t(LR.Mode), makeArrayRef(LabelTypeEnum));
553  return Error::success();
554 }
const NoneType None
Definition: None.h:24
MemberAccess getAccess() const
Definition: TypeRecord.h:808
static const EnumEntry< uint16_t > LabelTypeEnum[]
PointerKind
Equivalent to CV_ptrtype_e.
Definition: CodeView.h:326
void printItemIndex(StringRef FieldName, TypeIndex TI) const
TypeIndex getIndexType() const
Definition: TypeRecord.h:391
int32_t getThisPointerAdjustment() const
Definition: TypeRecord.h:194
static const EnumEntry< uint8_t > PtrKindNames[]
void printEnum(StringRef Label, T Value, ArrayRef< EnumEntry< TEnum >> EnumValues)
Definition: ScopedPrinter.h:94
uint16_t getMemberCount() const
Definition: TypeRecord.h:428
uint64_t getSize() const
Definition: TypeRecord.h:392
Kind kind() const
Definition: CVRecord.h:37
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
uint64_t getSize() const
Definition: TypeRecord.h:467
static const EnumEntry< uint8_t > PtrModeNames[]
TypeLeafKind
Duplicate copy of the above enum, but using the official CV names.
Definition: CodeView.h:34
ArrayRef< uint8_t > Data
Definition: TypeRecord.h:41
Error visitTypeEnd(CVType &Record) override
TypeIndex getBaseType() const
Definition: TypeRecord.h:843
AMDGPU Rewrite Out Arguments
ArrayRef< StringRef > getMethodNames() const
Definition: TypeRecord.h:676
MemberAccess getAccess() const
Definition: TypeRecord.h:703
TypeIndex getReferentType() const
Definition: TypeRecord.h:295
MemberPointerInfo getMemberInfo() const
Definition: TypeRecord.h:315
void printTypeIndex(StringRef FieldName, TypeIndex TI) const
static const EnumEntry< uint8_t > FunctionOptionEnum[]
TypeIndex getType() const
Definition: TypeRecord.h:520
auto formatv(const char *Fmt, Ts &&... Vals) -> formatv_object< decltype(std::make_tuple(detail::build_format_adapter(std::forward< Ts >(Vals))...))>
ArrayRef< uint8_t > Data
Definition: TypeRecord.h:377
Error visitMemberRecordStream(ArrayRef< uint8_t > FieldList, TypeVisitorCallbacks &Callbacks)
virtual uint32_t size()=0
MethodKind getMethodKind() const
Definition: TypeRecord.h:701
TypeIndex getFunctionType() const
Definition: TypeRecord.h:228
StringRef getName() const
Definition: TypeRecord.h:431
Error visitUnknownType(CVType &Record) override
Action to take on unknown types. By default, they are ignored.
static const EnumEntry< uint16_t > ClassOptionNames[]
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
Definition: ArrayRef.h:452
StringRef getName() const
Definition: TypeRecord.h:597
StringRef getName() const
Definition: TypeRecord.h:393
void indent(int Levels=1)
Definition: ScopedPrinter.h:75
static const EnumEntry< uint16_t > MemberKindNames[]
ArrayRef< uint8_t > content() const
Definition: CVRecord.h:44
uint64_t getBaseOffset() const
Definition: TypeRecord.h:844
static const EnumEntry< TypeLeafKind > LeafTypeNames[]
raw_ostream & getOStream()
ClassOptions getOptions() const
Definition: TypeRecord.h:429
ModifierOptions
Equivalent to CV_modifier_t.
Definition: CodeView.h:297
TypeIndex getFunctionType() const
Definition: TypeRecord.h:596
LabelType
Equivalent to CV_LABEL_TYPE_e.
Definition: CodeView.h:290
static Error visitKnownRecord(CVSymbol &Record, SymbolVisitorCallbacks &Callbacks)
PointerMode getMode() const
Definition: TypeRecord.h:302
A 32-bit type reference.
Definition: TypeIndex.h:96
TypeIndex getElementType() const
Definition: TypeRecord.h:390
TypeIndex getReturnType() const
Definition: TypeRecord.h:158
CallingConvention getCallConv() const
Definition: TypeRecord.h:190
MemberAccess getAccess() const
Definition: TypeRecord.h:764
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
MethodKind
Part of member attribute flags. (CV_methodprop_e)
Definition: CodeView.h:266
static TypeIndex fromArrayIndex(uint32_t Index)
Definition: TypeIndex.h:123
#define ENUM_ENTRY(enum_class, enum)
Error visitTypeBegin(CVType &Record) override
Paired begin/end actions for all types.
TypeIndex getFieldList() const
Definition: TypeRecord.h:430
StringRef getString() const
Definition: TypeRecord.h:580
ArrayRef< TypeIndex > getArgs() const
Definition: TypeRecord.h:652
PointerToMemberRepresentation getRepresentation() const
Definition: TypeRecord.h:111
static StringRef getLeafTypeName(TypeLeafKind LT)
void printTypeIndex(ScopedPrinter &Printer, StringRef FieldName, TypeIndex TI, TypeCollection &Types)
Definition: TypeIndex.cpp:90
FunctionOptions getOptions() const
Definition: TypeRecord.h:191
uint32_t getVFPtrOffset() const
Definition: TypeRecord.h:673
static Error visitKnownMember(CVMemberRecord &Record, TypeVisitorCallbacks &Callbacks)
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:150
raw_ostream & startLine()
LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST records together.
Definition: TypeRecord.h:882
StringRef getUniqueName() const
Definition: TypeRecord.h:432
TypeIndex getContainingType() const
Definition: TypeRecord.h:110
For method overload sets. LF_METHOD.
Definition: TypeRecord.h:732
TypeIndex getArgumentList() const
Definition: TypeRecord.h:162
MethodOptions getOptions() const
Definition: TypeRecord.h:702
PointerKind getPointerKind() const
Definition: TypeRecord.h:297
void printHex(StringRef Label, T Value)
TypeIndex getUnderlyingType() const
Definition: TypeRecord.h:506
uint64_t getSize() const
Definition: TypeRecord.h:490
uint32_t getIndex() const
Definition: TypeIndex.h:111
void printString(StringRef Value)
static ErrorSuccess success()
Create a success value.
Definition: Error.h:313
int32_t getVFTableOffset() const
Definition: TypeRecord.h:704
void printNumber(StringRef Label, uint64_t Value)
Error visitUnknownMember(CVMemberRecord &Record) override
static const EnumEntry< uint16_t > PtrMemberRepNames[]
TypeIndex getVTableShape() const
Definition: TypeRecord.h:466
MethodKind getMethodKind() const
Indicates if a method is defined with friend, virtual, static, etc.
Definition: TypeRecord.h:71
MemberAccess getAccess() const
Definition: TypeRecord.h:842
Error visitMemberBegin(CVMemberRecord &Record) override
TypeIndex getOverriddenVTable() const
Definition: TypeRecord.h:672
ArrayRef< OneMethodRecord > getMethods() const
Definition: TypeRecord.h:726
static const EnumEntry< uint8_t > CallingConventions[]
PointerMode
Equivalent to CV_ptrmode_e.
Definition: CodeView.h:343
ArrayRef< TypeIndex > getIndices() const
Definition: TypeRecord.h:259
uint8_t getBitOffset() const
Definition: TypeRecord.h:521
static const EnumEntry< uint16_t > MethodOptionNames[]
TypeIndex getDerivationList() const
Definition: TypeRecord.h:465
TypeIndex getParentScope() const
Definition: TypeRecord.h:595
TypeIndex getCompleteClass() const
Definition: TypeRecord.h:671
MethodOptions
Equivalent to CV_fldattr_t bitfield.
Definition: CodeView.h:277
StringRef getBytesAsCharacters(ArrayRef< uint8_t > LeafData)
Reinterpret a byte array as an array of characters.
The access may modify the value stored in memory.
amdgpu Simplify well known AMD library false Value Value * Arg
TypeIndex getNestedType() const
Definition: TypeRecord.h:362
void unindent(int Levels=1)
Definition: ScopedPrinter.h:77
const GUID & getGuid() const
Definition: TypeRecord.h:562
CallingConvention getCallConv() const
Definition: TypeRecord.h:159
static const EnumEntry< uint16_t > TypeModifierNames[]
static const EnumEntry< uint8_t > MemberAccessNames[]
void printFlags(StringRef Label, T Value, ArrayRef< EnumEntry< TFlag >> Flags, TFlag EnumMask1={}, TFlag EnumMask2={}, TFlag EnumMask3={})
#define I(x, y, z)
Definition: MD5.cpp:58
#define N
ArrayRef< TypeIndex > getIndices() const
Definition: TypeRecord.h:245
PointerOptions getOptions() const
Definition: TypeRecord.h:307
TypeIndex getType() const
Definition: TypeRecord.h:825
FunctionOptions getOptions() const
Definition: TypeRecord.h:160
PointerToMemberRepresentation
Equivalent to CV_pmtype_e.
Definition: CodeView.h:364
uint16_t getParameterCount() const
Definition: TypeRecord.h:161
const unsigned Kind
MemberAccess
Source-level access specifier. (CV_access_e)
Definition: CodeView.h:258
uint64_t getFieldOffset() const
Definition: TypeRecord.h:766
MethodOptions getFlags() const
Get the flags that are not included in access control or method properties.
Definition: TypeRecord.h:79
void printBinaryBlock(StringRef Label, ArrayRef< uint8_t > Value, uint32_t StartOffset)
Equvalent to CV_fldattr_t in cvinfo.h.
Definition: TypeRecord.h:47
constexpr char Size[]
Key for Kernel::Arg::Metadata::mSize.
Lightweight error class with error context and mandatory checking.
Definition: Error.h:156
CallingConvention
These values correspond to the CV_call_e enumeration, and are documented at the following locations: ...
Definition: CodeView.h:173
Error visitMemberEnd(CVMemberRecord &Record) override
TypeIndex getModifiedType() const
Definition: TypeRecord.h:139
IRTranslator LLVM IR MI
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
MemberAccess getAccess() const
Get the access specifier. Valid for any kind of member.
Definition: TypeRecord.h:66
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
StringRef getName() const
Definition: TypeRecord.h:674
ModifierOptions getModifiers() const
Definition: TypeRecord.h:140