blob: 8c6d7ec749bff80707acca5d6ff30de0e19226f0 [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
10#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
11#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
12
13using namespace llvm;
Zachary Turner2f09b502016-04-29 17:28:47 +000014using namespace llvm::pdb;
Zachary Turner6ba65de2016-04-29 17:22:58 +000015
16ByteStream::ByteStream() : Owned(false) {}
17
18ByteStream::ByteStream(MutableArrayRef<uint8_t> Bytes) : Owned(false) {
19 initialize(Bytes);
20}
21
22ByteStream::ByteStream(uint32_t Length) : Owned(false) { initialize(Length); }
23
24ByteStream::~ByteStream() { reset(); }
25
26void ByteStream::reset() {
27 if (Owned)
28 delete[] Data.data();
29 Owned = false;
30 Data = MutableArrayRef<uint8_t>();
31}
32
33void ByteStream::initialize(MutableArrayRef<uint8_t> Bytes) {
34 reset();
35 Data = Bytes;
36 Owned = false;
37}
38
39void ByteStream::initialize(uint32_t Length) {
40 reset();
41 Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length);
42 Owned = true;
43}
44
Zachary Turner819e77d2016-05-06 20:51:57 +000045Error ByteStream::initialize(StreamReader &Reader, uint32_t Length) {
Zachary Turner6ba65de2016-04-29 17:22:58 +000046 initialize(Length);
Zachary Turner819e77d2016-05-06 20:51:57 +000047 auto EC = Reader.readBytes(Data);
Zachary Turner6ba65de2016-04-29 17:22:58 +000048 if (EC)
49 reset();
50 return EC;
51}
52
Zachary Turner819e77d2016-05-06 20:51:57 +000053Error ByteStream::readBytes(uint32_t Offset,
54 MutableArrayRef<uint8_t> Buffer) const {
Zachary Turner6ba65de2016-04-29 17:22:58 +000055 if (Data.size() < Buffer.size() + Offset)
Zachary Turner819e77d2016-05-06 20:51:57 +000056 return make_error<RawError>(raw_error_code::insufficient_buffer);
Zachary Turner6ba65de2016-04-29 17:22:58 +000057 ::memcpy(Buffer.data(), Data.data() + Offset, Buffer.size());
Zachary Turner819e77d2016-05-06 20:51:57 +000058 return Error::success();
Zachary Turner6ba65de2016-04-29 17:22:58 +000059}
60
Zachary Turner819e77d2016-05-06 20:51:57 +000061Error ByteStream::getArrayRef(uint32_t Offset, ArrayRef<uint8_t> &Buffer,
62 uint32_t Length) const {
Zachary Turnerf5c59652016-05-03 00:28:21 +000063 if (Data.size() < Length + Offset)
Zachary Turner819e77d2016-05-06 20:51:57 +000064 return make_error<RawError>(raw_error_code::insufficient_buffer);
Zachary Turnerf5c59652016-05-03 00:28:21 +000065 Buffer = Data.slice(Offset, Length);
Zachary Turner819e77d2016-05-06 20:51:57 +000066 return Error::success();
Zachary Turnerf5c59652016-05-03 00:28:21 +000067}
68
Zachary Turner6ba65de2016-04-29 17:22:58 +000069uint32_t ByteStream::getLength() const { return Data.size(); }
Zachary Turner0eace0b2016-05-02 18:09:14 +000070
71StringRef ByteStream::str() const {
72 const char *CharData = reinterpret_cast<const char *>(Data.data());
73 return StringRef(CharData, Data.size());
74}