FieldListRecordBuilder.cpp revision 303975
1243791Sdim//===-- FieldListRecordBuilder.cpp ----------------------------------------===//
2243791Sdim//
3243791Sdim//                     The LLVM Compiler Infrastructure
4243791Sdim//
5243791Sdim// This file is distributed under the University of Illinois Open Source
6243791Sdim// License. See LICENSE.TXT for details.
7243791Sdim//
8243791Sdim//===----------------------------------------------------------------------===//
9243791Sdim
10243791Sdim#include "llvm/DebugInfo/CodeView/FieldListRecordBuilder.h"
11243791Sdim
12243791Sdimusing namespace llvm;
13243791Sdimusing namespace codeview;
14243791Sdim
15243791SdimFieldListRecordBuilder::FieldListRecordBuilder()
16243791Sdim    : ListRecordBuilder(TypeRecordKind::FieldList) {}
17243791Sdim
18243791Sdimvoid FieldListRecordBuilder::writeBaseClass(MemberAccess Access, TypeIndex Type,
19249423Sdim                                            uint64_t Offset) {
20243791Sdim  TypeRecordBuilder &Builder = getBuilder();
21243791Sdim
22243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::BaseClass);
23243791Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
24243791Sdim  Builder.writeTypeIndex(Type);
25243791Sdim  Builder.writeEncodedUnsignedInteger(Offset);
26243791Sdim
27243791Sdim  finishSubRecord();
28249423Sdim}
29243791Sdim
30243791Sdimvoid FieldListRecordBuilder::writeEnumerate(MemberAccess Access, uint64_t Value,
31243791Sdim                                            StringRef Name) {
32243791Sdim  TypeRecordBuilder &Builder = getBuilder();
33243791Sdim
34243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::Enumerate);
35243791Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
36243791Sdim  Builder.writeEncodedUnsignedInteger(Value);
37243791Sdim  Builder.writeNullTerminatedString(Name);
38243791Sdim
39243791Sdim  finishSubRecord();
40243791Sdim}
41243791Sdim
42243791Sdimvoid FieldListRecordBuilder::writeMember(MemberAccess Access, TypeIndex Type,
43243791Sdim                                         uint64_t Offset, StringRef Name) {
44243791Sdim  TypeRecordBuilder &Builder = getBuilder();
45243791Sdim
46243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::Member);
47243791Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
48243791Sdim  Builder.writeTypeIndex(Type);
49243791Sdim  Builder.writeEncodedUnsignedInteger(Offset);
50243791Sdim  Builder.writeNullTerminatedString(Name);
51243791Sdim
52243791Sdim  finishSubRecord();
53249423Sdim}
54243791Sdim
55243791Sdimvoid FieldListRecordBuilder::writeMethod(uint16_t OverloadCount,
56243791Sdim                                         TypeIndex MethodList, StringRef Name) {
57243791Sdim  TypeRecordBuilder &Builder = getBuilder();
58243791Sdim
59243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::Method);
60243791Sdim  Builder.writeUInt16(OverloadCount);
61243791Sdim  Builder.writeTypeIndex(MethodList);
62243791Sdim  Builder.writeNullTerminatedString(Name);
63243791Sdim
64243791Sdim  finishSubRecord();
65243791Sdim}
66243791Sdim
67243791Sdimvoid FieldListRecordBuilder::writeOneMethod(
68243791Sdim    MemberAccess Access, MethodKind Kind, MethodOptions Options, TypeIndex Type,
69243791Sdim    int32_t VTableSlotOffset, StringRef Name) {
70243791Sdim  TypeRecordBuilder &Builder = getBuilder();
71243791Sdim
72243791Sdim  uint16_t Flags = static_cast<uint16_t>(Access);
73243791Sdim  Flags |= static_cast<uint16_t>(Kind) << MethodKindShift;
74243791Sdim  Flags |= static_cast<uint16_t>(Options);
75243791Sdim
76243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::OneMethod);
77243791Sdim  Builder.writeUInt16(Flags);
78243791Sdim  Builder.writeTypeIndex(Type);
79243791Sdim  switch (Kind) {
80243791Sdim  case MethodKind::IntroducingVirtual:
81243791Sdim  case MethodKind::PureIntroducingVirtual:
82249423Sdim    assert(VTableSlotOffset >= 0);
83249423Sdim    Builder.writeInt32(VTableSlotOffset);
84249423Sdim    break;
85249423Sdim
86249423Sdim  default:
87243791Sdim    assert(VTableSlotOffset == -1);
88243791Sdim    break;
89243791Sdim  }
90243791Sdim
91243791Sdim  Builder.writeNullTerminatedString(Name);
92243791Sdim
93243791Sdim  finishSubRecord();
94243791Sdim}
95243791Sdim
96243791Sdimvoid FieldListRecordBuilder::writeOneMethod(const MethodInfo &Method,
97243791Sdim                                            StringRef Name) {
98243791Sdim  writeOneMethod(Method.getAccess(), Method.getKind(), Method.getOptions(),
99243791Sdim                 Method.getType(), Method.getVTableSlotOffset(), Name);
100243791Sdim}
101243791Sdim
102243791Sdimvoid FieldListRecordBuilder::writeNestedType(TypeIndex Type, StringRef Name) {
103243791Sdim  TypeRecordBuilder &Builder = getBuilder();
104243791Sdim
105243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::NestedType);
106243791Sdim  Builder.writeUInt16(0);
107243791Sdim  Builder.writeTypeIndex(Type);
108243791Sdim  Builder.writeNullTerminatedString(Name);
109243791Sdim
110243791Sdim  finishSubRecord();
111243791Sdim}
112243791Sdim
113243791Sdimvoid FieldListRecordBuilder::writeStaticMember(MemberAccess Access,
114243791Sdim                                               TypeIndex Type, StringRef Name) {
115243791Sdim  TypeRecordBuilder &Builder = getBuilder();
116243791Sdim
117243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::StaticMember);
118243791Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
119243791Sdim  Builder.writeTypeIndex(Type);
120243791Sdim  Builder.writeNullTerminatedString(Name);
121243791Sdim
122243791Sdim  finishSubRecord();
123243791Sdim}
124243791Sdim
125243791Sdimvoid FieldListRecordBuilder::writeIndirectVirtualBaseClass(
126243791Sdim    MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
127243791Sdim    int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
128243791Sdim  writeVirtualBaseClass(TypeRecordKind::IndirectVirtualBaseClass, Access, Type,
129243791Sdim                        VirtualBasePointerType, VirtualBasePointerOffset,
130243791Sdim                        SlotIndex);
131243791Sdim}
132243791Sdim
133243791Sdimvoid FieldListRecordBuilder::writeVirtualBaseClass(
134243791Sdim    MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
135243791Sdim    int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
136243791Sdim  writeVirtualBaseClass(TypeRecordKind::VirtualBaseClass, Access, Type,
137243791Sdim                        VirtualBasePointerType, VirtualBasePointerOffset,
138243791Sdim                        SlotIndex);
139243791Sdim}
140243791Sdim
141243791Sdimvoid FieldListRecordBuilder::writeVirtualBaseClass(
142243791Sdim    TypeRecordKind Kind, MemberAccess Access, TypeIndex Type,
143243791Sdim    TypeIndex VirtualBasePointerType, int64_t VirtualBasePointerOffset,
144243791Sdim    uint64_t SlotIndex) {
145243791Sdim  TypeRecordBuilder &Builder = getBuilder();
146243791Sdim
147243791Sdim  Builder.writeTypeRecordKind(Kind);
148243791Sdim  Builder.writeUInt16(static_cast<uint16_t>(Access));
149243791Sdim  Builder.writeTypeIndex(Type);
150243791Sdim  Builder.writeTypeIndex(VirtualBasePointerType);
151243791Sdim  Builder.writeEncodedInteger(VirtualBasePointerOffset);
152243791Sdim  Builder.writeEncodedUnsignedInteger(SlotIndex);
153243791Sdim
154243791Sdim  finishSubRecord();
155243791Sdim}
156243791Sdim
157243791Sdimvoid FieldListRecordBuilder::writeVirtualFunctionTablePointer(TypeIndex Type) {
158243791Sdim  TypeRecordBuilder &Builder = getBuilder();
159243791Sdim
160243791Sdim  Builder.writeTypeRecordKind(TypeRecordKind::VirtualFunctionTablePointer);
161243791Sdim  Builder.writeUInt16(0);
162243791Sdim  Builder.writeTypeIndex(Type);
163243791Sdim
164243791Sdim  finishSubRecord();
165243791Sdim}