From 01095a5d43bbfde13731688ddcf6048ebb8b7721 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sat, 23 Jul 2016 20:41:05 +0000 Subject: Vendor import of llvm release_39 branch r276489: https://llvm.org/svn/llvm-project/llvm/branches/release_39@276489 --- lib/DebugInfo/CodeView/ByteStream.cpp | 79 +++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 lib/DebugInfo/CodeView/ByteStream.cpp (limited to 'lib/DebugInfo/CodeView/ByteStream.cpp') diff --git a/lib/DebugInfo/CodeView/ByteStream.cpp b/lib/DebugInfo/CodeView/ByteStream.cpp new file mode 100644 index 000000000000..2c43bc6958d2 --- /dev/null +++ b/lib/DebugInfo/CodeView/ByteStream.cpp @@ -0,0 +1,79 @@ +//===- ByteStream.cpp - Reads stream data from a byte sequence ------------===// +// +// 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/ByteStream.h" +#include "llvm/DebugInfo/CodeView/CodeViewError.h" +#include "llvm/DebugInfo/CodeView/StreamReader.h" +#include + +using namespace llvm; +using namespace llvm::codeview; + +static Error writeBytes(uint32_t Offset, ArrayRef Src, + ArrayRef Dest) { + return make_error(cv_error_code::operation_unsupported, + "ByteStream is immutable."); +} + +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); + + ::memcpy(Dest.data() + Offset, Src.data(), Src.size()); + return Error::success(); +} + +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(); +} + +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(); +} + +template Error ByteStream::commit() const { + return Error::success(); +} + +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.3