blob: ac2ef3972b60e72ffd15e7949f09cb15d4db9523 [file] [log] [blame]
//===-- FieldListRecordBuilder.cpp ----------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/CodeView/FieldListRecordBuilder.h"
using namespace llvm;
using namespace codeview;
FieldListRecordBuilder::FieldListRecordBuilder()
: ListRecordBuilder(TypeRecordKind::FieldList) {}
void FieldListRecordBuilder::writeMemberType(const BaseClassRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(TypeRecordKind::BaseClass);
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
Builder.writeTypeIndex(Record.getBaseType());
Builder.writeEncodedUnsignedInteger(Record.getBaseOffset());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(const EnumeratorRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(TypeRecordKind::Enumerator);
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
// FIXME: Handle full APInt such as __int128.
Builder.writeEncodedUnsignedInteger(Record.getValue().getZExtValue());
Builder.writeNullTerminatedString(Record.getName());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(const DataMemberRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(Record.getKind());
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
Builder.writeTypeIndex(Record.getType());
Builder.writeEncodedUnsignedInteger(Record.getFieldOffset());
Builder.writeNullTerminatedString(Record.getName());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(
const OverloadedMethodRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(TypeRecordKind::OverloadedMethod);
Builder.writeUInt16(Record.getNumOverloads());
Builder.writeTypeIndex(Record.getMethodList());
Builder.writeNullTerminatedString(Record.getName());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(const OneMethodRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
uint16_t Flags = static_cast<uint16_t>(Record.getAccess());
Flags |= static_cast<uint16_t>(Record.getKind()) << MethodKindShift;
Flags |= static_cast<uint16_t>(Record.getOptions());
Builder.writeTypeRecordKind(TypeRecordKind::OneMethod);
Builder.writeUInt16(Flags);
Builder.writeTypeIndex(Record.getType());
if (Record.isIntroducingVirtual()) {
assert(Record.getVFTableOffset() >= 0);
Builder.writeInt32(Record.getVFTableOffset());
} else {
assert(Record.getVFTableOffset() == -1);
}
Builder.writeNullTerminatedString(Record.getName());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(const NestedTypeRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(Record.getKind());
Builder.writeUInt16(0);
Builder.writeTypeIndex(Record.getNestedType());
Builder.writeNullTerminatedString(Record.getName());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(
const StaticDataMemberRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(Record.getKind());
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
Builder.writeTypeIndex(Record.getType());
Builder.writeNullTerminatedString(Record.getName());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(
const VirtualBaseClassRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(Record.getKind());
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
Builder.writeTypeIndex(Record.getBaseType());
Builder.writeTypeIndex(Record.getVBPtrType());
Builder.writeEncodedInteger(Record.getVBPtrOffset());
Builder.writeEncodedUnsignedInteger(Record.getVTableIndex());
finishSubRecord();
}
void FieldListRecordBuilder::writeMemberType(const VFPtrRecord &Record) {
TypeRecordBuilder &Builder = getBuilder();
Builder.writeTypeRecordKind(TypeRecordKind::VFPtr);
Builder.writeUInt16(0);
Builder.writeTypeIndex(Record.getType());
finishSubRecord();
}