blob: 879343afbfd09bcda454a22fd43893741da58100 [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 Turner06c2b4b2016-05-09 17:45:21 +000020ByteStream::ByteStream(MutableArrayRef<uint8_t> Bytes) { initialize(Bytes); }
Zachary Turner6ba65de2016-04-29 17:22:58 +000021
Zachary Turner06c2b4b2016-05-09 17:45:21 +000022ByteStream::ByteStream(uint32_t Length) { initialize(Length); }
Zachary Turner6ba65de2016-04-29 17:22:58 +000023
24ByteStream::~ByteStream() { reset(); }
25
26void ByteStream::reset() {
Zachary Turner06c2b4b2016-05-09 17:45:21 +000027 Ownership.reset();
Zachary Turner6ba65de2016-04-29 17:22:58 +000028 Data = MutableArrayRef<uint8_t>();
29}
30
31void ByteStream::initialize(MutableArrayRef<uint8_t> Bytes) {
32 reset();
33 Data = Bytes;
Zachary Turner6ba65de2016-04-29 17:22:58 +000034}
35
36void ByteStream::initialize(uint32_t Length) {
37 reset();
Zachary Turner06c2b4b2016-05-09 17:45:21 +000038 if (Length > 0)
39 Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length);
40 Ownership.reset(Data.data());
Zachary Turner6ba65de2016-04-29 17:22:58 +000041}
42
Zachary Turner819e77d2016-05-06 20:51:57 +000043Error ByteStream::initialize(StreamReader &Reader, uint32_t Length) {
Zachary Turner6ba65de2016-04-29 17:22:58 +000044 initialize(Length);
Zachary Turner819e77d2016-05-06 20:51:57 +000045 auto EC = Reader.readBytes(Data);
Zachary Turner6ba65de2016-04-29 17:22:58 +000046 if (EC)
47 reset();
48 return EC;
49}
50
Zachary Turner819e77d2016-05-06 20:51:57 +000051Error ByteStream::readBytes(uint32_t Offset,
52 MutableArrayRef<uint8_t> Buffer) const {
Zachary Turner6ba65de2016-04-29 17:22:58 +000053 if (Data.size() < Buffer.size() + Offset)
Zachary Turnerd5d37dc2016-05-25 20:37:03 +000054 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Zachary Turner6ba65de2016-04-29 17:22:58 +000055 ::memcpy(Buffer.data(), Data.data() + Offset, Buffer.size());
Zachary Turner819e77d2016-05-06 20:51:57 +000056 return Error::success();
Zachary Turner6ba65de2016-04-29 17:22:58 +000057}
58
Zachary Turner819e77d2016-05-06 20:51:57 +000059Error ByteStream::getArrayRef(uint32_t Offset, ArrayRef<uint8_t> &Buffer,
60 uint32_t Length) const {
Zachary Turnerf5c59652016-05-03 00:28:21 +000061 if (Data.size() < Length + Offset)
Zachary Turnerd5d37dc2016-05-25 20:37:03 +000062 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Zachary Turnerf5c59652016-05-03 00:28:21 +000063 Buffer = Data.slice(Offset, Length);
Zachary Turner819e77d2016-05-06 20:51:57 +000064 return Error::success();
Zachary Turnerf5c59652016-05-03 00:28:21 +000065}
66
Zachary Turner6ba65de2016-04-29 17:22:58 +000067uint32_t ByteStream::getLength() const { return Data.size(); }
Zachary Turner0eace0b2016-05-02 18:09:14 +000068
69StringRef ByteStream::str() const {
70 const char *CharData = reinterpret_cast<const char *>(Data.data());
71 return StringRef(CharData, Data.size());
72}