| //===- 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 <cstring> |
| |
| using namespace llvm; |
| using namespace llvm::codeview; |
| |
| static Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Src, |
| ArrayRef<uint8_t> Dest) { |
| return make_error<CodeViewError>(cv_error_code::operation_unsupported, |
| "ByteStream is immutable."); |
| } |
| |
| static Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Src, |
| MutableArrayRef<uint8_t> Dest) { |
| if (Dest.size() < Src.size()) |
| return make_error<CodeViewError>(cv_error_code::insufficient_buffer); |
| if (Offset > Src.size() - Dest.size()) |
| return make_error<CodeViewError>(cv_error_code::insufficient_buffer); |
| |
| ::memcpy(Dest.data() + Offset, Src.data(), Src.size()); |
| return Error::success(); |
| } |
| |
| template <bool Writable> |
| Error ByteStream<Writable>::readBytes(uint32_t Offset, uint32_t Size, |
| ArrayRef<uint8_t> &Buffer) const { |
| if (Offset > Data.size()) |
| return make_error<CodeViewError>(cv_error_code::insufficient_buffer); |
| if (Data.size() < Size + Offset) |
| return make_error<CodeViewError>(cv_error_code::insufficient_buffer); |
| Buffer = Data.slice(Offset, Size); |
| return Error::success(); |
| } |
| |
| template <bool Writable> |
| Error ByteStream<Writable>::readLongestContiguousChunk( |
| uint32_t Offset, ArrayRef<uint8_t> &Buffer) const { |
| if (Offset >= Data.size()) |
| return make_error<CodeViewError>(cv_error_code::insufficient_buffer); |
| Buffer = Data.slice(Offset); |
| return Error::success(); |
| } |
| |
| template <bool Writable> |
| Error ByteStream<Writable>::writeBytes(uint32_t Offset, |
| ArrayRef<uint8_t> Buffer) const { |
| return ::writeBytes(Offset, Buffer, Data); |
| } |
| |
| template <bool Writable> uint32_t ByteStream<Writable>::getLength() const { |
| return Data.size(); |
| } |
| |
| template <bool Writable> Error ByteStream<Writable>::commit() const { |
| return Error::success(); |
| } |
| |
| template <bool Writable> StringRef ByteStream<Writable>::str() const { |
| const char *CharData = reinterpret_cast<const char *>(Data.data()); |
| return StringRef(CharData, Data.size()); |
| } |
| |
| namespace llvm { |
| namespace codeview { |
| template class ByteStream<true>; |
| template class ByteStream<false>; |
| } |
| } |