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}