1*0b57cec5SDimitry Andric //===-- SBData.cpp --------------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "lldb/API/SBData.h"
10*0b57cec5SDimitry Andric #include "SBReproducerPrivate.h"
11*0b57cec5SDimitry Andric #include "lldb/API/SBError.h"
12*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
13*0b57cec5SDimitry Andric 
14*0b57cec5SDimitry Andric #include "lldb/Core/DumpDataExtractor.h"
15*0b57cec5SDimitry Andric #include "lldb/Utility/DataBufferHeap.h"
16*0b57cec5SDimitry Andric #include "lldb/Utility/DataExtractor.h"
17*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric #include <cinttypes>
20*0b57cec5SDimitry Andric #include <memory>
21*0b57cec5SDimitry Andric 
22*0b57cec5SDimitry Andric using namespace lldb;
23*0b57cec5SDimitry Andric using namespace lldb_private;
24*0b57cec5SDimitry Andric 
SBData()25*0b57cec5SDimitry Andric SBData::SBData() : m_opaque_sp(new DataExtractor()) {
26*0b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBData);
27*0b57cec5SDimitry Andric }
28*0b57cec5SDimitry Andric 
SBData(const lldb::DataExtractorSP & data_sp)29*0b57cec5SDimitry Andric SBData::SBData(const lldb::DataExtractorSP &data_sp) : m_opaque_sp(data_sp) {}
30*0b57cec5SDimitry Andric 
SBData(const SBData & rhs)31*0b57cec5SDimitry Andric SBData::SBData(const SBData &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
32*0b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBData, (const lldb::SBData &), rhs);
33*0b57cec5SDimitry Andric }
34*0b57cec5SDimitry Andric 
operator =(const SBData & rhs)35*0b57cec5SDimitry Andric const SBData &SBData::operator=(const SBData &rhs) {
36*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(const lldb::SBData &,
37*0b57cec5SDimitry Andric                      SBData, operator=,(const lldb::SBData &), rhs);
38*0b57cec5SDimitry Andric 
39*0b57cec5SDimitry Andric   if (this != &rhs)
40*0b57cec5SDimitry Andric     m_opaque_sp = rhs.m_opaque_sp;
41*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(*this);
42*0b57cec5SDimitry Andric }
43*0b57cec5SDimitry Andric 
44*0b57cec5SDimitry Andric SBData::~SBData() = default;
45*0b57cec5SDimitry Andric 
SetOpaque(const lldb::DataExtractorSP & data_sp)46*0b57cec5SDimitry Andric void SBData::SetOpaque(const lldb::DataExtractorSP &data_sp) {
47*0b57cec5SDimitry Andric   m_opaque_sp = data_sp;
48*0b57cec5SDimitry Andric }
49*0b57cec5SDimitry Andric 
get() const50*0b57cec5SDimitry Andric lldb_private::DataExtractor *SBData::get() const { return m_opaque_sp.get(); }
51*0b57cec5SDimitry Andric 
operator ->() const52*0b57cec5SDimitry Andric lldb_private::DataExtractor *SBData::operator->() const {
53*0b57cec5SDimitry Andric   return m_opaque_sp.operator->();
54*0b57cec5SDimitry Andric }
55*0b57cec5SDimitry Andric 
operator *()56*0b57cec5SDimitry Andric lldb::DataExtractorSP &SBData::operator*() { return m_opaque_sp; }
57*0b57cec5SDimitry Andric 
operator *() const58*0b57cec5SDimitry Andric const lldb::DataExtractorSP &SBData::operator*() const { return m_opaque_sp; }
59*0b57cec5SDimitry Andric 
IsValid()60*0b57cec5SDimitry Andric bool SBData::IsValid() {
61*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(bool, SBData, IsValid);
62*0b57cec5SDimitry Andric   return this->operator bool();
63*0b57cec5SDimitry Andric }
operator bool() const64*0b57cec5SDimitry Andric SBData::operator bool() const {
65*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBData, operator bool);
66*0b57cec5SDimitry Andric 
67*0b57cec5SDimitry Andric   return m_opaque_sp.get() != nullptr;
68*0b57cec5SDimitry Andric }
69*0b57cec5SDimitry Andric 
GetAddressByteSize()70*0b57cec5SDimitry Andric uint8_t SBData::GetAddressByteSize() {
71*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(uint8_t, SBData, GetAddressByteSize);
72*0b57cec5SDimitry Andric 
73*0b57cec5SDimitry Andric   uint8_t value = 0;
74*0b57cec5SDimitry Andric   if (m_opaque_sp.get())
75*0b57cec5SDimitry Andric     value = m_opaque_sp->GetAddressByteSize();
76*0b57cec5SDimitry Andric   return value;
77*0b57cec5SDimitry Andric }
78*0b57cec5SDimitry Andric 
SetAddressByteSize(uint8_t addr_byte_size)79*0b57cec5SDimitry Andric void SBData::SetAddressByteSize(uint8_t addr_byte_size) {
80*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBData, SetAddressByteSize, (uint8_t),
81*0b57cec5SDimitry Andric                      addr_byte_size);
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric   if (m_opaque_sp.get())
84*0b57cec5SDimitry Andric     m_opaque_sp->SetAddressByteSize(addr_byte_size);
85*0b57cec5SDimitry Andric }
86*0b57cec5SDimitry Andric 
Clear()87*0b57cec5SDimitry Andric void SBData::Clear() {
88*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(void, SBData, Clear);
89*0b57cec5SDimitry Andric 
90*0b57cec5SDimitry Andric   if (m_opaque_sp.get())
91*0b57cec5SDimitry Andric     m_opaque_sp->Clear();
92*0b57cec5SDimitry Andric }
93*0b57cec5SDimitry Andric 
GetByteSize()94*0b57cec5SDimitry Andric size_t SBData::GetByteSize() {
95*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBData, GetByteSize);
96*0b57cec5SDimitry Andric 
97*0b57cec5SDimitry Andric   size_t value = 0;
98*0b57cec5SDimitry Andric   if (m_opaque_sp.get())
99*0b57cec5SDimitry Andric     value = m_opaque_sp->GetByteSize();
100*0b57cec5SDimitry Andric   return value;
101*0b57cec5SDimitry Andric }
102*0b57cec5SDimitry Andric 
GetByteOrder()103*0b57cec5SDimitry Andric lldb::ByteOrder SBData::GetByteOrder() {
104*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(lldb::ByteOrder, SBData, GetByteOrder);
105*0b57cec5SDimitry Andric 
106*0b57cec5SDimitry Andric   lldb::ByteOrder value = eByteOrderInvalid;
107*0b57cec5SDimitry Andric   if (m_opaque_sp.get())
108*0b57cec5SDimitry Andric     value = m_opaque_sp->GetByteOrder();
109*0b57cec5SDimitry Andric   return value;
110*0b57cec5SDimitry Andric }
111*0b57cec5SDimitry Andric 
SetByteOrder(lldb::ByteOrder endian)112*0b57cec5SDimitry Andric void SBData::SetByteOrder(lldb::ByteOrder endian) {
113*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBData, SetByteOrder, (lldb::ByteOrder), endian);
114*0b57cec5SDimitry Andric 
115*0b57cec5SDimitry Andric   if (m_opaque_sp.get())
116*0b57cec5SDimitry Andric     m_opaque_sp->SetByteOrder(endian);
117*0b57cec5SDimitry Andric }
118*0b57cec5SDimitry Andric 
GetFloat(lldb::SBError & error,lldb::offset_t offset)119*0b57cec5SDimitry Andric float SBData::GetFloat(lldb::SBError &error, lldb::offset_t offset) {
120*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(float, SBData, GetFloat, (lldb::SBError &, lldb::offset_t),
121*0b57cec5SDimitry Andric                      error, offset);
122*0b57cec5SDimitry Andric 
123*0b57cec5SDimitry Andric   float value = 0;
124*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
125*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
126*0b57cec5SDimitry Andric   } else {
127*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
128*0b57cec5SDimitry Andric     value = m_opaque_sp->GetFloat(&offset);
129*0b57cec5SDimitry Andric     if (offset == old_offset)
130*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
131*0b57cec5SDimitry Andric   }
132*0b57cec5SDimitry Andric   return value;
133*0b57cec5SDimitry Andric }
134*0b57cec5SDimitry Andric 
GetDouble(lldb::SBError & error,lldb::offset_t offset)135*0b57cec5SDimitry Andric double SBData::GetDouble(lldb::SBError &error, lldb::offset_t offset) {
136*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(double, SBData, GetDouble,
137*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
138*0b57cec5SDimitry Andric 
139*0b57cec5SDimitry Andric   double value = 0;
140*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
141*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
142*0b57cec5SDimitry Andric   } else {
143*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
144*0b57cec5SDimitry Andric     value = m_opaque_sp->GetDouble(&offset);
145*0b57cec5SDimitry Andric     if (offset == old_offset)
146*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
147*0b57cec5SDimitry Andric   }
148*0b57cec5SDimitry Andric   return value;
149*0b57cec5SDimitry Andric }
150*0b57cec5SDimitry Andric 
GetLongDouble(lldb::SBError & error,lldb::offset_t offset)151*0b57cec5SDimitry Andric long double SBData::GetLongDouble(lldb::SBError &error, lldb::offset_t offset) {
152*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(long double, SBData, GetLongDouble,
153*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
154*0b57cec5SDimitry Andric 
155*0b57cec5SDimitry Andric   long double value = 0;
156*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
157*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
158*0b57cec5SDimitry Andric   } else {
159*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
160*0b57cec5SDimitry Andric     value = m_opaque_sp->GetLongDouble(&offset);
161*0b57cec5SDimitry Andric     if (offset == old_offset)
162*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
163*0b57cec5SDimitry Andric   }
164*0b57cec5SDimitry Andric   return value;
165*0b57cec5SDimitry Andric }
166*0b57cec5SDimitry Andric 
GetAddress(lldb::SBError & error,lldb::offset_t offset)167*0b57cec5SDimitry Andric lldb::addr_t SBData::GetAddress(lldb::SBError &error, lldb::offset_t offset) {
168*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::addr_t, SBData, GetAddress,
169*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
170*0b57cec5SDimitry Andric 
171*0b57cec5SDimitry Andric   lldb::addr_t value = 0;
172*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
173*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
174*0b57cec5SDimitry Andric   } else {
175*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
176*0b57cec5SDimitry Andric     value = m_opaque_sp->GetAddress(&offset);
177*0b57cec5SDimitry Andric     if (offset == old_offset)
178*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
179*0b57cec5SDimitry Andric   }
180*0b57cec5SDimitry Andric   return value;
181*0b57cec5SDimitry Andric }
182*0b57cec5SDimitry Andric 
GetUnsignedInt8(lldb::SBError & error,lldb::offset_t offset)183*0b57cec5SDimitry Andric uint8_t SBData::GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset) {
184*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(uint8_t, SBData, GetUnsignedInt8,
185*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
186*0b57cec5SDimitry Andric 
187*0b57cec5SDimitry Andric   uint8_t value = 0;
188*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
189*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
190*0b57cec5SDimitry Andric   } else {
191*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
192*0b57cec5SDimitry Andric     value = m_opaque_sp->GetU8(&offset);
193*0b57cec5SDimitry Andric     if (offset == old_offset)
194*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
195*0b57cec5SDimitry Andric   }
196*0b57cec5SDimitry Andric   return value;
197*0b57cec5SDimitry Andric }
198*0b57cec5SDimitry Andric 
GetUnsignedInt16(lldb::SBError & error,lldb::offset_t offset)199*0b57cec5SDimitry Andric uint16_t SBData::GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset) {
200*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(uint16_t, SBData, GetUnsignedInt16,
201*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
202*0b57cec5SDimitry Andric 
203*0b57cec5SDimitry Andric   uint16_t value = 0;
204*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
205*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
206*0b57cec5SDimitry Andric   } else {
207*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
208*0b57cec5SDimitry Andric     value = m_opaque_sp->GetU16(&offset);
209*0b57cec5SDimitry Andric     if (offset == old_offset)
210*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
211*0b57cec5SDimitry Andric   }
212*0b57cec5SDimitry Andric   return value;
213*0b57cec5SDimitry Andric }
214*0b57cec5SDimitry Andric 
GetUnsignedInt32(lldb::SBError & error,lldb::offset_t offset)215*0b57cec5SDimitry Andric uint32_t SBData::GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset) {
216*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(uint32_t, SBData, GetUnsignedInt32,
217*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
218*0b57cec5SDimitry Andric 
219*0b57cec5SDimitry Andric   uint32_t value = 0;
220*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
221*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
222*0b57cec5SDimitry Andric   } else {
223*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
224*0b57cec5SDimitry Andric     value = m_opaque_sp->GetU32(&offset);
225*0b57cec5SDimitry Andric     if (offset == old_offset)
226*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
227*0b57cec5SDimitry Andric   }
228*0b57cec5SDimitry Andric   return value;
229*0b57cec5SDimitry Andric }
230*0b57cec5SDimitry Andric 
GetUnsignedInt64(lldb::SBError & error,lldb::offset_t offset)231*0b57cec5SDimitry Andric uint64_t SBData::GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset) {
232*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(uint64_t, SBData, GetUnsignedInt64,
233*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
234*0b57cec5SDimitry Andric 
235*0b57cec5SDimitry Andric   uint64_t value = 0;
236*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
237*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
238*0b57cec5SDimitry Andric   } else {
239*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
240*0b57cec5SDimitry Andric     value = m_opaque_sp->GetU64(&offset);
241*0b57cec5SDimitry Andric     if (offset == old_offset)
242*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
243*0b57cec5SDimitry Andric   }
244*0b57cec5SDimitry Andric   return value;
245*0b57cec5SDimitry Andric }
246*0b57cec5SDimitry Andric 
GetSignedInt8(lldb::SBError & error,lldb::offset_t offset)247*0b57cec5SDimitry Andric int8_t SBData::GetSignedInt8(lldb::SBError &error, lldb::offset_t offset) {
248*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(int8_t, SBData, GetSignedInt8,
249*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
250*0b57cec5SDimitry Andric 
251*0b57cec5SDimitry Andric   int8_t value = 0;
252*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
253*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
254*0b57cec5SDimitry Andric   } else {
255*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
256*0b57cec5SDimitry Andric     value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
257*0b57cec5SDimitry Andric     if (offset == old_offset)
258*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
259*0b57cec5SDimitry Andric   }
260*0b57cec5SDimitry Andric   return value;
261*0b57cec5SDimitry Andric }
262*0b57cec5SDimitry Andric 
GetSignedInt16(lldb::SBError & error,lldb::offset_t offset)263*0b57cec5SDimitry Andric int16_t SBData::GetSignedInt16(lldb::SBError &error, lldb::offset_t offset) {
264*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(int16_t, SBData, GetSignedInt16,
265*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
266*0b57cec5SDimitry Andric 
267*0b57cec5SDimitry Andric   int16_t value = 0;
268*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
269*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
270*0b57cec5SDimitry Andric   } else {
271*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
272*0b57cec5SDimitry Andric     value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
273*0b57cec5SDimitry Andric     if (offset == old_offset)
274*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
275*0b57cec5SDimitry Andric   }
276*0b57cec5SDimitry Andric   return value;
277*0b57cec5SDimitry Andric }
278*0b57cec5SDimitry Andric 
GetSignedInt32(lldb::SBError & error,lldb::offset_t offset)279*0b57cec5SDimitry Andric int32_t SBData::GetSignedInt32(lldb::SBError &error, lldb::offset_t offset) {
280*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(int32_t, SBData, GetSignedInt32,
281*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
282*0b57cec5SDimitry Andric 
283*0b57cec5SDimitry Andric   int32_t value = 0;
284*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
285*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
286*0b57cec5SDimitry Andric   } else {
287*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
288*0b57cec5SDimitry Andric     value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
289*0b57cec5SDimitry Andric     if (offset == old_offset)
290*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
291*0b57cec5SDimitry Andric   }
292*0b57cec5SDimitry Andric   return value;
293*0b57cec5SDimitry Andric }
294*0b57cec5SDimitry Andric 
GetSignedInt64(lldb::SBError & error,lldb::offset_t offset)295*0b57cec5SDimitry Andric int64_t SBData::GetSignedInt64(lldb::SBError &error, lldb::offset_t offset) {
296*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(int64_t, SBData, GetSignedInt64,
297*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
298*0b57cec5SDimitry Andric 
299*0b57cec5SDimitry Andric   int64_t value = 0;
300*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
301*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
302*0b57cec5SDimitry Andric   } else {
303*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
304*0b57cec5SDimitry Andric     value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
305*0b57cec5SDimitry Andric     if (offset == old_offset)
306*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
307*0b57cec5SDimitry Andric   }
308*0b57cec5SDimitry Andric   return value;
309*0b57cec5SDimitry Andric }
310*0b57cec5SDimitry Andric 
GetString(lldb::SBError & error,lldb::offset_t offset)311*0b57cec5SDimitry Andric const char *SBData::GetString(lldb::SBError &error, lldb::offset_t offset) {
312*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(const char *, SBData, GetString,
313*0b57cec5SDimitry Andric                      (lldb::SBError &, lldb::offset_t), error, offset);
314*0b57cec5SDimitry Andric 
315*0b57cec5SDimitry Andric   const char *value = nullptr;
316*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
317*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
318*0b57cec5SDimitry Andric   } else {
319*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
320*0b57cec5SDimitry Andric     value = m_opaque_sp->GetCStr(&offset);
321*0b57cec5SDimitry Andric     if (offset == old_offset || (value == nullptr))
322*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
323*0b57cec5SDimitry Andric   }
324*0b57cec5SDimitry Andric   return value;
325*0b57cec5SDimitry Andric }
326*0b57cec5SDimitry Andric 
GetDescription(lldb::SBStream & description,lldb::addr_t base_addr)327*0b57cec5SDimitry Andric bool SBData::GetDescription(lldb::SBStream &description,
328*0b57cec5SDimitry Andric                             lldb::addr_t base_addr) {
329*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, GetDescription,
330*0b57cec5SDimitry Andric                      (lldb::SBStream &, lldb::addr_t), description, base_addr);
331*0b57cec5SDimitry Andric 
332*0b57cec5SDimitry Andric   Stream &strm = description.ref();
333*0b57cec5SDimitry Andric 
334*0b57cec5SDimitry Andric   if (m_opaque_sp) {
335*0b57cec5SDimitry Andric     DumpDataExtractor(*m_opaque_sp, &strm, 0, lldb::eFormatBytesWithASCII, 1,
336*0b57cec5SDimitry Andric                       m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0);
337*0b57cec5SDimitry Andric   } else
338*0b57cec5SDimitry Andric     strm.PutCString("No value");
339*0b57cec5SDimitry Andric 
340*0b57cec5SDimitry Andric   return true;
341*0b57cec5SDimitry Andric }
342*0b57cec5SDimitry Andric 
ReadRawData(lldb::SBError & error,lldb::offset_t offset,void * buf,size_t size)343*0b57cec5SDimitry Andric size_t SBData::ReadRawData(lldb::SBError &error, lldb::offset_t offset,
344*0b57cec5SDimitry Andric                            void *buf, size_t size) {
345*0b57cec5SDimitry Andric   LLDB_RECORD_DUMMY(size_t, SBData, ReadRawData,
346*0b57cec5SDimitry Andric                     (lldb::SBError &, lldb::offset_t, void *, size_t), error,
347*0b57cec5SDimitry Andric                     offset, buf, size);
348*0b57cec5SDimitry Andric 
349*0b57cec5SDimitry Andric   void *ok = nullptr;
350*0b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
351*0b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
352*0b57cec5SDimitry Andric   } else {
353*0b57cec5SDimitry Andric     uint32_t old_offset = offset;
354*0b57cec5SDimitry Andric     ok = m_opaque_sp->GetU8(&offset, buf, size);
355*0b57cec5SDimitry Andric     if ((offset == old_offset) || (ok == nullptr))
356*0b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
357*0b57cec5SDimitry Andric   }
358*0b57cec5SDimitry Andric   return ok ? size : 0;
359*0b57cec5SDimitry Andric }
360*0b57cec5SDimitry Andric 
SetData(lldb::SBError & error,const void * buf,size_t size,lldb::ByteOrder endian,uint8_t addr_size)361*0b57cec5SDimitry Andric void SBData::SetData(lldb::SBError &error, const void *buf, size_t size,
362*0b57cec5SDimitry Andric                      lldb::ByteOrder endian, uint8_t addr_size) {
363*0b57cec5SDimitry Andric   LLDB_RECORD_DUMMY(
364*0b57cec5SDimitry Andric       void, SBData, SetData,
365*0b57cec5SDimitry Andric       (lldb::SBError &, const void *, size_t, lldb::ByteOrder, uint8_t), error,
366*0b57cec5SDimitry Andric       buf, size, endian, addr_size);
367*0b57cec5SDimitry Andric 
368*0b57cec5SDimitry Andric   if (!m_opaque_sp.get())
369*0b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
370*0b57cec5SDimitry Andric   else
371*0b57cec5SDimitry Andric   {
372*0b57cec5SDimitry Andric     m_opaque_sp->SetData(buf, size, endian);
373*0b57cec5SDimitry Andric     m_opaque_sp->SetAddressByteSize(addr_size);
374*0b57cec5SDimitry Andric   }
375*0b57cec5SDimitry Andric }
376*0b57cec5SDimitry Andric 
Append(const SBData & rhs)377*0b57cec5SDimitry Andric bool SBData::Append(const SBData &rhs) {
378*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, Append, (const lldb::SBData &), rhs);
379*0b57cec5SDimitry Andric 
380*0b57cec5SDimitry Andric   bool value = false;
381*0b57cec5SDimitry Andric   if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
382*0b57cec5SDimitry Andric     value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
383*0b57cec5SDimitry Andric   return value;
384*0b57cec5SDimitry Andric }
385*0b57cec5SDimitry Andric 
CreateDataFromCString(lldb::ByteOrder endian,uint32_t addr_byte_size,const char * data)386*0b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromCString(lldb::ByteOrder endian,
387*0b57cec5SDimitry Andric                                            uint32_t addr_byte_size,
388*0b57cec5SDimitry Andric                                            const char *data) {
389*0b57cec5SDimitry Andric   LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromCString,
390*0b57cec5SDimitry Andric                             (lldb::ByteOrder, uint32_t, const char *), endian,
391*0b57cec5SDimitry Andric                             addr_byte_size, data);
392*0b57cec5SDimitry Andric 
393*0b57cec5SDimitry Andric   if (!data || !data[0])
394*0b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBData());
395*0b57cec5SDimitry Andric 
396*0b57cec5SDimitry Andric   uint32_t data_len = strlen(data);
397*0b57cec5SDimitry Andric 
398*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
399*0b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
400*0b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
401*0b57cec5SDimitry Andric 
402*0b57cec5SDimitry Andric   SBData ret(data_sp);
403*0b57cec5SDimitry Andric 
404*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(ret);
405*0b57cec5SDimitry Andric }
406*0b57cec5SDimitry Andric 
CreateDataFromUInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint64_t * array,size_t array_len)407*0b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromUInt64Array(lldb::ByteOrder endian,
408*0b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
409*0b57cec5SDimitry Andric                                                uint64_t *array,
410*0b57cec5SDimitry Andric                                                size_t array_len) {
411*0b57cec5SDimitry Andric   LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromUInt64Array,
412*0b57cec5SDimitry Andric                             (lldb::ByteOrder, uint32_t, uint64_t *, size_t),
413*0b57cec5SDimitry Andric                             endian, addr_byte_size, array, array_len);
414*0b57cec5SDimitry Andric 
415*0b57cec5SDimitry Andric   if (!array || array_len == 0)
416*0b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBData());
417*0b57cec5SDimitry Andric 
418*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint64_t);
419*0b57cec5SDimitry Andric 
420*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
421*0b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
422*0b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
423*0b57cec5SDimitry Andric 
424*0b57cec5SDimitry Andric   SBData ret(data_sp);
425*0b57cec5SDimitry Andric 
426*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(ret);
427*0b57cec5SDimitry Andric }
428*0b57cec5SDimitry Andric 
CreateDataFromUInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint32_t * array,size_t array_len)429*0b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromUInt32Array(lldb::ByteOrder endian,
430*0b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
431*0b57cec5SDimitry Andric                                                uint32_t *array,
432*0b57cec5SDimitry Andric                                                size_t array_len) {
433*0b57cec5SDimitry Andric   LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromUInt32Array,
434*0b57cec5SDimitry Andric                             (lldb::ByteOrder, uint32_t, uint32_t *, size_t),
435*0b57cec5SDimitry Andric                             endian, addr_byte_size, array, array_len);
436*0b57cec5SDimitry Andric 
437*0b57cec5SDimitry Andric   if (!array || array_len == 0)
438*0b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBData());
439*0b57cec5SDimitry Andric 
440*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint32_t);
441*0b57cec5SDimitry Andric 
442*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
443*0b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
444*0b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
445*0b57cec5SDimitry Andric 
446*0b57cec5SDimitry Andric   SBData ret(data_sp);
447*0b57cec5SDimitry Andric 
448*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(ret);
449*0b57cec5SDimitry Andric }
450*0b57cec5SDimitry Andric 
CreateDataFromSInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int64_t * array,size_t array_len)451*0b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromSInt64Array(lldb::ByteOrder endian,
452*0b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
453*0b57cec5SDimitry Andric                                                int64_t *array,
454*0b57cec5SDimitry Andric                                                size_t array_len) {
455*0b57cec5SDimitry Andric   LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromSInt64Array,
456*0b57cec5SDimitry Andric                             (lldb::ByteOrder, uint32_t, int64_t *, size_t),
457*0b57cec5SDimitry Andric                             endian, addr_byte_size, array, array_len);
458*0b57cec5SDimitry Andric 
459*0b57cec5SDimitry Andric   if (!array || array_len == 0)
460*0b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBData());
461*0b57cec5SDimitry Andric 
462*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int64_t);
463*0b57cec5SDimitry Andric 
464*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
465*0b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
466*0b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
467*0b57cec5SDimitry Andric 
468*0b57cec5SDimitry Andric   SBData ret(data_sp);
469*0b57cec5SDimitry Andric 
470*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(ret);
471*0b57cec5SDimitry Andric }
472*0b57cec5SDimitry Andric 
CreateDataFromSInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int32_t * array,size_t array_len)473*0b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromSInt32Array(lldb::ByteOrder endian,
474*0b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
475*0b57cec5SDimitry Andric                                                int32_t *array,
476*0b57cec5SDimitry Andric                                                size_t array_len) {
477*0b57cec5SDimitry Andric   LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromSInt32Array,
478*0b57cec5SDimitry Andric                             (lldb::ByteOrder, uint32_t, int32_t *, size_t),
479*0b57cec5SDimitry Andric                             endian, addr_byte_size, array, array_len);
480*0b57cec5SDimitry Andric 
481*0b57cec5SDimitry Andric   if (!array || array_len == 0)
482*0b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBData());
483*0b57cec5SDimitry Andric 
484*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int32_t);
485*0b57cec5SDimitry Andric 
486*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
487*0b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
488*0b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
489*0b57cec5SDimitry Andric 
490*0b57cec5SDimitry Andric   SBData ret(data_sp);
491*0b57cec5SDimitry Andric 
492*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(ret);
493*0b57cec5SDimitry Andric }
494*0b57cec5SDimitry Andric 
CreateDataFromDoubleArray(lldb::ByteOrder endian,uint32_t addr_byte_size,double * array,size_t array_len)495*0b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromDoubleArray(lldb::ByteOrder endian,
496*0b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
497*0b57cec5SDimitry Andric                                                double *array,
498*0b57cec5SDimitry Andric                                                size_t array_len) {
499*0b57cec5SDimitry Andric   LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromDoubleArray,
500*0b57cec5SDimitry Andric                             (lldb::ByteOrder, uint32_t, double *, size_t),
501*0b57cec5SDimitry Andric                             endian, addr_byte_size, array, array_len);
502*0b57cec5SDimitry Andric 
503*0b57cec5SDimitry Andric   if (!array || array_len == 0)
504*0b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBData());
505*0b57cec5SDimitry Andric 
506*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(double);
507*0b57cec5SDimitry Andric 
508*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
509*0b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
510*0b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
511*0b57cec5SDimitry Andric 
512*0b57cec5SDimitry Andric   SBData ret(data_sp);
513*0b57cec5SDimitry Andric 
514*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(ret);
515*0b57cec5SDimitry Andric }
516*0b57cec5SDimitry Andric 
SetDataFromCString(const char * data)517*0b57cec5SDimitry Andric bool SBData::SetDataFromCString(const char *data) {
518*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, SetDataFromCString, (const char *), data);
519*0b57cec5SDimitry Andric 
520*0b57cec5SDimitry Andric 
521*0b57cec5SDimitry Andric   if (!data) {
522*0b57cec5SDimitry Andric     return false;
523*0b57cec5SDimitry Andric   }
524*0b57cec5SDimitry Andric 
525*0b57cec5SDimitry Andric   size_t data_len = strlen(data);
526*0b57cec5SDimitry Andric 
527*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
528*0b57cec5SDimitry Andric 
529*0b57cec5SDimitry Andric   if (!m_opaque_sp.get())
530*0b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
531*0b57cec5SDimitry Andric                                                   GetAddressByteSize());
532*0b57cec5SDimitry Andric   else
533*0b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
534*0b57cec5SDimitry Andric 
535*0b57cec5SDimitry Andric 
536*0b57cec5SDimitry Andric   return true;
537*0b57cec5SDimitry Andric }
538*0b57cec5SDimitry Andric 
SetDataFromUInt64Array(uint64_t * array,size_t array_len)539*0b57cec5SDimitry Andric bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) {
540*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, SetDataFromUInt64Array, (uint64_t *, size_t),
541*0b57cec5SDimitry Andric                      array, array_len);
542*0b57cec5SDimitry Andric 
543*0b57cec5SDimitry Andric 
544*0b57cec5SDimitry Andric   if (!array || array_len == 0) {
545*0b57cec5SDimitry Andric     return false;
546*0b57cec5SDimitry Andric   }
547*0b57cec5SDimitry Andric 
548*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint64_t);
549*0b57cec5SDimitry Andric 
550*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
551*0b57cec5SDimitry Andric 
552*0b57cec5SDimitry Andric   if (!m_opaque_sp.get())
553*0b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
554*0b57cec5SDimitry Andric                                                   GetAddressByteSize());
555*0b57cec5SDimitry Andric   else
556*0b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
557*0b57cec5SDimitry Andric 
558*0b57cec5SDimitry Andric 
559*0b57cec5SDimitry Andric   return true;
560*0b57cec5SDimitry Andric }
561*0b57cec5SDimitry Andric 
SetDataFromUInt32Array(uint32_t * array,size_t array_len)562*0b57cec5SDimitry Andric bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) {
563*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, SetDataFromUInt32Array, (uint32_t *, size_t),
564*0b57cec5SDimitry Andric                      array, array_len);
565*0b57cec5SDimitry Andric 
566*0b57cec5SDimitry Andric 
567*0b57cec5SDimitry Andric   if (!array || array_len == 0) {
568*0b57cec5SDimitry Andric     return false;
569*0b57cec5SDimitry Andric   }
570*0b57cec5SDimitry Andric 
571*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint32_t);
572*0b57cec5SDimitry Andric 
573*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
574*0b57cec5SDimitry Andric 
575*0b57cec5SDimitry Andric   if (!m_opaque_sp.get())
576*0b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
577*0b57cec5SDimitry Andric                                                   GetAddressByteSize());
578*0b57cec5SDimitry Andric   else
579*0b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
580*0b57cec5SDimitry Andric 
581*0b57cec5SDimitry Andric   return true;
582*0b57cec5SDimitry Andric }
583*0b57cec5SDimitry Andric 
SetDataFromSInt64Array(int64_t * array,size_t array_len)584*0b57cec5SDimitry Andric bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) {
585*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, SetDataFromSInt64Array, (int64_t *, size_t),
586*0b57cec5SDimitry Andric                      array, array_len);
587*0b57cec5SDimitry Andric 
588*0b57cec5SDimitry Andric 
589*0b57cec5SDimitry Andric   if (!array || array_len == 0) {
590*0b57cec5SDimitry Andric     return false;
591*0b57cec5SDimitry Andric   }
592*0b57cec5SDimitry Andric 
593*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int64_t);
594*0b57cec5SDimitry Andric 
595*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
596*0b57cec5SDimitry Andric 
597*0b57cec5SDimitry Andric   if (!m_opaque_sp.get())
598*0b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
599*0b57cec5SDimitry Andric                                                   GetAddressByteSize());
600*0b57cec5SDimitry Andric   else
601*0b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
602*0b57cec5SDimitry Andric 
603*0b57cec5SDimitry Andric   return true;
604*0b57cec5SDimitry Andric }
605*0b57cec5SDimitry Andric 
SetDataFromSInt32Array(int32_t * array,size_t array_len)606*0b57cec5SDimitry Andric bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) {
607*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, SetDataFromSInt32Array, (int32_t *, size_t),
608*0b57cec5SDimitry Andric                      array, array_len);
609*0b57cec5SDimitry Andric 
610*0b57cec5SDimitry Andric 
611*0b57cec5SDimitry Andric   if (!array || array_len == 0) {
612*0b57cec5SDimitry Andric     return false;
613*0b57cec5SDimitry Andric   }
614*0b57cec5SDimitry Andric 
615*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int32_t);
616*0b57cec5SDimitry Andric 
617*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
618*0b57cec5SDimitry Andric 
619*0b57cec5SDimitry Andric   if (!m_opaque_sp.get())
620*0b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
621*0b57cec5SDimitry Andric                                                   GetAddressByteSize());
622*0b57cec5SDimitry Andric   else
623*0b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
624*0b57cec5SDimitry Andric 
625*0b57cec5SDimitry Andric   return true;
626*0b57cec5SDimitry Andric }
627*0b57cec5SDimitry Andric 
SetDataFromDoubleArray(double * array,size_t array_len)628*0b57cec5SDimitry Andric bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) {
629*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBData, SetDataFromDoubleArray, (double *, size_t),
630*0b57cec5SDimitry Andric                      array, array_len);
631*0b57cec5SDimitry Andric 
632*0b57cec5SDimitry Andric 
633*0b57cec5SDimitry Andric   if (!array || array_len == 0) {
634*0b57cec5SDimitry Andric     return false;
635*0b57cec5SDimitry Andric   }
636*0b57cec5SDimitry Andric 
637*0b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(double);
638*0b57cec5SDimitry Andric 
639*0b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
640*0b57cec5SDimitry Andric 
641*0b57cec5SDimitry Andric   if (!m_opaque_sp.get())
642*0b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
643*0b57cec5SDimitry Andric                                                   GetAddressByteSize());
644*0b57cec5SDimitry Andric   else
645*0b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
646*0b57cec5SDimitry Andric 
647*0b57cec5SDimitry Andric   return true;
648*0b57cec5SDimitry Andric }
649*0b57cec5SDimitry Andric 
650*0b57cec5SDimitry Andric namespace lldb_private {
651*0b57cec5SDimitry Andric namespace repro {
652*0b57cec5SDimitry Andric 
653*0b57cec5SDimitry Andric template <>
RegisterMethods(Registry & R)654*0b57cec5SDimitry Andric void RegisterMethods<SBData>(Registry &R) {
655*0b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBData, ());
656*0b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBData, (const lldb::SBData &));
657*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(const lldb::SBData &,
658*0b57cec5SDimitry Andric                        SBData, operator=,(const lldb::SBData &));
659*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, IsValid, ());
660*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBData, operator bool, ());
661*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint8_t, SBData, GetAddressByteSize, ());
662*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBData, SetAddressByteSize, (uint8_t));
663*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBData, Clear, ());
664*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(size_t, SBData, GetByteSize, ());
665*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::ByteOrder, SBData, GetByteOrder, ());
666*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBData, SetByteOrder, (lldb::ByteOrder));
667*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(float, SBData, GetFloat,
668*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
669*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(double, SBData, GetDouble,
670*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
671*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(long double, SBData, GetLongDouble,
672*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
673*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::addr_t, SBData, GetAddress,
674*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
675*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint8_t, SBData, GetUnsignedInt8,
676*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
677*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint16_t, SBData, GetUnsignedInt16,
678*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
679*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint32_t, SBData, GetUnsignedInt32,
680*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
681*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint64_t, SBData, GetUnsignedInt64,
682*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
683*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(int8_t, SBData, GetSignedInt8,
684*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
685*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(int16_t, SBData, GetSignedInt16,
686*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
687*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(int32_t, SBData, GetSignedInt32,
688*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
689*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(int64_t, SBData, GetSignedInt64,
690*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
691*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(const char *, SBData, GetString,
692*0b57cec5SDimitry Andric                        (lldb::SBError &, lldb::offset_t));
693*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, GetDescription,
694*0b57cec5SDimitry Andric                        (lldb::SBStream &, lldb::addr_t));
695*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, Append, (const lldb::SBData &));
696*0b57cec5SDimitry Andric   LLDB_REGISTER_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromCString,
697*0b57cec5SDimitry Andric                               (lldb::ByteOrder, uint32_t, const char *));
698*0b57cec5SDimitry Andric   LLDB_REGISTER_STATIC_METHOD(
699*0b57cec5SDimitry Andric       lldb::SBData, SBData, CreateDataFromUInt64Array,
700*0b57cec5SDimitry Andric       (lldb::ByteOrder, uint32_t, uint64_t *, size_t));
701*0b57cec5SDimitry Andric   LLDB_REGISTER_STATIC_METHOD(
702*0b57cec5SDimitry Andric       lldb::SBData, SBData, CreateDataFromUInt32Array,
703*0b57cec5SDimitry Andric       (lldb::ByteOrder, uint32_t, uint32_t *, size_t));
704*0b57cec5SDimitry Andric   LLDB_REGISTER_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromSInt64Array,
705*0b57cec5SDimitry Andric                               (lldb::ByteOrder, uint32_t, int64_t *, size_t));
706*0b57cec5SDimitry Andric   LLDB_REGISTER_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromSInt32Array,
707*0b57cec5SDimitry Andric                               (lldb::ByteOrder, uint32_t, int32_t *, size_t));
708*0b57cec5SDimitry Andric   LLDB_REGISTER_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromDoubleArray,
709*0b57cec5SDimitry Andric                               (lldb::ByteOrder, uint32_t, double *, size_t));
710*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, SetDataFromCString, (const char *));
711*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, SetDataFromUInt64Array,
712*0b57cec5SDimitry Andric                        (uint64_t *, size_t));
713*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, SetDataFromUInt32Array,
714*0b57cec5SDimitry Andric                        (uint32_t *, size_t));
715*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, SetDataFromSInt64Array,
716*0b57cec5SDimitry Andric                        (int64_t *, size_t));
717*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, SetDataFromSInt32Array,
718*0b57cec5SDimitry Andric                        (int32_t *, size_t));
719*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBData, SetDataFromDoubleArray,
720*0b57cec5SDimitry Andric                        (double *, size_t));
721*0b57cec5SDimitry Andric }
722*0b57cec5SDimitry Andric 
723*0b57cec5SDimitry Andric }
724*0b57cec5SDimitry Andric }
725