FieldListRecordBuilder.cpp revision 292915
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
12using namespace llvm;
13using namespace codeview;
14
15FieldListRecordBuilder::FieldListRecordBuilder()
16    : ListRecordBuilder(TypeRecordKind::FieldList) {}
17
18void 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
30void 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
42void 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
55void 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
67void 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
96void FieldListRecordBuilder::writeOneMethod(const MethodInfo &Method,
97                                            StringRef Name) {
98  writeOneMethod(Method.getAccess(), Method.getKind(), Method.getOptions(),
99                 Method.getType(), Method.getVTableSlotOffset(), Name);
100}
101
102void 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
113void 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
125void 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
133void 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
141void 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
157void 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}