180814287SRaphael Isemann //===-- SBData.cpp --------------------------------------------------------===//
29128ee2fSEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69128ee2fSEnrico Granata //
79128ee2fSEnrico Granata //===----------------------------------------------------------------------===//
89128ee2fSEnrico Granata 
99128ee2fSEnrico Granata #include "lldb/API/SBData.h"
109128ee2fSEnrico Granata #include "lldb/API/SBError.h"
119128ee2fSEnrico Granata #include "lldb/API/SBStream.h"
12*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
139128ee2fSEnrico Granata 
1429cb868aSZachary Turner #include "lldb/Core/DumpDataExtractor.h"
15666cc0b2SZachary Turner #include "lldb/Utility/DataBufferHeap.h"
16666cc0b2SZachary Turner #include "lldb/Utility/DataExtractor.h"
17bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
18da7bc7d0SGreg Clayton 
19796ac80bSJonas Devlieghere #include <cinttypes>
20796ac80bSJonas Devlieghere #include <memory>
21796ac80bSJonas Devlieghere 
229128ee2fSEnrico Granata using namespace lldb;
239128ee2fSEnrico Granata using namespace lldb_private;
249128ee2fSEnrico Granata 
SBData()25baf5664fSJonas Devlieghere SBData::SBData() : m_opaque_sp(new DataExtractor()) {
26*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
27baf5664fSJonas Devlieghere }
289128ee2fSEnrico Granata 
SBData(const lldb::DataExtractorSP & data_sp)29b9c1b51eSKate Stone SBData::SBData(const lldb::DataExtractorSP &data_sp) : m_opaque_sp(data_sp) {}
309128ee2fSEnrico Granata 
SBData(const SBData & rhs)31baf5664fSJonas Devlieghere SBData::SBData(const SBData &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
32*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
33baf5664fSJonas Devlieghere }
349128ee2fSEnrico Granata 
operator =(const SBData & rhs)35b9c1b51eSKate Stone const SBData &SBData::operator=(const SBData &rhs) {
36*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
37baf5664fSJonas Devlieghere 
389128ee2fSEnrico Granata   if (this != &rhs)
399128ee2fSEnrico Granata     m_opaque_sp = rhs.m_opaque_sp;
40d232abc3SJonas Devlieghere   return *this;
419128ee2fSEnrico Granata }
429128ee2fSEnrico Granata 
43866b7a65SJonas Devlieghere SBData::~SBData() = default;
449128ee2fSEnrico Granata 
SetOpaque(const lldb::DataExtractorSP & data_sp)45b9c1b51eSKate Stone void SBData::SetOpaque(const lldb::DataExtractorSP &data_sp) {
469128ee2fSEnrico Granata   m_opaque_sp = data_sp;
479128ee2fSEnrico Granata }
489128ee2fSEnrico Granata 
get() const49b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::get() const { return m_opaque_sp.get(); }
509128ee2fSEnrico Granata 
operator ->() const51b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::operator->() const {
529128ee2fSEnrico Granata   return m_opaque_sp.operator->();
539128ee2fSEnrico Granata }
549128ee2fSEnrico Granata 
operator *()55b9c1b51eSKate Stone lldb::DataExtractorSP &SBData::operator*() { return m_opaque_sp; }
569128ee2fSEnrico Granata 
operator *() const57b9c1b51eSKate Stone const lldb::DataExtractorSP &SBData::operator*() const { return m_opaque_sp; }
589128ee2fSEnrico Granata 
IsValid()59baf5664fSJonas Devlieghere bool SBData::IsValid() {
60*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
617f5237bcSPavel Labath   return this->operator bool();
627f5237bcSPavel Labath }
operator bool() const637f5237bcSPavel Labath SBData::operator bool() const {
64*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
65baf5664fSJonas Devlieghere 
66248a1305SKonrad Kleine   return m_opaque_sp.get() != nullptr;
67baf5664fSJonas Devlieghere }
689128ee2fSEnrico Granata 
GetAddressByteSize()69b9c1b51eSKate Stone uint8_t SBData::GetAddressByteSize() {
70*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
71baf5664fSJonas Devlieghere 
729128ee2fSEnrico Granata   uint8_t value = 0;
739128ee2fSEnrico Granata   if (m_opaque_sp.get())
749128ee2fSEnrico Granata     value = m_opaque_sp->GetAddressByteSize();
759128ee2fSEnrico Granata   return value;
769128ee2fSEnrico Granata }
779128ee2fSEnrico Granata 
SetAddressByteSize(uint8_t addr_byte_size)78b9c1b51eSKate Stone void SBData::SetAddressByteSize(uint8_t addr_byte_size) {
79*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, addr_byte_size);
80baf5664fSJonas Devlieghere 
810f28986aSGreg Clayton   if (m_opaque_sp.get())
820f28986aSGreg Clayton     m_opaque_sp->SetAddressByteSize(addr_byte_size);
830f28986aSGreg Clayton }
840f28986aSGreg Clayton 
Clear()85b9c1b51eSKate Stone void SBData::Clear() {
86*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
87baf5664fSJonas Devlieghere 
889128ee2fSEnrico Granata   if (m_opaque_sp.get())
899128ee2fSEnrico Granata     m_opaque_sp->Clear();
909128ee2fSEnrico Granata }
919128ee2fSEnrico Granata 
GetByteSize()92b9c1b51eSKate Stone size_t SBData::GetByteSize() {
93*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
94baf5664fSJonas Devlieghere 
959128ee2fSEnrico Granata   size_t value = 0;
969128ee2fSEnrico Granata   if (m_opaque_sp.get())
979128ee2fSEnrico Granata     value = m_opaque_sp->GetByteSize();
989128ee2fSEnrico Granata   return value;
999128ee2fSEnrico Granata }
1009128ee2fSEnrico Granata 
GetByteOrder()101b9c1b51eSKate Stone lldb::ByteOrder SBData::GetByteOrder() {
102*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
103baf5664fSJonas Devlieghere 
1049128ee2fSEnrico Granata   lldb::ByteOrder value = eByteOrderInvalid;
1059128ee2fSEnrico Granata   if (m_opaque_sp.get())
1069128ee2fSEnrico Granata     value = m_opaque_sp->GetByteOrder();
1079128ee2fSEnrico Granata   return value;
1089128ee2fSEnrico Granata }
1099128ee2fSEnrico Granata 
SetByteOrder(lldb::ByteOrder endian)110b9c1b51eSKate Stone void SBData::SetByteOrder(lldb::ByteOrder endian) {
111*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, endian);
112baf5664fSJonas Devlieghere 
1130f28986aSGreg Clayton   if (m_opaque_sp.get())
1140f28986aSGreg Clayton     m_opaque_sp->SetByteOrder(endian);
1150f28986aSGreg Clayton }
1160f28986aSGreg Clayton 
GetFloat(lldb::SBError & error,lldb::offset_t offset)117b9c1b51eSKate Stone float SBData::GetFloat(lldb::SBError &error, lldb::offset_t offset) {
118*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
119baf5664fSJonas Devlieghere 
1209128ee2fSEnrico Granata   float value = 0;
121b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
1229128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
123b9c1b51eSKate Stone   } else {
1249128ee2fSEnrico Granata     uint32_t old_offset = offset;
1259128ee2fSEnrico Granata     value = m_opaque_sp->GetFloat(&offset);
1269128ee2fSEnrico Granata     if (offset == old_offset)
1279128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
1289128ee2fSEnrico Granata   }
1299128ee2fSEnrico Granata   return value;
1309128ee2fSEnrico Granata }
1319128ee2fSEnrico Granata 
GetDouble(lldb::SBError & error,lldb::offset_t offset)132b9c1b51eSKate Stone double SBData::GetDouble(lldb::SBError &error, lldb::offset_t offset) {
133*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
134baf5664fSJonas Devlieghere 
1359128ee2fSEnrico Granata   double value = 0;
136b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
1379128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
138b9c1b51eSKate Stone   } else {
1399128ee2fSEnrico Granata     uint32_t old_offset = offset;
1409128ee2fSEnrico Granata     value = m_opaque_sp->GetDouble(&offset);
1419128ee2fSEnrico Granata     if (offset == old_offset)
1429128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
1439128ee2fSEnrico Granata   }
1449128ee2fSEnrico Granata   return value;
1459128ee2fSEnrico Granata }
1469128ee2fSEnrico Granata 
GetLongDouble(lldb::SBError & error,lldb::offset_t offset)147b9c1b51eSKate Stone long double SBData::GetLongDouble(lldb::SBError &error, lldb::offset_t offset) {
148*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
149baf5664fSJonas Devlieghere 
1509128ee2fSEnrico Granata   long double value = 0;
151b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
1529128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
153b9c1b51eSKate Stone   } else {
1549128ee2fSEnrico Granata     uint32_t old_offset = offset;
1559128ee2fSEnrico Granata     value = m_opaque_sp->GetLongDouble(&offset);
1569128ee2fSEnrico Granata     if (offset == old_offset)
1579128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
1589128ee2fSEnrico Granata   }
1599128ee2fSEnrico Granata   return value;
1609128ee2fSEnrico Granata }
1619128ee2fSEnrico Granata 
GetAddress(lldb::SBError & error,lldb::offset_t offset)162b9c1b51eSKate Stone lldb::addr_t SBData::GetAddress(lldb::SBError &error, lldb::offset_t offset) {
163*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
164baf5664fSJonas Devlieghere 
1659128ee2fSEnrico Granata   lldb::addr_t value = 0;
166b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
1679128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
168b9c1b51eSKate Stone   } else {
1699128ee2fSEnrico Granata     uint32_t old_offset = offset;
1709128ee2fSEnrico Granata     value = m_opaque_sp->GetAddress(&offset);
1719128ee2fSEnrico Granata     if (offset == old_offset)
1729128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
1739128ee2fSEnrico Granata   }
1749128ee2fSEnrico Granata   return value;
1759128ee2fSEnrico Granata }
1769128ee2fSEnrico Granata 
GetUnsignedInt8(lldb::SBError & error,lldb::offset_t offset)177b9c1b51eSKate Stone uint8_t SBData::GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset) {
178*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
179baf5664fSJonas Devlieghere 
1809128ee2fSEnrico Granata   uint8_t value = 0;
181b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
1829128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
183b9c1b51eSKate Stone   } else {
1849128ee2fSEnrico Granata     uint32_t old_offset = offset;
1859128ee2fSEnrico Granata     value = m_opaque_sp->GetU8(&offset);
1869128ee2fSEnrico Granata     if (offset == old_offset)
1879128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
1889128ee2fSEnrico Granata   }
1899128ee2fSEnrico Granata   return value;
1909128ee2fSEnrico Granata }
1919128ee2fSEnrico Granata 
GetUnsignedInt16(lldb::SBError & error,lldb::offset_t offset)192b9c1b51eSKate Stone uint16_t SBData::GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset) {
193*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
194baf5664fSJonas Devlieghere 
1959128ee2fSEnrico Granata   uint16_t value = 0;
196b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
1979128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
198b9c1b51eSKate Stone   } else {
1999128ee2fSEnrico Granata     uint32_t old_offset = offset;
2009128ee2fSEnrico Granata     value = m_opaque_sp->GetU16(&offset);
2019128ee2fSEnrico Granata     if (offset == old_offset)
2029128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
2039128ee2fSEnrico Granata   }
2049128ee2fSEnrico Granata   return value;
2059128ee2fSEnrico Granata }
2069128ee2fSEnrico Granata 
GetUnsignedInt32(lldb::SBError & error,lldb::offset_t offset)207b9c1b51eSKate Stone uint32_t SBData::GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset) {
208*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
209baf5664fSJonas Devlieghere 
2109128ee2fSEnrico Granata   uint32_t value = 0;
211b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
2129128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
213b9c1b51eSKate Stone   } else {
2149128ee2fSEnrico Granata     uint32_t old_offset = offset;
2159128ee2fSEnrico Granata     value = m_opaque_sp->GetU32(&offset);
2169128ee2fSEnrico Granata     if (offset == old_offset)
2179128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
2189128ee2fSEnrico Granata   }
2199128ee2fSEnrico Granata   return value;
2209128ee2fSEnrico Granata }
2219128ee2fSEnrico Granata 
GetUnsignedInt64(lldb::SBError & error,lldb::offset_t offset)222b9c1b51eSKate Stone uint64_t SBData::GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset) {
223*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
224baf5664fSJonas Devlieghere 
2259128ee2fSEnrico Granata   uint64_t value = 0;
226b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
2279128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
228b9c1b51eSKate Stone   } else {
2299128ee2fSEnrico Granata     uint32_t old_offset = offset;
2309128ee2fSEnrico Granata     value = m_opaque_sp->GetU64(&offset);
2319128ee2fSEnrico Granata     if (offset == old_offset)
2329128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
2339128ee2fSEnrico Granata   }
2349128ee2fSEnrico Granata   return value;
2359128ee2fSEnrico Granata }
2369128ee2fSEnrico Granata 
GetSignedInt8(lldb::SBError & error,lldb::offset_t offset)237b9c1b51eSKate Stone int8_t SBData::GetSignedInt8(lldb::SBError &error, lldb::offset_t offset) {
238*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
239baf5664fSJonas Devlieghere 
2409128ee2fSEnrico Granata   int8_t value = 0;
241b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
2429128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
243b9c1b51eSKate Stone   } else {
2449128ee2fSEnrico Granata     uint32_t old_offset = offset;
2459128ee2fSEnrico Granata     value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
2469128ee2fSEnrico Granata     if (offset == old_offset)
2479128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
2489128ee2fSEnrico Granata   }
2499128ee2fSEnrico Granata   return value;
2509128ee2fSEnrico Granata }
2519128ee2fSEnrico Granata 
GetSignedInt16(lldb::SBError & error,lldb::offset_t offset)252b9c1b51eSKate Stone int16_t SBData::GetSignedInt16(lldb::SBError &error, lldb::offset_t offset) {
253*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
254baf5664fSJonas Devlieghere 
2559128ee2fSEnrico Granata   int16_t value = 0;
256b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
2579128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
258b9c1b51eSKate Stone   } else {
2599128ee2fSEnrico Granata     uint32_t old_offset = offset;
2609128ee2fSEnrico Granata     value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
2619128ee2fSEnrico Granata     if (offset == old_offset)
2629128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
2639128ee2fSEnrico Granata   }
2649128ee2fSEnrico Granata   return value;
2659128ee2fSEnrico Granata }
2669128ee2fSEnrico Granata 
GetSignedInt32(lldb::SBError & error,lldb::offset_t offset)267b9c1b51eSKate Stone int32_t SBData::GetSignedInt32(lldb::SBError &error, lldb::offset_t offset) {
268*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
269baf5664fSJonas Devlieghere 
2709128ee2fSEnrico Granata   int32_t value = 0;
271b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
2729128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
273b9c1b51eSKate Stone   } else {
2749128ee2fSEnrico Granata     uint32_t old_offset = offset;
2759128ee2fSEnrico Granata     value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
2769128ee2fSEnrico Granata     if (offset == old_offset)
2779128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
2789128ee2fSEnrico Granata   }
2799128ee2fSEnrico Granata   return value;
2809128ee2fSEnrico Granata }
2819128ee2fSEnrico Granata 
GetSignedInt64(lldb::SBError & error,lldb::offset_t offset)282b9c1b51eSKate Stone int64_t SBData::GetSignedInt64(lldb::SBError &error, lldb::offset_t offset) {
283*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
284baf5664fSJonas Devlieghere 
2859128ee2fSEnrico Granata   int64_t value = 0;
286b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
2879128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
288b9c1b51eSKate Stone   } else {
2899128ee2fSEnrico Granata     uint32_t old_offset = offset;
2909128ee2fSEnrico Granata     value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
2919128ee2fSEnrico Granata     if (offset == old_offset)
2929128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
2939128ee2fSEnrico Granata   }
2949128ee2fSEnrico Granata   return value;
2959128ee2fSEnrico Granata }
2969128ee2fSEnrico Granata 
GetString(lldb::SBError & error,lldb::offset_t offset)297b9c1b51eSKate Stone const char *SBData::GetString(lldb::SBError &error, lldb::offset_t offset) {
298*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset);
299baf5664fSJonas Devlieghere 
300248a1305SKonrad Kleine   const char *value = nullptr;
301b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
3029128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
303b9c1b51eSKate Stone   } else {
3049128ee2fSEnrico Granata     uint32_t old_offset = offset;
3059128ee2fSEnrico Granata     value = m_opaque_sp->GetCStr(&offset);
306248a1305SKonrad Kleine     if (offset == old_offset || (value == nullptr))
3079128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
3089128ee2fSEnrico Granata   }
3099128ee2fSEnrico Granata   return value;
3109128ee2fSEnrico Granata }
3119128ee2fSEnrico Granata 
GetDescription(lldb::SBStream & description,lldb::addr_t base_addr)312b9c1b51eSKate Stone bool SBData::GetDescription(lldb::SBStream &description,
313b9c1b51eSKate Stone                             lldb::addr_t base_addr) {
314*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description, base_addr);
315baf5664fSJonas Devlieghere 
316da7bc7d0SGreg Clayton   Stream &strm = description.ref();
317da7bc7d0SGreg Clayton 
318b9c1b51eSKate Stone   if (m_opaque_sp) {
31929cb868aSZachary Turner     DumpDataExtractor(*m_opaque_sp, &strm, 0, lldb::eFormatBytesWithASCII, 1,
320b9c1b51eSKate Stone                       m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0);
321b9c1b51eSKate Stone   } else
322da7bc7d0SGreg Clayton     strm.PutCString("No value");
3239128ee2fSEnrico Granata 
3249128ee2fSEnrico Granata   return true;
3259128ee2fSEnrico Granata }
3269128ee2fSEnrico Granata 
ReadRawData(lldb::SBError & error,lldb::offset_t offset,void * buf,size_t size)327b9c1b51eSKate Stone size_t SBData::ReadRawData(lldb::SBError &error, lldb::offset_t offset,
328b9c1b51eSKate Stone                            void *buf, size_t size) {
329*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, offset, buf, size);
3300d7b0c96SJonas Devlieghere 
331248a1305SKonrad Kleine   void *ok = nullptr;
332b9c1b51eSKate Stone   if (!m_opaque_sp.get()) {
3339128ee2fSEnrico Granata     error.SetErrorString("no value to read from");
334b9c1b51eSKate Stone   } else {
3359128ee2fSEnrico Granata     uint32_t old_offset = offset;
3369128ee2fSEnrico Granata     ok = m_opaque_sp->GetU8(&offset, buf, size);
337248a1305SKonrad Kleine     if ((offset == old_offset) || (ok == nullptr))
3389128ee2fSEnrico Granata       error.SetErrorString("unable to read data");
3399128ee2fSEnrico Granata   }
3409128ee2fSEnrico Granata   return ok ? size : 0;
3419128ee2fSEnrico Granata }
3429128ee2fSEnrico Granata 
SetData(lldb::SBError & error,const void * buf,size_t size,lldb::ByteOrder endian,uint8_t addr_size)343b9c1b51eSKate Stone void SBData::SetData(lldb::SBError &error, const void *buf, size_t size,
344b9c1b51eSKate Stone                      lldb::ByteOrder endian, uint8_t addr_size) {
345*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
3460d7b0c96SJonas Devlieghere 
3479128ee2fSEnrico Granata   if (!m_opaque_sp.get())
348796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
3499128ee2fSEnrico Granata   else
350896b4513SGreg Clayton   {
3519128ee2fSEnrico Granata     m_opaque_sp->SetData(buf, size, endian);
352896b4513SGreg Clayton     m_opaque_sp->SetAddressByteSize(addr_size);
353896b4513SGreg Clayton   }
3549128ee2fSEnrico Granata }
3559128ee2fSEnrico Granata 
SetDataWithOwnership(lldb::SBError & error,const void * buf,size_t size,lldb::ByteOrder endian,uint8_t addr_size)35672e25978SMed Ismail Bennani void SBData::SetDataWithOwnership(lldb::SBError &error, const void *buf,
35772e25978SMed Ismail Bennani                                   size_t size, lldb::ByteOrder endian,
35872e25978SMed Ismail Bennani                                   uint8_t addr_size) {
359*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
36072e25978SMed Ismail Bennani 
36172e25978SMed Ismail Bennani   lldb::DataBufferSP buffer_sp = std::make_shared<DataBufferHeap>(buf, size);
36272e25978SMed Ismail Bennani 
36372e25978SMed Ismail Bennani   if (!m_opaque_sp.get())
36472e25978SMed Ismail Bennani     m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
36572e25978SMed Ismail Bennani   else {
36672e25978SMed Ismail Bennani     m_opaque_sp->SetData(buffer_sp);
36772e25978SMed Ismail Bennani     m_opaque_sp->SetByteOrder(endian);
36872e25978SMed Ismail Bennani     m_opaque_sp->SetAddressByteSize(addr_size);
36972e25978SMed Ismail Bennani   }
37072e25978SMed Ismail Bennani }
37172e25978SMed Ismail Bennani 
Append(const SBData & rhs)372b9c1b51eSKate Stone bool SBData::Append(const SBData &rhs) {
373*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
374baf5664fSJonas Devlieghere 
3759128ee2fSEnrico Granata   bool value = false;
3769128ee2fSEnrico Granata   if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
3779128ee2fSEnrico Granata     value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
3789128ee2fSEnrico Granata   return value;
3799128ee2fSEnrico Granata }
3800f28986aSGreg Clayton 
CreateDataFromCString(lldb::ByteOrder endian,uint32_t addr_byte_size,const char * data)381b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromCString(lldb::ByteOrder endian,
382b9c1b51eSKate Stone                                            uint32_t addr_byte_size,
383b9c1b51eSKate Stone                                            const char *data) {
384*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(endian, addr_byte_size, data);
385baf5664fSJonas Devlieghere 
3860f28986aSGreg Clayton   if (!data || !data[0])
387d232abc3SJonas Devlieghere     return SBData();
3880f28986aSGreg Clayton 
3890f28986aSGreg Clayton   uint32_t data_len = strlen(data);
3900f28986aSGreg Clayton 
3910f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
392b9c1b51eSKate Stone   lldb::DataExtractorSP data_sp(
393b9c1b51eSKate Stone       new DataExtractor(buffer_sp, endian, addr_byte_size));
3940f28986aSGreg Clayton 
3950f28986aSGreg Clayton   SBData ret(data_sp);
3960f28986aSGreg Clayton 
397d232abc3SJonas Devlieghere   return ret;
3980f28986aSGreg Clayton }
3990f28986aSGreg Clayton 
CreateDataFromUInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint64_t * array,size_t array_len)400b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt64Array(lldb::ByteOrder endian,
401b9c1b51eSKate Stone                                                uint32_t addr_byte_size,
402b9c1b51eSKate Stone                                                uint64_t *array,
403b9c1b51eSKate Stone                                                size_t array_len) {
404*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
405baf5664fSJonas Devlieghere 
4060f28986aSGreg Clayton   if (!array || array_len == 0)
407d232abc3SJonas Devlieghere     return SBData();
4080f28986aSGreg Clayton 
4090f28986aSGreg Clayton   size_t data_len = array_len * sizeof(uint64_t);
4100f28986aSGreg Clayton 
4110f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
412b9c1b51eSKate Stone   lldb::DataExtractorSP data_sp(
413b9c1b51eSKate Stone       new DataExtractor(buffer_sp, endian, addr_byte_size));
4140f28986aSGreg Clayton 
4150f28986aSGreg Clayton   SBData ret(data_sp);
4160f28986aSGreg Clayton 
417d232abc3SJonas Devlieghere   return ret;
4180f28986aSGreg Clayton }
4190f28986aSGreg Clayton 
CreateDataFromUInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint32_t * array,size_t array_len)420b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt32Array(lldb::ByteOrder endian,
421b9c1b51eSKate Stone                                                uint32_t addr_byte_size,
422b9c1b51eSKate Stone                                                uint32_t *array,
423b9c1b51eSKate Stone                                                size_t array_len) {
424*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
425baf5664fSJonas Devlieghere 
4260f28986aSGreg Clayton   if (!array || array_len == 0)
427d232abc3SJonas Devlieghere     return SBData();
4280f28986aSGreg Clayton 
4290f28986aSGreg Clayton   size_t data_len = array_len * sizeof(uint32_t);
4300f28986aSGreg Clayton 
4310f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
432b9c1b51eSKate Stone   lldb::DataExtractorSP data_sp(
433b9c1b51eSKate Stone       new DataExtractor(buffer_sp, endian, addr_byte_size));
4340f28986aSGreg Clayton 
4350f28986aSGreg Clayton   SBData ret(data_sp);
4360f28986aSGreg Clayton 
437d232abc3SJonas Devlieghere   return ret;
4380f28986aSGreg Clayton }
4390f28986aSGreg Clayton 
CreateDataFromSInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int64_t * array,size_t array_len)440b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt64Array(lldb::ByteOrder endian,
441b9c1b51eSKate Stone                                                uint32_t addr_byte_size,
442b9c1b51eSKate Stone                                                int64_t *array,
443b9c1b51eSKate Stone                                                size_t array_len) {
444*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
445baf5664fSJonas Devlieghere 
4460f28986aSGreg Clayton   if (!array || array_len == 0)
447d232abc3SJonas Devlieghere     return SBData();
4480f28986aSGreg Clayton 
4490f28986aSGreg Clayton   size_t data_len = array_len * sizeof(int64_t);
4500f28986aSGreg Clayton 
4510f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
452b9c1b51eSKate Stone   lldb::DataExtractorSP data_sp(
453b9c1b51eSKate Stone       new DataExtractor(buffer_sp, endian, addr_byte_size));
4540f28986aSGreg Clayton 
4550f28986aSGreg Clayton   SBData ret(data_sp);
4560f28986aSGreg Clayton 
457d232abc3SJonas Devlieghere   return ret;
4580f28986aSGreg Clayton }
4590f28986aSGreg Clayton 
CreateDataFromSInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int32_t * array,size_t array_len)460b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt32Array(lldb::ByteOrder endian,
461b9c1b51eSKate Stone                                                uint32_t addr_byte_size,
462b9c1b51eSKate Stone                                                int32_t *array,
463b9c1b51eSKate Stone                                                size_t array_len) {
464*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
465baf5664fSJonas Devlieghere 
4660f28986aSGreg Clayton   if (!array || array_len == 0)
467d232abc3SJonas Devlieghere     return SBData();
4680f28986aSGreg Clayton 
4690f28986aSGreg Clayton   size_t data_len = array_len * sizeof(int32_t);
4700f28986aSGreg Clayton 
4710f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
472b9c1b51eSKate Stone   lldb::DataExtractorSP data_sp(
473b9c1b51eSKate Stone       new DataExtractor(buffer_sp, endian, addr_byte_size));
4740f28986aSGreg Clayton 
4750f28986aSGreg Clayton   SBData ret(data_sp);
4760f28986aSGreg Clayton 
477d232abc3SJonas Devlieghere   return ret;
4780f28986aSGreg Clayton }
4790f28986aSGreg Clayton 
CreateDataFromDoubleArray(lldb::ByteOrder endian,uint32_t addr_byte_size,double * array,size_t array_len)480b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromDoubleArray(lldb::ByteOrder endian,
481b9c1b51eSKate Stone                                                uint32_t addr_byte_size,
482b9c1b51eSKate Stone                                                double *array,
483b9c1b51eSKate Stone                                                size_t array_len) {
484*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
485baf5664fSJonas Devlieghere 
4860f28986aSGreg Clayton   if (!array || array_len == 0)
487d232abc3SJonas Devlieghere     return SBData();
4880f28986aSGreg Clayton 
4890f28986aSGreg Clayton   size_t data_len = array_len * sizeof(double);
4900f28986aSGreg Clayton 
4910f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
492b9c1b51eSKate Stone   lldb::DataExtractorSP data_sp(
493b9c1b51eSKate Stone       new DataExtractor(buffer_sp, endian, addr_byte_size));
4940f28986aSGreg Clayton 
4950f28986aSGreg Clayton   SBData ret(data_sp);
4960f28986aSGreg Clayton 
497d232abc3SJonas Devlieghere   return ret;
4980f28986aSGreg Clayton }
4990f28986aSGreg Clayton 
SetDataFromCString(const char * data)500b9c1b51eSKate Stone bool SBData::SetDataFromCString(const char *data) {
501*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data);
5020f28986aSGreg Clayton 
503b9c1b51eSKate Stone   if (!data) {
5040f28986aSGreg Clayton     return false;
5050f28986aSGreg Clayton   }
5060f28986aSGreg Clayton 
5070f28986aSGreg Clayton   size_t data_len = strlen(data);
5080f28986aSGreg Clayton 
5090f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
5100f28986aSGreg Clayton 
5110f28986aSGreg Clayton   if (!m_opaque_sp.get())
512796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
513796ac80bSJonas Devlieghere                                                   GetAddressByteSize());
5140f28986aSGreg Clayton   else
5150f28986aSGreg Clayton     m_opaque_sp->SetData(buffer_sp);
5160f28986aSGreg Clayton 
5170f28986aSGreg Clayton 
5180f28986aSGreg Clayton   return true;
5190f28986aSGreg Clayton }
5200f28986aSGreg Clayton 
SetDataFromUInt64Array(uint64_t * array,size_t array_len)521b9c1b51eSKate Stone bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) {
522*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, array, array_len);
5230f28986aSGreg Clayton 
524b9c1b51eSKate Stone   if (!array || array_len == 0) {
5250f28986aSGreg Clayton     return false;
5260f28986aSGreg Clayton   }
5270f28986aSGreg Clayton 
5280f28986aSGreg Clayton   size_t data_len = array_len * sizeof(uint64_t);
5290f28986aSGreg Clayton 
5300f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5310f28986aSGreg Clayton 
5320f28986aSGreg Clayton   if (!m_opaque_sp.get())
533796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
534796ac80bSJonas Devlieghere                                                   GetAddressByteSize());
5350f28986aSGreg Clayton   else
5360f28986aSGreg Clayton     m_opaque_sp->SetData(buffer_sp);
5370f28986aSGreg Clayton 
5380f28986aSGreg Clayton 
5390f28986aSGreg Clayton   return true;
5400f28986aSGreg Clayton }
5410f28986aSGreg Clayton 
SetDataFromUInt32Array(uint32_t * array,size_t array_len)542b9c1b51eSKate Stone bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) {
543*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, array, array_len);
5440f28986aSGreg Clayton 
545b9c1b51eSKate Stone   if (!array || array_len == 0) {
5460f28986aSGreg Clayton     return false;
5470f28986aSGreg Clayton   }
5480f28986aSGreg Clayton 
5490f28986aSGreg Clayton   size_t data_len = array_len * sizeof(uint32_t);
5500f28986aSGreg Clayton 
5510f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5520f28986aSGreg Clayton 
5530f28986aSGreg Clayton   if (!m_opaque_sp.get())
554796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
555796ac80bSJonas Devlieghere                                                   GetAddressByteSize());
5560f28986aSGreg Clayton   else
5570f28986aSGreg Clayton     m_opaque_sp->SetData(buffer_sp);
5580f28986aSGreg Clayton 
5590f28986aSGreg Clayton   return true;
5600f28986aSGreg Clayton }
5610f28986aSGreg Clayton 
SetDataFromSInt64Array(int64_t * array,size_t array_len)562b9c1b51eSKate Stone bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) {
563*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, array, array_len);
5640f28986aSGreg Clayton 
565b9c1b51eSKate Stone   if (!array || array_len == 0) {
5660f28986aSGreg Clayton     return false;
5670f28986aSGreg Clayton   }
5680f28986aSGreg Clayton 
5690f28986aSGreg Clayton   size_t data_len = array_len * sizeof(int64_t);
5700f28986aSGreg Clayton 
5710f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5720f28986aSGreg Clayton 
5730f28986aSGreg Clayton   if (!m_opaque_sp.get())
574796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
575796ac80bSJonas Devlieghere                                                   GetAddressByteSize());
5760f28986aSGreg Clayton   else
5770f28986aSGreg Clayton     m_opaque_sp->SetData(buffer_sp);
5780f28986aSGreg Clayton 
5790f28986aSGreg Clayton   return true;
5800f28986aSGreg Clayton }
5810f28986aSGreg Clayton 
SetDataFromSInt32Array(int32_t * array,size_t array_len)582b9c1b51eSKate Stone bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) {
583*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, array, array_len);
5840f28986aSGreg Clayton 
585b9c1b51eSKate Stone   if (!array || array_len == 0) {
5860f28986aSGreg Clayton     return false;
5870f28986aSGreg Clayton   }
5880f28986aSGreg Clayton 
5890f28986aSGreg Clayton   size_t data_len = array_len * sizeof(int32_t);
5900f28986aSGreg Clayton 
5910f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5920f28986aSGreg Clayton 
5930f28986aSGreg Clayton   if (!m_opaque_sp.get())
594796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
595796ac80bSJonas Devlieghere                                                   GetAddressByteSize());
5960f28986aSGreg Clayton   else
5970f28986aSGreg Clayton     m_opaque_sp->SetData(buffer_sp);
5980f28986aSGreg Clayton 
5990f28986aSGreg Clayton   return true;
6000f28986aSGreg Clayton }
6010f28986aSGreg Clayton 
SetDataFromDoubleArray(double * array,size_t array_len)602b9c1b51eSKate Stone bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) {
603*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, array, array_len);
6040f28986aSGreg Clayton 
605b9c1b51eSKate Stone   if (!array || array_len == 0) {
6060f28986aSGreg Clayton     return false;
6070f28986aSGreg Clayton   }
6080f28986aSGreg Clayton 
6090f28986aSGreg Clayton   size_t data_len = array_len * sizeof(double);
6100f28986aSGreg Clayton 
6110f28986aSGreg Clayton   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
6120f28986aSGreg Clayton 
6130f28986aSGreg Clayton   if (!m_opaque_sp.get())
614796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
615796ac80bSJonas Devlieghere                                                   GetAddressByteSize());
6160f28986aSGreg Clayton   else
6170f28986aSGreg Clayton     m_opaque_sp->SetData(buffer_sp);
6180f28986aSGreg Clayton 
6190f28986aSGreg Clayton   return true;
6200f28986aSGreg Clayton }
621