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}