LLVM  8.0.1
TypeRecord.h
Go to the documentation of this file.
1 //===- TypeRecord.h ---------------------------------------------*- 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 
10 #ifndef LLVM_DEBUGINFO_CODEVIEW_TYPERECORD_H
11 #define LLVM_DEBUGINFO_CODEVIEW_TYPERECORD_H
12 
13 #include "llvm/ADT/APSInt.h"
14 #include "llvm/ADT/ArrayRef.h"
15 #include "llvm/ADT/Optional.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/StringRef.h"
24 #include "llvm/Support/Endian.h"
25 #include <algorithm>
26 #include <cstdint>
27 #include <vector>
28 
29 namespace llvm {
30 namespace codeview {
31 
35 
38 
42 };
45 
46 /// Equvalent to CV_fldattr_t in cvinfo.h.
48  uint16_t Attrs = 0;
49 
50  enum {
51  MethodKindShift = 2,
52  };
53 
54  MemberAttributes() = default;
55 
56  explicit MemberAttributes(MemberAccess Access)
57  : Attrs(static_cast<uint16_t>(Access)) {}
58 
60  Attrs = static_cast<uint16_t>(Access);
61  Attrs |= (static_cast<uint16_t>(Kind) << MethodKindShift);
62  Attrs |= static_cast<uint16_t>(Flags);
63  }
64 
65  /// Get the access specifier. Valid for any kind of member.
67  return MemberAccess(unsigned(Attrs) & unsigned(MethodOptions::AccessMask));
68  }
69 
70  /// Indicates if a method is defined with friend, virtual, static, etc.
72  return MethodKind(
73  (unsigned(Attrs) & unsigned(MethodOptions::MethodKindMask)) >>
74  MethodKindShift);
75  }
76 
77  /// Get the flags that are not included in access control or method
78  /// properties.
80  return MethodOptions(
81  unsigned(Attrs) &
83  }
84 
85  /// Is this method virtual.
86  bool isVirtual() const {
87  auto MP = getMethodKind();
88  return MP != MethodKind::Vanilla && MP != MethodKind::Friend &&
89  MP != MethodKind::Static;
90  }
91 
92  /// Does this member introduce a new virtual method.
93  bool isIntroducedVirtual() const {
94  auto MP = getMethodKind();
95  return MP == MethodKind::IntroducingVirtual ||
97  }
98 
99  /// Is this method static.
100  bool isStatic() const {
101  return getMethodKind() == MethodKind::Static;
102  }
103 };
104 
105 // Does not correspond to any tag, this is the tail of an LF_POINTER record
106 // if it represents a member pointer.
108 public:
109  MemberPointerInfo() = default;
110 
111  MemberPointerInfo(TypeIndex ContainingType,
112  PointerToMemberRepresentation Representation)
113  : ContainingType(ContainingType), Representation(Representation) {}
114 
115  TypeIndex getContainingType() const { return ContainingType; }
117  return Representation;
118  }
119 
122 };
123 
124 class TypeRecord {
125 protected:
126  TypeRecord() = default;
127  explicit TypeRecord(TypeRecordKind Kind) : Kind(Kind) {}
128 
129 public:
130  TypeRecordKind getKind() const { return Kind; }
131 
133 };
134 
135 // LF_MODIFIER
136 class ModifierRecord : public TypeRecord {
137 public:
138  ModifierRecord() = default;
140  ModifierRecord(TypeIndex ModifiedType, ModifierOptions Modifiers)
141  : TypeRecord(TypeRecordKind::Modifier), ModifiedType(ModifiedType),
142  Modifiers(Modifiers) {}
143 
144  TypeIndex getModifiedType() const { return ModifiedType; }
145  ModifierOptions getModifiers() const { return Modifiers; }
146 
149 };
150 
151 // LF_PROCEDURE
152 class ProcedureRecord : public TypeRecord {
153 public:
154  ProcedureRecord() = default;
157  FunctionOptions Options, uint16_t ParameterCount,
158  TypeIndex ArgumentList)
159  : TypeRecord(TypeRecordKind::Procedure), ReturnType(ReturnType),
160  CallConv(CallConv), Options(Options), ParameterCount(ParameterCount),
161  ArgumentList(ArgumentList) {}
162 
163  TypeIndex getReturnType() const { return ReturnType; }
164  CallingConvention getCallConv() const { return CallConv; }
165  FunctionOptions getOptions() const { return Options; }
166  uint16_t getParameterCount() const { return ParameterCount; }
167  TypeIndex getArgumentList() const { return ArgumentList; }
168 
172  uint16_t ParameterCount;
174 };
175 
176 // LF_MFUNCTION
178 public:
179  MemberFunctionRecord() = default;
181 
183  TypeIndex ThisType, CallingConvention CallConv,
184  FunctionOptions Options, uint16_t ParameterCount,
185  TypeIndex ArgumentList, int32_t ThisPointerAdjustment)
186  : TypeRecord(TypeRecordKind::MemberFunction), ReturnType(ReturnType),
187  ClassType(ClassType), ThisType(ThisType), CallConv(CallConv),
188  Options(Options), ParameterCount(ParameterCount),
189  ArgumentList(ArgumentList),
190  ThisPointerAdjustment(ThisPointerAdjustment) {}
191 
192  TypeIndex getReturnType() const { return ReturnType; }
193  TypeIndex getClassType() const { return ClassType; }
194  TypeIndex getThisType() const { return ThisType; }
195  CallingConvention getCallConv() const { return CallConv; }
196  FunctionOptions getOptions() const { return Options; }
197  uint16_t getParameterCount() const { return ParameterCount; }
198  TypeIndex getArgumentList() const { return ArgumentList; }
199  int32_t getThisPointerAdjustment() const { return ThisPointerAdjustment; }
200 
206  uint16_t ParameterCount;
209 };
210 
211 // LF_LABEL
212 class LabelRecord : public TypeRecord {
213 public:
214  LabelRecord() = default;
216 
218 
220 };
221 
222 // LF_MFUNC_ID
224 public:
225  MemberFuncIdRecord() = default;
228  StringRef Name)
229  : TypeRecord(TypeRecordKind::MemberFuncId), ClassType(ClassType),
230  FunctionType(FunctionType), Name(Name) {}
231 
232  TypeIndex getClassType() const { return ClassType; }
234  StringRef getName() const { return Name; }
235 
239 };
240 
241 // LF_ARGLIST
242 class ArgListRecord : public TypeRecord {
243 public:
244  ArgListRecord() = default;
246 
248  : TypeRecord(Kind), ArgIndices(Indices) {}
249 
250  ArrayRef<TypeIndex> getIndices() const { return ArgIndices; }
251 
252  std::vector<TypeIndex> ArgIndices;
253 };
254 
255 // LF_SUBSTR_LIST
256 class StringListRecord : public TypeRecord {
257 public:
258  StringListRecord() = default;
260 
262  : TypeRecord(Kind), StringIndices(Indices) {}
263 
264  ArrayRef<TypeIndex> getIndices() const { return StringIndices; }
265 
266  std::vector<TypeIndex> StringIndices;
267 };
268 
269 // LF_POINTER
270 class PointerRecord : public TypeRecord {
271 public:
272  // ---------------------------XXXXX
273  static const uint32_t PointerKindShift = 0;
274  static const uint32_t PointerKindMask = 0x1F;
275 
276  // ------------------------XXX-----
277  static const uint32_t PointerModeShift = 5;
278  static const uint32_t PointerModeMask = 0x07;
279 
280  // ----------XXX------XXXXX--------
281  static const uint32_t PointerOptionMask = 0x381f00;
282 
283  // -------------XXXXXX------------
284  static const uint32_t PointerSizeShift = 13;
285  static const uint32_t PointerSizeMask = 0xFF;
286 
287  PointerRecord() = default;
289 
291  : TypeRecord(TypeRecordKind::Pointer), ReferentType(ReferentType),
292  Attrs(Attrs) {}
293 
295  PointerOptions PO, uint8_t Size)
296  : TypeRecord(TypeRecordKind::Pointer), ReferentType(ReferentType),
297  Attrs(calcAttrs(PK, PM, PO, Size)) {}
298 
300  PointerOptions PO, uint8_t Size, const MemberPointerInfo &MPI)
301  : TypeRecord(TypeRecordKind::Pointer), ReferentType(ReferentType),
302  Attrs(calcAttrs(PK, PM, PO, Size)), MemberInfo(MPI) {}
303 
304  TypeIndex getReferentType() const { return ReferentType; }
305 
307  return static_cast<PointerKind>((Attrs >> PointerKindShift) &
308  PointerKindMask);
309  }
310 
312  return static_cast<PointerMode>((Attrs >> PointerModeShift) &
313  PointerModeMask);
314  }
315 
317  return static_cast<PointerOptions>(Attrs & PointerOptionMask);
318  }
319 
320  uint8_t getSize() const {
321  return (Attrs >> PointerSizeShift) & PointerSizeMask;
322  }
323 
324  MemberPointerInfo getMemberInfo() const { return *MemberInfo; }
325 
326  bool isPointerToMember() const {
327  return getMode() == PointerMode::PointerToDataMember ||
329  }
330 
331  bool isFlat() const { return !!(Attrs & uint32_t(PointerOptions::Flat32)); }
332  bool isConst() const { return !!(Attrs & uint32_t(PointerOptions::Const)); }
333 
334  bool isVolatile() const {
336  }
337 
338  bool isUnaligned() const {
340  }
341 
342  bool isRestrict() const {
344  }
345 
348  }
349 
352  }
353 
357 
359  uint8_t Size) {
360  Attrs = calcAttrs(PK, PM, PO, Size);
361  }
362 
363 private:
364  static uint32_t calcAttrs(PointerKind PK, PointerMode PM, PointerOptions PO,
365  uint8_t Size) {
366  uint32_t A = 0;
367  A |= static_cast<uint32_t>(PK);
368  A |= static_cast<uint32_t>(PO);
369  A |= (static_cast<uint32_t>(PM) << PointerModeShift);
370  A |= (static_cast<uint32_t>(Size) << PointerSizeShift);
371  return A;
372  }
373 };
374 
375 // LF_NESTTYPE
376 class NestedTypeRecord : public TypeRecord {
377 public:
378  NestedTypeRecord() = default;
381  : TypeRecord(TypeRecordKind::NestedType), Type(Type), Name(Name) {}
382 
383  TypeIndex getNestedType() const { return Type; }
384  StringRef getName() const { return Name; }
385 
388 };
389 
390 // LF_FIELDLIST
391 class FieldListRecord : public TypeRecord {
392 public:
393  FieldListRecord() = default;
396  : TypeRecord(TypeRecordKind::FieldList), Data(Data) {}
397 
399 };
400 
401 // LF_ARRAY
402 class ArrayRecord : public TypeRecord {
403 public:
404  ArrayRecord() = default;
406  ArrayRecord(TypeIndex ElementType, TypeIndex IndexType, uint64_t Size,
407  StringRef Name)
408  : TypeRecord(TypeRecordKind::Array), ElementType(ElementType),
409  IndexType(IndexType), Size(Size), Name(Name) {}
410 
411  TypeIndex getElementType() const { return ElementType; }
412  TypeIndex getIndexType() const { return IndexType; }
413  uint64_t getSize() const { return Size; }
414  StringRef getName() const { return Name; }
415 
418  uint64_t Size;
420 };
421 
422 class TagRecord : public TypeRecord {
423 protected:
424  TagRecord() = default;
426  TagRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options,
428  : TypeRecord(Kind), MemberCount(MemberCount), Options(Options),
429  FieldList(FieldList), Name(Name), UniqueName(UniqueName) {}
430 
431 public:
432  static const int HfaKindShift = 11;
433  static const int HfaKindMask = 0x1800;
434  static const int WinRTKindShift = 14;
435  static const int WinRTKindMask = 0xC000;
436 
437  bool hasUniqueName() const {
438  return (Options & ClassOptions::HasUniqueName) != ClassOptions::None;
439  }
440 
441  bool isNested() const {
442  return (Options & ClassOptions::Nested) != ClassOptions::None;
443  }
444 
445  bool isForwardRef() const {
447  }
448 
449  bool containsNestedClass() const {
451  }
452 
453  bool isScoped() const {
454  return (Options & ClassOptions::Scoped) != ClassOptions::None;
455  }
456 
457  uint16_t getMemberCount() const { return MemberCount; }
458  ClassOptions getOptions() const { return Options; }
459  TypeIndex getFieldList() const { return FieldList; }
460  StringRef getName() const { return Name; }
461  StringRef getUniqueName() const { return UniqueName; }
462 
463  uint16_t MemberCount;
468 };
469 
470 // LF_CLASS, LF_STRUCTURE, LF_INTERFACE
471 class ClassRecord : public TagRecord {
472 public:
473  ClassRecord() = default;
475  ClassRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options,
476  TypeIndex FieldList, TypeIndex DerivationList,
477  TypeIndex VTableShape, uint64_t Size, StringRef Name,
478  StringRef UniqueName)
479  : TagRecord(Kind, MemberCount, Options, FieldList, Name, UniqueName),
480  DerivationList(DerivationList), VTableShape(VTableShape), Size(Size) {}
481 
482  HfaKind getHfa() const {
483  uint16_t Value = static_cast<uint16_t>(Options);
484  Value = (Value & HfaKindMask) >> HfaKindShift;
485  return static_cast<HfaKind>(Value);
486  }
487 
489  uint16_t Value = static_cast<uint16_t>(Options);
490  Value = (Value & WinRTKindMask) >> WinRTKindShift;
491  return static_cast<WindowsRTClassKind>(Value);
492  }
493 
494  TypeIndex getDerivationList() const { return DerivationList; }
495  TypeIndex getVTableShape() const { return VTableShape; }
496  uint64_t getSize() const { return Size; }
497 
500  uint64_t Size;
501 };
502 
503 // LF_UNION
504 struct UnionRecord : public TagRecord {
505  UnionRecord() = default;
507  UnionRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList,
508  uint64_t Size, StringRef Name, StringRef UniqueName)
509  : TagRecord(TypeRecordKind::Union, MemberCount, Options, FieldList, Name,
510  UniqueName),
511  Size(Size) {}
512 
513  HfaKind getHfa() const {
514  uint16_t Value = static_cast<uint16_t>(Options);
515  Value = (Value & HfaKindMask) >> HfaKindShift;
516  return static_cast<HfaKind>(Value);
517  }
518 
519  uint64_t getSize() const { return Size; }
520 
521  uint64_t Size;
522 };
523 
524 // LF_ENUM
525 class EnumRecord : public TagRecord {
526 public:
527  EnumRecord() = default;
529  EnumRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList,
530  StringRef Name, StringRef UniqueName, TypeIndex UnderlyingType)
531  : TagRecord(TypeRecordKind::Enum, MemberCount, Options, FieldList, Name,
532  UniqueName),
533  UnderlyingType(UnderlyingType) {}
534 
535  TypeIndex getUnderlyingType() const { return UnderlyingType; }
536 
538 };
539 
540 // LF_BITFIELD
541 class BitFieldRecord : public TypeRecord {
542 public:
543  BitFieldRecord() = default;
545  BitFieldRecord(TypeIndex Type, uint8_t BitSize, uint8_t BitOffset)
546  : TypeRecord(TypeRecordKind::BitField), Type(Type), BitSize(BitSize),
547  BitOffset(BitOffset) {}
548 
549  TypeIndex getType() const { return Type; }
550  uint8_t getBitOffset() const { return BitOffset; }
551  uint8_t getBitSize() const { return BitSize; }
552 
554  uint8_t BitSize;
555  uint8_t BitOffset;
556 };
557 
558 // LF_VTSHAPE
560 public:
561  VFTableShapeRecord() = default;
564  : TypeRecord(TypeRecordKind::VFTableShape), SlotsRef(Slots) {}
565  explicit VFTableShapeRecord(std::vector<VFTableSlotKind> Slots)
566  : TypeRecord(TypeRecordKind::VFTableShape), Slots(std::move(Slots)) {}
567 
569  if (!SlotsRef.empty())
570  return SlotsRef;
571  return Slots;
572  }
573 
574  uint32_t getEntryCount() const { return getSlots().size(); }
575 
577  std::vector<VFTableSlotKind> Slots;
578 };
579 
580 // LF_TYPESERVER2
582 public:
583  TypeServer2Record() = default;
586  : TypeRecord(TypeRecordKind::TypeServer2), Age(Age), Name(Name) {
587  assert(GuidStr.size() == 16 && "guid isn't 16 bytes");
588  ::memcpy(Guid.Guid, GuidStr.data(), 16);
589  }
590 
591  const GUID &getGuid() const { return Guid; }
592  uint32_t getAge() const { return Age; }
593  StringRef getName() const { return Name; }
594 
598 };
599 
600 // LF_STRING_ID
601 class StringIdRecord : public TypeRecord {
602 public:
603  StringIdRecord() = default;
606  : TypeRecord(TypeRecordKind::StringId), Id(Id), String(String) {}
607 
608  TypeIndex getId() const { return Id; }
609  StringRef getString() const { return String; }
610 
613 };
614 
615 // LF_FUNC_ID
616 class FuncIdRecord : public TypeRecord {
617 public:
618  FuncIdRecord() = default;
621  : TypeRecord(TypeRecordKind::FuncId), ParentScope(ParentScope),
622  FunctionType(FunctionType), Name(Name) {}
623 
624  TypeIndex getParentScope() const { return ParentScope; }
626  StringRef getName() const { return Name; }
627 
631 };
632 
633 // LF_UDT_SRC_LINE
635 public:
636  UdtSourceLineRecord() = default;
638  UdtSourceLineRecord(TypeIndex UDT, TypeIndex SourceFile, uint32_t LineNumber)
639  : TypeRecord(TypeRecordKind::UdtSourceLine), UDT(UDT),
640  SourceFile(SourceFile), LineNumber(LineNumber) {}
641 
642  TypeIndex getUDT() const { return UDT; }
643  TypeIndex getSourceFile() const { return SourceFile; }
644  uint32_t getLineNumber() const { return LineNumber; }
645 
649 };
650 
651 // LF_UDT_MOD_SRC_LINE
653 public:
654  UdtModSourceLineRecord() = default;
657  uint32_t LineNumber, uint16_t Module)
658  : TypeRecord(TypeRecordKind::UdtSourceLine), UDT(UDT),
659  SourceFile(SourceFile), LineNumber(LineNumber), Module(Module) {}
660 
661  TypeIndex getUDT() const { return UDT; }
662  TypeIndex getSourceFile() const { return SourceFile; }
663  uint32_t getLineNumber() const { return LineNumber; }
664  uint16_t getModule() const { return Module; }
665 
669  uint16_t Module;
670 };
671 
672 // LF_BUILDINFO
673 class BuildInfoRecord : public TypeRecord {
674 public:
675  BuildInfoRecord() = default;
678  : TypeRecord(TypeRecordKind::BuildInfo),
679  ArgIndices(ArgIndices.begin(), ArgIndices.end()) {}
680 
681  ArrayRef<TypeIndex> getArgs() const { return ArgIndices; }
682 
683  /// Indices of known build info arguments.
685  CurrentDirectory, ///< Absolute CWD path
686  BuildTool, ///< Absolute compiler path
687  SourceFile, ///< Path to main source file, relative or absolute
688  TypeServerPDB, ///< Absolute path of type server PDB (/Fd)
689  CommandLine, ///< Full canonical command line (maybe -cc1)
690  MaxArgs
691  };
692 
694 };
695 
696 // LF_VFTABLE
697 class VFTableRecord : public TypeRecord {
698 public:
699  VFTableRecord() = default;
701  VFTableRecord(TypeIndex CompleteClass, TypeIndex OverriddenVFTable,
702  uint32_t VFPtrOffset, StringRef Name,
703  ArrayRef<StringRef> Methods)
704  : TypeRecord(TypeRecordKind::VFTable), CompleteClass(CompleteClass),
705  OverriddenVFTable(OverriddenVFTable), VFPtrOffset(VFPtrOffset) {
706  MethodNames.push_back(Name);
707  MethodNames.insert(MethodNames.end(), Methods.begin(), Methods.end());
708  }
709 
710  TypeIndex getCompleteClass() const { return CompleteClass; }
711  TypeIndex getOverriddenVTable() const { return OverriddenVFTable; }
712  uint32_t getVFPtrOffset() const { return VFPtrOffset; }
713  StringRef getName() const { return makeArrayRef(MethodNames).front(); }
714 
716  return makeArrayRef(MethodNames).drop_front();
717  }
718 
722  std::vector<StringRef> MethodNames;
723 };
724 
725 // LF_ONEMETHOD
726 class OneMethodRecord : public TypeRecord {
727 public:
728  OneMethodRecord() = default;
731  StringRef Name)
732  : TypeRecord(TypeRecordKind::OneMethod), Type(Type), Attrs(Attrs),
733  VFTableOffset(VFTableOffset), Name(Name) {}
735  MethodOptions Options, int32_t VFTableOffset, StringRef Name)
736  : TypeRecord(TypeRecordKind::OneMethod), Type(Type),
737  Attrs(Access, MK, Options), VFTableOffset(VFTableOffset), Name(Name) {}
738 
739  TypeIndex getType() const { return Type; }
740  MethodKind getMethodKind() const { return Attrs.getMethodKind(); }
741  MethodOptions getOptions() const { return Attrs.getFlags(); }
742  MemberAccess getAccess() const { return Attrs.getAccess(); }
743  int32_t getVFTableOffset() const { return VFTableOffset; }
744  StringRef getName() const { return Name; }
745 
746  bool isIntroducingVirtual() const {
749  }
750 
753  int32_t VFTableOffset;
755 };
756 
757 // LF_METHODLIST
759 public:
760  MethodOverloadListRecord() = default;
763  : TypeRecord(TypeRecordKind::MethodOverloadList), Methods(Methods) {}
764 
765  ArrayRef<OneMethodRecord> getMethods() const { return Methods; }
766 
767  std::vector<OneMethodRecord> Methods;
768 };
769 
770 /// For method overload sets. LF_METHOD
772 public:
773  OverloadedMethodRecord() = default;
775  OverloadedMethodRecord(uint16_t NumOverloads, TypeIndex MethodList,
776  StringRef Name)
777  : TypeRecord(TypeRecordKind::OverloadedMethod),
778  NumOverloads(NumOverloads), MethodList(MethodList), Name(Name) {}
779 
780  uint16_t getNumOverloads() const { return NumOverloads; }
781  TypeIndex getMethodList() const { return MethodList; }
782  StringRef getName() const { return Name; }
783 
784  uint16_t NumOverloads;
787 };
788 
789 // LF_MEMBER
790 class DataMemberRecord : public TypeRecord {
791 public:
792  DataMemberRecord() = default;
795  StringRef Name)
796  : TypeRecord(TypeRecordKind::DataMember), Attrs(Attrs), Type(Type),
797  FieldOffset(Offset), Name(Name) {}
799  StringRef Name)
800  : TypeRecord(TypeRecordKind::DataMember), Attrs(Access), Type(Type),
801  FieldOffset(Offset), Name(Name) {}
802 
803  MemberAccess getAccess() const { return Attrs.getAccess(); }
804  TypeIndex getType() const { return Type; }
805  uint64_t getFieldOffset() const { return FieldOffset; }
806  StringRef getName() const { return Name; }
807 
810  uint64_t FieldOffset;
812 };
813 
814 // LF_STMEMBER
816 public:
817  StaticDataMemberRecord() = default;
820  : TypeRecord(TypeRecordKind::StaticDataMember), Attrs(Attrs), Type(Type),
821  Name(Name) {}
823  : TypeRecord(TypeRecordKind::StaticDataMember), Attrs(Access), Type(Type),
824  Name(Name) {}
825 
826  MemberAccess getAccess() const { return Attrs.getAccess(); }
827  TypeIndex getType() const { return Type; }
828  StringRef getName() const { return Name; }
829 
833 };
834 
835 // LF_ENUMERATE
836 class EnumeratorRecord : public TypeRecord {
837 public:
838  EnumeratorRecord() = default;
841  : TypeRecord(TypeRecordKind::Enumerator), Attrs(Attrs),
842  Value(std::move(Value)), Name(Name) {}
845  Value(std::move(Value)), Name(Name) {}
846 
847  MemberAccess getAccess() const { return Attrs.getAccess(); }
848  APSInt getValue() const { return Value; }
849  StringRef getName() const { return Name; }
850 
854 };
855 
856 // LF_VFUNCTAB
857 class VFPtrRecord : public TypeRecord {
858 public:
859  VFPtrRecord() = default;
862  : TypeRecord(TypeRecordKind::VFPtr), Type(Type) {}
863 
864  TypeIndex getType() const { return Type; }
865 
867 };
868 
869 // LF_BCLASS, LF_BINTERFACE
870 class BaseClassRecord : public TypeRecord {
871 public:
872  BaseClassRecord() = default;
875  : TypeRecord(TypeRecordKind::BaseClass), Attrs(Attrs), Type(Type),
876  Offset(Offset) {}
878  : TypeRecord(TypeRecordKind::BaseClass), Attrs(Access), Type(Type),
879  Offset(Offset) {}
880 
881  MemberAccess getAccess() const { return Attrs.getAccess(); }
882  TypeIndex getBaseType() const { return Type; }
883  uint64_t getBaseOffset() const { return Offset; }
884 
887  uint64_t Offset;
888 };
889 
890 // LF_VBCLASS, LF_IVBCLASS
892 public:
893  VirtualBaseClassRecord() = default;
896  TypeIndex BaseType, TypeIndex VBPtrType,
897  uint64_t Offset, uint64_t Index)
898  : TypeRecord(Kind), Attrs(Attrs), BaseType(BaseType),
899  VBPtrType(VBPtrType), VBPtrOffset(Offset), VTableIndex(Index) {}
901  TypeIndex BaseType, TypeIndex VBPtrType,
902  uint64_t Offset, uint64_t Index)
903  : TypeRecord(Kind), Attrs(Access), BaseType(BaseType),
904  VBPtrType(VBPtrType), VBPtrOffset(Offset), VTableIndex(Index) {}
905 
906  MemberAccess getAccess() const { return Attrs.getAccess(); }
907  TypeIndex getBaseType() const { return BaseType; }
908  TypeIndex getVBPtrType() const { return VBPtrType; }
909  uint64_t getVBPtrOffset() const { return VBPtrOffset; }
910  uint64_t getVTableIndex() const { return VTableIndex; }
911 
915  uint64_t VBPtrOffset;
916  uint64_t VTableIndex;
917 };
918 
919 /// LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST records
920 /// together. The first will end in an LF_INDEX record that points to the next.
922 public:
923  ListContinuationRecord() = default;
926  : TypeRecord(TypeRecordKind::ListContinuation),
927  ContinuationIndex(ContinuationIndex) {}
928 
929  TypeIndex getContinuationIndex() const { return ContinuationIndex; }
930 
932 };
933 
934 // LF_PRECOMP
935 class PrecompRecord : public TypeRecord {
936 public:
937  PrecompRecord() = default;
939 
940  uint32_t getStartTypeIndex() const { return StartTypeIndex; }
941  uint32_t getTypesCount() const { return TypesCount; }
942  uint32_t getSignature() const { return Signature; }
943  StringRef getPrecompFilePath() const { return PrecompFilePath; }
944 
949 };
950 
951 // LF_ENDPRECOMP
952 class EndPrecompRecord : public TypeRecord {
953 public:
954  EndPrecompRecord() = default;
956 
957  uint32_t getSignature() const { return Signature; }
958 
960 };
961 
962 } // end namespace codeview
963 } // end namespace llvm
964 
965 #endif // LLVM_DEBUGINFO_CODEVIEW_TYPERECORD_H
MemberAccess getAccess() const
Definition: TypeRecord.h:847
Profile::FuncID FuncId
Definition: Profile.cpp:321
PointerKind
Equivalent to CV_ptrtype_e.
Definition: CodeView.h:328
TypeIndex getIndexType() const
Definition: TypeRecord.h:412
const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:259
int32_t getThisPointerAdjustment() const
Definition: TypeRecord.h:199
UdtSourceLineRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:637
MemberAttributes(MemberAccess Access)
Definition: TypeRecord.h:56
VirtualBaseClassRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:894
uint16_t getMemberCount() const
Definition: TypeRecord.h:457
uint64_t getSize() const
Definition: TypeRecord.h:413
BuildInfoRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:676
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
Definition: Path.cpp:250
uint32_t getSignature() const
Definition: TypeRecord.h:942
MemberFunctionRecord(TypeIndex ReturnType, TypeIndex ClassType, TypeIndex ThisType, CallingConvention CallConv, FunctionOptions Options, uint16_t ParameterCount, TypeIndex ArgumentList, int32_t ThisPointerAdjustment)
Definition: TypeRecord.h:182
SI Whole Quad Mode
This class represents lattice values for constants.
Definition: AllocatorList.h:24
uint64_t getSize() const
Definition: TypeRecord.h:496
LabelRecord(LabelType Mode)
Definition: TypeRecord.h:217
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:65
TypeLeafKind
Duplicate copy of the above enum, but using the official CV names.
Definition: CodeView.h:34
TagRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList, StringRef Name, StringRef UniqueName)
Definition: TypeRecord.h:426
MethodOverloadListRecord(ArrayRef< OneMethodRecord > Methods)
Definition: TypeRecord.h:762
iterator begin() const
Definition: ArrayRef.h:137
StaticDataMemberRecord(MemberAttributes Attrs, TypeIndex Type, StringRef Name)
Definition: TypeRecord.h:819
ArrayRef< uint8_t > Data
Definition: TypeRecord.h:41
VirtualBaseClassRecord(TypeRecordKind Kind, MemberAttributes Attrs, TypeIndex BaseType, TypeIndex VBPtrType, uint64_t Offset, uint64_t Index)
Definition: TypeRecord.h:895
TypeIndex getBaseType() const
Definition: TypeRecord.h:882
bool isRValueReferenceThisPtr() const
Definition: TypeRecord.h:350
ArrayRef< StringRef > getMethodNames() const
Definition: TypeRecord.h:715
MemberAccess getAccess() const
Definition: TypeRecord.h:742
This provides a very simple, boring adaptor for a begin and end iterator into a range type...
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t size() const
size - Get the string size.
Definition: StringRef.h:138
StringIdRecord(TypeIndex Id, StringRef String)
Definition: TypeRecord.h:605
BuildInfoRecord(ArrayRef< TypeIndex > ArgIndices)
Definition: TypeRecord.h:677
NestedTypeRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:379
OverloadedMethodRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:774
TypeIndex getReferentType() const
Definition: TypeRecord.h:304
MemberPointerInfo getMemberInfo() const
Definition: TypeRecord.h:324
PointerRecord(TypeIndex ReferentType, uint32_t Attrs)
Definition: TypeRecord.h:290
ClassRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList, TypeIndex DerivationList, TypeIndex VTableShape, uint64_t Size, StringRef Name, StringRef UniqueName)
Definition: TypeRecord.h:475
TypeIndex getType() const
Definition: TypeRecord.h:549
FieldListRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:394
FieldListRecord(ArrayRef< uint8_t > Data)
Definition: TypeRecord.h:395
ArrayRef< uint8_t > Data
Definition: TypeRecord.h:398
TypeServer2Record(StringRef GuidStr, uint32_t Age, StringRef Name)
Definition: TypeRecord.h:585
detail::packed_endian_specific_integral< uint16_t, little, unaligned > ulittle16_t
Definition: Endian.h:269
TypeServer2Record(TypeRecordKind Kind)
Definition: TypeRecord.h:584
BitFieldRecord(TypeIndex Type, uint8_t BitSize, uint8_t BitOffset)
Definition: TypeRecord.h:545
WindowsRTClassKind getWinRTKind() const
Definition: TypeRecord.h:488
OneMethodRecord(TypeIndex Type, MemberAttributes Attrs, int32_t VFTableOffset, StringRef Name)
Definition: TypeRecord.h:730
BitFieldRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:544
ArgListRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:245
MethodKind getMethodKind() const
Definition: TypeRecord.h:740
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition: StringRef.h:128
OneMethodRecord(TypeIndex Type, MemberAccess Access, MethodKind MK, MethodOptions Options, int32_t VFTableOffset, StringRef Name)
Definition: TypeRecord.h:734
TypeIndex getFunctionType() const
Definition: TypeRecord.h:233
EnumRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList, StringRef Name, StringRef UniqueName, TypeIndex UnderlyingType)
Definition: TypeRecord.h:529
MemberFunctionRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:180
bool isForwardRef() const
Definition: TypeRecord.h:445
PointerRecord(TypeIndex ReferentType, PointerKind PK, PointerMode PM, PointerOptions PO, uint8_t Size)
Definition: TypeRecord.h:294
bool isLValueReferenceThisPtr() const
Definition: TypeRecord.h:346
StringRef getName() const
Definition: TypeRecord.h:460
bool hasUniqueName() const
Definition: TypeRecord.h:437
DataMemberRecord(MemberAttributes Attrs, TypeIndex Type, uint64_t Offset, StringRef Name)
Definition: TypeRecord.h:794
ArgListRecord(TypeRecordKind Kind, ArrayRef< TypeIndex > Indices)
Definition: TypeRecord.h:247
amdgpu Simplify well known AMD library false Value Value const Twine & Name
Definition: BitVector.h:938
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
Definition: ArrayRef.h:451
StringRef getName() const
Definition: TypeRecord.h:626
StringRef getName() const
Definition: TypeRecord.h:414
ArrayRef< VFTableSlotKind > SlotsRef
Definition: TypeRecord.h:576
This represents the &#39;GUID&#39; type from windows.h.
Definition: GUID.h:22
LabelRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:215
uint64_t getBaseOffset() const
Definition: TypeRecord.h:883
Class to represent function types.
Definition: DerivedTypes.h:103
VirtualBaseClassRecord(TypeRecordKind Kind, MemberAccess Access, TypeIndex BaseType, TypeIndex VBPtrType, uint64_t Offset, uint64_t Index)
Definition: TypeRecord.h:900
OneMethodRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:729
ClassOptions getOptions() const
Definition: TypeRecord.h:458
ModifierOptions
Equivalent to CV_modifier_t.
Definition: CodeView.h:299
BuildInfoArg
Indices of known build info arguments.
Definition: TypeRecord.h:684
static MethodKind getMethodKind(uint16_t Attrs)
TypeIndex getFunctionType() const
Definition: TypeRecord.h:625
LabelType
Equivalent to CV_LABEL_TYPE_e.
Definition: CodeView.h:292
PointerRecord(TypeIndex ReferentType, PointerKind PK, PointerMode PM, PointerOptions PO, uint8_t Size, const MemberPointerInfo &MPI)
Definition: TypeRecord.h:299
PointerMode getMode() const
Definition: TypeRecord.h:311
A 32-bit type reference.
Definition: TypeIndex.h:96
UdtSourceLineRecord(TypeIndex UDT, TypeIndex SourceFile, uint32_t LineNumber)
Definition: TypeRecord.h:638
TypeIndex getElementType() const
Definition: TypeRecord.h:411
TypeIndex getReturnType() const
Definition: TypeRecord.h:163
CallingConvention getCallConv() const
Definition: TypeRecord.h:195
std::vector< TypeIndex > StringIndices
Definition: TypeRecord.h:266
VFTableRecord(TypeIndex CompleteClass, TypeIndex OverriddenVFTable, uint32_t VFPtrOffset, StringRef Name, ArrayRef< StringRef > Methods)
Definition: TypeRecord.h:701
MemberAccess getAccess() const
Definition: TypeRecord.h:803
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
MethodKind
Part of member attribute flags. (CV_methodprop_e)
Definition: CodeView.h:268
ModifierRecord(TypeIndex ModifiedType, ModifierOptions Modifiers)
Definition: TypeRecord.h:140
ModifierRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:139
EnumeratorRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:839
TypeIndex getFieldList() const
Definition: TypeRecord.h:459
StringRef getString() const
Definition: TypeRecord.h:609
ArrayRef< TypeIndex > getArgs() const
Definition: TypeRecord.h:681
VFTableRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:700
Full canonical command line (maybe -cc1)
Definition: TypeRecord.h:689
TypeRecordKind
Distinguishes individual records in .debug$T or .debug$P section or PDB type stream.
Definition: CodeView.h:27
PointerToMemberRepresentation getRepresentation() const
Definition: TypeRecord.h:116
ListContinuationRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:924
FunctionOptions getOptions() const
Definition: TypeRecord.h:196
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
detail::packed_endian_specific_integral< uint32_t, little, unaligned > ulittle32_t
Definition: Endian.h:271
Absolute path of type server PDB (/Fd)
Definition: TypeRecord.h:688
PointerRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:288
uint32_t getVFPtrOffset() const
Definition: TypeRecord.h:712
bool isIntroducedVirtual() const
Does this member introduce a new virtual method.
Definition: TypeRecord.h:93
Optional< MemberPointerInfo > MemberInfo
Definition: TypeRecord.h:356
NestedTypeRecord(TypeIndex Type, StringRef Name)
Definition: TypeRecord.h:380
LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST records together.
Definition: TypeRecord.h:921
StringRef getUniqueName() const
Definition: TypeRecord.h:461
TypeIndex getContainingType() const
Definition: TypeRecord.h:115
std::vector< TypeIndex > ArgIndices
Definition: TypeRecord.h:252
FuncIdRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:619
StringListRecord(TypeRecordKind Kind, ArrayRef< TypeIndex > Indices)
Definition: TypeRecord.h:261
TagRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:425
For method overload sets. LF_METHOD.
Definition: TypeRecord.h:771
OverloadedMethodRecord(uint16_t NumOverloads, TypeIndex MethodList, StringRef Name)
Definition: TypeRecord.h:775
TypeIndex getArgumentList() const
Definition: TypeRecord.h:167
FuncIdRecord(TypeIndex ParentScope, TypeIndex FunctionType, StringRef Name)
Definition: TypeRecord.h:620
MethodOptions getOptions() const
Definition: TypeRecord.h:741
PointerKind getPointerKind() const
Definition: TypeRecord.h:306
std::vector< StringRef > MethodNames
Definition: TypeRecord.h:722
ArrayRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:405
TypeIndex getUnderlyingType() const
Definition: TypeRecord.h:535
UdtModSourceLineRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:655
uint32_t getTypesCount() const
Definition: TypeRecord.h:941
BaseClassRecord(MemberAttributes Attrs, TypeIndex Type, uint64_t Offset)
Definition: TypeRecord.h:874
ListContinuationRecord(TypeIndex ContinuationIndex)
Definition: TypeRecord.h:925
StringListRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:259
uint64_t getSize() const
Definition: TypeRecord.h:519
ProcedureRecord(TypeIndex ReturnType, CallingConvention CallConv, FunctionOptions Options, uint16_t ParameterCount, TypeIndex ArgumentList)
Definition: TypeRecord.h:156
PrecompRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:938
PointerOptions
Equivalent to misc lfPointerAttr bitfields.
Definition: CodeView.h:354
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
MethodOverloadListRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:761
EndPrecompRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:955
int32_t getVFTableOffset() const
Definition: TypeRecord.h:743
UnionRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList, uint64_t Size, StringRef Name, StringRef UniqueName)
Definition: TypeRecord.h:507
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:847
StaticDataMemberRecord(MemberAccess Access, TypeIndex Type, StringRef Name)
Definition: TypeRecord.h:822
TypeIndex getVTableShape() const
Definition: TypeRecord.h:495
CallingConvention CallConv
Definition: TypeRecord.h:170
MethodKind getMethodKind() const
Indicates if a method is defined with friend, virtual, static, etc.
Definition: TypeRecord.h:71
bool isStatic() const
Is this method static.
Definition: TypeRecord.h:100
iterator end() const
Definition: ArrayRef.h:138
MemberAccess getAccess() const
Definition: TypeRecord.h:881
DataMemberRecord(MemberAccess Access, TypeIndex Type, uint64_t Offset, StringRef Name)
Definition: TypeRecord.h:798
HfaKind getHfa() const
Definition: TypeRecord.h:513
EnumeratorRecord(MemberAccess Access, APSInt Value, StringRef Name)
Definition: TypeRecord.h:843
TypeIndex getOverriddenVTable() const
Definition: TypeRecord.h:711
TypeRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:127
ArrayRef< OneMethodRecord > getMethods() const
Definition: TypeRecord.h:765
PointerMode
Equivalent to CV_ptrmode_e.
Definition: CodeView.h:345
VFTableShapeRecord(ArrayRef< VFTableSlotKind > Slots)
Definition: TypeRecord.h:563
A range adaptor for a pair of iterators.
ArrayRef< TypeIndex > getIndices() const
Definition: TypeRecord.h:264
uint8_t getBitOffset() const
Definition: TypeRecord.h:550
TypeIndex getDerivationList() const
Definition: TypeRecord.h:494
TypeIndex getParentScope() const
Definition: TypeRecord.h:624
MemberFuncIdRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:226
ClassRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:474
TypeIndex getCompleteClass() const
Definition: TypeRecord.h:710
MethodOptions
Equivalent to CV_fldattr_t bitfield.
Definition: CodeView.h:279
bool isVirtual() const
Is this method virtual.
Definition: TypeRecord.h:86
void setAttrs(PointerKind PK, PointerMode PM, PointerOptions PO, uint8_t Size)
Definition: TypeRecord.h:358
std::vector< OneMethodRecord > Methods
Definition: TypeRecord.h:767
TypeIndex getNestedType() const
Definition: TypeRecord.h:383
MemberFuncIdRecord(TypeIndex ClassType, TypeIndex FunctionType, StringRef Name)
Definition: TypeRecord.h:227
const GUID & getGuid() const
Definition: TypeRecord.h:591
VFTableShapeRecord(std::vector< VFTableSlotKind > Slots)
Definition: TypeRecord.h:565
StringRef getPrecompFilePath() const
Definition: TypeRecord.h:943
CallingConvention getCallConv() const
Definition: TypeRecord.h:164
Path to main source file, relative or absolute.
Definition: TypeRecord.h:687
detail::packed_endian_specific_integral< int32_t, little, unaligned > little32_t
Definition: Endian.h:278
VFTableShapeRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:562
ArrayRef< TypeIndex > getIndices() const
Definition: TypeRecord.h:250
StaticDataMemberRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:818
PointerOptions getOptions() const
Definition: TypeRecord.h:316
ArrayRecord(TypeIndex ElementType, TypeIndex IndexType, uint64_t Size, StringRef Name)
Definition: TypeRecord.h:406
uint32_t Size
Definition: Profile.cpp:47
TypeIndex getType() const
Definition: TypeRecord.h:864
FunctionOptions getOptions() const
Definition: TypeRecord.h:165
EnumeratorRecord(MemberAttributes Attrs, APSInt Value, StringRef Name)
Definition: TypeRecord.h:840
PointerToMemberRepresentation
Equivalent to CV_pmtype_e.
Definition: CodeView.h:368
VFPtrRecord(TypeIndex Type)
Definition: TypeRecord.h:861
ProcedureRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:155
StringIdRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:604
uint16_t getParameterCount() const
Definition: TypeRecord.h:166
MemberAccess
Source-level access specifier. (CV_access_e)
Definition: CodeView.h:260
DataMemberRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:793
uint64_t getFieldOffset() const
Definition: TypeRecord.h:805
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
MethodOptions getFlags() const
Get the flags that are not included in access control or method properties.
Definition: TypeRecord.h:79
std::vector< VFTableSlotKind > Slots
Definition: TypeRecord.h:577
BaseClassRecord(MemberAccess Access, TypeIndex Type, uint64_t Offset)
Definition: TypeRecord.h:877
ArrayRef< VFTableSlotKind > getSlots() const
Definition: TypeRecord.h:568
BaseClassRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:873
Equvalent to CV_fldattr_t in cvinfo.h.
Definition: TypeRecord.h:47
UnionRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:506
LLVM Value Representation.
Definition: Value.h:73
EnumRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:528
TypeRecordKind getKind() const
Definition: TypeRecord.h:130
CallingConvention
These values correspond to the CV_call_e enumeration, and are documented at the following locations: ...
Definition: CodeView.h:173
uint32_t getStartTypeIndex() const
Definition: TypeRecord.h:940
VFPtrRecord(TypeRecordKind Kind)
Definition: TypeRecord.h:860
TypeIndex getModifiedType() const
Definition: TypeRecord.h:144
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
HfaKind getHfa() const
Definition: TypeRecord.h:482
bool containsNestedClass() const
Definition: TypeRecord.h:449
SmallVector< TypeIndex, MaxArgs > ArgIndices
Definition: TypeRecord.h:693
UdtModSourceLineRecord(TypeIndex UDT, TypeIndex SourceFile, uint32_t LineNumber, uint16_t Module)
Definition: TypeRecord.h:656
MemberAccess getAccess() const
Get the access specifier. Valid for any kind of member.
Definition: TypeRecord.h:66
MemberPointerInfo(TypeIndex ContainingType, PointerToMemberRepresentation Representation)
Definition: TypeRecord.h:111
MemberAttributes(MemberAccess Access, MethodKind Kind, MethodOptions Flags)
Definition: TypeRecord.h:59
PointerToMemberRepresentation Representation
Definition: TypeRecord.h:121
StringRef getName() const
Definition: TypeRecord.h:713
ModifierOptions getModifiers() const
Definition: TypeRecord.h:145