xref: /openbsd-src/gnu/llvm/lldb/source/API/SBData.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- SBData.cpp --------------------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "lldb/API/SBData.h"
10061da546Spatrick #include "lldb/API/SBError.h"
11061da546Spatrick #include "lldb/API/SBStream.h"
12*f6aab3d8Srobert #include "lldb/Utility/Instrumentation.h"
13061da546Spatrick 
14061da546Spatrick #include "lldb/Core/DumpDataExtractor.h"
15061da546Spatrick #include "lldb/Utility/DataBufferHeap.h"
16061da546Spatrick #include "lldb/Utility/DataExtractor.h"
17061da546Spatrick #include "lldb/Utility/Stream.h"
18061da546Spatrick 
19061da546Spatrick #include <cinttypes>
20061da546Spatrick #include <memory>
21061da546Spatrick 
22061da546Spatrick using namespace lldb;
23061da546Spatrick using namespace lldb_private;
24061da546Spatrick 
SBData()25061da546Spatrick SBData::SBData() : m_opaque_sp(new DataExtractor()) {
26*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this);
27061da546Spatrick }
28061da546Spatrick 
SBData(const lldb::DataExtractorSP & data_sp)29061da546Spatrick SBData::SBData(const lldb::DataExtractorSP &data_sp) : m_opaque_sp(data_sp) {}
30061da546Spatrick 
SBData(const SBData & rhs)31061da546Spatrick SBData::SBData(const SBData &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
32*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, rhs);
33061da546Spatrick }
34061da546Spatrick 
operator =(const SBData & rhs)35061da546Spatrick const SBData &SBData::operator=(const SBData &rhs) {
36*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, rhs);
37061da546Spatrick 
38061da546Spatrick   if (this != &rhs)
39061da546Spatrick     m_opaque_sp = rhs.m_opaque_sp;
40*f6aab3d8Srobert   return *this;
41061da546Spatrick }
42061da546Spatrick 
43dda28197Spatrick SBData::~SBData() = default;
44061da546Spatrick 
SetOpaque(const lldb::DataExtractorSP & data_sp)45061da546Spatrick void SBData::SetOpaque(const lldb::DataExtractorSP &data_sp) {
46061da546Spatrick   m_opaque_sp = data_sp;
47061da546Spatrick }
48061da546Spatrick 
get() const49061da546Spatrick lldb_private::DataExtractor *SBData::get() const { return m_opaque_sp.get(); }
50061da546Spatrick 
operator ->() const51061da546Spatrick lldb_private::DataExtractor *SBData::operator->() const {
52061da546Spatrick   return m_opaque_sp.operator->();
53061da546Spatrick }
54061da546Spatrick 
operator *()55061da546Spatrick lldb::DataExtractorSP &SBData::operator*() { return m_opaque_sp; }
56061da546Spatrick 
operator *() const57061da546Spatrick const lldb::DataExtractorSP &SBData::operator*() const { return m_opaque_sp; }
58061da546Spatrick 
IsValid()59061da546Spatrick bool SBData::IsValid() {
60*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this);
61061da546Spatrick   return this->operator bool();
62061da546Spatrick }
operator bool() const63061da546Spatrick SBData::operator bool() const {
64*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this);
65061da546Spatrick 
66061da546Spatrick   return m_opaque_sp.get() != nullptr;
67061da546Spatrick }
68061da546Spatrick 
GetAddressByteSize()69061da546Spatrick uint8_t SBData::GetAddressByteSize() {
70*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this);
71061da546Spatrick 
72061da546Spatrick   uint8_t value = 0;
73061da546Spatrick   if (m_opaque_sp.get())
74061da546Spatrick     value = m_opaque_sp->GetAddressByteSize();
75061da546Spatrick   return value;
76061da546Spatrick }
77061da546Spatrick 
SetAddressByteSize(uint8_t addr_byte_size)78061da546Spatrick void SBData::SetAddressByteSize(uint8_t addr_byte_size) {
79*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, addr_byte_size);
80061da546Spatrick 
81061da546Spatrick   if (m_opaque_sp.get())
82061da546Spatrick     m_opaque_sp->SetAddressByteSize(addr_byte_size);
83061da546Spatrick }
84061da546Spatrick 
Clear()85061da546Spatrick void SBData::Clear() {
86*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this);
87061da546Spatrick 
88061da546Spatrick   if (m_opaque_sp.get())
89061da546Spatrick     m_opaque_sp->Clear();
90061da546Spatrick }
91061da546Spatrick 
GetByteSize()92061da546Spatrick size_t SBData::GetByteSize() {
93*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this);
94061da546Spatrick 
95061da546Spatrick   size_t value = 0;
96061da546Spatrick   if (m_opaque_sp.get())
97061da546Spatrick     value = m_opaque_sp->GetByteSize();
98061da546Spatrick   return value;
99061da546Spatrick }
100061da546Spatrick 
GetByteOrder()101061da546Spatrick lldb::ByteOrder SBData::GetByteOrder() {
102*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this);
103061da546Spatrick 
104061da546Spatrick   lldb::ByteOrder value = eByteOrderInvalid;
105061da546Spatrick   if (m_opaque_sp.get())
106061da546Spatrick     value = m_opaque_sp->GetByteOrder();
107061da546Spatrick   return value;
108061da546Spatrick }
109061da546Spatrick 
SetByteOrder(lldb::ByteOrder endian)110061da546Spatrick void SBData::SetByteOrder(lldb::ByteOrder endian) {
111*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, endian);
112061da546Spatrick 
113061da546Spatrick   if (m_opaque_sp.get())
114061da546Spatrick     m_opaque_sp->SetByteOrder(endian);
115061da546Spatrick }
116061da546Spatrick 
GetFloat(lldb::SBError & error,lldb::offset_t offset)117061da546Spatrick float SBData::GetFloat(lldb::SBError &error, lldb::offset_t offset) {
118*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
119061da546Spatrick 
120061da546Spatrick   float value = 0;
121061da546Spatrick   if (!m_opaque_sp.get()) {
122061da546Spatrick     error.SetErrorString("no value to read from");
123061da546Spatrick   } else {
124061da546Spatrick     uint32_t old_offset = offset;
125061da546Spatrick     value = m_opaque_sp->GetFloat(&offset);
126061da546Spatrick     if (offset == old_offset)
127061da546Spatrick       error.SetErrorString("unable to read data");
128061da546Spatrick   }
129061da546Spatrick   return value;
130061da546Spatrick }
131061da546Spatrick 
GetDouble(lldb::SBError & error,lldb::offset_t offset)132061da546Spatrick double SBData::GetDouble(lldb::SBError &error, lldb::offset_t offset) {
133*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
134061da546Spatrick 
135061da546Spatrick   double value = 0;
136061da546Spatrick   if (!m_opaque_sp.get()) {
137061da546Spatrick     error.SetErrorString("no value to read from");
138061da546Spatrick   } else {
139061da546Spatrick     uint32_t old_offset = offset;
140061da546Spatrick     value = m_opaque_sp->GetDouble(&offset);
141061da546Spatrick     if (offset == old_offset)
142061da546Spatrick       error.SetErrorString("unable to read data");
143061da546Spatrick   }
144061da546Spatrick   return value;
145061da546Spatrick }
146061da546Spatrick 
GetLongDouble(lldb::SBError & error,lldb::offset_t offset)147061da546Spatrick long double SBData::GetLongDouble(lldb::SBError &error, lldb::offset_t offset) {
148*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
149061da546Spatrick 
150061da546Spatrick   long double value = 0;
151061da546Spatrick   if (!m_opaque_sp.get()) {
152061da546Spatrick     error.SetErrorString("no value to read from");
153061da546Spatrick   } else {
154061da546Spatrick     uint32_t old_offset = offset;
155061da546Spatrick     value = m_opaque_sp->GetLongDouble(&offset);
156061da546Spatrick     if (offset == old_offset)
157061da546Spatrick       error.SetErrorString("unable to read data");
158061da546Spatrick   }
159061da546Spatrick   return value;
160061da546Spatrick }
161061da546Spatrick 
GetAddress(lldb::SBError & error,lldb::offset_t offset)162061da546Spatrick lldb::addr_t SBData::GetAddress(lldb::SBError &error, lldb::offset_t offset) {
163*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
164061da546Spatrick 
165061da546Spatrick   lldb::addr_t value = 0;
166061da546Spatrick   if (!m_opaque_sp.get()) {
167061da546Spatrick     error.SetErrorString("no value to read from");
168061da546Spatrick   } else {
169061da546Spatrick     uint32_t old_offset = offset;
170061da546Spatrick     value = m_opaque_sp->GetAddress(&offset);
171061da546Spatrick     if (offset == old_offset)
172061da546Spatrick       error.SetErrorString("unable to read data");
173061da546Spatrick   }
174061da546Spatrick   return value;
175061da546Spatrick }
176061da546Spatrick 
GetUnsignedInt8(lldb::SBError & error,lldb::offset_t offset)177061da546Spatrick uint8_t SBData::GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset) {
178*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
179061da546Spatrick 
180061da546Spatrick   uint8_t value = 0;
181061da546Spatrick   if (!m_opaque_sp.get()) {
182061da546Spatrick     error.SetErrorString("no value to read from");
183061da546Spatrick   } else {
184061da546Spatrick     uint32_t old_offset = offset;
185061da546Spatrick     value = m_opaque_sp->GetU8(&offset);
186061da546Spatrick     if (offset == old_offset)
187061da546Spatrick       error.SetErrorString("unable to read data");
188061da546Spatrick   }
189061da546Spatrick   return value;
190061da546Spatrick }
191061da546Spatrick 
GetUnsignedInt16(lldb::SBError & error,lldb::offset_t offset)192061da546Spatrick uint16_t SBData::GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset) {
193*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
194061da546Spatrick 
195061da546Spatrick   uint16_t value = 0;
196061da546Spatrick   if (!m_opaque_sp.get()) {
197061da546Spatrick     error.SetErrorString("no value to read from");
198061da546Spatrick   } else {
199061da546Spatrick     uint32_t old_offset = offset;
200061da546Spatrick     value = m_opaque_sp->GetU16(&offset);
201061da546Spatrick     if (offset == old_offset)
202061da546Spatrick       error.SetErrorString("unable to read data");
203061da546Spatrick   }
204061da546Spatrick   return value;
205061da546Spatrick }
206061da546Spatrick 
GetUnsignedInt32(lldb::SBError & error,lldb::offset_t offset)207061da546Spatrick uint32_t SBData::GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset) {
208*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
209061da546Spatrick 
210061da546Spatrick   uint32_t value = 0;
211061da546Spatrick   if (!m_opaque_sp.get()) {
212061da546Spatrick     error.SetErrorString("no value to read from");
213061da546Spatrick   } else {
214061da546Spatrick     uint32_t old_offset = offset;
215061da546Spatrick     value = m_opaque_sp->GetU32(&offset);
216061da546Spatrick     if (offset == old_offset)
217061da546Spatrick       error.SetErrorString("unable to read data");
218061da546Spatrick   }
219061da546Spatrick   return value;
220061da546Spatrick }
221061da546Spatrick 
GetUnsignedInt64(lldb::SBError & error,lldb::offset_t offset)222061da546Spatrick uint64_t SBData::GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset) {
223*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
224061da546Spatrick 
225061da546Spatrick   uint64_t value = 0;
226061da546Spatrick   if (!m_opaque_sp.get()) {
227061da546Spatrick     error.SetErrorString("no value to read from");
228061da546Spatrick   } else {
229061da546Spatrick     uint32_t old_offset = offset;
230061da546Spatrick     value = m_opaque_sp->GetU64(&offset);
231061da546Spatrick     if (offset == old_offset)
232061da546Spatrick       error.SetErrorString("unable to read data");
233061da546Spatrick   }
234061da546Spatrick   return value;
235061da546Spatrick }
236061da546Spatrick 
GetSignedInt8(lldb::SBError & error,lldb::offset_t offset)237061da546Spatrick int8_t SBData::GetSignedInt8(lldb::SBError &error, lldb::offset_t offset) {
238*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
239061da546Spatrick 
240061da546Spatrick   int8_t value = 0;
241061da546Spatrick   if (!m_opaque_sp.get()) {
242061da546Spatrick     error.SetErrorString("no value to read from");
243061da546Spatrick   } else {
244061da546Spatrick     uint32_t old_offset = offset;
245061da546Spatrick     value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
246061da546Spatrick     if (offset == old_offset)
247061da546Spatrick       error.SetErrorString("unable to read data");
248061da546Spatrick   }
249061da546Spatrick   return value;
250061da546Spatrick }
251061da546Spatrick 
GetSignedInt16(lldb::SBError & error,lldb::offset_t offset)252061da546Spatrick int16_t SBData::GetSignedInt16(lldb::SBError &error, lldb::offset_t offset) {
253*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
254061da546Spatrick 
255061da546Spatrick   int16_t value = 0;
256061da546Spatrick   if (!m_opaque_sp.get()) {
257061da546Spatrick     error.SetErrorString("no value to read from");
258061da546Spatrick   } else {
259061da546Spatrick     uint32_t old_offset = offset;
260061da546Spatrick     value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
261061da546Spatrick     if (offset == old_offset)
262061da546Spatrick       error.SetErrorString("unable to read data");
263061da546Spatrick   }
264061da546Spatrick   return value;
265061da546Spatrick }
266061da546Spatrick 
GetSignedInt32(lldb::SBError & error,lldb::offset_t offset)267061da546Spatrick int32_t SBData::GetSignedInt32(lldb::SBError &error, lldb::offset_t offset) {
268*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
269061da546Spatrick 
270061da546Spatrick   int32_t value = 0;
271061da546Spatrick   if (!m_opaque_sp.get()) {
272061da546Spatrick     error.SetErrorString("no value to read from");
273061da546Spatrick   } else {
274061da546Spatrick     uint32_t old_offset = offset;
275061da546Spatrick     value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
276061da546Spatrick     if (offset == old_offset)
277061da546Spatrick       error.SetErrorString("unable to read data");
278061da546Spatrick   }
279061da546Spatrick   return value;
280061da546Spatrick }
281061da546Spatrick 
GetSignedInt64(lldb::SBError & error,lldb::offset_t offset)282061da546Spatrick int64_t SBData::GetSignedInt64(lldb::SBError &error, lldb::offset_t offset) {
283*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
284061da546Spatrick 
285061da546Spatrick   int64_t value = 0;
286061da546Spatrick   if (!m_opaque_sp.get()) {
287061da546Spatrick     error.SetErrorString("no value to read from");
288061da546Spatrick   } else {
289061da546Spatrick     uint32_t old_offset = offset;
290061da546Spatrick     value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
291061da546Spatrick     if (offset == old_offset)
292061da546Spatrick       error.SetErrorString("unable to read data");
293061da546Spatrick   }
294061da546Spatrick   return value;
295061da546Spatrick }
296061da546Spatrick 
GetString(lldb::SBError & error,lldb::offset_t offset)297061da546Spatrick const char *SBData::GetString(lldb::SBError &error, lldb::offset_t offset) {
298*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset);
299061da546Spatrick 
300061da546Spatrick   const char *value = nullptr;
301061da546Spatrick   if (!m_opaque_sp.get()) {
302061da546Spatrick     error.SetErrorString("no value to read from");
303061da546Spatrick   } else {
304061da546Spatrick     uint32_t old_offset = offset;
305061da546Spatrick     value = m_opaque_sp->GetCStr(&offset);
306061da546Spatrick     if (offset == old_offset || (value == nullptr))
307061da546Spatrick       error.SetErrorString("unable to read data");
308061da546Spatrick   }
309061da546Spatrick   return value;
310061da546Spatrick }
311061da546Spatrick 
GetDescription(lldb::SBStream & description,lldb::addr_t base_addr)312061da546Spatrick bool SBData::GetDescription(lldb::SBStream &description,
313061da546Spatrick                             lldb::addr_t base_addr) {
314*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, description, base_addr);
315061da546Spatrick 
316061da546Spatrick   Stream &strm = description.ref();
317061da546Spatrick 
318061da546Spatrick   if (m_opaque_sp) {
319061da546Spatrick     DumpDataExtractor(*m_opaque_sp, &strm, 0, lldb::eFormatBytesWithASCII, 1,
320061da546Spatrick                       m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0);
321061da546Spatrick   } else
322061da546Spatrick     strm.PutCString("No value");
323061da546Spatrick 
324061da546Spatrick   return true;
325061da546Spatrick }
326061da546Spatrick 
ReadRawData(lldb::SBError & error,lldb::offset_t offset,void * buf,size_t size)327061da546Spatrick size_t SBData::ReadRawData(lldb::SBError &error, lldb::offset_t offset,
328061da546Spatrick                            void *buf, size_t size) {
329*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, offset, buf, size);
330061da546Spatrick 
331061da546Spatrick   void *ok = nullptr;
332061da546Spatrick   if (!m_opaque_sp.get()) {
333061da546Spatrick     error.SetErrorString("no value to read from");
334061da546Spatrick   } else {
335061da546Spatrick     uint32_t old_offset = offset;
336061da546Spatrick     ok = m_opaque_sp->GetU8(&offset, buf, size);
337061da546Spatrick     if ((offset == old_offset) || (ok == nullptr))
338061da546Spatrick       error.SetErrorString("unable to read data");
339061da546Spatrick   }
340061da546Spatrick   return ok ? size : 0;
341061da546Spatrick }
342061da546Spatrick 
SetData(lldb::SBError & error,const void * buf,size_t size,lldb::ByteOrder endian,uint8_t addr_size)343061da546Spatrick void SBData::SetData(lldb::SBError &error, const void *buf, size_t size,
344061da546Spatrick                      lldb::ByteOrder endian, uint8_t addr_size) {
345*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
346061da546Spatrick 
347061da546Spatrick   if (!m_opaque_sp.get())
348061da546Spatrick     m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
349061da546Spatrick   else
350061da546Spatrick   {
351061da546Spatrick     m_opaque_sp->SetData(buf, size, endian);
352061da546Spatrick     m_opaque_sp->SetAddressByteSize(addr_size);
353061da546Spatrick   }
354061da546Spatrick }
355061da546Spatrick 
SetDataWithOwnership(lldb::SBError & error,const void * buf,size_t size,lldb::ByteOrder endian,uint8_t addr_size)356*f6aab3d8Srobert void SBData::SetDataWithOwnership(lldb::SBError &error, const void *buf,
357*f6aab3d8Srobert                                   size_t size, lldb::ByteOrder endian,
358*f6aab3d8Srobert                                   uint8_t addr_size) {
359*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
360*f6aab3d8Srobert 
361*f6aab3d8Srobert   lldb::DataBufferSP buffer_sp = std::make_shared<DataBufferHeap>(buf, size);
362*f6aab3d8Srobert 
363*f6aab3d8Srobert   if (!m_opaque_sp.get())
364*f6aab3d8Srobert     m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
365*f6aab3d8Srobert   else {
366*f6aab3d8Srobert     m_opaque_sp->SetData(buffer_sp);
367*f6aab3d8Srobert     m_opaque_sp->SetByteOrder(endian);
368*f6aab3d8Srobert     m_opaque_sp->SetAddressByteSize(addr_size);
369*f6aab3d8Srobert   }
370*f6aab3d8Srobert }
371*f6aab3d8Srobert 
Append(const SBData & rhs)372061da546Spatrick bool SBData::Append(const SBData &rhs) {
373*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, rhs);
374061da546Spatrick 
375061da546Spatrick   bool value = false;
376061da546Spatrick   if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
377061da546Spatrick     value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
378061da546Spatrick   return value;
379061da546Spatrick }
380061da546Spatrick 
CreateDataFromCString(lldb::ByteOrder endian,uint32_t addr_byte_size,const char * data)381061da546Spatrick lldb::SBData SBData::CreateDataFromCString(lldb::ByteOrder endian,
382061da546Spatrick                                            uint32_t addr_byte_size,
383061da546Spatrick                                            const char *data) {
384*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(endian, addr_byte_size, data);
385061da546Spatrick 
386061da546Spatrick   if (!data || !data[0])
387*f6aab3d8Srobert     return SBData();
388061da546Spatrick 
389061da546Spatrick   uint32_t data_len = strlen(data);
390061da546Spatrick 
391061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
392061da546Spatrick   lldb::DataExtractorSP data_sp(
393061da546Spatrick       new DataExtractor(buffer_sp, endian, addr_byte_size));
394061da546Spatrick 
395061da546Spatrick   SBData ret(data_sp);
396061da546Spatrick 
397*f6aab3d8Srobert   return ret;
398061da546Spatrick }
399061da546Spatrick 
CreateDataFromUInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint64_t * array,size_t array_len)400061da546Spatrick lldb::SBData SBData::CreateDataFromUInt64Array(lldb::ByteOrder endian,
401061da546Spatrick                                                uint32_t addr_byte_size,
402061da546Spatrick                                                uint64_t *array,
403061da546Spatrick                                                size_t array_len) {
404*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
405061da546Spatrick 
406061da546Spatrick   if (!array || array_len == 0)
407*f6aab3d8Srobert     return SBData();
408061da546Spatrick 
409061da546Spatrick   size_t data_len = array_len * sizeof(uint64_t);
410061da546Spatrick 
411061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
412061da546Spatrick   lldb::DataExtractorSP data_sp(
413061da546Spatrick       new DataExtractor(buffer_sp, endian, addr_byte_size));
414061da546Spatrick 
415061da546Spatrick   SBData ret(data_sp);
416061da546Spatrick 
417*f6aab3d8Srobert   return ret;
418061da546Spatrick }
419061da546Spatrick 
CreateDataFromUInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint32_t * array,size_t array_len)420061da546Spatrick lldb::SBData SBData::CreateDataFromUInt32Array(lldb::ByteOrder endian,
421061da546Spatrick                                                uint32_t addr_byte_size,
422061da546Spatrick                                                uint32_t *array,
423061da546Spatrick                                                size_t array_len) {
424*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
425061da546Spatrick 
426061da546Spatrick   if (!array || array_len == 0)
427*f6aab3d8Srobert     return SBData();
428061da546Spatrick 
429061da546Spatrick   size_t data_len = array_len * sizeof(uint32_t);
430061da546Spatrick 
431061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
432061da546Spatrick   lldb::DataExtractorSP data_sp(
433061da546Spatrick       new DataExtractor(buffer_sp, endian, addr_byte_size));
434061da546Spatrick 
435061da546Spatrick   SBData ret(data_sp);
436061da546Spatrick 
437*f6aab3d8Srobert   return ret;
438061da546Spatrick }
439061da546Spatrick 
CreateDataFromSInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int64_t * array,size_t array_len)440061da546Spatrick lldb::SBData SBData::CreateDataFromSInt64Array(lldb::ByteOrder endian,
441061da546Spatrick                                                uint32_t addr_byte_size,
442061da546Spatrick                                                int64_t *array,
443061da546Spatrick                                                size_t array_len) {
444*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
445061da546Spatrick 
446061da546Spatrick   if (!array || array_len == 0)
447*f6aab3d8Srobert     return SBData();
448061da546Spatrick 
449061da546Spatrick   size_t data_len = array_len * sizeof(int64_t);
450061da546Spatrick 
451061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
452061da546Spatrick   lldb::DataExtractorSP data_sp(
453061da546Spatrick       new DataExtractor(buffer_sp, endian, addr_byte_size));
454061da546Spatrick 
455061da546Spatrick   SBData ret(data_sp);
456061da546Spatrick 
457*f6aab3d8Srobert   return ret;
458061da546Spatrick }
459061da546Spatrick 
CreateDataFromSInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int32_t * array,size_t array_len)460061da546Spatrick lldb::SBData SBData::CreateDataFromSInt32Array(lldb::ByteOrder endian,
461061da546Spatrick                                                uint32_t addr_byte_size,
462061da546Spatrick                                                int32_t *array,
463061da546Spatrick                                                size_t array_len) {
464*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
465061da546Spatrick 
466061da546Spatrick   if (!array || array_len == 0)
467*f6aab3d8Srobert     return SBData();
468061da546Spatrick 
469061da546Spatrick   size_t data_len = array_len * sizeof(int32_t);
470061da546Spatrick 
471061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
472061da546Spatrick   lldb::DataExtractorSP data_sp(
473061da546Spatrick       new DataExtractor(buffer_sp, endian, addr_byte_size));
474061da546Spatrick 
475061da546Spatrick   SBData ret(data_sp);
476061da546Spatrick 
477*f6aab3d8Srobert   return ret;
478061da546Spatrick }
479061da546Spatrick 
CreateDataFromDoubleArray(lldb::ByteOrder endian,uint32_t addr_byte_size,double * array,size_t array_len)480061da546Spatrick lldb::SBData SBData::CreateDataFromDoubleArray(lldb::ByteOrder endian,
481061da546Spatrick                                                uint32_t addr_byte_size,
482061da546Spatrick                                                double *array,
483061da546Spatrick                                                size_t array_len) {
484*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
485061da546Spatrick 
486061da546Spatrick   if (!array || array_len == 0)
487*f6aab3d8Srobert     return SBData();
488061da546Spatrick 
489061da546Spatrick   size_t data_len = array_len * sizeof(double);
490061da546Spatrick 
491061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
492061da546Spatrick   lldb::DataExtractorSP data_sp(
493061da546Spatrick       new DataExtractor(buffer_sp, endian, addr_byte_size));
494061da546Spatrick 
495061da546Spatrick   SBData ret(data_sp);
496061da546Spatrick 
497*f6aab3d8Srobert   return ret;
498061da546Spatrick }
499061da546Spatrick 
SetDataFromCString(const char * data)500061da546Spatrick bool SBData::SetDataFromCString(const char *data) {
501*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, data);
502061da546Spatrick 
503061da546Spatrick   if (!data) {
504061da546Spatrick     return false;
505061da546Spatrick   }
506061da546Spatrick 
507061da546Spatrick   size_t data_len = strlen(data);
508061da546Spatrick 
509061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
510061da546Spatrick 
511061da546Spatrick   if (!m_opaque_sp.get())
512061da546Spatrick     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
513061da546Spatrick                                                   GetAddressByteSize());
514061da546Spatrick   else
515061da546Spatrick     m_opaque_sp->SetData(buffer_sp);
516061da546Spatrick 
517061da546Spatrick 
518061da546Spatrick   return true;
519061da546Spatrick }
520061da546Spatrick 
SetDataFromUInt64Array(uint64_t * array,size_t array_len)521061da546Spatrick bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) {
522*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, array, array_len);
523061da546Spatrick 
524061da546Spatrick   if (!array || array_len == 0) {
525061da546Spatrick     return false;
526061da546Spatrick   }
527061da546Spatrick 
528061da546Spatrick   size_t data_len = array_len * sizeof(uint64_t);
529061da546Spatrick 
530061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
531061da546Spatrick 
532061da546Spatrick   if (!m_opaque_sp.get())
533061da546Spatrick     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
534061da546Spatrick                                                   GetAddressByteSize());
535061da546Spatrick   else
536061da546Spatrick     m_opaque_sp->SetData(buffer_sp);
537061da546Spatrick 
538061da546Spatrick 
539061da546Spatrick   return true;
540061da546Spatrick }
541061da546Spatrick 
SetDataFromUInt32Array(uint32_t * array,size_t array_len)542061da546Spatrick bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) {
543*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, array, array_len);
544061da546Spatrick 
545061da546Spatrick   if (!array || array_len == 0) {
546061da546Spatrick     return false;
547061da546Spatrick   }
548061da546Spatrick 
549061da546Spatrick   size_t data_len = array_len * sizeof(uint32_t);
550061da546Spatrick 
551061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
552061da546Spatrick 
553061da546Spatrick   if (!m_opaque_sp.get())
554061da546Spatrick     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
555061da546Spatrick                                                   GetAddressByteSize());
556061da546Spatrick   else
557061da546Spatrick     m_opaque_sp->SetData(buffer_sp);
558061da546Spatrick 
559061da546Spatrick   return true;
560061da546Spatrick }
561061da546Spatrick 
SetDataFromSInt64Array(int64_t * array,size_t array_len)562061da546Spatrick bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) {
563*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, array, array_len);
564061da546Spatrick 
565061da546Spatrick   if (!array || array_len == 0) {
566061da546Spatrick     return false;
567061da546Spatrick   }
568061da546Spatrick 
569061da546Spatrick   size_t data_len = array_len * sizeof(int64_t);
570061da546Spatrick 
571061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
572061da546Spatrick 
573061da546Spatrick   if (!m_opaque_sp.get())
574061da546Spatrick     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
575061da546Spatrick                                                   GetAddressByteSize());
576061da546Spatrick   else
577061da546Spatrick     m_opaque_sp->SetData(buffer_sp);
578061da546Spatrick 
579061da546Spatrick   return true;
580061da546Spatrick }
581061da546Spatrick 
SetDataFromSInt32Array(int32_t * array,size_t array_len)582061da546Spatrick bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) {
583*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, array, array_len);
584061da546Spatrick 
585061da546Spatrick   if (!array || array_len == 0) {
586061da546Spatrick     return false;
587061da546Spatrick   }
588061da546Spatrick 
589061da546Spatrick   size_t data_len = array_len * sizeof(int32_t);
590061da546Spatrick 
591061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
592061da546Spatrick 
593061da546Spatrick   if (!m_opaque_sp.get())
594061da546Spatrick     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
595061da546Spatrick                                                   GetAddressByteSize());
596061da546Spatrick   else
597061da546Spatrick     m_opaque_sp->SetData(buffer_sp);
598061da546Spatrick 
599061da546Spatrick   return true;
600061da546Spatrick }
601061da546Spatrick 
SetDataFromDoubleArray(double * array,size_t array_len)602061da546Spatrick bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) {
603*f6aab3d8Srobert   LLDB_INSTRUMENT_VA(this, array, array_len);
604061da546Spatrick 
605061da546Spatrick   if (!array || array_len == 0) {
606061da546Spatrick     return false;
607061da546Spatrick   }
608061da546Spatrick 
609061da546Spatrick   size_t data_len = array_len * sizeof(double);
610061da546Spatrick 
611061da546Spatrick   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
612061da546Spatrick 
613061da546Spatrick   if (!m_opaque_sp.get())
614061da546Spatrick     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
615061da546Spatrick                                                   GetAddressByteSize());
616061da546Spatrick   else
617061da546Spatrick     m_opaque_sp->SetData(buffer_sp);
618061da546Spatrick 
619061da546Spatrick   return true;
620061da546Spatrick }
621