mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-15 22:50:34 +00:00

Differential Revision: http://reviews.llvm.org/D20138 Reviewed By: rnk git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@269216 91177308-0d34-0410-b5e6-96231b3b80d8
165 lines
5.5 KiB
C++
165 lines
5.5 KiB
C++
//===-- 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::writeBaseClass(MemberAccess Access, TypeIndex Type,
|
|
uint64_t Offset) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::BaseClass);
|
|
Builder.writeUInt16(static_cast<uint16_t>(Access));
|
|
Builder.writeTypeIndex(Type);
|
|
Builder.writeEncodedUnsignedInteger(Offset);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeEnumerate(MemberAccess Access, uint64_t Value,
|
|
StringRef Name) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::Enumerate);
|
|
Builder.writeUInt16(static_cast<uint16_t>(Access));
|
|
Builder.writeEncodedUnsignedInteger(Value);
|
|
Builder.writeNullTerminatedString(Name);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeMember(MemberAccess Access, TypeIndex Type,
|
|
uint64_t Offset, StringRef Name) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::Member);
|
|
Builder.writeUInt16(static_cast<uint16_t>(Access));
|
|
Builder.writeTypeIndex(Type);
|
|
Builder.writeEncodedUnsignedInteger(Offset);
|
|
Builder.writeNullTerminatedString(Name);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeMethod(uint16_t OverloadCount,
|
|
TypeIndex MethodList, StringRef Name) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::OverloadedMethod);
|
|
Builder.writeUInt16(OverloadCount);
|
|
Builder.writeTypeIndex(MethodList);
|
|
Builder.writeNullTerminatedString(Name);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeOneMethod(
|
|
MemberAccess Access, MethodKind Kind, MethodOptions Options, TypeIndex Type,
|
|
int32_t VTableSlotOffset, StringRef Name) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
uint16_t Flags = static_cast<uint16_t>(Access);
|
|
Flags |= static_cast<uint16_t>(Kind) << MethodKindShift;
|
|
Flags |= static_cast<uint16_t>(Options);
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::OneMethod);
|
|
Builder.writeUInt16(Flags);
|
|
Builder.writeTypeIndex(Type);
|
|
switch (Kind) {
|
|
case MethodKind::IntroducingVirtual:
|
|
case MethodKind::PureIntroducingVirtual:
|
|
assert(VTableSlotOffset >= 0);
|
|
Builder.writeInt32(VTableSlotOffset);
|
|
break;
|
|
|
|
default:
|
|
assert(VTableSlotOffset == -1);
|
|
break;
|
|
}
|
|
|
|
Builder.writeNullTerminatedString(Name);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeOneMethod(const MethodInfo &Method,
|
|
StringRef Name) {
|
|
writeOneMethod(Method.getAccess(), Method.getKind(), Method.getOptions(),
|
|
Method.getType(), Method.getVTableSlotOffset(), Name);
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeNestedType(TypeIndex Type, StringRef Name) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::NestedType);
|
|
Builder.writeUInt16(0);
|
|
Builder.writeTypeIndex(Type);
|
|
Builder.writeNullTerminatedString(Name);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeStaticMember(MemberAccess Access,
|
|
TypeIndex Type, StringRef Name) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::StaticMember);
|
|
Builder.writeUInt16(static_cast<uint16_t>(Access));
|
|
Builder.writeTypeIndex(Type);
|
|
Builder.writeNullTerminatedString(Name);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeIndirectVirtualBaseClass(
|
|
MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
|
|
int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
|
|
writeVirtualBaseClass(TypeRecordKind::IndirectVirtualBaseClass, Access, Type,
|
|
VirtualBasePointerType, VirtualBasePointerOffset,
|
|
SlotIndex);
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeVirtualBaseClass(
|
|
MemberAccess Access, TypeIndex Type, TypeIndex VirtualBasePointerType,
|
|
int64_t VirtualBasePointerOffset, uint64_t SlotIndex) {
|
|
writeVirtualBaseClass(TypeRecordKind::VirtualBaseClass, Access, Type,
|
|
VirtualBasePointerType, VirtualBasePointerOffset,
|
|
SlotIndex);
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeVirtualBaseClass(
|
|
TypeRecordKind Kind, MemberAccess Access, TypeIndex Type,
|
|
TypeIndex VirtualBasePointerType, int64_t VirtualBasePointerOffset,
|
|
uint64_t SlotIndex) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(Kind);
|
|
Builder.writeUInt16(static_cast<uint16_t>(Access));
|
|
Builder.writeTypeIndex(Type);
|
|
Builder.writeTypeIndex(VirtualBasePointerType);
|
|
Builder.writeEncodedInteger(VirtualBasePointerOffset);
|
|
Builder.writeEncodedUnsignedInteger(SlotIndex);
|
|
|
|
finishSubRecord();
|
|
}
|
|
|
|
void FieldListRecordBuilder::writeVirtualFunctionTablePointer(TypeIndex Type) {
|
|
TypeRecordBuilder &Builder = getBuilder();
|
|
|
|
Builder.writeTypeRecordKind(TypeRecordKind::VirtualFunctionTablePointer);
|
|
Builder.writeUInt16(0);
|
|
Builder.writeTypeIndex(Type);
|
|
|
|
finishSubRecord();
|
|
} |