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