2015-12-30 06:46:15 -05:00
|
|
|
//===-- 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) {}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeBaseClass(const BaseClassRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::BaseClass);
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
|
|
|
|
|
Builder.writeTypeIndex(Record.getBaseType());
|
|
|
|
|
Builder.writeEncodedUnsignedInteger(Record.getBaseOffset());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeEnumerator(const EnumeratorRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
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());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeDataMember(const DataMemberRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeRecordKind(Record.getKind());
|
|
|
|
|
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
|
|
|
|
|
Builder.writeTypeIndex(Record.getType());
|
|
|
|
|
Builder.writeEncodedUnsignedInteger(Record.getFieldOffset());
|
|
|
|
|
Builder.writeNullTerminatedString(Record.getName());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeOverloadedMethod(
|
|
|
|
|
const OverloadedMethodRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::OverloadedMethod);
|
|
|
|
|
Builder.writeUInt16(Record.getNumOverloads());
|
|
|
|
|
Builder.writeTypeIndex(Record.getMethodList());
|
|
|
|
|
Builder.writeNullTerminatedString(Record.getName());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeOneMethod(const OneMethodRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
uint16_t Flags = static_cast<uint16_t>(Record.getAccess());
|
|
|
|
|
Flags |= static_cast<uint16_t>(Record.getKind()) << MethodKindShift;
|
|
|
|
|
Flags |= static_cast<uint16_t>(Record.getOptions());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::OneMethod);
|
|
|
|
|
Builder.writeUInt16(Flags);
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeIndex(Record.getType());
|
|
|
|
|
if (Record.isIntroducingVirtual()) {
|
|
|
|
|
assert(Record.getVFTableOffset() >= 0);
|
|
|
|
|
Builder.writeInt32(Record.getVFTableOffset());
|
|
|
|
|
} else {
|
|
|
|
|
assert(Record.getVFTableOffset() == -1);
|
2015-12-30 06:46:15 -05:00
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeNullTerminatedString(Record.getName());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeNestedType(const NestedTypeRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeRecordKind(Record.getKind());
|
2015-12-30 06:46:15 -05:00
|
|
|
Builder.writeUInt16(0);
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeIndex(Record.getNestedType());
|
|
|
|
|
Builder.writeNullTerminatedString(Record.getName());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeStaticDataMember(
|
|
|
|
|
const StaticDataMemberRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeRecordKind(Record.getKind());
|
|
|
|
|
Builder.writeUInt16(static_cast<uint16_t>(Record.getAccess()));
|
|
|
|
|
Builder.writeTypeIndex(Record.getType());
|
|
|
|
|
Builder.writeNullTerminatedString(Record.getName());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FieldListRecordBuilder::writeVirtualBaseClass(
|
2016-07-23 16:41:05 -04:00
|
|
|
const VirtualBaseClassRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
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());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
void FieldListRecordBuilder::writeVFPtr(const VFPtrRecord &Record) {
|
2015-12-30 06:46:15 -05:00
|
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
|
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::VFPtr);
|
2015-12-30 06:46:15 -05:00
|
|
|
Builder.writeUInt16(0);
|
2016-07-23 16:41:05 -04:00
|
|
|
Builder.writeTypeIndex(Record.getType());
|
2015-12-30 06:46:15 -05:00
|
|
|
|
|
|
|
|
finishSubRecord();
|
2016-07-23 16:41:05 -04:00
|
|
|
}
|