15ffd83dbSDimitry Andric //===-- SBData.cpp --------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBData.h"
100b57cec5SDimitry Andric #include "lldb/API/SBError.h"
110b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
1204eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "lldb/Core/DumpDataExtractor.h"
150b57cec5SDimitry Andric #include "lldb/Utility/DataBufferHeap.h"
160b57cec5SDimitry Andric #include "lldb/Utility/DataExtractor.h"
170b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric #include <cinttypes>
200b57cec5SDimitry Andric #include <memory>
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric using namespace lldb;
230b57cec5SDimitry Andric using namespace lldb_private;
240b57cec5SDimitry Andric 
SBData()250b57cec5SDimitry Andric SBData::SBData() : m_opaque_sp(new DataExtractor()) {
2604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
270b57cec5SDimitry Andric }
280b57cec5SDimitry Andric 
SBData(const lldb::DataExtractorSP & data_sp)290b57cec5SDimitry Andric SBData::SBData(const lldb::DataExtractorSP &data_sp) : m_opaque_sp(data_sp) {}
300b57cec5SDimitry Andric 
SBData(const SBData & rhs)310b57cec5SDimitry Andric SBData::SBData(const SBData &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
3204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
330b57cec5SDimitry Andric }
340b57cec5SDimitry Andric 
operator =(const SBData & rhs)350b57cec5SDimitry Andric const SBData &SBData::operator=(const SBData &rhs) {
3604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric   if (this != &rhs)
390b57cec5SDimitry Andric     m_opaque_sp = rhs.m_opaque_sp;
4004eeddc0SDimitry Andric   return *this;
410b57cec5SDimitry Andric }
420b57cec5SDimitry Andric 
435ffd83dbSDimitry Andric SBData::~SBData() = default;
440b57cec5SDimitry Andric 
SetOpaque(const lldb::DataExtractorSP & data_sp)450b57cec5SDimitry Andric void SBData::SetOpaque(const lldb::DataExtractorSP &data_sp) {
460b57cec5SDimitry Andric   m_opaque_sp = data_sp;
470b57cec5SDimitry Andric }
480b57cec5SDimitry Andric 
get() const490b57cec5SDimitry Andric lldb_private::DataExtractor *SBData::get() const { return m_opaque_sp.get(); }
500b57cec5SDimitry Andric 
operator ->() const510b57cec5SDimitry Andric lldb_private::DataExtractor *SBData::operator->() const {
520b57cec5SDimitry Andric   return m_opaque_sp.operator->();
530b57cec5SDimitry Andric }
540b57cec5SDimitry Andric 
operator *()550b57cec5SDimitry Andric lldb::DataExtractorSP &SBData::operator*() { return m_opaque_sp; }
560b57cec5SDimitry Andric 
operator *() const570b57cec5SDimitry Andric const lldb::DataExtractorSP &SBData::operator*() const { return m_opaque_sp; }
580b57cec5SDimitry Andric 
IsValid()590b57cec5SDimitry Andric bool SBData::IsValid() {
6004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
610b57cec5SDimitry Andric   return this->operator bool();
620b57cec5SDimitry Andric }
operator bool() const630b57cec5SDimitry Andric SBData::operator bool() const {
6404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric   return m_opaque_sp.get() != nullptr;
670b57cec5SDimitry Andric }
680b57cec5SDimitry Andric 
GetAddressByteSize()690b57cec5SDimitry Andric uint8_t SBData::GetAddressByteSize() {
7004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric   uint8_t value = 0;
730b57cec5SDimitry Andric   if (m_opaque_sp.get())
740b57cec5SDimitry Andric     value = m_opaque_sp->GetAddressByteSize();
750b57cec5SDimitry Andric   return value;
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric 
SetAddressByteSize(uint8_t addr_byte_size)780b57cec5SDimitry Andric void SBData::SetAddressByteSize(uint8_t addr_byte_size) {
7904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, addr_byte_size);
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric   if (m_opaque_sp.get())
820b57cec5SDimitry Andric     m_opaque_sp->SetAddressByteSize(addr_byte_size);
830b57cec5SDimitry Andric }
840b57cec5SDimitry Andric 
Clear()850b57cec5SDimitry Andric void SBData::Clear() {
8604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric   if (m_opaque_sp.get())
890b57cec5SDimitry Andric     m_opaque_sp->Clear();
900b57cec5SDimitry Andric }
910b57cec5SDimitry Andric 
GetByteSize()920b57cec5SDimitry Andric size_t SBData::GetByteSize() {
9304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   size_t value = 0;
960b57cec5SDimitry Andric   if (m_opaque_sp.get())
970b57cec5SDimitry Andric     value = m_opaque_sp->GetByteSize();
980b57cec5SDimitry Andric   return value;
990b57cec5SDimitry Andric }
1000b57cec5SDimitry Andric 
GetByteOrder()1010b57cec5SDimitry Andric lldb::ByteOrder SBData::GetByteOrder() {
10204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric   lldb::ByteOrder value = eByteOrderInvalid;
1050b57cec5SDimitry Andric   if (m_opaque_sp.get())
1060b57cec5SDimitry Andric     value = m_opaque_sp->GetByteOrder();
1070b57cec5SDimitry Andric   return value;
1080b57cec5SDimitry Andric }
1090b57cec5SDimitry Andric 
SetByteOrder(lldb::ByteOrder endian)1100b57cec5SDimitry Andric void SBData::SetByteOrder(lldb::ByteOrder endian) {
11104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, endian);
1120b57cec5SDimitry Andric 
1130b57cec5SDimitry Andric   if (m_opaque_sp.get())
1140b57cec5SDimitry Andric     m_opaque_sp->SetByteOrder(endian);
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric 
GetFloat(lldb::SBError & error,lldb::offset_t offset)1170b57cec5SDimitry Andric float SBData::GetFloat(lldb::SBError &error, lldb::offset_t offset) {
11804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric   float value = 0;
1210b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
1220b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
1230b57cec5SDimitry Andric   } else {
1240b57cec5SDimitry Andric     uint32_t old_offset = offset;
1250b57cec5SDimitry Andric     value = m_opaque_sp->GetFloat(&offset);
1260b57cec5SDimitry Andric     if (offset == old_offset)
1270b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
1280b57cec5SDimitry Andric   }
1290b57cec5SDimitry Andric   return value;
1300b57cec5SDimitry Andric }
1310b57cec5SDimitry Andric 
GetDouble(lldb::SBError & error,lldb::offset_t offset)1320b57cec5SDimitry Andric double SBData::GetDouble(lldb::SBError &error, lldb::offset_t offset) {
13304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
1340b57cec5SDimitry Andric 
1350b57cec5SDimitry Andric   double value = 0;
1360b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
1370b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
1380b57cec5SDimitry Andric   } else {
1390b57cec5SDimitry Andric     uint32_t old_offset = offset;
1400b57cec5SDimitry Andric     value = m_opaque_sp->GetDouble(&offset);
1410b57cec5SDimitry Andric     if (offset == old_offset)
1420b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
1430b57cec5SDimitry Andric   }
1440b57cec5SDimitry Andric   return value;
1450b57cec5SDimitry Andric }
1460b57cec5SDimitry Andric 
GetLongDouble(lldb::SBError & error,lldb::offset_t offset)1470b57cec5SDimitry Andric long double SBData::GetLongDouble(lldb::SBError &error, lldb::offset_t offset) {
14804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
1490b57cec5SDimitry Andric 
1500b57cec5SDimitry Andric   long double value = 0;
1510b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
1520b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
1530b57cec5SDimitry Andric   } else {
1540b57cec5SDimitry Andric     uint32_t old_offset = offset;
1550b57cec5SDimitry Andric     value = m_opaque_sp->GetLongDouble(&offset);
1560b57cec5SDimitry Andric     if (offset == old_offset)
1570b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
1580b57cec5SDimitry Andric   }
1590b57cec5SDimitry Andric   return value;
1600b57cec5SDimitry Andric }
1610b57cec5SDimitry Andric 
GetAddress(lldb::SBError & error,lldb::offset_t offset)1620b57cec5SDimitry Andric lldb::addr_t SBData::GetAddress(lldb::SBError &error, lldb::offset_t offset) {
16304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
1640b57cec5SDimitry Andric 
1650b57cec5SDimitry Andric   lldb::addr_t value = 0;
1660b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
1670b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
1680b57cec5SDimitry Andric   } else {
1690b57cec5SDimitry Andric     uint32_t old_offset = offset;
1700b57cec5SDimitry Andric     value = m_opaque_sp->GetAddress(&offset);
1710b57cec5SDimitry Andric     if (offset == old_offset)
1720b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
1730b57cec5SDimitry Andric   }
1740b57cec5SDimitry Andric   return value;
1750b57cec5SDimitry Andric }
1760b57cec5SDimitry Andric 
GetUnsignedInt8(lldb::SBError & error,lldb::offset_t offset)1770b57cec5SDimitry Andric uint8_t SBData::GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset) {
17804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
1790b57cec5SDimitry Andric 
1800b57cec5SDimitry Andric   uint8_t value = 0;
1810b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
1820b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
1830b57cec5SDimitry Andric   } else {
1840b57cec5SDimitry Andric     uint32_t old_offset = offset;
1850b57cec5SDimitry Andric     value = m_opaque_sp->GetU8(&offset);
1860b57cec5SDimitry Andric     if (offset == old_offset)
1870b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
1880b57cec5SDimitry Andric   }
1890b57cec5SDimitry Andric   return value;
1900b57cec5SDimitry Andric }
1910b57cec5SDimitry Andric 
GetUnsignedInt16(lldb::SBError & error,lldb::offset_t offset)1920b57cec5SDimitry Andric uint16_t SBData::GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset) {
19304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
1940b57cec5SDimitry Andric 
1950b57cec5SDimitry Andric   uint16_t value = 0;
1960b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
1970b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
1980b57cec5SDimitry Andric   } else {
1990b57cec5SDimitry Andric     uint32_t old_offset = offset;
2000b57cec5SDimitry Andric     value = m_opaque_sp->GetU16(&offset);
2010b57cec5SDimitry Andric     if (offset == old_offset)
2020b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
2030b57cec5SDimitry Andric   }
2040b57cec5SDimitry Andric   return value;
2050b57cec5SDimitry Andric }
2060b57cec5SDimitry Andric 
GetUnsignedInt32(lldb::SBError & error,lldb::offset_t offset)2070b57cec5SDimitry Andric uint32_t SBData::GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset) {
20804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
2090b57cec5SDimitry Andric 
2100b57cec5SDimitry Andric   uint32_t value = 0;
2110b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
2120b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
2130b57cec5SDimitry Andric   } else {
2140b57cec5SDimitry Andric     uint32_t old_offset = offset;
2150b57cec5SDimitry Andric     value = m_opaque_sp->GetU32(&offset);
2160b57cec5SDimitry Andric     if (offset == old_offset)
2170b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
2180b57cec5SDimitry Andric   }
2190b57cec5SDimitry Andric   return value;
2200b57cec5SDimitry Andric }
2210b57cec5SDimitry Andric 
GetUnsignedInt64(lldb::SBError & error,lldb::offset_t offset)2220b57cec5SDimitry Andric uint64_t SBData::GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset) {
22304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
2240b57cec5SDimitry Andric 
2250b57cec5SDimitry Andric   uint64_t value = 0;
2260b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
2270b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
2280b57cec5SDimitry Andric   } else {
2290b57cec5SDimitry Andric     uint32_t old_offset = offset;
2300b57cec5SDimitry Andric     value = m_opaque_sp->GetU64(&offset);
2310b57cec5SDimitry Andric     if (offset == old_offset)
2320b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
2330b57cec5SDimitry Andric   }
2340b57cec5SDimitry Andric   return value;
2350b57cec5SDimitry Andric }
2360b57cec5SDimitry Andric 
GetSignedInt8(lldb::SBError & error,lldb::offset_t offset)2370b57cec5SDimitry Andric int8_t SBData::GetSignedInt8(lldb::SBError &error, lldb::offset_t offset) {
23804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
2390b57cec5SDimitry Andric 
2400b57cec5SDimitry Andric   int8_t value = 0;
2410b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
2420b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
2430b57cec5SDimitry Andric   } else {
2440b57cec5SDimitry Andric     uint32_t old_offset = offset;
2450b57cec5SDimitry Andric     value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
2460b57cec5SDimitry Andric     if (offset == old_offset)
2470b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
2480b57cec5SDimitry Andric   }
2490b57cec5SDimitry Andric   return value;
2500b57cec5SDimitry Andric }
2510b57cec5SDimitry Andric 
GetSignedInt16(lldb::SBError & error,lldb::offset_t offset)2520b57cec5SDimitry Andric int16_t SBData::GetSignedInt16(lldb::SBError &error, lldb::offset_t offset) {
25304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
2540b57cec5SDimitry Andric 
2550b57cec5SDimitry Andric   int16_t value = 0;
2560b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
2570b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
2580b57cec5SDimitry Andric   } else {
2590b57cec5SDimitry Andric     uint32_t old_offset = offset;
2600b57cec5SDimitry Andric     value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
2610b57cec5SDimitry Andric     if (offset == old_offset)
2620b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
2630b57cec5SDimitry Andric   }
2640b57cec5SDimitry Andric   return value;
2650b57cec5SDimitry Andric }
2660b57cec5SDimitry Andric 
GetSignedInt32(lldb::SBError & error,lldb::offset_t offset)2670b57cec5SDimitry Andric int32_t SBData::GetSignedInt32(lldb::SBError &error, lldb::offset_t offset) {
26804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
2690b57cec5SDimitry Andric 
2700b57cec5SDimitry Andric   int32_t value = 0;
2710b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
2720b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
2730b57cec5SDimitry Andric   } else {
2740b57cec5SDimitry Andric     uint32_t old_offset = offset;
2750b57cec5SDimitry Andric     value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
2760b57cec5SDimitry Andric     if (offset == old_offset)
2770b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
2780b57cec5SDimitry Andric   }
2790b57cec5SDimitry Andric   return value;
2800b57cec5SDimitry Andric }
2810b57cec5SDimitry Andric 
GetSignedInt64(lldb::SBError & error,lldb::offset_t offset)2820b57cec5SDimitry Andric int64_t SBData::GetSignedInt64(lldb::SBError &error, lldb::offset_t offset) {
28304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
2840b57cec5SDimitry Andric 
2850b57cec5SDimitry Andric   int64_t value = 0;
2860b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
2870b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
2880b57cec5SDimitry Andric   } else {
2890b57cec5SDimitry Andric     uint32_t old_offset = offset;
2900b57cec5SDimitry Andric     value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
2910b57cec5SDimitry Andric     if (offset == old_offset)
2920b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
2930b57cec5SDimitry Andric   }
2940b57cec5SDimitry Andric   return value;
2950b57cec5SDimitry Andric }
2960b57cec5SDimitry Andric 
GetString(lldb::SBError & error,lldb::offset_t offset)2970b57cec5SDimitry Andric const char *SBData::GetString(lldb::SBError &error, lldb::offset_t offset) {
29804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset);
2990b57cec5SDimitry Andric 
300*fe013be4SDimitry Andric   if (!m_opaque_sp) {
3010b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
302*fe013be4SDimitry Andric     return nullptr;
3030b57cec5SDimitry Andric   }
304*fe013be4SDimitry Andric 
305*fe013be4SDimitry Andric   lldb::offset_t old_offset = offset;
306*fe013be4SDimitry Andric   const char *value = m_opaque_sp->GetCStr(&offset);
307*fe013be4SDimitry Andric   if (offset == old_offset || value == nullptr) {
308*fe013be4SDimitry Andric     error.SetErrorString("unable to read data");
309*fe013be4SDimitry Andric     return nullptr;
310*fe013be4SDimitry Andric   }
311*fe013be4SDimitry Andric 
312*fe013be4SDimitry Andric   return ConstString(value).GetCString();
3130b57cec5SDimitry Andric }
3140b57cec5SDimitry Andric 
GetDescription(lldb::SBStream & description,lldb::addr_t base_addr)3150b57cec5SDimitry Andric bool SBData::GetDescription(lldb::SBStream &description,
3160b57cec5SDimitry Andric                             lldb::addr_t base_addr) {
31704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, description, base_addr);
3180b57cec5SDimitry Andric 
3190b57cec5SDimitry Andric   Stream &strm = description.ref();
3200b57cec5SDimitry Andric 
3210b57cec5SDimitry Andric   if (m_opaque_sp) {
3220b57cec5SDimitry Andric     DumpDataExtractor(*m_opaque_sp, &strm, 0, lldb::eFormatBytesWithASCII, 1,
3230b57cec5SDimitry Andric                       m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0);
3240b57cec5SDimitry Andric   } else
3250b57cec5SDimitry Andric     strm.PutCString("No value");
3260b57cec5SDimitry Andric 
3270b57cec5SDimitry Andric   return true;
3280b57cec5SDimitry Andric }
3290b57cec5SDimitry Andric 
ReadRawData(lldb::SBError & error,lldb::offset_t offset,void * buf,size_t size)3300b57cec5SDimitry Andric size_t SBData::ReadRawData(lldb::SBError &error, lldb::offset_t offset,
3310b57cec5SDimitry Andric                            void *buf, size_t size) {
33204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, offset, buf, size);
3330b57cec5SDimitry Andric 
3340b57cec5SDimitry Andric   void *ok = nullptr;
3350b57cec5SDimitry Andric   if (!m_opaque_sp.get()) {
3360b57cec5SDimitry Andric     error.SetErrorString("no value to read from");
3370b57cec5SDimitry Andric   } else {
3380b57cec5SDimitry Andric     uint32_t old_offset = offset;
3390b57cec5SDimitry Andric     ok = m_opaque_sp->GetU8(&offset, buf, size);
3400b57cec5SDimitry Andric     if ((offset == old_offset) || (ok == nullptr))
3410b57cec5SDimitry Andric       error.SetErrorString("unable to read data");
3420b57cec5SDimitry Andric   }
3430b57cec5SDimitry Andric   return ok ? size : 0;
3440b57cec5SDimitry Andric }
3450b57cec5SDimitry Andric 
SetData(lldb::SBError & error,const void * buf,size_t size,lldb::ByteOrder endian,uint8_t addr_size)3460b57cec5SDimitry Andric void SBData::SetData(lldb::SBError &error, const void *buf, size_t size,
3470b57cec5SDimitry Andric                      lldb::ByteOrder endian, uint8_t addr_size) {
34804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
3490b57cec5SDimitry Andric 
3500b57cec5SDimitry Andric   if (!m_opaque_sp.get())
3510b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
3520b57cec5SDimitry Andric   else
3530b57cec5SDimitry Andric   {
3540b57cec5SDimitry Andric     m_opaque_sp->SetData(buf, size, endian);
3550b57cec5SDimitry Andric     m_opaque_sp->SetAddressByteSize(addr_size);
3560b57cec5SDimitry Andric   }
3570b57cec5SDimitry Andric }
3580b57cec5SDimitry Andric 
SetDataWithOwnership(lldb::SBError & error,const void * buf,size_t size,lldb::ByteOrder endian,uint8_t addr_size)3590eae32dcSDimitry Andric void SBData::SetDataWithOwnership(lldb::SBError &error, const void *buf,
3600eae32dcSDimitry Andric                                   size_t size, lldb::ByteOrder endian,
3610eae32dcSDimitry Andric                                   uint8_t addr_size) {
36204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
3630eae32dcSDimitry Andric 
3640eae32dcSDimitry Andric   lldb::DataBufferSP buffer_sp = std::make_shared<DataBufferHeap>(buf, size);
3650eae32dcSDimitry Andric 
3660eae32dcSDimitry Andric   if (!m_opaque_sp.get())
3670eae32dcSDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
3680eae32dcSDimitry Andric   else {
3690eae32dcSDimitry Andric     m_opaque_sp->SetData(buffer_sp);
3700eae32dcSDimitry Andric     m_opaque_sp->SetByteOrder(endian);
3710eae32dcSDimitry Andric     m_opaque_sp->SetAddressByteSize(addr_size);
3720eae32dcSDimitry Andric   }
3730eae32dcSDimitry Andric }
3740eae32dcSDimitry Andric 
Append(const SBData & rhs)3750b57cec5SDimitry Andric bool SBData::Append(const SBData &rhs) {
37604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
3770b57cec5SDimitry Andric 
3780b57cec5SDimitry Andric   bool value = false;
3790b57cec5SDimitry Andric   if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
3800b57cec5SDimitry Andric     value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
3810b57cec5SDimitry Andric   return value;
3820b57cec5SDimitry Andric }
3830b57cec5SDimitry Andric 
CreateDataFromCString(lldb::ByteOrder endian,uint32_t addr_byte_size,const char * data)3840b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromCString(lldb::ByteOrder endian,
3850b57cec5SDimitry Andric                                            uint32_t addr_byte_size,
3860b57cec5SDimitry Andric                                            const char *data) {
38704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(endian, addr_byte_size, data);
3880b57cec5SDimitry Andric 
3890b57cec5SDimitry Andric   if (!data || !data[0])
39004eeddc0SDimitry Andric     return SBData();
3910b57cec5SDimitry Andric 
3920b57cec5SDimitry Andric   uint32_t data_len = strlen(data);
3930b57cec5SDimitry Andric 
3940b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
3950b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
3960b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
3970b57cec5SDimitry Andric 
3980b57cec5SDimitry Andric   SBData ret(data_sp);
3990b57cec5SDimitry Andric 
40004eeddc0SDimitry Andric   return ret;
4010b57cec5SDimitry Andric }
4020b57cec5SDimitry Andric 
CreateDataFromUInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint64_t * array,size_t array_len)4030b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromUInt64Array(lldb::ByteOrder endian,
4040b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
4050b57cec5SDimitry Andric                                                uint64_t *array,
4060b57cec5SDimitry Andric                                                size_t array_len) {
40704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
4080b57cec5SDimitry Andric 
4090b57cec5SDimitry Andric   if (!array || array_len == 0)
41004eeddc0SDimitry Andric     return SBData();
4110b57cec5SDimitry Andric 
4120b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint64_t);
4130b57cec5SDimitry Andric 
4140b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
4150b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
4160b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
4170b57cec5SDimitry Andric 
4180b57cec5SDimitry Andric   SBData ret(data_sp);
4190b57cec5SDimitry Andric 
42004eeddc0SDimitry Andric   return ret;
4210b57cec5SDimitry Andric }
4220b57cec5SDimitry Andric 
CreateDataFromUInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,uint32_t * array,size_t array_len)4230b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromUInt32Array(lldb::ByteOrder endian,
4240b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
4250b57cec5SDimitry Andric                                                uint32_t *array,
4260b57cec5SDimitry Andric                                                size_t array_len) {
42704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
4280b57cec5SDimitry Andric 
4290b57cec5SDimitry Andric   if (!array || array_len == 0)
43004eeddc0SDimitry Andric     return SBData();
4310b57cec5SDimitry Andric 
4320b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint32_t);
4330b57cec5SDimitry Andric 
4340b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
4350b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
4360b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
4370b57cec5SDimitry Andric 
4380b57cec5SDimitry Andric   SBData ret(data_sp);
4390b57cec5SDimitry Andric 
44004eeddc0SDimitry Andric   return ret;
4410b57cec5SDimitry Andric }
4420b57cec5SDimitry Andric 
CreateDataFromSInt64Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int64_t * array,size_t array_len)4430b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromSInt64Array(lldb::ByteOrder endian,
4440b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
4450b57cec5SDimitry Andric                                                int64_t *array,
4460b57cec5SDimitry Andric                                                size_t array_len) {
44704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
4480b57cec5SDimitry Andric 
4490b57cec5SDimitry Andric   if (!array || array_len == 0)
45004eeddc0SDimitry Andric     return SBData();
4510b57cec5SDimitry Andric 
4520b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int64_t);
4530b57cec5SDimitry Andric 
4540b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
4550b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
4560b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
4570b57cec5SDimitry Andric 
4580b57cec5SDimitry Andric   SBData ret(data_sp);
4590b57cec5SDimitry Andric 
46004eeddc0SDimitry Andric   return ret;
4610b57cec5SDimitry Andric }
4620b57cec5SDimitry Andric 
CreateDataFromSInt32Array(lldb::ByteOrder endian,uint32_t addr_byte_size,int32_t * array,size_t array_len)4630b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromSInt32Array(lldb::ByteOrder endian,
4640b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
4650b57cec5SDimitry Andric                                                int32_t *array,
4660b57cec5SDimitry Andric                                                size_t array_len) {
46704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
4680b57cec5SDimitry Andric 
4690b57cec5SDimitry Andric   if (!array || array_len == 0)
47004eeddc0SDimitry Andric     return SBData();
4710b57cec5SDimitry Andric 
4720b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int32_t);
4730b57cec5SDimitry Andric 
4740b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
4750b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
4760b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
4770b57cec5SDimitry Andric 
4780b57cec5SDimitry Andric   SBData ret(data_sp);
4790b57cec5SDimitry Andric 
48004eeddc0SDimitry Andric   return ret;
4810b57cec5SDimitry Andric }
4820b57cec5SDimitry Andric 
CreateDataFromDoubleArray(lldb::ByteOrder endian,uint32_t addr_byte_size,double * array,size_t array_len)4830b57cec5SDimitry Andric lldb::SBData SBData::CreateDataFromDoubleArray(lldb::ByteOrder endian,
4840b57cec5SDimitry Andric                                                uint32_t addr_byte_size,
4850b57cec5SDimitry Andric                                                double *array,
4860b57cec5SDimitry Andric                                                size_t array_len) {
48704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
4880b57cec5SDimitry Andric 
4890b57cec5SDimitry Andric   if (!array || array_len == 0)
49004eeddc0SDimitry Andric     return SBData();
4910b57cec5SDimitry Andric 
4920b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(double);
4930b57cec5SDimitry Andric 
4940b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
4950b57cec5SDimitry Andric   lldb::DataExtractorSP data_sp(
4960b57cec5SDimitry Andric       new DataExtractor(buffer_sp, endian, addr_byte_size));
4970b57cec5SDimitry Andric 
4980b57cec5SDimitry Andric   SBData ret(data_sp);
4990b57cec5SDimitry Andric 
50004eeddc0SDimitry Andric   return ret;
5010b57cec5SDimitry Andric }
5020b57cec5SDimitry Andric 
SetDataFromCString(const char * data)5030b57cec5SDimitry Andric bool SBData::SetDataFromCString(const char *data) {
50404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, data);
5050b57cec5SDimitry Andric 
5060b57cec5SDimitry Andric   if (!data) {
5070b57cec5SDimitry Andric     return false;
5080b57cec5SDimitry Andric   }
5090b57cec5SDimitry Andric 
5100b57cec5SDimitry Andric   size_t data_len = strlen(data);
5110b57cec5SDimitry Andric 
5120b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
5130b57cec5SDimitry Andric 
5140b57cec5SDimitry Andric   if (!m_opaque_sp.get())
5150b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
5160b57cec5SDimitry Andric                                                   GetAddressByteSize());
5170b57cec5SDimitry Andric   else
5180b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
5190b57cec5SDimitry Andric 
5200b57cec5SDimitry Andric 
5210b57cec5SDimitry Andric   return true;
5220b57cec5SDimitry Andric }
5230b57cec5SDimitry Andric 
SetDataFromUInt64Array(uint64_t * array,size_t array_len)5240b57cec5SDimitry Andric bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) {
52504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, array, array_len);
5260b57cec5SDimitry Andric 
5270b57cec5SDimitry Andric   if (!array || array_len == 0) {
5280b57cec5SDimitry Andric     return false;
5290b57cec5SDimitry Andric   }
5300b57cec5SDimitry Andric 
5310b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint64_t);
5320b57cec5SDimitry Andric 
5330b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5340b57cec5SDimitry Andric 
5350b57cec5SDimitry Andric   if (!m_opaque_sp.get())
5360b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
5370b57cec5SDimitry Andric                                                   GetAddressByteSize());
5380b57cec5SDimitry Andric   else
5390b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
5400b57cec5SDimitry Andric 
5410b57cec5SDimitry Andric 
5420b57cec5SDimitry Andric   return true;
5430b57cec5SDimitry Andric }
5440b57cec5SDimitry Andric 
SetDataFromUInt32Array(uint32_t * array,size_t array_len)5450b57cec5SDimitry Andric bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) {
54604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, array, array_len);
5470b57cec5SDimitry Andric 
5480b57cec5SDimitry Andric   if (!array || array_len == 0) {
5490b57cec5SDimitry Andric     return false;
5500b57cec5SDimitry Andric   }
5510b57cec5SDimitry Andric 
5520b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(uint32_t);
5530b57cec5SDimitry Andric 
5540b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5550b57cec5SDimitry Andric 
5560b57cec5SDimitry Andric   if (!m_opaque_sp.get())
5570b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
5580b57cec5SDimitry Andric                                                   GetAddressByteSize());
5590b57cec5SDimitry Andric   else
5600b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
5610b57cec5SDimitry Andric 
5620b57cec5SDimitry Andric   return true;
5630b57cec5SDimitry Andric }
5640b57cec5SDimitry Andric 
SetDataFromSInt64Array(int64_t * array,size_t array_len)5650b57cec5SDimitry Andric bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) {
56604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, array, array_len);
5670b57cec5SDimitry Andric 
5680b57cec5SDimitry Andric   if (!array || array_len == 0) {
5690b57cec5SDimitry Andric     return false;
5700b57cec5SDimitry Andric   }
5710b57cec5SDimitry Andric 
5720b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int64_t);
5730b57cec5SDimitry Andric 
5740b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5750b57cec5SDimitry Andric 
5760b57cec5SDimitry Andric   if (!m_opaque_sp.get())
5770b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
5780b57cec5SDimitry Andric                                                   GetAddressByteSize());
5790b57cec5SDimitry Andric   else
5800b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
5810b57cec5SDimitry Andric 
5820b57cec5SDimitry Andric   return true;
5830b57cec5SDimitry Andric }
5840b57cec5SDimitry Andric 
SetDataFromSInt32Array(int32_t * array,size_t array_len)5850b57cec5SDimitry Andric bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) {
58604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, array, array_len);
5870b57cec5SDimitry Andric 
5880b57cec5SDimitry Andric   if (!array || array_len == 0) {
5890b57cec5SDimitry Andric     return false;
5900b57cec5SDimitry Andric   }
5910b57cec5SDimitry Andric 
5920b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(int32_t);
5930b57cec5SDimitry Andric 
5940b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
5950b57cec5SDimitry Andric 
5960b57cec5SDimitry Andric   if (!m_opaque_sp.get())
5970b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
5980b57cec5SDimitry Andric                                                   GetAddressByteSize());
5990b57cec5SDimitry Andric   else
6000b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
6010b57cec5SDimitry Andric 
6020b57cec5SDimitry Andric   return true;
6030b57cec5SDimitry Andric }
6040b57cec5SDimitry Andric 
SetDataFromDoubleArray(double * array,size_t array_len)6050b57cec5SDimitry Andric bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) {
60604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, array, array_len);
6070b57cec5SDimitry Andric 
6080b57cec5SDimitry Andric   if (!array || array_len == 0) {
6090b57cec5SDimitry Andric     return false;
6100b57cec5SDimitry Andric   }
6110b57cec5SDimitry Andric 
6120b57cec5SDimitry Andric   size_t data_len = array_len * sizeof(double);
6130b57cec5SDimitry Andric 
6140b57cec5SDimitry Andric   lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
6150b57cec5SDimitry Andric 
6160b57cec5SDimitry Andric   if (!m_opaque_sp.get())
6170b57cec5SDimitry Andric     m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
6180b57cec5SDimitry Andric                                                   GetAddressByteSize());
6190b57cec5SDimitry Andric   else
6200b57cec5SDimitry Andric     m_opaque_sp->SetData(buffer_sp);
6210b57cec5SDimitry Andric 
6220b57cec5SDimitry Andric   return true;
6230b57cec5SDimitry Andric }
624