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