From 5acb4ac6d7989e5f59dd6bc035cc1110b2c830dd Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Fri, 10 Jun 2016 05:09:12 +0000 Subject: Add support for writing through StreamInterface. This adds method and tests for writing to a PDB stream. With this, even a PDB stream which is discontiguous can be treated as a sequential stream of bytes for the purposes of writing. Reviewed By: ruiu Differential Revision: http://reviews.llvm.org/D21157 llvm-svn: 272369 --- llvm/lib/DebugInfo/CodeView/ByteStream.cpp | 52 ++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 7 deletions(-) (limited to 'llvm/lib/DebugInfo/CodeView/ByteStream.cpp') diff --git a/llvm/lib/DebugInfo/CodeView/ByteStream.cpp b/llvm/lib/DebugInfo/CodeView/ByteStream.cpp index c0ac0b7a8ff..83b2f8ec307 100644 --- a/llvm/lib/DebugInfo/CodeView/ByteStream.cpp +++ b/llvm/lib/DebugInfo/CodeView/ByteStream.cpp @@ -15,23 +15,61 @@ using namespace llvm; using namespace llvm::codeview; -ByteStream::ByteStream() {} +static Error writeBytes(uint32_t Offset, ArrayRef Src, + ArrayRef Dest) { + return make_error(cv_error_code::operation_unsupported, + "ByteStream is immutable."); +} -ByteStream::ByteStream(ArrayRef Data) : Data(Data) {} +static Error writeBytes(uint32_t Offset, ArrayRef Src, + MutableArrayRef Dest) { + if (Dest.size() < Src.size()) + return make_error(cv_error_code::insufficient_buffer); + if (Offset > Src.size() - Dest.size()) + return make_error(cv_error_code::insufficient_buffer); -ByteStream::~ByteStream() {} + ::memcpy(Dest.data() + Offset, Src.data(), Src.size()); + return Error::success(); +} -Error ByteStream::readBytes(uint32_t Offset, uint32_t Size, - ArrayRef &Buffer) const { +template +Error ByteStream::readBytes(uint32_t Offset, uint32_t Size, + ArrayRef &Buffer) const { + if (Offset > Data.size()) + return make_error(cv_error_code::insufficient_buffer); if (Data.size() < Size + Offset) return make_error(cv_error_code::insufficient_buffer); Buffer = Data.slice(Offset, Size); return Error::success(); } -uint32_t ByteStream::getLength() const { return Data.size(); } +template +Error ByteStream::readLongestContiguousChunk( + uint32_t Offset, ArrayRef &Buffer) const { + if (Offset >= Data.size()) + return make_error(cv_error_code::insufficient_buffer); + Buffer = Data.slice(Offset); + return Error::success(); +} + +template +Error ByteStream::writeBytes(uint32_t Offset, + ArrayRef Buffer) const { + return ::writeBytes(Offset, Buffer, Data); +} + +template uint32_t ByteStream::getLength() const { + return Data.size(); +} -StringRef ByteStream::str() const { +template StringRef ByteStream::str() const { const char *CharData = reinterpret_cast(Data.data()); return StringRef(CharData, Data.size()); } + +namespace llvm { +namespace codeview { +template class ByteStream; +template class ByteStream; +} +} -- cgit v1.2.3