1292915Sdim//===-- FieldListRecordBuilder.cpp ----------------------------------------===//
2292915Sdim//
3292915Sdim//                     The LLVM Compiler Infrastructure
4292915Sdim//
5292915Sdim// This file is distributed under the University of Illinois Open Source
6292915Sdim// License. See LICENSE.TXT for details.
7292915Sdim//
8292915Sdim//===----------------------------------------------------------------------===//
9292915Sdim
10292915Sdim#include "llvm/DebugInfo/CodeView/FieldListRecordBuilder.h"
11292915Sdim
12292915Sdimusing namespace llvm;
13292915Sdimusing namespace codeview;
14292915Sdim
15292915SdimFieldListRecordBuilder::FieldListRecordBuilder()
16292915Sdim    : ListRecordBuilder(TypeRecordKind::FieldList) {}
17292915Sdim
18292915Sdimvoid FieldListRecordBuilder::writeBaseClass(MemberAccess Access, TypeIndex Type,
19292915Sdim                                            uint64_t Offset) {
20292915Sdim  TypeRecordBuilder &Builder = getBuilder();
21292915Sdim
22292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::BaseClass);
23292915Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
24292915Sdim  Builder.writeTypeIndex(Type);
25292915Sdim  Builder.writeEncodedUnsignedInteger(Offset);
26292915Sdim
27292915Sdim  finishSubRecord();
28292915Sdim}
29292915Sdim
30292915Sdimvoid FieldListRecordBuilder::writeEnumerate(MemberAccess Access, uint64_t Value,
31292915Sdim                                            StringRef Name) {
32292915Sdim  TypeRecordBuilder &Builder = getBuilder();
33292915Sdim
34292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::Enumerate);
35292915Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
36292915Sdim  Builder.writeEncodedUnsignedInteger(Value);
37292915Sdim  Builder.writeNullTerminatedString(Name);
38292915Sdim
39292915Sdim  finishSubRecord();
40292915Sdim}
41292915Sdim
42292915Sdimvoid FieldListRecordBuilder::writeMember(MemberAccess Access, TypeIndex Type,
43292915Sdim                                         uint64_t Offset, StringRef Name) {
44292915Sdim  TypeRecordBuilder &Builder = getBuilder();
45292915Sdim
46292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::Member);
47292915Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
48292915Sdim  Builder.writeTypeIndex(Type);
49292915Sdim  Builder.writeEncodedUnsignedInteger(Offset);
50292915Sdim  Builder.writeNullTerminatedString(Name);
51292915Sdim
52292915Sdim  finishSubRecord();
53292915Sdim}
54292915Sdim
55292915Sdimvoid FieldListRecordBuilder::writeMethod(uint16_t OverloadCount,
56292915Sdim                                         TypeIndex MethodList, StringRef Name) {
57292915Sdim  TypeRecordBuilder &Builder = getBuilder();
58292915Sdim
59292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::Method);
60292915Sdim  Builder.writeUInt16(OverloadCount);
61292915Sdim  Builder.writeTypeIndex(MethodList);
62292915Sdim  Builder.writeNullTerminatedString(Name);
63292915Sdim
64292915Sdim  finishSubRecord();
65292915Sdim}
66292915Sdim
67292915Sdimvoid FieldListRecordBuilder::writeOneMethod(
68292915Sdim    MemberAccess Access, MethodKind Kind, MethodOptions Options, TypeIndex Type,
69292915Sdim    int32_t VTableSlotOffset, StringRef Name) {
70292915Sdim  TypeRecordBuilder &Builder = getBuilder();
71292915Sdim
72292915Sdim  uint16_t Flags = static_cast<uint16_t>(Access);
73292915Sdim  Flags |= static_cast<uint16_t>(Kind) << MethodKindShift;
74292915Sdim  Flags |= static_cast<uint16_t>(Options);
75292915Sdim
76292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::OneMethod);
77292915Sdim  Builder.writeUInt16(Flags);
78292915Sdim  Builder.writeTypeIndex(Type);
79292915Sdim  switch (Kind) {
80292915Sdim  case MethodKind::IntroducingVirtual:
81292915Sdim  case MethodKind::PureIntroducingVirtual:
82292915Sdim    assert(VTableSlotOffset >= 0);
83292915Sdim    Builder.writeInt32(VTableSlotOffset);
84292915Sdim    break;
85292915Sdim
86292915Sdim  default:
87292915Sdim    assert(VTableSlotOffset == -1);
88292915Sdim    break;
89292915Sdim  }
90292915Sdim
91292915Sdim  Builder.writeNullTerminatedString(Name);
92292915Sdim
93292915Sdim  finishSubRecord();
94292915Sdim}
95292915Sdim
96292915Sdimvoid FieldListRecordBuilder::writeOneMethod(const MethodInfo &Method,
97292915Sdim                                            StringRef Name) {
98292915Sdim  writeOneMethod(Method.getAccess(), Method.getKind(), Method.getOptions(),
99292915Sdim                 Method.getType(), Method.getVTableSlotOffset(), Name);
100292915Sdim}
101292915Sdim
102292915Sdimvoid FieldListRecordBuilder::writeNestedType(TypeIndex Type, StringRef Name) {
103292915Sdim  TypeRecordBuilder &Builder = getBuilder();
104292915Sdim
105292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::NestedType);
106292915Sdim  Builder.writeUInt16(0);
107292915Sdim  Builder.writeTypeIndex(Type);
108292915Sdim  Builder.writeNullTerminatedString(Name);
109292915Sdim
110292915Sdim  finishSubRecord();
111292915Sdim}
112292915Sdim
113292915Sdimvoid FieldListRecordBuilder::writeStaticMember(MemberAccess Access,
114292915Sdim                                               TypeIndex Type, StringRef Name) {
115292915Sdim  TypeRecordBuilder &Builder = getBuilder();
116292915Sdim
117292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::StaticMember);
118292915Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
119292915Sdim  Builder.writeTypeIndex(Type);
120292915Sdim  Builder.writeNullTerminatedString(Name);
121292915Sdim
122292915Sdim  finishSubRecord();
123292915Sdim}
124292915Sdim
125292915Sdimvoid FieldListRecordBuilder::writeIndirectVirtualBaseClass(
126292915Sdim    MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
127292915Sdim    int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
128292915Sdim  writeVirtualBaseClass(TypeRecordKind::IndirectVirtualBaseClass, Access, Type,
129292915Sdim                        VirtualBasePointerType, VirtualBasePointerOffset,
130292915Sdim                        SlotIndex);
131292915Sdim}
132292915Sdim
133292915Sdimvoid FieldListRecordBuilder::writeVirtualBaseClass(
134292915Sdim    MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
135292915Sdim    int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
136292915Sdim  writeVirtualBaseClass(TypeRecordKind::VirtualBaseClass, Access, Type,
137292915Sdim                        VirtualBasePointerType, VirtualBasePointerOffset,
138292915Sdim                        SlotIndex);
139292915Sdim}
140292915Sdim
141292915Sdimvoid FieldListRecordBuilder::writeVirtualBaseClass(
142292915Sdim    TypeRecordKind Kind, MemberAccess Access, TypeIndex Type,
143292915Sdim    TypeIndex VirtualBasePointerType, int64_t VirtualBasePointerOffset,
144292915Sdim    uint64_t SlotIndex) {
145292915Sdim  TypeRecordBuilder &Builder = getBuilder();
146292915Sdim
147292915Sdim  Builder.writeTypeRecordKind(Kind);
148292915Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
149292915Sdim  Builder.writeTypeIndex(Type);
150292915Sdim  Builder.writeTypeIndex(VirtualBasePointerType);
151292915Sdim  Builder.writeEncodedInteger(VirtualBasePointerOffset);
152292915Sdim  Builder.writeEncodedUnsignedInteger(SlotIndex);
153292915Sdim
154292915Sdim  finishSubRecord();
155292915Sdim}
156292915Sdim
157292915Sdimvoid FieldListRecordBuilder::writeVirtualFunctionTablePointer(TypeIndex Type) {
158292915Sdim  TypeRecordBuilder &Builder = getBuilder();
159292915Sdim
160292915Sdim  Builder.writeTypeRecordKind(TypeRecordKind::VirtualFunctionTablePointer);
161292915Sdim  Builder.writeUInt16(0);
162292915Sdim  Builder.writeTypeIndex(Type);
163292915Sdim
164292915Sdim  finishSubRecord();
165292915Sdim}