LLVM CodeView library
[oota-llvm.git] / lib / DebugInfo / CodeView / FieldListRecordBuilder.cpp
1 //===-- FieldListRecordBuilder.cpp ----------------------------------------===//
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 #include "llvm/DebugInfo/CodeView/FieldListRecordBuilder.h"
11
12 using namespace llvm;
13 using namespace codeview;
14
15 FieldListRecordBuilder::FieldListRecordBuilder()
16     : ListRecordBuilder(TypeRecordKind::FieldList) {}
17
18 void FieldListRecordBuilder::writeBaseClass(MemberAccess Access, TypeIndex Type,
19                                             uint64_t Offset) {
20   TypeRecordBuilder &Builder = getBuilder();
21
22   Builder.writeTypeRecordKind(TypeRecordKind::BaseClass);
23   Builder.writeUInt16(static_cast<uint16_t>(Access));
24   Builder.writeTypeIndex(Type);
25   Builder.writeEncodedUnsignedInteger(Offset);
26
27   finishSubRecord();
28 }
29
30 void FieldListRecordBuilder::writeEnumerate(MemberAccess Access, uint64_t Value,
31                                             StringRef Name) {
32   TypeRecordBuilder &Builder = getBuilder();
33
34   Builder.writeTypeRecordKind(TypeRecordKind::Enumerate);
35   Builder.writeUInt16(static_cast<uint16_t>(Access));
36   Builder.writeEncodedUnsignedInteger(Value);
37   Builder.writeNullTerminatedString(Name);
38
39   finishSubRecord();
40 }
41
42 void FieldListRecordBuilder::writeMember(MemberAccess Access, TypeIndex Type,
43                                          uint64_t Offset, StringRef Name) {
44   TypeRecordBuilder &Builder = getBuilder();
45
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);
51
52   finishSubRecord();
53 }
54
55 void FieldListRecordBuilder::writeMethod(uint16_t OverloadCount,
56                                          TypeIndex MethodList, StringRef Name) {
57   TypeRecordBuilder &Builder = getBuilder();
58
59   Builder.writeTypeRecordKind(TypeRecordKind::Method);
60   Builder.writeUInt16(OverloadCount);
61   Builder.writeTypeIndex(MethodList);
62   Builder.writeNullTerminatedString(Name);
63
64   finishSubRecord();
65 }
66
67 void FieldListRecordBuilder::writeOneMethod(
68     MemberAccess Access, MethodKind Kind, MethodOptions Options, TypeIndex Type,
69     int32_t VTableSlotOffset, StringRef Name) {
70   TypeRecordBuilder &Builder = getBuilder();
71
72   uint16_t Flags = static_cast<uint16_t>(Access);
73   Flags |= static_cast<uint16_t>(Kind) << MethodKindShift;
74   Flags |= static_cast<uint16_t>(Options);
75
76   Builder.writeTypeRecordKind(TypeRecordKind::OneMethod);
77   Builder.writeUInt16(Flags);
78   Builder.writeTypeIndex(Type);
79   switch (Kind) {
80   case MethodKind::IntroducingVirtual:
81   case MethodKind::PureIntroducingVirtual:
82     assert(VTableSlotOffset >= 0);
83     Builder.writeInt32(VTableSlotOffset);
84     break;
85
86   default:
87     assert(VTableSlotOffset == -1);
88     break;
89   }
90
91   Builder.writeNullTerminatedString(Name);
92
93   finishSubRecord();
94 }
95
96 void FieldListRecordBuilder::writeOneMethod(const MethodInfo &Method,
97                                             StringRef Name) {
98   writeOneMethod(Method.getAccess(), Method.getKind(), Method.getOptions(),
99                  Method.getType(), Method.getVTableSlotOffset(), Name);
100 }
101
102 void FieldListRecordBuilder::writeNestedType(TypeIndex Type, StringRef Name) {
103   TypeRecordBuilder &Builder = getBuilder();
104
105   Builder.writeTypeRecordKind(TypeRecordKind::NestedType);
106   Builder.writeUInt16(0);
107   Builder.writeTypeIndex(Type);
108   Builder.writeNullTerminatedString(Name);
109
110   finishSubRecord();
111 }
112
113 void FieldListRecordBuilder::writeStaticMember(MemberAccess Access,
114                                                TypeIndex Type, StringRef Name) {
115   TypeRecordBuilder &Builder = getBuilder();
116
117   Builder.writeTypeRecordKind(TypeRecordKind::StaticMember);
118   Builder.writeUInt16(static_cast<uint16_t>(Access));
119   Builder.writeTypeIndex(Type);
120   Builder.writeNullTerminatedString(Name);
121
122   finishSubRecord();
123 }
124
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,
130                         SlotIndex);
131 }
132
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,
138                         SlotIndex);
139 }
140
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();
146
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);
153
154   finishSubRecord();
155 }
156
157 void FieldListRecordBuilder::writeVirtualFunctionTablePointer(TypeIndex Type) {
158   TypeRecordBuilder &Builder = getBuilder();
159
160   Builder.writeTypeRecordKind(TypeRecordKind::VirtualFunctionTablePointer);
161   Builder.writeUInt16(0);
162   Builder.writeTypeIndex(Type);
163
164   finishSubRecord();
165 }