blob: 1ea976b6a262a4450c8df3d0526efef7eb0940f1 [file] [log] [blame]
Zachary Turner6ba65de2016-04-29 17:22:58 +00001//===- ByteStream.cpp - Reads stream data from a byte sequence ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Zachary Turnerd5d37dc2016-05-25 20:37:03 +000010#include "llvm/DebugInfo/CodeView/ByteStream.h"
11#include "llvm/DebugInfo/CodeView/CodeViewError.h"
12#include "llvm/DebugInfo/CodeView/StreamReader.h"
Eugene Zelenko417d4c52016-05-09 23:11:38 +000013#include <cstring>
Zachary Turner6ba65de2016-04-29 17:22:58 +000014
15using namespace llvm;
Zachary Turnerd5d37dc2016-05-25 20:37:03 +000016using namespace llvm::codeview;
Zachary Turner6ba65de2016-04-29 17:22:58 +000017
Zachary Turner06c2b4b2016-05-09 17:45:21 +000018ByteStream::ByteStream() {}
Zachary Turner6ba65de2016-04-29 17:22:58 +000019
Zachary Turner8dbe3622016-05-27 01:54:44 +000020ByteStream::ByteStream(MutableArrayRef<uint8_t> Data) : Data(Data) {}
Zachary Turner6ba65de2016-04-29 17:22:58 +000021
Zachary Turner8dbe3622016-05-27 01:54:44 +000022ByteStream::~ByteStream() {}
Zachary Turner6ba65de2016-04-29 17:22:58 +000023
24void ByteStream::reset() {
Zachary Turner06c2b4b2016-05-09 17:45:21 +000025 Ownership.reset();
Zachary Turner6ba65de2016-04-29 17:22:58 +000026 Data = MutableArrayRef<uint8_t>();
27}
28
Zachary Turner8dbe3622016-05-27 01:54:44 +000029void ByteStream::load(uint32_t Length) {
Zachary Turner6ba65de2016-04-29 17:22:58 +000030 reset();
Zachary Turner06c2b4b2016-05-09 17:45:21 +000031 if (Length > 0)
32 Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length);
33 Ownership.reset(Data.data());
Zachary Turner6ba65de2016-04-29 17:22:58 +000034}
35
Zachary Turner8dbe3622016-05-27 01:54:44 +000036Error ByteStream::load(StreamReader &Reader, uint32_t Length) {
37 load(Length);
Zachary Turner819e77d2016-05-06 20:51:57 +000038 auto EC = Reader.readBytes(Data);
Zachary Turner6ba65de2016-04-29 17:22:58 +000039 if (EC)
40 reset();
41 return EC;
42}
43
Zachary Turner819e77d2016-05-06 20:51:57 +000044Error ByteStream::readBytes(uint32_t Offset,
45 MutableArrayRef<uint8_t> Buffer) const {
Zachary Turner6ba65de2016-04-29 17:22:58 +000046 if (Data.size() < Buffer.size() + Offset)
Zachary Turnerd5d37dc2016-05-25 20:37:03 +000047 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Zachary Turner8dbe3622016-05-27 01:54:44 +000048 ::memcpy(Buffer.data() + Offset, Data.data(), Buffer.size());
Zachary Turner819e77d2016-05-06 20:51:57 +000049 return Error::success();
Zachary Turner6ba65de2016-04-29 17:22:58 +000050}
51
Zachary Turner8dbe3622016-05-27 01:54:44 +000052Error ByteStream::readBytes(uint32_t Offset, uint32_t Size,
53 ArrayRef<uint8_t> &Buffer) const {
54 if (Data.size() < Buffer.size() + Offset)
Zachary Turnerd5d37dc2016-05-25 20:37:03 +000055 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Zachary Turner8dbe3622016-05-27 01:54:44 +000056 Buffer = Data.slice(Offset, Size);
Zachary Turner819e77d2016-05-06 20:51:57 +000057 return Error::success();
Zachary Turnerf5c59652016-05-03 00:28:21 +000058}
59
Zachary Turner6ba65de2016-04-29 17:22:58 +000060uint32_t ByteStream::getLength() const { return Data.size(); }
Zachary Turner0eace0b2016-05-02 18:09:14 +000061
62StringRef ByteStream::str() const {
63 const char *CharData = reinterpret_cast<const char *>(Data.data());
64 return StringRef(CharData, Data.size());
65}