LLVM  6.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"
21 
22 using namespace llvm;
23 using namespace llvm::codeview;
24 
26 #define CV_TYPE(enum, val) {#enum, enum},
27 #include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
28 };
29 
30 #define ENUM_ENTRY(enum_class, enum) \
31  { #enum, std::underlying_type < enum_class > ::type(enum_class::enum) }
32 
46 };
47 
51 };
52 
54  ENUM_ENTRY(MethodOptions, Pseudo),
59 };
60 
64  ENUM_ENTRY(MethodKind, Static),
69 };
70 
71 static const EnumEntry<uint8_t> PtrKindNames[] = {
85 };
86 
87 static const EnumEntry<uint8_t> PtrModeNames[] = {
93 };
94 
105 };
106 
110 };
111 
137 };
138 
143 };
144 
147 };
148 
149 #undef ENUM_ENTRY
150 
152  switch (LT) {
153 #define TYPE_RECORD(ename, value, name) \
154  case ename: \
155  return #name;
156 #include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
157  default:
158  break;
159  }
160  return "UnknownLeaf";
161 }
162 
164  codeview::printTypeIndex(*W, FieldName, TI, TpiTypes);
165 }
166 
168  codeview::printTypeIndex(*W, FieldName, TI, getSourceTypes());
169 }
170 
172  return visitTypeBegin(Record, TypeIndex::fromArrayIndex(TpiTypes.size()));
173 }
174 
176  W->startLine() << getLeafTypeName(Record.Type);
177  W->getOStream() << " (" << HexNumber(Index.getIndex()) << ")";
178  W->getOStream() << " {\n";
179  W->indent();
180  W->printEnum("TypeLeafKind", unsigned(Record.Type),
181  makeArrayRef(LeafTypeNames));
182  return Error::success();
183 }
184 
186  if (PrintRecordBytes)
187  W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.content()));
188 
189  W->unindent();
190  W->startLine() << "}\n";
191  return Error::success();
192 }
193 
195  W->startLine() << getLeafTypeName(Record.Kind);
196  W->getOStream() << " {\n";
197  W->indent();
198  W->printEnum("TypeLeafKind", unsigned(Record.Kind),
199  makeArrayRef(LeafTypeNames));
200  return Error::success();
201 }
202 
204  if (PrintRecordBytes)
205  W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.Data));
206 
207  W->unindent();
208  W->startLine() << "}\n";
209  return Error::success();
210 }
211 
213  FieldListRecord &FieldList) {
214  if (auto EC = codeview::visitMemberRecordStream(FieldList.Data, *this))
215  return EC;
216 
217  return Error::success();
218 }
219 
221  printItemIndex("Id", String.getId());
222  W->printString("StringData", String.getString());
223  return Error::success();
224 }
225 
227  auto Indices = Args.getIndices();
228  uint32_t Size = Indices.size();
229  W->printNumber("NumArgs", Size);
230  ListScope Arguments(*W, "Arguments");
231  for (uint32_t I = 0; I < Size; ++I) {
232  printTypeIndex("ArgType", Indices[I]);
233  }
234  return Error::success();
235 }
236 
238  auto Indices = Strs.getIndices();
239  uint32_t Size = Indices.size();
240  W->printNumber("NumStrings", Size);
241  ListScope Arguments(*W, "Strings");
242  for (uint32_t I = 0; I < Size; ++I) {
243  printItemIndex("String", Indices[I]);
244  }
245  return Error::success();
246 }
247 
249  uint16_t Props = static_cast<uint16_t>(Class.getOptions());
250  W->printNumber("MemberCount", Class.getMemberCount());
251  W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
252  printTypeIndex("FieldList", Class.getFieldList());
253  printTypeIndex("DerivedFrom", Class.getDerivationList());
254  printTypeIndex("VShape", Class.getVTableShape());
255  W->printNumber("SizeOf", Class.getSize());
256  W->printString("Name", Class.getName());
257  if (Props & uint16_t(ClassOptions::HasUniqueName))
258  W->printString("LinkageName", Class.getUniqueName());
259  return Error::success();
260 }
261 
263  uint16_t Props = static_cast<uint16_t>(Union.getOptions());
264  W->printNumber("MemberCount", Union.getMemberCount());
265  W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
266  printTypeIndex("FieldList", Union.getFieldList());
267  W->printNumber("SizeOf", Union.getSize());
268  W->printString("Name", Union.getName());
269  if (Props & uint16_t(ClassOptions::HasUniqueName))
270  W->printString("LinkageName", Union.getUniqueName());
271  return Error::success();
272 }
273 
275  uint16_t Props = static_cast<uint16_t>(Enum.getOptions());
276  W->printNumber("NumEnumerators", Enum.getMemberCount());
277  W->printFlags("Properties", uint16_t(Enum.getOptions()),
278  makeArrayRef(ClassOptionNames));
279  printTypeIndex("UnderlyingType", Enum.getUnderlyingType());
280  printTypeIndex("FieldListType", Enum.getFieldList());
281  W->printString("Name", Enum.getName());
282  if (Props & uint16_t(ClassOptions::HasUniqueName))
283  W->printString("LinkageName", Enum.getUniqueName());
284  return Error::success();
285 }
286 
288  printTypeIndex("ElementType", AT.getElementType());
289  printTypeIndex("IndexType", AT.getIndexType());
290  W->printNumber("SizeOf", AT.getSize());
291  W->printString("Name", AT.getName());
292  return Error::success();
293 }
294 
296  printTypeIndex("CompleteClass", VFT.getCompleteClass());
297  printTypeIndex("OverriddenVFTable", VFT.getOverriddenVTable());
298  W->printHex("VFPtrOffset", VFT.getVFPtrOffset());
299  W->printString("VFTableName", VFT.getName());
300  for (auto N : VFT.getMethodNames())
301  W->printString("MethodName", N);
302  return Error::success();
303 }
304 
306  printTypeIndex("ClassType", Id.getClassType());
307  printTypeIndex("FunctionType", Id.getFunctionType());
308  W->printString("Name", Id.getName());
309  return Error::success();
310 }
311 
313  printTypeIndex("ReturnType", Proc.getReturnType());
314  W->printEnum("CallingConvention", uint8_t(Proc.getCallConv()),
315  makeArrayRef(CallingConventions));
316  W->printFlags("FunctionOptions", uint8_t(Proc.getOptions()),
317  makeArrayRef(FunctionOptionEnum));
318  W->printNumber("NumParameters", Proc.getParameterCount());
319  printTypeIndex("ArgListType", Proc.getArgumentList());
320  return Error::success();
321 }
322 
324  printTypeIndex("ReturnType", MF.getReturnType());
325  printTypeIndex("ClassType", MF.getClassType());
326  printTypeIndex("ThisType", MF.getThisType());
327  W->printEnum("CallingConvention", uint8_t(MF.getCallConv()),
328  makeArrayRef(CallingConventions));
329  W->printFlags("FunctionOptions", uint8_t(MF.getOptions()),
330  makeArrayRef(FunctionOptionEnum));
331  W->printNumber("NumParameters", MF.getParameterCount());
332  printTypeIndex("ArgListType", MF.getArgumentList());
333  W->printNumber("ThisAdjustment", MF.getThisPointerAdjustment());
334  return Error::success();
335 }
336 
338  MethodOverloadListRecord &MethodList) {
339  for (auto &M : MethodList.getMethods()) {
340  ListScope S(*W, "Method");
341  printMemberAttributes(M.getAccess(), M.getMethodKind(), M.getOptions());
342  printTypeIndex("Type", M.getType());
343  if (M.isIntroducingVirtual())
344  W->printHex("VFTableOffset", M.getVFTableOffset());
345  }
346  return Error::success();
347 }
348 
350  printItemIndex("ParentScope", Func.getParentScope());
351  printTypeIndex("FunctionType", Func.getFunctionType());
352  W->printString("Name", Func.getName());
353  return Error::success();
354 }
355 
357  W->printString("Guid", formatv("{0}", TS.getGuid()).str());
358  W->printNumber("Age", TS.getAge());
359  W->printString("Name", TS.getName());
360  return Error::success();
361 }
362 
364  printTypeIndex("PointeeType", Ptr.getReferentType());
365  W->printHex("PointerAttributes", uint32_t(Ptr.getOptions()));
366  W->printEnum("PtrType", unsigned(Ptr.getPointerKind()),
367  makeArrayRef(PtrKindNames));
368  W->printEnum("PtrMode", unsigned(Ptr.getMode()), makeArrayRef(PtrModeNames));
369 
370  W->printNumber("IsFlat", Ptr.isFlat());
371  W->printNumber("IsConst", Ptr.isConst());
372  W->printNumber("IsVolatile", Ptr.isVolatile());
373  W->printNumber("IsUnaligned", Ptr.isUnaligned());
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()),
381  makeArrayRef(PtrMemberRepNames));
382  }
383 
384  return Error::success();
385 }
386 
388  uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
389  printTypeIndex("ModifiedType", Mod.getModifiedType());
390  W->printFlags("Modifiers", Mods, makeArrayRef(TypeModifierNames));
391 
392  return Error::success();
393 }
394 
396  printTypeIndex("Type", BitField.getType());
397  W->printNumber("BitSize", BitField.getBitSize());
398  W->printNumber("BitOffset", BitField.getBitOffset());
399  return Error::success();
400 }
401 
403  VFTableShapeRecord &Shape) {
404  W->printNumber("VFEntryCount", Shape.getEntryCount());
405  return Error::success();
406 }
407 
410  printTypeIndex("UDT", Line.getUDT());
411  printItemIndex("SourceFile", Line.getSourceFile());
412  W->printNumber("LineNumber", Line.getLineNumber());
413  return Error::success();
414 }
415 
417  UdtModSourceLineRecord &Line) {
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 
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 
435 void TypeDumpVisitor::printMemberAttributes(MemberAttributes Attrs) {
436  return printMemberAttributes(Attrs.getAccess(), Attrs.getMethodKind(),
437  Attrs.getFlags());
438 }
439 
440 void TypeDumpVisitor::printMemberAttributes(MemberAccess Access,
442  MethodOptions Options) {
443  W->printEnum("AccessSpecifier", uint8_t(Access),
444  makeArrayRef(MemberAccessNames));
445  // Data members will be vanilla. Don't try to print a method kind for them.
446  if (Kind != MethodKind::Vanilla)
447  W->printEnum("MethodKind", unsigned(Kind), makeArrayRef(MemberKindNames));
448  if (Options != MethodOptions::None) {
449  W->printFlags("MethodOptions", unsigned(Options),
450  makeArrayRef(MethodOptionNames));
451  }
452 }
453 
455  W->printHex("UnknownMember", unsigned(Record.Kind));
456  return Error::success();
457 }
458 
460  W->printEnum("Kind", uint16_t(Record.kind()), makeArrayRef(LeafTypeNames));
461  W->printNumber("Length", uint32_t(Record.content().size()));
462  return Error::success();
463 }
464 
467  printTypeIndex("Type", Nested.getNestedType());
468  W->printString("Name", Nested.getName());
469  return Error::success();
470 }
471 
473  OneMethodRecord &Method) {
474  MethodKind K = Method.getMethodKind();
475  printMemberAttributes(Method.getAccess(), K, Method.getOptions());
476  printTypeIndex("Type", Method.getType());
477  // If virtual, then read the vftable offset.
478  if (Method.isIntroducingVirtual())
479  W->printHex("VFTableOffset", Method.getVFTableOffset());
480  W->printString("Name", Method.getName());
481  return Error::success();
482 }
483 
485  OverloadedMethodRecord &Method) {
486  W->printHex("MethodCount", Method.getNumOverloads());
487  printTypeIndex("MethodListIndex", Method.getMethodList());
488  W->printString("Name", Method.getName());
489  return Error::success();
490 }
491 
494  printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
496  printTypeIndex("Type", Field.getType());
497  W->printHex("FieldOffset", Field.getFieldOffset());
498  W->printString("Name", Field.getName());
499  return Error::success();
500 }
501 
503  StaticDataMemberRecord &Field) {
504  printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
506  printTypeIndex("Type", Field.getType());
507  W->printString("Name", Field.getName());
508  return Error::success();
509 }
510 
512  VFPtrRecord &VFTable) {
513  printTypeIndex("Type", VFTable.getType());
514  return Error::success();
515 }
516 
518  EnumeratorRecord &Enum) {
519  printMemberAttributes(Enum.getAccess(), MethodKind::Vanilla,
521  W->printNumber("EnumValue", Enum.getValue());
522  W->printString("Name", Enum.getName());
523  return Error::success();
524 }
525 
528  printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
530  printTypeIndex("BaseType", Base.getBaseType());
531  W->printHex("BaseOffset", Base.getBaseOffset());
532  return Error::success();
533 }
534 
536  VirtualBaseClassRecord &Base) {
537  printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
539  printTypeIndex("BaseType", Base.getBaseType());
540  printTypeIndex("VBPtrType", Base.getVBPtrType());
541  W->printHex("VBPtrOffset", Base.getVBPtrOffset());
542  W->printHex("VBTableIndex", Base.getVTableIndex());
543  return Error::success();
544 }
545 
547  ListContinuationRecord &Cont) {
548  printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
549  return Error::success();
550 }
551 
553  W->printEnum("Mode", uint16_t(LR.Mode), makeArrayRef(LabelTypeEnum));
554  return Error::success();
555 }
const NoneType None
Definition: None.h:24
MemberAccess getAccess() const
Definition: TypeRecord.h:803
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:386
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:423
uint64_t getSize() const
Definition: TypeRecord.h:387
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:462
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:838
AMDGPU Rewrite Out Arguments
ArrayRef< StringRef > getMethodNames() const
Definition: TypeRecord.h:671
MemberAccess getAccess() const
Definition: TypeRecord.h:698
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:515
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:372
Error visitMemberRecordStream(ArrayRef< uint8_t > FieldList, TypeVisitorCallbacks &Callbacks)
virtual uint32_t size()=0
MethodKind getMethodKind() const
Definition: TypeRecord.h:696
TypeIndex getFunctionType() const
Definition: TypeRecord.h:228
StringRef getName() const
Definition: TypeRecord.h:426
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:451
StringRef getName() const
Definition: TypeRecord.h:592
StringRef getName() const
Definition: TypeRecord.h:388
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:839
static const EnumEntry< TypeLeafKind > LeafTypeNames[]
raw_ostream & getOStream()
ClassOptions getOptions() const
Definition: TypeRecord.h:424
ModifierOptions
Equivalent to CV_modifier_t.
Definition: CodeView.h:297
TypeIndex getFunctionType() const
Definition: TypeRecord.h:591
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:385
TypeIndex getReturnType() const
Definition: TypeRecord.h:158
CallingConvention getCallConv() const
Definition: TypeRecord.h:190
MemberAccess getAccess() const
Definition: TypeRecord.h:759
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:121
#define ENUM_ENTRY(enum_class, enum)
Error visitTypeBegin(CVType &Record) override
Paired begin/end actions for all types.
TypeIndex getFieldList() const
Definition: TypeRecord.h:425
StringRef getString() const
Definition: TypeRecord.h:575
ArrayRef< TypeIndex > getArgs() const
Definition: TypeRecord.h:647
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:668
static Error visitKnownMember(CVMemberRecord &Record, TypeVisitorCallbacks &Callbacks)
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:149
raw_ostream & startLine()
LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST records together.
Definition: TypeRecord.h:877
StringRef getUniqueName() const
Definition: TypeRecord.h:427
TypeIndex getContainingType() const
Definition: TypeRecord.h:110
For method overload sets. LF_METHOD.
Definition: TypeRecord.h:727
TypeIndex getArgumentList() const
Definition: TypeRecord.h:162
MethodOptions getOptions() const
Definition: TypeRecord.h:697
PointerKind getPointerKind() const
Definition: TypeRecord.h:297
void printHex(StringRef Label, T Value)
TypeIndex getUnderlyingType() const
Definition: TypeRecord.h:501
uint64_t getSize() const
Definition: TypeRecord.h:485
uint32_t getIndex() const
Definition: TypeIndex.h:110
void printString(StringRef Value)
static ErrorSuccess success()
Create a success value.
Definition: Error.h:313
int32_t getVFTableOffset() const
Definition: TypeRecord.h:699
void printNumber(StringRef Label, uint64_t Value)
Error visitUnknownMember(CVMemberRecord &Record) override
static const EnumEntry< uint16_t > PtrMemberRepNames[]
TypeIndex getVTableShape() const
Definition: TypeRecord.h:461
MethodKind getMethodKind() const
Indicates if a method is defined with friend, virtual, static, etc.
Definition: TypeRecord.h:71
MemberAccess getAccess() const
Definition: TypeRecord.h:837
Error visitMemberBegin(CVMemberRecord &Record) override
TypeIndex getOverriddenVTable() const
Definition: TypeRecord.h:667
ArrayRef< OneMethodRecord > getMethods() const
Definition: TypeRecord.h:721
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:516
static const EnumEntry< uint16_t > MethodOptionNames[]
TypeIndex getDerivationList() const
Definition: TypeRecord.h:460
TypeIndex getParentScope() const
Definition: TypeRecord.h:590
TypeIndex getCompleteClass() const
Definition: TypeRecord.h:666
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.
amdgpu Simplify well known AMD library false Value Value * Arg
TypeIndex getNestedType() const
Definition: TypeRecord.h:357
void unindent(int Levels=1)
Definition: ScopedPrinter.h:77
const GUID & getGuid() const
Definition: TypeRecord.h:557
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:820
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:761
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:669
ModifierOptions getModifiers() const
Definition: TypeRecord.h:140