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" 10*d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h" 119128ee2fSEnrico Granata #include "lldb/API/SBError.h" 129128ee2fSEnrico Granata #include "lldb/API/SBStream.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 25baf5664fSJonas Devlieghere SBData::SBData() : m_opaque_sp(new DataExtractor()) { 26baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBData); 27baf5664fSJonas Devlieghere } 289128ee2fSEnrico Granata 29b9c1b51eSKate Stone SBData::SBData(const lldb::DataExtractorSP &data_sp) : m_opaque_sp(data_sp) {} 309128ee2fSEnrico Granata 31baf5664fSJonas Devlieghere SBData::SBData(const SBData &rhs) : m_opaque_sp(rhs.m_opaque_sp) { 32baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBData, (const lldb::SBData &), rhs); 33baf5664fSJonas Devlieghere } 349128ee2fSEnrico Granata 35b9c1b51eSKate Stone const SBData &SBData::operator=(const SBData &rhs) { 36baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBData &, 37baf5664fSJonas Devlieghere SBData, operator=,(const lldb::SBData &), rhs); 38baf5664fSJonas Devlieghere 399128ee2fSEnrico Granata if (this != &rhs) 409128ee2fSEnrico Granata m_opaque_sp = rhs.m_opaque_sp; 41306809f2SJonas Devlieghere return LLDB_RECORD_RESULT(*this); 429128ee2fSEnrico Granata } 439128ee2fSEnrico Granata 44866b7a65SJonas Devlieghere SBData::~SBData() = default; 459128ee2fSEnrico Granata 46b9c1b51eSKate Stone void SBData::SetOpaque(const lldb::DataExtractorSP &data_sp) { 479128ee2fSEnrico Granata m_opaque_sp = data_sp; 489128ee2fSEnrico Granata } 499128ee2fSEnrico Granata 50b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::get() const { return m_opaque_sp.get(); } 519128ee2fSEnrico Granata 52b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::operator->() const { 539128ee2fSEnrico Granata return m_opaque_sp.operator->(); 549128ee2fSEnrico Granata } 559128ee2fSEnrico Granata 56b9c1b51eSKate Stone lldb::DataExtractorSP &SBData::operator*() { return m_opaque_sp; } 579128ee2fSEnrico Granata 58b9c1b51eSKate Stone const lldb::DataExtractorSP &SBData::operator*() const { return m_opaque_sp; } 599128ee2fSEnrico Granata 60baf5664fSJonas Devlieghere bool SBData::IsValid() { 61baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBData, IsValid); 627f5237bcSPavel Labath return this->operator bool(); 637f5237bcSPavel Labath } 647f5237bcSPavel Labath SBData::operator bool() const { 657f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBData, operator bool); 66baf5664fSJonas Devlieghere 67248a1305SKonrad Kleine return m_opaque_sp.get() != nullptr; 68baf5664fSJonas Devlieghere } 699128ee2fSEnrico Granata 70b9c1b51eSKate Stone uint8_t SBData::GetAddressByteSize() { 71baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint8_t, SBData, GetAddressByteSize); 72baf5664fSJonas Devlieghere 739128ee2fSEnrico Granata uint8_t value = 0; 749128ee2fSEnrico Granata if (m_opaque_sp.get()) 759128ee2fSEnrico Granata value = m_opaque_sp->GetAddressByteSize(); 769128ee2fSEnrico Granata return value; 779128ee2fSEnrico Granata } 789128ee2fSEnrico Granata 79b9c1b51eSKate Stone void SBData::SetAddressByteSize(uint8_t addr_byte_size) { 80baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBData, SetAddressByteSize, (uint8_t), 81baf5664fSJonas Devlieghere addr_byte_size); 82baf5664fSJonas Devlieghere 830f28986aSGreg Clayton if (m_opaque_sp.get()) 840f28986aSGreg Clayton m_opaque_sp->SetAddressByteSize(addr_byte_size); 850f28986aSGreg Clayton } 860f28986aSGreg Clayton 87b9c1b51eSKate Stone void SBData::Clear() { 88baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBData, Clear); 89baf5664fSJonas Devlieghere 909128ee2fSEnrico Granata if (m_opaque_sp.get()) 919128ee2fSEnrico Granata m_opaque_sp->Clear(); 929128ee2fSEnrico Granata } 939128ee2fSEnrico Granata 94b9c1b51eSKate Stone size_t SBData::GetByteSize() { 95baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(size_t, SBData, GetByteSize); 96baf5664fSJonas Devlieghere 979128ee2fSEnrico Granata size_t value = 0; 989128ee2fSEnrico Granata if (m_opaque_sp.get()) 999128ee2fSEnrico Granata value = m_opaque_sp->GetByteSize(); 1009128ee2fSEnrico Granata return value; 1019128ee2fSEnrico Granata } 1029128ee2fSEnrico Granata 103b9c1b51eSKate Stone lldb::ByteOrder SBData::GetByteOrder() { 104baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::ByteOrder, SBData, GetByteOrder); 105baf5664fSJonas Devlieghere 1069128ee2fSEnrico Granata lldb::ByteOrder value = eByteOrderInvalid; 1079128ee2fSEnrico Granata if (m_opaque_sp.get()) 1089128ee2fSEnrico Granata value = m_opaque_sp->GetByteOrder(); 1099128ee2fSEnrico Granata return value; 1109128ee2fSEnrico Granata } 1119128ee2fSEnrico Granata 112b9c1b51eSKate Stone void SBData::SetByteOrder(lldb::ByteOrder endian) { 113baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBData, SetByteOrder, (lldb::ByteOrder), endian); 114baf5664fSJonas Devlieghere 1150f28986aSGreg Clayton if (m_opaque_sp.get()) 1160f28986aSGreg Clayton m_opaque_sp->SetByteOrder(endian); 1170f28986aSGreg Clayton } 1180f28986aSGreg Clayton 119b9c1b51eSKate Stone float SBData::GetFloat(lldb::SBError &error, lldb::offset_t offset) { 120baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(float, SBData, GetFloat, (lldb::SBError &, lldb::offset_t), 121baf5664fSJonas Devlieghere error, offset); 122baf5664fSJonas Devlieghere 1239128ee2fSEnrico Granata float value = 0; 124b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1259128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 126b9c1b51eSKate Stone } else { 1279128ee2fSEnrico Granata uint32_t old_offset = offset; 1289128ee2fSEnrico Granata value = m_opaque_sp->GetFloat(&offset); 1299128ee2fSEnrico Granata if (offset == old_offset) 1309128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1319128ee2fSEnrico Granata } 1329128ee2fSEnrico Granata return value; 1339128ee2fSEnrico Granata } 1349128ee2fSEnrico Granata 135b9c1b51eSKate Stone double SBData::GetDouble(lldb::SBError &error, lldb::offset_t offset) { 136baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(double, SBData, GetDouble, 137baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 138baf5664fSJonas Devlieghere 1399128ee2fSEnrico Granata double value = 0; 140b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1419128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 142b9c1b51eSKate Stone } else { 1439128ee2fSEnrico Granata uint32_t old_offset = offset; 1449128ee2fSEnrico Granata value = m_opaque_sp->GetDouble(&offset); 1459128ee2fSEnrico Granata if (offset == old_offset) 1469128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1479128ee2fSEnrico Granata } 1489128ee2fSEnrico Granata return value; 1499128ee2fSEnrico Granata } 1509128ee2fSEnrico Granata 151b9c1b51eSKate Stone long double SBData::GetLongDouble(lldb::SBError &error, lldb::offset_t offset) { 152baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(long double, SBData, GetLongDouble, 153baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 154baf5664fSJonas Devlieghere 1559128ee2fSEnrico Granata long double value = 0; 156b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1579128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 158b9c1b51eSKate Stone } else { 1599128ee2fSEnrico Granata uint32_t old_offset = offset; 1609128ee2fSEnrico Granata value = m_opaque_sp->GetLongDouble(&offset); 1619128ee2fSEnrico Granata if (offset == old_offset) 1629128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1639128ee2fSEnrico Granata } 1649128ee2fSEnrico Granata return value; 1659128ee2fSEnrico Granata } 1669128ee2fSEnrico Granata 167b9c1b51eSKate Stone lldb::addr_t SBData::GetAddress(lldb::SBError &error, lldb::offset_t offset) { 168baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::addr_t, SBData, GetAddress, 169baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 170baf5664fSJonas Devlieghere 1719128ee2fSEnrico Granata lldb::addr_t value = 0; 172b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1739128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 174b9c1b51eSKate Stone } else { 1759128ee2fSEnrico Granata uint32_t old_offset = offset; 1769128ee2fSEnrico Granata value = m_opaque_sp->GetAddress(&offset); 1779128ee2fSEnrico Granata if (offset == old_offset) 1789128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1799128ee2fSEnrico Granata } 1809128ee2fSEnrico Granata return value; 1819128ee2fSEnrico Granata } 1829128ee2fSEnrico Granata 183b9c1b51eSKate Stone uint8_t SBData::GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset) { 184baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint8_t, SBData, GetUnsignedInt8, 185baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 186baf5664fSJonas Devlieghere 1879128ee2fSEnrico Granata uint8_t value = 0; 188b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1899128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 190b9c1b51eSKate Stone } else { 1919128ee2fSEnrico Granata uint32_t old_offset = offset; 1929128ee2fSEnrico Granata value = m_opaque_sp->GetU8(&offset); 1939128ee2fSEnrico Granata if (offset == old_offset) 1949128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1959128ee2fSEnrico Granata } 1969128ee2fSEnrico Granata return value; 1979128ee2fSEnrico Granata } 1989128ee2fSEnrico Granata 199b9c1b51eSKate Stone uint16_t SBData::GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset) { 200baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint16_t, SBData, GetUnsignedInt16, 201baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 202baf5664fSJonas Devlieghere 2039128ee2fSEnrico Granata uint16_t value = 0; 204b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2059128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 206b9c1b51eSKate Stone } else { 2079128ee2fSEnrico Granata uint32_t old_offset = offset; 2089128ee2fSEnrico Granata value = m_opaque_sp->GetU16(&offset); 2099128ee2fSEnrico Granata if (offset == old_offset) 2109128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2119128ee2fSEnrico Granata } 2129128ee2fSEnrico Granata return value; 2139128ee2fSEnrico Granata } 2149128ee2fSEnrico Granata 215b9c1b51eSKate Stone uint32_t SBData::GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset) { 216baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBData, GetUnsignedInt32, 217baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 218baf5664fSJonas Devlieghere 2199128ee2fSEnrico Granata uint32_t value = 0; 220b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2219128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 222b9c1b51eSKate Stone } else { 2239128ee2fSEnrico Granata uint32_t old_offset = offset; 2249128ee2fSEnrico Granata value = m_opaque_sp->GetU32(&offset); 2259128ee2fSEnrico Granata if (offset == old_offset) 2269128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2279128ee2fSEnrico Granata } 2289128ee2fSEnrico Granata return value; 2299128ee2fSEnrico Granata } 2309128ee2fSEnrico Granata 231b9c1b51eSKate Stone uint64_t SBData::GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset) { 232baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint64_t, SBData, GetUnsignedInt64, 233baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 234baf5664fSJonas Devlieghere 2359128ee2fSEnrico Granata uint64_t value = 0; 236b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2379128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 238b9c1b51eSKate Stone } else { 2399128ee2fSEnrico Granata uint32_t old_offset = offset; 2409128ee2fSEnrico Granata value = m_opaque_sp->GetU64(&offset); 2419128ee2fSEnrico Granata if (offset == old_offset) 2429128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2439128ee2fSEnrico Granata } 2449128ee2fSEnrico Granata return value; 2459128ee2fSEnrico Granata } 2469128ee2fSEnrico Granata 247b9c1b51eSKate Stone int8_t SBData::GetSignedInt8(lldb::SBError &error, lldb::offset_t offset) { 248baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(int8_t, SBData, GetSignedInt8, 249baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 250baf5664fSJonas Devlieghere 2519128ee2fSEnrico Granata int8_t value = 0; 252b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2539128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 254b9c1b51eSKate Stone } else { 2559128ee2fSEnrico Granata uint32_t old_offset = offset; 2569128ee2fSEnrico Granata value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1); 2579128ee2fSEnrico Granata if (offset == old_offset) 2589128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2599128ee2fSEnrico Granata } 2609128ee2fSEnrico Granata return value; 2619128ee2fSEnrico Granata } 2629128ee2fSEnrico Granata 263b9c1b51eSKate Stone int16_t SBData::GetSignedInt16(lldb::SBError &error, lldb::offset_t offset) { 264baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(int16_t, SBData, GetSignedInt16, 265baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 266baf5664fSJonas Devlieghere 2679128ee2fSEnrico Granata int16_t value = 0; 268b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2699128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 270b9c1b51eSKate Stone } else { 2719128ee2fSEnrico Granata uint32_t old_offset = offset; 2729128ee2fSEnrico Granata value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2); 2739128ee2fSEnrico Granata if (offset == old_offset) 2749128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2759128ee2fSEnrico Granata } 2769128ee2fSEnrico Granata return value; 2779128ee2fSEnrico Granata } 2789128ee2fSEnrico Granata 279b9c1b51eSKate Stone int32_t SBData::GetSignedInt32(lldb::SBError &error, lldb::offset_t offset) { 280baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(int32_t, SBData, GetSignedInt32, 281baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 282baf5664fSJonas Devlieghere 2839128ee2fSEnrico Granata int32_t value = 0; 284b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2859128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 286b9c1b51eSKate Stone } else { 2879128ee2fSEnrico Granata uint32_t old_offset = offset; 2889128ee2fSEnrico Granata value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4); 2899128ee2fSEnrico Granata if (offset == old_offset) 2909128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2919128ee2fSEnrico Granata } 2929128ee2fSEnrico Granata return value; 2939128ee2fSEnrico Granata } 2949128ee2fSEnrico Granata 295b9c1b51eSKate Stone int64_t SBData::GetSignedInt64(lldb::SBError &error, lldb::offset_t offset) { 296baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(int64_t, SBData, GetSignedInt64, 297baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 298baf5664fSJonas Devlieghere 2999128ee2fSEnrico Granata int64_t value = 0; 300b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3019128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 302b9c1b51eSKate Stone } else { 3039128ee2fSEnrico Granata uint32_t old_offset = offset; 3049128ee2fSEnrico Granata value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8); 3059128ee2fSEnrico Granata if (offset == old_offset) 3069128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3079128ee2fSEnrico Granata } 3089128ee2fSEnrico Granata return value; 3099128ee2fSEnrico Granata } 3109128ee2fSEnrico Granata 311b9c1b51eSKate Stone const char *SBData::GetString(lldb::SBError &error, lldb::offset_t offset) { 312baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const char *, SBData, GetString, 313baf5664fSJonas Devlieghere (lldb::SBError &, lldb::offset_t), error, offset); 314baf5664fSJonas Devlieghere 315248a1305SKonrad Kleine const char *value = nullptr; 316b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3179128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 318b9c1b51eSKate Stone } else { 3199128ee2fSEnrico Granata uint32_t old_offset = offset; 3209128ee2fSEnrico Granata value = m_opaque_sp->GetCStr(&offset); 321248a1305SKonrad Kleine if (offset == old_offset || (value == nullptr)) 3229128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3239128ee2fSEnrico Granata } 3249128ee2fSEnrico Granata return value; 3259128ee2fSEnrico Granata } 3269128ee2fSEnrico Granata 327b9c1b51eSKate Stone bool SBData::GetDescription(lldb::SBStream &description, 328b9c1b51eSKate Stone lldb::addr_t base_addr) { 329baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, GetDescription, 330baf5664fSJonas Devlieghere (lldb::SBStream &, lldb::addr_t), description, base_addr); 331baf5664fSJonas Devlieghere 332da7bc7d0SGreg Clayton Stream &strm = description.ref(); 333da7bc7d0SGreg Clayton 334b9c1b51eSKate Stone if (m_opaque_sp) { 33529cb868aSZachary Turner DumpDataExtractor(*m_opaque_sp, &strm, 0, lldb::eFormatBytesWithASCII, 1, 336b9c1b51eSKate Stone m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0); 337b9c1b51eSKate Stone } else 338da7bc7d0SGreg Clayton strm.PutCString("No value"); 3399128ee2fSEnrico Granata 3409128ee2fSEnrico Granata return true; 3419128ee2fSEnrico Granata } 3429128ee2fSEnrico Granata 343b9c1b51eSKate Stone size_t SBData::ReadRawData(lldb::SBError &error, lldb::offset_t offset, 344b9c1b51eSKate Stone void *buf, size_t size) { 3450d7b0c96SJonas Devlieghere LLDB_RECORD_DUMMY(size_t, SBData, ReadRawData, 3460d7b0c96SJonas Devlieghere (lldb::SBError &, lldb::offset_t, void *, size_t), error, 3470d7b0c96SJonas Devlieghere offset, buf, size); 3480d7b0c96SJonas Devlieghere 349248a1305SKonrad Kleine void *ok = nullptr; 350b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3519128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 352b9c1b51eSKate Stone } else { 3539128ee2fSEnrico Granata uint32_t old_offset = offset; 3549128ee2fSEnrico Granata ok = m_opaque_sp->GetU8(&offset, buf, size); 355248a1305SKonrad Kleine if ((offset == old_offset) || (ok == nullptr)) 3569128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3579128ee2fSEnrico Granata } 3589128ee2fSEnrico Granata return ok ? size : 0; 3599128ee2fSEnrico Granata } 3609128ee2fSEnrico Granata 361b9c1b51eSKate Stone void SBData::SetData(lldb::SBError &error, const void *buf, size_t size, 362b9c1b51eSKate Stone lldb::ByteOrder endian, uint8_t addr_size) { 3630d7b0c96SJonas Devlieghere LLDB_RECORD_DUMMY( 3640d7b0c96SJonas Devlieghere void, SBData, SetData, 3650d7b0c96SJonas Devlieghere (lldb::SBError &, const void *, size_t, lldb::ByteOrder, uint8_t), error, 3660d7b0c96SJonas Devlieghere buf, size, endian, addr_size); 3670d7b0c96SJonas Devlieghere 3689128ee2fSEnrico Granata if (!m_opaque_sp.get()) 369796ac80bSJonas Devlieghere m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size); 3709128ee2fSEnrico Granata else 371896b4513SGreg Clayton { 3729128ee2fSEnrico Granata m_opaque_sp->SetData(buf, size, endian); 373896b4513SGreg Clayton m_opaque_sp->SetAddressByteSize(addr_size); 374896b4513SGreg Clayton } 3759128ee2fSEnrico Granata } 3769128ee2fSEnrico Granata 37772e25978SMed Ismail Bennani void SBData::SetDataWithOwnership(lldb::SBError &error, const void *buf, 37872e25978SMed Ismail Bennani size_t size, lldb::ByteOrder endian, 37972e25978SMed Ismail Bennani uint8_t addr_size) { 38072e25978SMed Ismail Bennani LLDB_RECORD_DUMMY( 38172e25978SMed Ismail Bennani void, SBData, SetData, 38272e25978SMed Ismail Bennani (lldb::SBError &, const void *, size_t, lldb::ByteOrder, uint8_t, bool), 38372e25978SMed Ismail Bennani error, buf, size, endian, addr_size, copy); 38472e25978SMed Ismail Bennani 38572e25978SMed Ismail Bennani lldb::DataBufferSP buffer_sp = std::make_shared<DataBufferHeap>(buf, size); 38672e25978SMed Ismail Bennani 38772e25978SMed Ismail Bennani if (!m_opaque_sp.get()) 38872e25978SMed Ismail Bennani m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size); 38972e25978SMed Ismail Bennani else { 39072e25978SMed Ismail Bennani m_opaque_sp->SetData(buffer_sp); 39172e25978SMed Ismail Bennani m_opaque_sp->SetByteOrder(endian); 39272e25978SMed Ismail Bennani m_opaque_sp->SetAddressByteSize(addr_size); 39372e25978SMed Ismail Bennani } 39472e25978SMed Ismail Bennani } 39572e25978SMed Ismail Bennani 396b9c1b51eSKate Stone bool SBData::Append(const SBData &rhs) { 397baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, Append, (const lldb::SBData &), rhs); 398baf5664fSJonas Devlieghere 3999128ee2fSEnrico Granata bool value = false; 4009128ee2fSEnrico Granata if (m_opaque_sp.get() && rhs.m_opaque_sp.get()) 4019128ee2fSEnrico Granata value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp); 4029128ee2fSEnrico Granata return value; 4039128ee2fSEnrico Granata } 4040f28986aSGreg Clayton 405b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromCString(lldb::ByteOrder endian, 406b9c1b51eSKate Stone uint32_t addr_byte_size, 407b9c1b51eSKate Stone const char *data) { 408baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromCString, 409baf5664fSJonas Devlieghere (lldb::ByteOrder, uint32_t, const char *), endian, 410baf5664fSJonas Devlieghere addr_byte_size, data); 411baf5664fSJonas Devlieghere 4120f28986aSGreg Clayton if (!data || !data[0]) 413baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBData()); 4140f28986aSGreg Clayton 4150f28986aSGreg Clayton uint32_t data_len = strlen(data); 4160f28986aSGreg Clayton 4170f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len)); 418b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 419b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4200f28986aSGreg Clayton 4210f28986aSGreg Clayton SBData ret(data_sp); 4220f28986aSGreg Clayton 423baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(ret); 4240f28986aSGreg Clayton } 4250f28986aSGreg Clayton 426b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt64Array(lldb::ByteOrder endian, 427b9c1b51eSKate Stone uint32_t addr_byte_size, 428b9c1b51eSKate Stone uint64_t *array, 429b9c1b51eSKate Stone size_t array_len) { 430baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromUInt64Array, 431baf5664fSJonas Devlieghere (lldb::ByteOrder, uint32_t, uint64_t *, size_t), 432baf5664fSJonas Devlieghere endian, addr_byte_size, array, array_len); 433baf5664fSJonas Devlieghere 4340f28986aSGreg Clayton if (!array || array_len == 0) 435baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBData()); 4360f28986aSGreg Clayton 4370f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint64_t); 4380f28986aSGreg Clayton 4390f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 440b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 441b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4420f28986aSGreg Clayton 4430f28986aSGreg Clayton SBData ret(data_sp); 4440f28986aSGreg Clayton 445baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(ret); 4460f28986aSGreg Clayton } 4470f28986aSGreg Clayton 448b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt32Array(lldb::ByteOrder endian, 449b9c1b51eSKate Stone uint32_t addr_byte_size, 450b9c1b51eSKate Stone uint32_t *array, 451b9c1b51eSKate Stone size_t array_len) { 452baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromUInt32Array, 453baf5664fSJonas Devlieghere (lldb::ByteOrder, uint32_t, uint32_t *, size_t), 454baf5664fSJonas Devlieghere endian, addr_byte_size, array, array_len); 455baf5664fSJonas Devlieghere 4560f28986aSGreg Clayton if (!array || array_len == 0) 457baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBData()); 4580f28986aSGreg Clayton 4590f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint32_t); 4600f28986aSGreg Clayton 4610f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 462b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 463b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4640f28986aSGreg Clayton 4650f28986aSGreg Clayton SBData ret(data_sp); 4660f28986aSGreg Clayton 467baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(ret); 4680f28986aSGreg Clayton } 4690f28986aSGreg Clayton 470b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt64Array(lldb::ByteOrder endian, 471b9c1b51eSKate Stone uint32_t addr_byte_size, 472b9c1b51eSKate Stone int64_t *array, 473b9c1b51eSKate Stone size_t array_len) { 474baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromSInt64Array, 475baf5664fSJonas Devlieghere (lldb::ByteOrder, uint32_t, int64_t *, size_t), 476baf5664fSJonas Devlieghere endian, addr_byte_size, array, array_len); 477baf5664fSJonas Devlieghere 4780f28986aSGreg Clayton if (!array || array_len == 0) 479baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBData()); 4800f28986aSGreg Clayton 4810f28986aSGreg Clayton size_t data_len = array_len * sizeof(int64_t); 4820f28986aSGreg Clayton 4830f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 484b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 485b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4860f28986aSGreg Clayton 4870f28986aSGreg Clayton SBData ret(data_sp); 4880f28986aSGreg Clayton 489baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(ret); 4900f28986aSGreg Clayton } 4910f28986aSGreg Clayton 492b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt32Array(lldb::ByteOrder endian, 493b9c1b51eSKate Stone uint32_t addr_byte_size, 494b9c1b51eSKate Stone int32_t *array, 495b9c1b51eSKate Stone size_t array_len) { 496baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromSInt32Array, 497baf5664fSJonas Devlieghere (lldb::ByteOrder, uint32_t, int32_t *, size_t), 498baf5664fSJonas Devlieghere endian, addr_byte_size, array, array_len); 499baf5664fSJonas Devlieghere 5000f28986aSGreg Clayton if (!array || array_len == 0) 501baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBData()); 5020f28986aSGreg Clayton 5030f28986aSGreg Clayton size_t data_len = array_len * sizeof(int32_t); 5040f28986aSGreg Clayton 5050f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 506b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 507b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 5080f28986aSGreg Clayton 5090f28986aSGreg Clayton SBData ret(data_sp); 5100f28986aSGreg Clayton 511baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(ret); 5120f28986aSGreg Clayton } 5130f28986aSGreg Clayton 514b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromDoubleArray(lldb::ByteOrder endian, 515b9c1b51eSKate Stone uint32_t addr_byte_size, 516b9c1b51eSKate Stone double *array, 517b9c1b51eSKate Stone size_t array_len) { 518baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBData, SBData, CreateDataFromDoubleArray, 519baf5664fSJonas Devlieghere (lldb::ByteOrder, uint32_t, double *, size_t), 520baf5664fSJonas Devlieghere endian, addr_byte_size, array, array_len); 521baf5664fSJonas Devlieghere 5220f28986aSGreg Clayton if (!array || array_len == 0) 523baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBData()); 5240f28986aSGreg Clayton 5250f28986aSGreg Clayton size_t data_len = array_len * sizeof(double); 5260f28986aSGreg Clayton 5270f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 528b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 529b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 5300f28986aSGreg Clayton 5310f28986aSGreg Clayton SBData ret(data_sp); 5320f28986aSGreg Clayton 533baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(ret); 5340f28986aSGreg Clayton } 5350f28986aSGreg Clayton 536b9c1b51eSKate Stone bool SBData::SetDataFromCString(const char *data) { 537baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, SetDataFromCString, (const char *), data); 538baf5664fSJonas Devlieghere 5390f28986aSGreg Clayton 540b9c1b51eSKate Stone if (!data) { 5410f28986aSGreg Clayton return false; 5420f28986aSGreg Clayton } 5430f28986aSGreg Clayton 5440f28986aSGreg Clayton size_t data_len = strlen(data); 5450f28986aSGreg Clayton 5460f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len)); 5470f28986aSGreg Clayton 5480f28986aSGreg Clayton if (!m_opaque_sp.get()) 549796ac80bSJonas Devlieghere m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(), 550796ac80bSJonas Devlieghere GetAddressByteSize()); 5510f28986aSGreg Clayton else 5520f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5530f28986aSGreg Clayton 5540f28986aSGreg Clayton 5550f28986aSGreg Clayton return true; 5560f28986aSGreg Clayton } 5570f28986aSGreg Clayton 558b9c1b51eSKate Stone bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) { 559baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, SetDataFromUInt64Array, (uint64_t *, size_t), 560baf5664fSJonas Devlieghere array, array_len); 561baf5664fSJonas Devlieghere 5620f28986aSGreg Clayton 563b9c1b51eSKate Stone if (!array || array_len == 0) { 5640f28986aSGreg Clayton return false; 5650f28986aSGreg Clayton } 5660f28986aSGreg Clayton 5670f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint64_t); 5680f28986aSGreg Clayton 5690f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 5700f28986aSGreg Clayton 5710f28986aSGreg Clayton if (!m_opaque_sp.get()) 572796ac80bSJonas Devlieghere m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(), 573796ac80bSJonas Devlieghere GetAddressByteSize()); 5740f28986aSGreg Clayton else 5750f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5760f28986aSGreg Clayton 5770f28986aSGreg Clayton 5780f28986aSGreg Clayton return true; 5790f28986aSGreg Clayton } 5800f28986aSGreg Clayton 581b9c1b51eSKate Stone bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) { 582baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, SetDataFromUInt32Array, (uint32_t *, size_t), 583baf5664fSJonas Devlieghere array, array_len); 584baf5664fSJonas Devlieghere 5850f28986aSGreg Clayton 586b9c1b51eSKate Stone if (!array || array_len == 0) { 5870f28986aSGreg Clayton return false; 5880f28986aSGreg Clayton } 5890f28986aSGreg Clayton 5900f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint32_t); 5910f28986aSGreg Clayton 5920f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 5930f28986aSGreg Clayton 5940f28986aSGreg Clayton if (!m_opaque_sp.get()) 595796ac80bSJonas Devlieghere m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(), 596796ac80bSJonas Devlieghere GetAddressByteSize()); 5970f28986aSGreg Clayton else 5980f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5990f28986aSGreg Clayton 6000f28986aSGreg Clayton return true; 6010f28986aSGreg Clayton } 6020f28986aSGreg Clayton 603b9c1b51eSKate Stone bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) { 604baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, SetDataFromSInt64Array, (int64_t *, size_t), 605baf5664fSJonas Devlieghere array, array_len); 606baf5664fSJonas Devlieghere 6070f28986aSGreg Clayton 608b9c1b51eSKate Stone if (!array || array_len == 0) { 6090f28986aSGreg Clayton return false; 6100f28986aSGreg Clayton } 6110f28986aSGreg Clayton 6120f28986aSGreg Clayton size_t data_len = array_len * sizeof(int64_t); 6130f28986aSGreg Clayton 6140f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6150f28986aSGreg Clayton 6160f28986aSGreg Clayton if (!m_opaque_sp.get()) 617796ac80bSJonas Devlieghere m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(), 618796ac80bSJonas Devlieghere GetAddressByteSize()); 6190f28986aSGreg Clayton else 6200f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6210f28986aSGreg Clayton 6220f28986aSGreg Clayton return true; 6230f28986aSGreg Clayton } 6240f28986aSGreg Clayton 625b9c1b51eSKate Stone bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) { 626baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, SetDataFromSInt32Array, (int32_t *, size_t), 627baf5664fSJonas Devlieghere array, array_len); 628baf5664fSJonas Devlieghere 6290f28986aSGreg Clayton 630b9c1b51eSKate Stone if (!array || array_len == 0) { 6310f28986aSGreg Clayton return false; 6320f28986aSGreg Clayton } 6330f28986aSGreg Clayton 6340f28986aSGreg Clayton size_t data_len = array_len * sizeof(int32_t); 6350f28986aSGreg Clayton 6360f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6370f28986aSGreg Clayton 6380f28986aSGreg Clayton if (!m_opaque_sp.get()) 639796ac80bSJonas Devlieghere m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(), 640796ac80bSJonas Devlieghere GetAddressByteSize()); 6410f28986aSGreg Clayton else 6420f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6430f28986aSGreg Clayton 6440f28986aSGreg Clayton return true; 6450f28986aSGreg Clayton } 6460f28986aSGreg Clayton 647b9c1b51eSKate Stone bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) { 648baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBData, SetDataFromDoubleArray, (double *, size_t), 649baf5664fSJonas Devlieghere array, array_len); 650baf5664fSJonas Devlieghere 6510f28986aSGreg Clayton 652b9c1b51eSKate Stone if (!array || array_len == 0) { 6530f28986aSGreg Clayton return false; 6540f28986aSGreg Clayton } 6550f28986aSGreg Clayton 6560f28986aSGreg Clayton size_t data_len = array_len * sizeof(double); 6570f28986aSGreg Clayton 6580f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6590f28986aSGreg Clayton 6600f28986aSGreg Clayton if (!m_opaque_sp.get()) 661796ac80bSJonas Devlieghere m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(), 662796ac80bSJonas Devlieghere GetAddressByteSize()); 6630f28986aSGreg Clayton else 6640f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6650f28986aSGreg Clayton 6660f28986aSGreg Clayton return true; 6670f28986aSGreg Clayton } 668