1 //===- TypeRecord.h ---------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_DEBUGINFO_CODEVIEW_TYPERECORD_H
11 #define LLVM_DEBUGINFO_CODEVIEW_TYPERECORD_H
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"
18 #include "llvm/DebugInfo/CodeView/CVRecord.h"
19 #include "llvm/DebugInfo/CodeView/CodeView.h"
20 #include "llvm/DebugInfo/CodeView/TypeIndex.h"
21 #include "llvm/Support/BinaryStreamArray.h"
22 #include "llvm/Support/Endian.h"
29 class BinaryStreamReader;
33 using support::little32_t;
34 using support::ulittle16_t;
35 using support::ulittle32_t;
37 typedef CVRecord<TypeLeafKind> CVType;
38 typedef RemappedRecord<TypeLeafKind> RemappedType;
40 struct CVMemberRecord {
42 ArrayRef<uint8_t> Data;
44 typedef VarStreamArray<CVType> CVTypeArray;
45 typedef iterator_range<CVTypeArray::Iterator> CVTypeRange;
47 /// Equvalent to CV_fldattr_t in cvinfo.h.
48 struct MemberAttributes {
53 MemberAttributes() = default;
55 explicit MemberAttributes(MemberAccess Access)
56 : Attrs(static_cast<uint16_t>(Access)) {}
58 MemberAttributes(MemberAccess Access, MethodKind Kind, MethodOptions Flags) {
59 Attrs = static_cast<uint16_t>(Access);
60 Attrs |= (static_cast<uint16_t>(Kind) << MethodKindShift);
61 Attrs |= static_cast<uint16_t>(Flags);
64 /// Get the access specifier. Valid for any kind of member.
65 MemberAccess getAccess() const {
66 return MemberAccess(unsigned(Attrs) & unsigned(MethodOptions::AccessMask));
69 /// Indicates if a method is defined with friend, virtual, static, etc.
70 MethodKind getMethodKind() const {
72 (unsigned(Attrs) & unsigned(MethodOptions::MethodKindMask)) >>
76 /// Get the flags that are not included in access control or method
78 MethodOptions getFlags() const {
81 ~unsigned(MethodOptions::AccessMask | MethodOptions::MethodKindMask));
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;
91 /// Does this member introduce a new virtual method.
92 bool isIntroducedVirtual() const {
93 auto MP = getMethodKind();
94 return MP == MethodKind::IntroducingVirtual ||
95 MP == MethodKind::PureIntroducingVirtual;
99 // Does not correspond to any tag, this is the tail of an LF_POINTER record
100 // if it represents a member pointer.
101 class MemberPointerInfo {
103 MemberPointerInfo() = default;
105 MemberPointerInfo(TypeIndex ContainingType,
106 PointerToMemberRepresentation Representation)
107 : ContainingType(ContainingType), Representation(Representation) {}
109 TypeIndex getContainingType() const { return ContainingType; }
110 PointerToMemberRepresentation getRepresentation() const {
111 return Representation;
114 TypeIndex ContainingType;
115 PointerToMemberRepresentation Representation;
120 TypeRecord() = default;
121 explicit TypeRecord(TypeRecordKind Kind) : Kind(Kind) {}
124 TypeRecordKind getKind() const { return Kind; }
131 class ModifierRecord : public TypeRecord {
133 explicit ModifierRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
134 ModifierRecord(TypeIndex ModifiedType, ModifierOptions Modifiers)
135 : TypeRecord(TypeRecordKind::Modifier), ModifiedType(ModifiedType),
136 Modifiers(Modifiers) {}
138 TypeIndex getModifiedType() const { return ModifiedType; }
139 ModifierOptions getModifiers() const { return Modifiers; }
141 TypeIndex ModifiedType;
142 ModifierOptions Modifiers;
146 class ProcedureRecord : public TypeRecord {
148 explicit ProcedureRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
149 ProcedureRecord(TypeIndex ReturnType, CallingConvention CallConv,
150 FunctionOptions Options, uint16_t ParameterCount,
151 TypeIndex ArgumentList)
152 : TypeRecord(TypeRecordKind::Procedure), ReturnType(ReturnType),
153 CallConv(CallConv), Options(Options), ParameterCount(ParameterCount),
154 ArgumentList(ArgumentList) {}
156 TypeIndex getReturnType() const { return ReturnType; }
157 CallingConvention getCallConv() const { return CallConv; }
158 FunctionOptions getOptions() const { return Options; }
159 uint16_t getParameterCount() const { return ParameterCount; }
160 TypeIndex getArgumentList() const { return ArgumentList; }
162 TypeIndex ReturnType;
163 CallingConvention CallConv;
164 FunctionOptions Options;
165 uint16_t ParameterCount;
166 TypeIndex ArgumentList;
170 class MemberFunctionRecord : public TypeRecord {
172 explicit MemberFunctionRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
174 MemberFunctionRecord(TypeIndex ReturnType, TypeIndex ClassType,
175 TypeIndex ThisType, CallingConvention CallConv,
176 FunctionOptions Options, uint16_t ParameterCount,
177 TypeIndex ArgumentList, int32_t ThisPointerAdjustment)
178 : TypeRecord(TypeRecordKind::MemberFunction), ReturnType(ReturnType),
179 ClassType(ClassType), ThisType(ThisType), CallConv(CallConv),
180 Options(Options), ParameterCount(ParameterCount),
181 ArgumentList(ArgumentList),
182 ThisPointerAdjustment(ThisPointerAdjustment) {}
184 TypeIndex getReturnType() const { return ReturnType; }
185 TypeIndex getClassType() const { return ClassType; }
186 TypeIndex getThisType() const { return ThisType; }
187 CallingConvention getCallConv() const { return CallConv; }
188 FunctionOptions getOptions() const { return Options; }
189 uint16_t getParameterCount() const { return ParameterCount; }
190 TypeIndex getArgumentList() const { return ArgumentList; }
191 int32_t getThisPointerAdjustment() const { return ThisPointerAdjustment; }
193 TypeIndex ReturnType;
196 CallingConvention CallConv;
197 FunctionOptions Options;
198 uint16_t ParameterCount;
199 TypeIndex ArgumentList;
200 int32_t ThisPointerAdjustment;
204 class LabelRecord : public TypeRecord {
206 explicit LabelRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
208 LabelRecord(LabelType Mode) : TypeRecord(TypeRecordKind::Label), Mode(Mode) {}
214 class MemberFuncIdRecord : public TypeRecord {
216 explicit MemberFuncIdRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
217 MemberFuncIdRecord(TypeIndex ClassType, TypeIndex FunctionType,
219 : TypeRecord(TypeRecordKind::MemberFuncId), ClassType(ClassType),
220 FunctionType(FunctionType), Name(Name) {}
222 TypeIndex getClassType() const { return ClassType; }
223 TypeIndex getFunctionType() const { return FunctionType; }
224 StringRef getName() const { return Name; }
226 TypeIndex FunctionType;
231 class ArgListRecord : public TypeRecord {
233 explicit ArgListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
235 ArgListRecord(TypeRecordKind Kind, ArrayRef<TypeIndex> Indices)
236 : TypeRecord(Kind), ArgIndices(Indices) {}
238 ArrayRef<TypeIndex> getIndices() const { return ArgIndices; }
240 std::vector<TypeIndex> ArgIndices;
244 class StringListRecord : public TypeRecord {
246 explicit StringListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
248 StringListRecord(TypeRecordKind Kind, ArrayRef<TypeIndex> Indices)
249 : TypeRecord(Kind), StringIndices(Indices) {}
251 ArrayRef<TypeIndex> getIndices() const { return StringIndices; }
253 std::vector<TypeIndex> StringIndices;
257 class PointerRecord : public TypeRecord {
259 static const uint32_t PointerKindShift = 0;
260 static const uint32_t PointerKindMask = 0x1F;
262 static const uint32_t PointerModeShift = 5;
263 static const uint32_t PointerModeMask = 0x07;
265 static const uint32_t PointerOptionMask = 0xFF;
267 static const uint32_t PointerSizeShift = 13;
268 static const uint32_t PointerSizeMask = 0xFF;
270 explicit PointerRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
272 PointerRecord(TypeIndex ReferentType, uint32_t Attrs)
273 : TypeRecord(TypeRecordKind::Pointer), ReferentType(ReferentType),
276 PointerRecord(TypeIndex ReferentType, PointerKind PK, PointerMode PM,
277 PointerOptions PO, uint8_t Size)
278 : TypeRecord(TypeRecordKind::Pointer), ReferentType(ReferentType),
279 Attrs(calcAttrs(PK, PM, PO, Size)) {}
281 PointerRecord(TypeIndex ReferentType, PointerKind PK, PointerMode PM,
282 PointerOptions PO, uint8_t Size, const MemberPointerInfo &MPI)
283 : TypeRecord(TypeRecordKind::Pointer), ReferentType(ReferentType),
284 Attrs(calcAttrs(PK, PM, PO, Size)), MemberInfo(MPI) {}
286 TypeIndex getReferentType() const { return ReferentType; }
288 PointerKind getPointerKind() const {
289 return static_cast<PointerKind>((Attrs >> PointerKindShift) &
293 PointerMode getMode() const {
294 return static_cast<PointerMode>((Attrs >> PointerModeShift) &
298 PointerOptions getOptions() const {
299 return static_cast<PointerOptions>(Attrs);
302 uint8_t getSize() const {
303 return (Attrs >> PointerSizeShift) & PointerSizeMask;
306 MemberPointerInfo getMemberInfo() const { return *MemberInfo; }
308 bool isPointerToMember() const {
309 return getMode() == PointerMode::PointerToDataMember ||
310 getMode() == PointerMode::PointerToMemberFunction;
313 bool isFlat() const { return !!(Attrs & uint32_t(PointerOptions::Flat32)); }
314 bool isConst() const { return !!(Attrs & uint32_t(PointerOptions::Const)); }
316 bool isVolatile() const {
317 return !!(Attrs & uint32_t(PointerOptions::Volatile));
320 bool isUnaligned() const {
321 return !!(Attrs & uint32_t(PointerOptions::Unaligned));
324 TypeIndex ReferentType;
327 Optional<MemberPointerInfo> MemberInfo;
330 static uint32_t calcAttrs(PointerKind PK, PointerMode PM, PointerOptions PO,
333 A |= static_cast<uint32_t>(PK);
334 A |= static_cast<uint32_t>(PO);
335 A |= (static_cast<uint32_t>(PM) << PointerModeShift);
336 A |= (static_cast<uint32_t>(Size) << PointerSizeShift);
342 class NestedTypeRecord : public TypeRecord {
344 explicit NestedTypeRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
345 NestedTypeRecord(TypeIndex Type, StringRef Name)
346 : TypeRecord(TypeRecordKind::NestedType), Type(Type), Name(Name) {}
348 TypeIndex getNestedType() const { return Type; }
349 StringRef getName() const { return Name; }
356 class FieldListRecord : public TypeRecord {
358 explicit FieldListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
359 explicit FieldListRecord(ArrayRef<uint8_t> Data)
360 : TypeRecord(TypeRecordKind::FieldList), Data(Data) {}
362 ArrayRef<uint8_t> Data;
366 class ArrayRecord : public TypeRecord {
368 explicit ArrayRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
369 ArrayRecord(TypeIndex ElementType, TypeIndex IndexType, uint64_t Size,
371 : TypeRecord(TypeRecordKind::Array), ElementType(ElementType),
372 IndexType(IndexType), Size(Size), Name(Name) {}
374 TypeIndex getElementType() const { return ElementType; }
375 TypeIndex getIndexType() const { return IndexType; }
376 uint64_t getSize() const { return Size; }
377 StringRef getName() const { return Name; }
379 TypeIndex ElementType;
385 class TagRecord : public TypeRecord {
387 explicit TagRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
388 TagRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options,
389 TypeIndex FieldList, StringRef Name, StringRef UniqueName)
390 : TypeRecord(Kind), MemberCount(MemberCount), Options(Options),
391 FieldList(FieldList), Name(Name), UniqueName(UniqueName) {}
394 static const int HfaKindShift = 11;
395 static const int HfaKindMask = 0x1800;
396 static const int WinRTKindShift = 14;
397 static const int WinRTKindMask = 0xC000;
399 bool hasUniqueName() const {
400 return (Options & ClassOptions::HasUniqueName) != ClassOptions::None;
403 uint16_t getMemberCount() const { return MemberCount; }
404 ClassOptions getOptions() const { return Options; }
405 TypeIndex getFieldList() const { return FieldList; }
406 StringRef getName() const { return Name; }
407 StringRef getUniqueName() const { return UniqueName; }
409 uint16_t MemberCount;
410 ClassOptions Options;
413 StringRef UniqueName;
416 // LF_CLASS, LF_STRUCTURE, LF_INTERFACE
417 class ClassRecord : public TagRecord {
419 explicit ClassRecord(TypeRecordKind Kind) : TagRecord(Kind) {}
420 ClassRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options,
421 TypeIndex FieldList, TypeIndex DerivationList,
422 TypeIndex VTableShape, uint64_t Size, StringRef Name,
423 StringRef UniqueName)
424 : TagRecord(Kind, MemberCount, Options, FieldList, Name, UniqueName),
425 DerivationList(DerivationList), VTableShape(VTableShape), Size(Size) {}
427 HfaKind getHfa() const {
428 uint16_t Value = static_cast<uint16_t>(Options);
429 Value = (Value & HfaKindMask) >> HfaKindShift;
430 return static_cast<HfaKind>(Value);
433 WindowsRTClassKind getWinRTKind() const {
434 uint16_t Value = static_cast<uint16_t>(Options);
435 Value = (Value & WinRTKindMask) >> WinRTKindShift;
436 return static_cast<WindowsRTClassKind>(Value);
439 TypeIndex getDerivationList() const { return DerivationList; }
440 TypeIndex getVTableShape() const { return VTableShape; }
441 uint64_t getSize() const { return Size; }
443 TypeIndex DerivationList;
444 TypeIndex VTableShape;
449 struct UnionRecord : public TagRecord {
450 explicit UnionRecord(TypeRecordKind Kind) : TagRecord(Kind) {}
451 UnionRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList,
452 uint64_t Size, StringRef Name, StringRef UniqueName)
453 : TagRecord(TypeRecordKind::Union, MemberCount, Options, FieldList, Name,
457 HfaKind getHfa() const {
458 uint16_t Value = static_cast<uint16_t>(Options);
459 Value = (Value & HfaKindMask) >> HfaKindShift;
460 return static_cast<HfaKind>(Value);
463 uint64_t getSize() const { return Size; }
469 class EnumRecord : public TagRecord {
471 explicit EnumRecord(TypeRecordKind Kind) : TagRecord(Kind) {}
472 EnumRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList,
473 StringRef Name, StringRef UniqueName, TypeIndex UnderlyingType)
474 : TagRecord(TypeRecordKind::Enum, MemberCount, Options, FieldList, Name,
476 UnderlyingType(UnderlyingType) {}
478 TypeIndex getUnderlyingType() const { return UnderlyingType; }
479 TypeIndex UnderlyingType;
483 class BitFieldRecord : public TypeRecord {
485 explicit BitFieldRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
486 BitFieldRecord(TypeIndex Type, uint8_t BitSize, uint8_t BitOffset)
487 : TypeRecord(TypeRecordKind::BitField), Type(Type), BitSize(BitSize),
488 BitOffset(BitOffset) {}
490 TypeIndex getType() const { return Type; }
491 uint8_t getBitOffset() const { return BitOffset; }
492 uint8_t getBitSize() const { return BitSize; }
499 class VFTableShapeRecord : public TypeRecord {
501 explicit VFTableShapeRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
502 explicit VFTableShapeRecord(ArrayRef<VFTableSlotKind> Slots)
503 : TypeRecord(TypeRecordKind::VFTableShape), SlotsRef(Slots) {}
504 explicit VFTableShapeRecord(std::vector<VFTableSlotKind> Slots)
505 : TypeRecord(TypeRecordKind::VFTableShape), Slots(std::move(Slots)) {}
507 ArrayRef<VFTableSlotKind> getSlots() const {
508 if (!SlotsRef.empty())
513 uint32_t getEntryCount() const { return getSlots().size(); }
514 ArrayRef<VFTableSlotKind> SlotsRef;
515 std::vector<VFTableSlotKind> Slots;
519 class TypeServer2Record : public TypeRecord {
521 explicit TypeServer2Record(TypeRecordKind Kind) : TypeRecord(Kind) {}
522 TypeServer2Record(StringRef Guid, uint32_t Age, StringRef Name)
523 : TypeRecord(TypeRecordKind::TypeServer2), Guid(Guid), Age(Age),
526 StringRef getGuid() const { return Guid; }
528 uint32_t getAge() const { return Age; }
530 StringRef getName() const { return Name; }
538 class StringIdRecord : public TypeRecord {
540 explicit StringIdRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
541 StringIdRecord(TypeIndex Id, StringRef String)
542 : TypeRecord(TypeRecordKind::StringId), Id(Id), String(String) {}
544 TypeIndex getId() const { return Id; }
546 StringRef getString() const { return String; }
552 class FuncIdRecord : public TypeRecord {
554 explicit FuncIdRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
555 FuncIdRecord(TypeIndex ParentScope, TypeIndex FunctionType, StringRef Name)
556 : TypeRecord(TypeRecordKind::FuncId), ParentScope(ParentScope),
557 FunctionType(FunctionType), Name(Name) {}
559 TypeIndex getParentScope() const { return ParentScope; }
561 TypeIndex getFunctionType() const { return FunctionType; }
563 StringRef getName() const { return Name; }
565 TypeIndex ParentScope;
566 TypeIndex FunctionType;
571 class UdtSourceLineRecord : public TypeRecord {
573 explicit UdtSourceLineRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
574 UdtSourceLineRecord(TypeIndex UDT, TypeIndex SourceFile, uint32_t LineNumber)
575 : TypeRecord(TypeRecordKind::UdtSourceLine), UDT(UDT),
576 SourceFile(SourceFile), LineNumber(LineNumber) {}
578 TypeIndex getUDT() const { return UDT; }
579 TypeIndex getSourceFile() const { return SourceFile; }
580 uint32_t getLineNumber() const { return LineNumber; }
583 TypeIndex SourceFile;
587 // LF_UDT_MOD_SRC_LINE
588 class UdtModSourceLineRecord : public TypeRecord {
590 explicit UdtModSourceLineRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
591 UdtModSourceLineRecord(TypeIndex UDT, TypeIndex SourceFile,
592 uint32_t LineNumber, uint16_t Module)
593 : TypeRecord(TypeRecordKind::UdtSourceLine), UDT(UDT),
594 SourceFile(SourceFile), LineNumber(LineNumber), Module(Module) {}
596 TypeIndex getUDT() const { return UDT; }
597 TypeIndex getSourceFile() const { return SourceFile; }
598 uint32_t getLineNumber() const { return LineNumber; }
599 uint16_t getModule() const { return Module; }
602 TypeIndex SourceFile;
608 class BuildInfoRecord : public TypeRecord {
610 explicit BuildInfoRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
611 BuildInfoRecord(ArrayRef<TypeIndex> ArgIndices)
612 : TypeRecord(TypeRecordKind::BuildInfo),
613 ArgIndices(ArgIndices.begin(), ArgIndices.end()) {}
615 ArrayRef<TypeIndex> getArgs() const { return ArgIndices; }
616 SmallVector<TypeIndex, 4> ArgIndices;
620 class VFTableRecord : public TypeRecord {
622 explicit VFTableRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
623 VFTableRecord(TypeIndex CompleteClass, TypeIndex OverriddenVFTable,
624 uint32_t VFPtrOffset, StringRef Name,
625 ArrayRef<StringRef> Methods)
626 : TypeRecord(TypeRecordKind::VFTable), CompleteClass(CompleteClass),
627 OverriddenVFTable(OverriddenVFTable), VFPtrOffset(VFPtrOffset) {
628 MethodNames.push_back(Name);
629 MethodNames.insert(MethodNames.end(), Methods.begin(), Methods.end());
632 TypeIndex getCompleteClass() const { return CompleteClass; }
633 TypeIndex getOverriddenVTable() const { return OverriddenVFTable; }
634 uint32_t getVFPtrOffset() const { return VFPtrOffset; }
635 StringRef getName() const { return makeArrayRef(MethodNames).front(); }
636 ArrayRef<StringRef> getMethodNames() const {
637 return makeArrayRef(MethodNames).drop_front();
640 TypeIndex CompleteClass;
641 TypeIndex OverriddenVFTable;
642 uint32_t VFPtrOffset;
643 std::vector<StringRef> MethodNames;
647 class OneMethodRecord : public TypeRecord {
649 OneMethodRecord() : TypeRecord(TypeRecordKind::OneMethod) {}
650 explicit OneMethodRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
651 OneMethodRecord(TypeIndex Type, MemberAttributes Attrs, int32_t VFTableOffset,
653 : TypeRecord(TypeRecordKind::OneMethod), Type(Type), Attrs(Attrs),
654 VFTableOffset(VFTableOffset), Name(Name) {}
655 OneMethodRecord(TypeIndex Type, MemberAccess Access, MethodKind MK,
656 MethodOptions Options, int32_t VFTableOffset, StringRef Name)
657 : TypeRecord(TypeRecordKind::OneMethod), Type(Type),
658 Attrs(Access, MK, Options), VFTableOffset(VFTableOffset), Name(Name) {}
660 TypeIndex getType() const { return Type; }
661 MethodKind getMethodKind() const { return Attrs.getMethodKind(); }
662 MethodOptions getOptions() const { return Attrs.getFlags(); }
663 MemberAccess getAccess() const { return Attrs.getAccess(); }
664 int32_t getVFTableOffset() const { return VFTableOffset; }
665 StringRef getName() const { return Name; }
667 bool isIntroducingVirtual() const {
668 return getMethodKind() == MethodKind::IntroducingVirtual ||
669 getMethodKind() == MethodKind::PureIntroducingVirtual;
673 MemberAttributes Attrs;
674 int32_t VFTableOffset;
679 class MethodOverloadListRecord : public TypeRecord {
681 explicit MethodOverloadListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
682 MethodOverloadListRecord(ArrayRef<OneMethodRecord> Methods)
683 : TypeRecord(TypeRecordKind::MethodOverloadList), Methods(Methods) {}
685 ArrayRef<OneMethodRecord> getMethods() const { return Methods; }
686 std::vector<OneMethodRecord> Methods;
689 /// For method overload sets. LF_METHOD
690 class OverloadedMethodRecord : public TypeRecord {
692 explicit OverloadedMethodRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
693 OverloadedMethodRecord(uint16_t NumOverloads, TypeIndex MethodList,
695 : TypeRecord(TypeRecordKind::OverloadedMethod),
696 NumOverloads(NumOverloads), MethodList(MethodList), Name(Name) {}
698 uint16_t getNumOverloads() const { return NumOverloads; }
699 TypeIndex getMethodList() const { return MethodList; }
700 StringRef getName() const { return Name; }
701 uint16_t NumOverloads;
702 TypeIndex MethodList;
707 class DataMemberRecord : public TypeRecord {
709 explicit DataMemberRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
710 DataMemberRecord(MemberAttributes Attrs, TypeIndex Type, uint64_t Offset,
712 : TypeRecord(TypeRecordKind::DataMember), Attrs(Attrs), Type(Type),
713 FieldOffset(Offset), Name(Name) {}
714 DataMemberRecord(MemberAccess Access, TypeIndex Type, uint64_t Offset,
716 : TypeRecord(TypeRecordKind::DataMember), Attrs(Access), Type(Type),
717 FieldOffset(Offset), Name(Name) {}
719 MemberAccess getAccess() const { return Attrs.getAccess(); }
720 TypeIndex getType() const { return Type; }
721 uint64_t getFieldOffset() const { return FieldOffset; }
722 StringRef getName() const { return Name; }
724 MemberAttributes Attrs;
726 uint64_t FieldOffset;
731 class StaticDataMemberRecord : public TypeRecord {
733 explicit StaticDataMemberRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
734 StaticDataMemberRecord(MemberAttributes Attrs, TypeIndex Type, StringRef Name)
735 : TypeRecord(TypeRecordKind::StaticDataMember), Attrs(Attrs), Type(Type),
737 StaticDataMemberRecord(MemberAccess Access, TypeIndex Type, StringRef Name)
738 : TypeRecord(TypeRecordKind::StaticDataMember), Attrs(Access), Type(Type),
741 MemberAccess getAccess() const { return Attrs.getAccess(); }
742 TypeIndex getType() const { return Type; }
743 StringRef getName() const { return Name; }
745 MemberAttributes Attrs;
751 class EnumeratorRecord : public TypeRecord {
753 explicit EnumeratorRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
754 EnumeratorRecord(MemberAttributes Attrs, APSInt Value, StringRef Name)
755 : TypeRecord(TypeRecordKind::Enumerator), Attrs(Attrs),
756 Value(std::move(Value)), Name(Name) {}
757 EnumeratorRecord(MemberAccess Access, APSInt Value, StringRef Name)
758 : TypeRecord(TypeRecordKind::Enumerator), Attrs(Access),
759 Value(std::move(Value)), Name(Name) {}
761 MemberAccess getAccess() const { return Attrs.getAccess(); }
762 APSInt getValue() const { return Value; }
763 StringRef getName() const { return Name; }
765 MemberAttributes Attrs;
771 class VFPtrRecord : public TypeRecord {
773 explicit VFPtrRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
774 VFPtrRecord(TypeIndex Type)
775 : TypeRecord(TypeRecordKind::VFPtr), Type(Type) {}
777 TypeIndex getType() const { return Type; }
782 // LF_BCLASS, LF_BINTERFACE
783 class BaseClassRecord : public TypeRecord {
785 explicit BaseClassRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
786 BaseClassRecord(MemberAttributes Attrs, TypeIndex Type, uint64_t Offset)
787 : TypeRecord(TypeRecordKind::BaseClass), Attrs(Attrs), Type(Type),
789 BaseClassRecord(MemberAccess Access, TypeIndex Type, uint64_t Offset)
790 : TypeRecord(TypeRecordKind::BaseClass), Attrs(Access), Type(Type),
793 MemberAccess getAccess() const { return Attrs.getAccess(); }
794 TypeIndex getBaseType() const { return Type; }
795 uint64_t getBaseOffset() const { return Offset; }
797 MemberAttributes Attrs;
802 // LF_VBCLASS, LF_IVBCLASS
803 class VirtualBaseClassRecord : public TypeRecord {
805 explicit VirtualBaseClassRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
806 VirtualBaseClassRecord(TypeRecordKind Kind, MemberAttributes Attrs,
807 TypeIndex BaseType, TypeIndex VBPtrType,
808 uint64_t Offset, uint64_t Index)
809 : TypeRecord(Kind), Attrs(Attrs), BaseType(BaseType),
810 VBPtrType(VBPtrType), VBPtrOffset(Offset), VTableIndex(Index) {}
811 VirtualBaseClassRecord(TypeRecordKind Kind, MemberAccess Access,
812 TypeIndex BaseType, TypeIndex VBPtrType,
813 uint64_t Offset, uint64_t Index)
814 : TypeRecord(Kind), Attrs(Access), BaseType(BaseType),
815 VBPtrType(VBPtrType), VBPtrOffset(Offset), VTableIndex(Index) {}
817 MemberAccess getAccess() const { return Attrs.getAccess(); }
818 TypeIndex getBaseType() const { return BaseType; }
819 TypeIndex getVBPtrType() const { return VBPtrType; }
820 uint64_t getVBPtrOffset() const { return VBPtrOffset; }
821 uint64_t getVTableIndex() const { return VTableIndex; }
823 MemberAttributes Attrs;
826 uint64_t VBPtrOffset;
827 uint64_t VTableIndex;
830 /// LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST records
831 /// together. The first will end in an LF_INDEX record that points to the next.
832 class ListContinuationRecord : public TypeRecord {
834 explicit ListContinuationRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
835 ListContinuationRecord(TypeIndex ContinuationIndex)
836 : TypeRecord(TypeRecordKind::ListContinuation),
837 ContinuationIndex(ContinuationIndex) {}
839 TypeIndex getContinuationIndex() const { return ContinuationIndex; }
841 TypeIndex ContinuationIndex;
844 } // end namespace codeview
846 } // end namespace llvm
848 #endif // LLVM_DEBUGINFO_CODEVIEW_TYPERECORD_H