//===- 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; ByteStream::ByteStream() {} ByteStream::ByteStream(MutableArrayRef Data) : Data(Data) {} ByteStream::~ByteStream() {} void ByteStream::reset() { Ownership.reset(); Data = MutableArrayRef(); } void ByteStream::load(uint32_t Length) { reset(); if (Length > 0) Data = MutableArrayRef(new uint8_t[Length], Length); Ownership.reset(Data.data()); } Error ByteStream::load(StreamReader &Reader, uint32_t Length) { load(Length); auto EC = Reader.readBytes(Data); if (EC) reset(); return EC; } Error ByteStream::readBytes(uint32_t Offset, MutableArrayRef Buffer) const { if (Data.size() < Buffer.size() + Offset) return make_error(cv_error_code::insufficient_buffer); ::memcpy(Buffer.data() + Offset, Data.data(), Buffer.size()); return Error::success(); } Error ByteStream::readBytes(uint32_t Offset, uint32_t Size, ArrayRef &Buffer) const { if (Data.size() < Buffer.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(); } StringRef ByteStream::str() const { const char *CharData = reinterpret_cast(Data.data()); return StringRef(CharData, Data.size()); }