1 //===-- FieldListRecordBuilder.cpp ----------------------------------------===//
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 #include "llvm/DebugInfo/CodeView/FieldListRecordBuilder.h"
13 using namespace codeview;
15 FieldListRecordBuilder::FieldListRecordBuilder()
16 : ListRecordBuilder(TypeRecordKind::FieldList) {}
18 void FieldListRecordBuilder::writeBaseClass(MemberAccess Access, TypeIndex Type,
20 TypeRecordBuilder &Builder = getBuilder();
22 Builder.writeTypeRecordKind(TypeRecordKind::BaseClass);
23 Builder.writeUInt16(static_cast<uint16_t>(Access));
24 Builder.writeTypeIndex(Type);
25 Builder.writeEncodedUnsignedInteger(Offset);
30 void FieldListRecordBuilder::writeEnumerate(MemberAccess Access, uint64_t Value,
32 TypeRecordBuilder &Builder = getBuilder();
34 Builder.writeTypeRecordKind(TypeRecordKind::Enumerate);
35 Builder.writeUInt16(static_cast<uint16_t>(Access));
36 Builder.writeEncodedUnsignedInteger(Value);
37 Builder.writeNullTerminatedString(Name);
42 void FieldListRecordBuilder::writeMember(MemberAccess Access, TypeIndex Type,
43 uint64_t Offset, StringRef Name) {
44 TypeRecordBuilder &Builder = getBuilder();
46 Builder.writeTypeRecordKind(TypeRecordKind::Member);
47 Builder.writeUInt16(static_cast<uint16_t>(Access));
48 Builder.writeTypeIndex(Type);
49 Builder.writeEncodedUnsignedInteger(Offset);
50 Builder.writeNullTerminatedString(Name);
55 void FieldListRecordBuilder::writeMethod(uint16_t OverloadCount,
56 TypeIndex MethodList, StringRef Name) {
57 TypeRecordBuilder &Builder = getBuilder();
59 Builder.writeTypeRecordKind(TypeRecordKind::Method);
60 Builder.writeUInt16(OverloadCount);
61 Builder.writeTypeIndex(MethodList);
62 Builder.writeNullTerminatedString(Name);
67 void FieldListRecordBuilder::writeOneMethod(
68 MemberAccess Access, MethodKind Kind, MethodOptions Options, TypeIndex Type,
69 int32_t VTableSlotOffset, StringRef Name) {
70 TypeRecordBuilder &Builder = getBuilder();
72 uint16_t Flags = static_cast<uint16_t>(Access);
73 Flags |= static_cast<uint16_t>(Kind) << MethodKindShift;
74 Flags |= static_cast<uint16_t>(Options);
76 Builder.writeTypeRecordKind(TypeRecordKind::OneMethod);
77 Builder.writeUInt16(Flags);
78 Builder.writeTypeIndex(Type);
80 case MethodKind::IntroducingVirtual:
81 case MethodKind::PureIntroducingVirtual:
82 assert(VTableSlotOffset >= 0);
83 Builder.writeInt32(VTableSlotOffset);
87 assert(VTableSlotOffset == -1);
91 Builder.writeNullTerminatedString(Name);
96 void FieldListRecordBuilder::writeOneMethod(const MethodInfo &Method,
98 writeOneMethod(Method.getAccess(), Method.getKind(), Method.getOptions(),
99 Method.getType(), Method.getVTableSlotOffset(), Name);
102 void FieldListRecordBuilder::writeNestedType(TypeIndex Type, StringRef Name) {
103 TypeRecordBuilder &Builder = getBuilder();
105 Builder.writeTypeRecordKind(TypeRecordKind::NestedType);
106 Builder.writeUInt16(0);
107 Builder.writeTypeIndex(Type);
108 Builder.writeNullTerminatedString(Name);
113 void FieldListRecordBuilder::writeStaticMember(MemberAccess Access,
114 TypeIndex Type, StringRef Name) {
115 TypeRecordBuilder &Builder = getBuilder();
117 Builder.writeTypeRecordKind(TypeRecordKind::StaticMember);
118 Builder.writeUInt16(static_cast<uint16_t>(Access));
119 Builder.writeTypeIndex(Type);
120 Builder.writeNullTerminatedString(Name);
125 void FieldListRecordBuilder::writeIndirectVirtualBaseClass(
126 MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
127 int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
128 writeVirtualBaseClass(TypeRecordKind::IndirectVirtualBaseClass, Access, Type,
129 VirtualBasePointerType, VirtualBasePointerOffset,
133 void FieldListRecordBuilder::writeVirtualBaseClass(
134 MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
135 int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
136 writeVirtualBaseClass(TypeRecordKind::VirtualBaseClass, Access, Type,
137 VirtualBasePointerType, VirtualBasePointerOffset,
141 void FieldListRecordBuilder::writeVirtualBaseClass(
142 TypeRecordKind Kind, MemberAccess Access, TypeIndex Type,
143 TypeIndex VirtualBasePointerType, int64_t VirtualBasePointerOffset,
144 uint64_t SlotIndex) {
145 TypeRecordBuilder &Builder = getBuilder();
147 Builder.writeTypeRecordKind(Kind);
148 Builder.writeUInt16(static_cast<uint16_t>(Access));
149 Builder.writeTypeIndex(Type);
150 Builder.writeTypeIndex(VirtualBasePointerType);
151 Builder.writeEncodedInteger(VirtualBasePointerOffset);
152 Builder.writeEncodedUnsignedInteger(SlotIndex);
157 void FieldListRecordBuilder::writeVirtualFunctionTablePointer(TypeIndex Type) {
158 TypeRecordBuilder &Builder = getBuilder();
160 Builder.writeTypeRecordKind(TypeRecordKind::VirtualFunctionTablePointer);
161 Builder.writeUInt16(0);
162 Builder.writeTypeIndex(Type);