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}