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