xref: /aosp_15_r20/external/llvm/lib/DebugInfo/CodeView/ByteStream.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- ByteStream.cpp - Reads stream data from a byte sequence ------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/ByteStream.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/CodeViewError.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/StreamReader.h"
13*9880d681SAndroid Build Coastguard Worker #include <cstring>
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker using namespace llvm;
16*9880d681SAndroid Build Coastguard Worker using namespace llvm::codeview;
17*9880d681SAndroid Build Coastguard Worker 
writeBytes(uint32_t Offset,ArrayRef<uint8_t> Src,ArrayRef<uint8_t> Dest)18*9880d681SAndroid Build Coastguard Worker static Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Src,
19*9880d681SAndroid Build Coastguard Worker                         ArrayRef<uint8_t> Dest) {
20*9880d681SAndroid Build Coastguard Worker   return make_error<CodeViewError>(cv_error_code::operation_unsupported,
21*9880d681SAndroid Build Coastguard Worker                                    "ByteStream is immutable.");
22*9880d681SAndroid Build Coastguard Worker }
23*9880d681SAndroid Build Coastguard Worker 
writeBytes(uint32_t Offset,ArrayRef<uint8_t> Src,MutableArrayRef<uint8_t> Dest)24*9880d681SAndroid Build Coastguard Worker static Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Src,
25*9880d681SAndroid Build Coastguard Worker                         MutableArrayRef<uint8_t> Dest) {
26*9880d681SAndroid Build Coastguard Worker   if (Dest.size() < Src.size())
27*9880d681SAndroid Build Coastguard Worker     return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
28*9880d681SAndroid Build Coastguard Worker   if (Offset > Src.size() - Dest.size())
29*9880d681SAndroid Build Coastguard Worker     return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker   ::memcpy(Dest.data() + Offset, Src.data(), Src.size());
32*9880d681SAndroid Build Coastguard Worker   return Error::success();
33*9880d681SAndroid Build Coastguard Worker }
34*9880d681SAndroid Build Coastguard Worker 
35*9880d681SAndroid Build Coastguard Worker template <bool Writable>
readBytes(uint32_t Offset,uint32_t Size,ArrayRef<uint8_t> & Buffer) const36*9880d681SAndroid Build Coastguard Worker Error ByteStream<Writable>::readBytes(uint32_t Offset, uint32_t Size,
37*9880d681SAndroid Build Coastguard Worker                                       ArrayRef<uint8_t> &Buffer) const {
38*9880d681SAndroid Build Coastguard Worker   if (Offset > Data.size())
39*9880d681SAndroid Build Coastguard Worker     return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
40*9880d681SAndroid Build Coastguard Worker   if (Data.size() < Size + Offset)
41*9880d681SAndroid Build Coastguard Worker     return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
42*9880d681SAndroid Build Coastguard Worker   Buffer = Data.slice(Offset, Size);
43*9880d681SAndroid Build Coastguard Worker   return Error::success();
44*9880d681SAndroid Build Coastguard Worker }
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker template <bool Writable>
readLongestContiguousChunk(uint32_t Offset,ArrayRef<uint8_t> & Buffer) const47*9880d681SAndroid Build Coastguard Worker Error ByteStream<Writable>::readLongestContiguousChunk(
48*9880d681SAndroid Build Coastguard Worker     uint32_t Offset, ArrayRef<uint8_t> &Buffer) const {
49*9880d681SAndroid Build Coastguard Worker   if (Offset >= Data.size())
50*9880d681SAndroid Build Coastguard Worker     return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
51*9880d681SAndroid Build Coastguard Worker   Buffer = Data.slice(Offset);
52*9880d681SAndroid Build Coastguard Worker   return Error::success();
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker template <bool Writable>
writeBytes(uint32_t Offset,ArrayRef<uint8_t> Buffer) const56*9880d681SAndroid Build Coastguard Worker Error ByteStream<Writable>::writeBytes(uint32_t Offset,
57*9880d681SAndroid Build Coastguard Worker                                        ArrayRef<uint8_t> Buffer) const {
58*9880d681SAndroid Build Coastguard Worker   return ::writeBytes(Offset, Buffer, Data);
59*9880d681SAndroid Build Coastguard Worker }
60*9880d681SAndroid Build Coastguard Worker 
getLength() const61*9880d681SAndroid Build Coastguard Worker template <bool Writable> uint32_t ByteStream<Writable>::getLength() const {
62*9880d681SAndroid Build Coastguard Worker   return Data.size();
63*9880d681SAndroid Build Coastguard Worker }
64*9880d681SAndroid Build Coastguard Worker 
commit() const65*9880d681SAndroid Build Coastguard Worker template <bool Writable> Error ByteStream<Writable>::commit() const {
66*9880d681SAndroid Build Coastguard Worker   return Error::success();
67*9880d681SAndroid Build Coastguard Worker }
68*9880d681SAndroid Build Coastguard Worker 
str() const69*9880d681SAndroid Build Coastguard Worker template <bool Writable> StringRef ByteStream<Writable>::str() const {
70*9880d681SAndroid Build Coastguard Worker   const char *CharData = reinterpret_cast<const char *>(Data.data());
71*9880d681SAndroid Build Coastguard Worker   return StringRef(CharData, Data.size());
72*9880d681SAndroid Build Coastguard Worker }
73*9880d681SAndroid Build Coastguard Worker 
74*9880d681SAndroid Build Coastguard Worker namespace llvm {
75*9880d681SAndroid Build Coastguard Worker namespace codeview {
76*9880d681SAndroid Build Coastguard Worker template class ByteStream<true>;
77*9880d681SAndroid Build Coastguard Worker template class ByteStream<false>;
78*9880d681SAndroid Build Coastguard Worker }
79*9880d681SAndroid Build Coastguard Worker }
80