Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
#include "llvm/DebugInfo/CodeView/SimpleTypeSerializer.h" | #include "llvm/DebugInfo/CodeView/SimpleTypeSerializer.h" | ||||
using namespace llvm; | using namespace llvm; | ||||
using namespace llvm::codeview; | using namespace llvm::codeview; | ||||
static void addPadding(BinaryStreamWriter &Writer) { | static void addPadding(BinaryStreamWriter &Writer) { | ||||
uint32_t Align = Writer.getOffset() % 4; | uint32_t Align = Writer.getOffset() % 4; | ||||
if (Align == 0) | if (Align == 0) | ||||
return; | return; | ||||
int PaddingBytes = 4 - Align; | int PaddingBytes = 4 - Align; | ||||
while (PaddingBytes > 0) { | while (PaddingBytes > 0) { | ||||
uint8_t Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes); | uint8_t Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes); | ||||
cantFail(Writer.writeInteger(Pad)); | llvm_cantFail(Writer.writeInteger(Pad)); | ||||
--PaddingBytes; | --PaddingBytes; | ||||
} | } | ||||
} | } | ||||
SimpleTypeSerializer::SimpleTypeSerializer() : ScratchBuffer(MaxRecordLength) {} | SimpleTypeSerializer::SimpleTypeSerializer() : ScratchBuffer(MaxRecordLength) {} | ||||
SimpleTypeSerializer::~SimpleTypeSerializer() {} | SimpleTypeSerializer::~SimpleTypeSerializer() {} | ||||
template <typename T> | template <typename T> | ||||
ArrayRef<uint8_t> SimpleTypeSerializer::serialize(T &Record) { | ArrayRef<uint8_t> SimpleTypeSerializer::serialize(T &Record) { | ||||
BinaryStreamWriter Writer(ScratchBuffer, support::little); | BinaryStreamWriter Writer(ScratchBuffer, support::little); | ||||
TypeRecordMapping Mapping(Writer); | TypeRecordMapping Mapping(Writer); | ||||
// Write the record prefix first with a dummy length but real kind. | // Write the record prefix first with a dummy length but real kind. | ||||
RecordPrefix DummyPrefix(uint16_t(Record.getKind())); | RecordPrefix DummyPrefix(uint16_t(Record.getKind())); | ||||
cantFail(Writer.writeObject(DummyPrefix)); | llvm_cantFail(Writer.writeObject(DummyPrefix)); | ||||
RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(ScratchBuffer.data()); | RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(ScratchBuffer.data()); | ||||
CVType CVT(Prefix, sizeof(RecordPrefix)); | CVType CVT(Prefix, sizeof(RecordPrefix)); | ||||
cantFail(Mapping.visitTypeBegin(CVT)); | llvm_cantFail(Mapping.visitTypeBegin(CVT)); | ||||
cantFail(Mapping.visitKnownRecord(CVT, Record)); | llvm_cantFail(Mapping.visitKnownRecord(CVT, Record)); | ||||
cantFail(Mapping.visitTypeEnd(CVT)); | llvm_cantFail(Mapping.visitTypeEnd(CVT)); | ||||
addPadding(Writer); | addPadding(Writer); | ||||
// Update the size and kind after serialization. | // Update the size and kind after serialization. | ||||
Prefix->RecordKind = CVT.kind(); | Prefix->RecordKind = CVT.kind(); | ||||
Prefix->RecordLen = Writer.getOffset() - sizeof(uint16_t); | Prefix->RecordLen = Writer.getOffset() - sizeof(uint16_t); | ||||
return {ScratchBuffer.data(), Writer.getOffset()}; | return {ScratchBuffer.data(), Writer.getOffset()}; | ||||
Show All 11 Lines |