blob: 83b2f8ec30754a90616bd0b8cec40d8ca2eaacb6 [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 Turner5acb4ac2016-06-10 05:09:12 +000018static Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Src,
19 ArrayRef<uint8_t> Dest) {
20 return make_error<CodeViewError>(cv_error_code::operation_unsupported,
21 "ByteStream is immutable.");
22}
Zachary Turner6ba65de2016-04-29 17:22:58 +000023
Zachary Turner5acb4ac2016-06-10 05:09:12 +000024static Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Src,
25 MutableArrayRef<uint8_t> Dest) {
26 if (Dest.size() < Src.size())
27 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
28 if (Offset > Src.size() - Dest.size())
29 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Zachary Turner6ba65de2016-04-29 17:22:58 +000030
Zachary Turner5acb4ac2016-06-10 05:09:12 +000031 ::memcpy(Dest.data() + Offset, Src.data(), Src.size());
32 return Error::success();
33}
Zachary Turner6ba65de2016-04-29 17:22:58 +000034
Zachary Turner5acb4ac2016-06-10 05:09:12 +000035template <bool Writable>
36Error ByteStream<Writable>::readBytes(uint32_t Offset, uint32_t Size,
37 ArrayRef<uint8_t> &Buffer) const {
38 if (Offset > Data.size())
39 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Zachary Turner0d43c1c2016-05-28 05:21:57 +000040 if (Data.size() < Size + Offset)
Zachary Turnerd5d37dc2016-05-25 20:37:03 +000041 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Zachary Turner8dbe3622016-05-27 01:54:44 +000042 Buffer = Data.slice(Offset, Size);
Zachary Turner819e77d2016-05-06 20:51:57 +000043 return Error::success();
Zachary Turnerf5c59652016-05-03 00:28:21 +000044}
45
Zachary Turner5acb4ac2016-06-10 05:09:12 +000046template <bool Writable>
47Error ByteStream<Writable>::readLongestContiguousChunk(
48 uint32_t Offset, ArrayRef<uint8_t> &Buffer) const {
49 if (Offset >= Data.size())
50 return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
51 Buffer = Data.slice(Offset);
52 return Error::success();
53}
Zachary Turner0eace0b2016-05-02 18:09:14 +000054
Zachary Turner5acb4ac2016-06-10 05:09:12 +000055template <bool Writable>
56Error ByteStream<Writable>::writeBytes(uint32_t Offset,
57 ArrayRef<uint8_t> Buffer) const {
58 return ::writeBytes(Offset, Buffer, Data);
59}
60
61template <bool Writable> uint32_t ByteStream<Writable>::getLength() const {
62 return Data.size();
63}
64
65template <bool Writable> StringRef ByteStream<Writable>::str() const {
Zachary Turner0eace0b2016-05-02 18:09:14 +000066 const char *CharData = reinterpret_cast<const char *>(Data.data());
67 return StringRef(CharData, Data.size());
68}
Zachary Turner5acb4ac2016-06-10 05:09:12 +000069
70namespace llvm {
71namespace codeview {
72template class ByteStream<true>;
73template class ByteStream<false>;
74}
75}