19128ee2fSEnrico Granata //===-- SBData.cpp ----------------------------------------------*- C++ -*-===// 29128ee2fSEnrico Granata // 39128ee2fSEnrico Granata // The LLVM Compiler Infrastructure 49128ee2fSEnrico Granata // 59128ee2fSEnrico Granata // This file is distributed under the University of Illinois Open Source 69128ee2fSEnrico Granata // License. See LICENSE.TXT for details. 79128ee2fSEnrico Granata // 89128ee2fSEnrico Granata //===----------------------------------------------------------------------===// 99128ee2fSEnrico Granata 10af90cf52SSean Callanan #include <inttypes.h> // PRIu64 11af90cf52SSean Callanan 129128ee2fSEnrico Granata #include "lldb/API/SBData.h" 139128ee2fSEnrico Granata #include "lldb/API/SBError.h" 149128ee2fSEnrico Granata #include "lldb/API/SBStream.h" 159128ee2fSEnrico Granata 160f28986aSGreg Clayton #include "lldb/Core/DataBufferHeap.h" 179128ee2fSEnrico Granata #include "lldb/Core/DataExtractor.h" 18*6f9e6901SZachary Turner #include "lldb/Utility/Log.h" 19bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 20da7bc7d0SGreg Clayton 219128ee2fSEnrico Granata using namespace lldb; 229128ee2fSEnrico Granata using namespace lldb_private; 239128ee2fSEnrico Granata 24b9c1b51eSKate Stone SBData::SBData() : m_opaque_sp(new DataExtractor()) {} 259128ee2fSEnrico Granata 26b9c1b51eSKate Stone SBData::SBData(const lldb::DataExtractorSP &data_sp) : m_opaque_sp(data_sp) {} 279128ee2fSEnrico Granata 28b9c1b51eSKate Stone SBData::SBData(const SBData &rhs) : m_opaque_sp(rhs.m_opaque_sp) {} 299128ee2fSEnrico Granata 30b9c1b51eSKate Stone const SBData &SBData::operator=(const SBData &rhs) { 319128ee2fSEnrico Granata if (this != &rhs) 329128ee2fSEnrico Granata m_opaque_sp = rhs.m_opaque_sp; 339128ee2fSEnrico Granata return *this; 349128ee2fSEnrico Granata } 359128ee2fSEnrico Granata 36b9c1b51eSKate Stone SBData::~SBData() {} 379128ee2fSEnrico Granata 38b9c1b51eSKate Stone void SBData::SetOpaque(const lldb::DataExtractorSP &data_sp) { 399128ee2fSEnrico Granata m_opaque_sp = data_sp; 409128ee2fSEnrico Granata } 419128ee2fSEnrico Granata 42b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::get() const { return m_opaque_sp.get(); } 439128ee2fSEnrico Granata 44b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::operator->() const { 459128ee2fSEnrico Granata return m_opaque_sp.operator->(); 469128ee2fSEnrico Granata } 479128ee2fSEnrico Granata 48b9c1b51eSKate Stone lldb::DataExtractorSP &SBData::operator*() { return m_opaque_sp; } 499128ee2fSEnrico Granata 50b9c1b51eSKate Stone const lldb::DataExtractorSP &SBData::operator*() const { return m_opaque_sp; } 519128ee2fSEnrico Granata 52b9c1b51eSKate Stone bool SBData::IsValid() { return m_opaque_sp.get() != NULL; } 539128ee2fSEnrico Granata 54b9c1b51eSKate Stone uint8_t SBData::GetAddressByteSize() { 555160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 569128ee2fSEnrico Granata uint8_t value = 0; 579128ee2fSEnrico Granata if (m_opaque_sp.get()) 589128ee2fSEnrico Granata value = m_opaque_sp->GetAddressByteSize(); 599128ee2fSEnrico Granata if (log) 609128ee2fSEnrico Granata log->Printf("SBData::GetAddressByteSize () => " 61b9c1b51eSKate Stone "(%i)", 62b9c1b51eSKate Stone value); 639128ee2fSEnrico Granata return value; 649128ee2fSEnrico Granata } 659128ee2fSEnrico Granata 66b9c1b51eSKate Stone void SBData::SetAddressByteSize(uint8_t addr_byte_size) { 675160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 680f28986aSGreg Clayton if (m_opaque_sp.get()) 690f28986aSGreg Clayton m_opaque_sp->SetAddressByteSize(addr_byte_size); 700f28986aSGreg Clayton if (log) 710f28986aSGreg Clayton log->Printf("SBData::SetAddressByteSize (%i)", addr_byte_size); 720f28986aSGreg Clayton } 730f28986aSGreg Clayton 74b9c1b51eSKate Stone void SBData::Clear() { 759128ee2fSEnrico Granata if (m_opaque_sp.get()) 769128ee2fSEnrico Granata m_opaque_sp->Clear(); 779128ee2fSEnrico Granata } 789128ee2fSEnrico Granata 79b9c1b51eSKate Stone size_t SBData::GetByteSize() { 805160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 819128ee2fSEnrico Granata size_t value = 0; 829128ee2fSEnrico Granata if (m_opaque_sp.get()) 839128ee2fSEnrico Granata value = m_opaque_sp->GetByteSize(); 849128ee2fSEnrico Granata if (log) 859128ee2fSEnrico Granata log->Printf("SBData::GetByteSize () => " 86b9c1b51eSKate Stone "( %" PRIu64 " )", 87b9c1b51eSKate Stone (uint64_t)value); 889128ee2fSEnrico Granata return value; 899128ee2fSEnrico Granata } 909128ee2fSEnrico Granata 91b9c1b51eSKate Stone lldb::ByteOrder SBData::GetByteOrder() { 925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 939128ee2fSEnrico Granata lldb::ByteOrder value = eByteOrderInvalid; 949128ee2fSEnrico Granata if (m_opaque_sp.get()) 959128ee2fSEnrico Granata value = m_opaque_sp->GetByteOrder(); 969128ee2fSEnrico Granata if (log) 979128ee2fSEnrico Granata log->Printf("SBData::GetByteOrder () => " 98b9c1b51eSKate Stone "(%i)", 99b9c1b51eSKate Stone value); 1009128ee2fSEnrico Granata return value; 1019128ee2fSEnrico Granata } 1029128ee2fSEnrico Granata 103b9c1b51eSKate Stone void SBData::SetByteOrder(lldb::ByteOrder endian) { 1045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1050f28986aSGreg Clayton if (m_opaque_sp.get()) 1060f28986aSGreg Clayton m_opaque_sp->SetByteOrder(endian); 1070f28986aSGreg Clayton if (log) 1080f28986aSGreg Clayton log->Printf("SBData::GetByteOrder (%i)", endian); 1090f28986aSGreg Clayton } 1100f28986aSGreg Clayton 111b9c1b51eSKate Stone float SBData::GetFloat(lldb::SBError &error, lldb::offset_t offset) { 1125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1139128ee2fSEnrico Granata float value = 0; 114b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1159128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 116b9c1b51eSKate Stone } else { 1179128ee2fSEnrico Granata uint32_t old_offset = offset; 1189128ee2fSEnrico Granata value = m_opaque_sp->GetFloat(&offset); 1199128ee2fSEnrico Granata if (offset == old_offset) 1209128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1219128ee2fSEnrico Granata } 1229128ee2fSEnrico Granata if (log) 123324a1036SSaleem Abdulrasool log->Printf("SBData::GetFloat (error=%p,offset=%" PRIu64 ") => (%f)", 124324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), offset, value); 1259128ee2fSEnrico Granata return value; 1269128ee2fSEnrico Granata } 1279128ee2fSEnrico Granata 128b9c1b51eSKate Stone double SBData::GetDouble(lldb::SBError &error, lldb::offset_t offset) { 1295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1309128ee2fSEnrico Granata double value = 0; 131b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1329128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 133b9c1b51eSKate Stone } else { 1349128ee2fSEnrico Granata uint32_t old_offset = offset; 1359128ee2fSEnrico Granata value = m_opaque_sp->GetDouble(&offset); 1369128ee2fSEnrico Granata if (offset == old_offset) 1379128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1389128ee2fSEnrico Granata } 1399128ee2fSEnrico Granata if (log) 140c7bece56SGreg Clayton log->Printf("SBData::GetDouble (error=%p,offset=%" PRIu64 ") => " 141b9c1b51eSKate Stone "(%f)", 142b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 1439128ee2fSEnrico Granata return value; 1449128ee2fSEnrico Granata } 1459128ee2fSEnrico Granata 146b9c1b51eSKate Stone long double SBData::GetLongDouble(lldb::SBError &error, lldb::offset_t offset) { 1475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1489128ee2fSEnrico Granata long double value = 0; 149b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1509128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 151b9c1b51eSKate Stone } else { 1529128ee2fSEnrico Granata uint32_t old_offset = offset; 1539128ee2fSEnrico Granata value = m_opaque_sp->GetLongDouble(&offset); 1549128ee2fSEnrico Granata if (offset == old_offset) 1559128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1569128ee2fSEnrico Granata } 1579128ee2fSEnrico Granata if (log) 158c7bece56SGreg Clayton log->Printf("SBData::GetLongDouble (error=%p,offset=%" PRIu64 ") => " 159b9c1b51eSKate Stone "(%Lf)", 160b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 1619128ee2fSEnrico Granata return value; 1629128ee2fSEnrico Granata } 1639128ee2fSEnrico Granata 164b9c1b51eSKate Stone lldb::addr_t SBData::GetAddress(lldb::SBError &error, lldb::offset_t offset) { 1655160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1669128ee2fSEnrico Granata lldb::addr_t value = 0; 167b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1689128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 169b9c1b51eSKate Stone } else { 1709128ee2fSEnrico Granata uint32_t old_offset = offset; 1719128ee2fSEnrico Granata value = m_opaque_sp->GetAddress(&offset); 1729128ee2fSEnrico Granata if (offset == old_offset) 1739128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1749128ee2fSEnrico Granata } 1759128ee2fSEnrico Granata if (log) 176c7bece56SGreg Clayton log->Printf("SBData::GetAddress (error=%p,offset=%" PRIu64 ") => " 177b9c1b51eSKate Stone "(%p)", 178b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, 179324a1036SSaleem Abdulrasool reinterpret_cast<void *>(value)); 1809128ee2fSEnrico Granata return value; 1819128ee2fSEnrico Granata } 1829128ee2fSEnrico Granata 183b9c1b51eSKate Stone uint8_t SBData::GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset) { 1845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1859128ee2fSEnrico Granata uint8_t value = 0; 186b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1879128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 188b9c1b51eSKate Stone } else { 1899128ee2fSEnrico Granata uint32_t old_offset = offset; 1909128ee2fSEnrico Granata value = m_opaque_sp->GetU8(&offset); 1919128ee2fSEnrico Granata if (offset == old_offset) 1929128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1939128ee2fSEnrico Granata } 1949128ee2fSEnrico Granata if (log) 195c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt8 (error=%p,offset=%" PRIu64 ") => " 196b9c1b51eSKate Stone "(%c)", 197b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 1989128ee2fSEnrico Granata return value; 1999128ee2fSEnrico Granata } 2009128ee2fSEnrico Granata 201b9c1b51eSKate Stone uint16_t SBData::GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset) { 2025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 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 if (log) 213c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt16 (error=%p,offset=%" PRIu64 ") => " 214b9c1b51eSKate Stone "(%hd)", 215b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2169128ee2fSEnrico Granata return value; 2179128ee2fSEnrico Granata } 2189128ee2fSEnrico Granata 219b9c1b51eSKate Stone uint32_t SBData::GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset) { 2205160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2219128ee2fSEnrico Granata uint32_t value = 0; 222b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2239128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 224b9c1b51eSKate Stone } else { 2259128ee2fSEnrico Granata uint32_t old_offset = offset; 2269128ee2fSEnrico Granata value = m_opaque_sp->GetU32(&offset); 2279128ee2fSEnrico Granata if (offset == old_offset) 2289128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2299128ee2fSEnrico Granata } 2309128ee2fSEnrico Granata if (log) 231c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt32 (error=%p,offset=%" PRIu64 ") => " 232b9c1b51eSKate Stone "(%d)", 233b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2349128ee2fSEnrico Granata return value; 2359128ee2fSEnrico Granata } 2369128ee2fSEnrico Granata 237b9c1b51eSKate Stone uint64_t SBData::GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset) { 2385160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2399128ee2fSEnrico Granata uint64_t value = 0; 240b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2419128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 242b9c1b51eSKate Stone } else { 2439128ee2fSEnrico Granata uint32_t old_offset = offset; 2449128ee2fSEnrico Granata value = m_opaque_sp->GetU64(&offset); 2459128ee2fSEnrico Granata if (offset == old_offset) 2469128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2479128ee2fSEnrico Granata } 2489128ee2fSEnrico Granata if (log) 249c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt64 (error=%p,offset=%" PRIu64 ") => " 250b9c1b51eSKate Stone "(%" PRId64 ")", 251b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2529128ee2fSEnrico Granata return value; 2539128ee2fSEnrico Granata } 2549128ee2fSEnrico Granata 255b9c1b51eSKate Stone int8_t SBData::GetSignedInt8(lldb::SBError &error, lldb::offset_t offset) { 2565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2579128ee2fSEnrico Granata int8_t value = 0; 258b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2599128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 260b9c1b51eSKate Stone } else { 2619128ee2fSEnrico Granata uint32_t old_offset = offset; 2629128ee2fSEnrico Granata value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1); 2639128ee2fSEnrico Granata if (offset == old_offset) 2649128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2659128ee2fSEnrico Granata } 2669128ee2fSEnrico Granata if (log) 267c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt8 (error=%p,offset=%" PRIu64 ") => " 268b9c1b51eSKate Stone "(%c)", 269b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2709128ee2fSEnrico Granata return value; 2719128ee2fSEnrico Granata } 2729128ee2fSEnrico Granata 273b9c1b51eSKate Stone int16_t SBData::GetSignedInt16(lldb::SBError &error, lldb::offset_t offset) { 2745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2759128ee2fSEnrico Granata int16_t value = 0; 276b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2779128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 278b9c1b51eSKate Stone } else { 2799128ee2fSEnrico Granata uint32_t old_offset = offset; 2809128ee2fSEnrico Granata value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2); 2819128ee2fSEnrico Granata if (offset == old_offset) 2829128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2839128ee2fSEnrico Granata } 2849128ee2fSEnrico Granata if (log) 285c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt16 (error=%p,offset=%" PRIu64 ") => " 286b9c1b51eSKate Stone "(%hd)", 287b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2889128ee2fSEnrico Granata return value; 2899128ee2fSEnrico Granata } 2909128ee2fSEnrico Granata 291b9c1b51eSKate Stone int32_t SBData::GetSignedInt32(lldb::SBError &error, lldb::offset_t offset) { 2925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2939128ee2fSEnrico Granata int32_t value = 0; 294b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2959128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 296b9c1b51eSKate Stone } else { 2979128ee2fSEnrico Granata uint32_t old_offset = offset; 2989128ee2fSEnrico Granata value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4); 2999128ee2fSEnrico Granata if (offset == old_offset) 3009128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3019128ee2fSEnrico Granata } 3029128ee2fSEnrico Granata if (log) 303c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt32 (error=%p,offset=%" PRIu64 ") => " 304b9c1b51eSKate Stone "(%d)", 305b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 3069128ee2fSEnrico Granata return value; 3079128ee2fSEnrico Granata } 3089128ee2fSEnrico Granata 309b9c1b51eSKate Stone int64_t SBData::GetSignedInt64(lldb::SBError &error, lldb::offset_t offset) { 3105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3119128ee2fSEnrico Granata int64_t value = 0; 312b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3139128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 314b9c1b51eSKate Stone } else { 3159128ee2fSEnrico Granata uint32_t old_offset = offset; 3169128ee2fSEnrico Granata value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8); 3179128ee2fSEnrico Granata if (offset == old_offset) 3189128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3199128ee2fSEnrico Granata } 3209128ee2fSEnrico Granata if (log) 321c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt64 (error=%p,offset=%" PRIu64 ") => " 322b9c1b51eSKate Stone "(%" PRId64 ")", 323b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 3249128ee2fSEnrico Granata return value; 3259128ee2fSEnrico Granata } 3269128ee2fSEnrico Granata 327b9c1b51eSKate Stone const char *SBData::GetString(lldb::SBError &error, lldb::offset_t offset) { 3285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3299128ee2fSEnrico Granata const char *value = 0; 330b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3319128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 332b9c1b51eSKate Stone } else { 3339128ee2fSEnrico Granata uint32_t old_offset = offset; 3349128ee2fSEnrico Granata value = m_opaque_sp->GetCStr(&offset); 3359128ee2fSEnrico Granata if (offset == old_offset || (value == NULL)) 3369128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3379128ee2fSEnrico Granata } 3389128ee2fSEnrico Granata if (log) 339324a1036SSaleem Abdulrasool log->Printf("SBData::GetString (error=%p,offset=%" PRIu64 ") => (%p)", 340324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), offset, 341324a1036SSaleem Abdulrasool static_cast<const void *>(value)); 3429128ee2fSEnrico Granata return value; 3439128ee2fSEnrico Granata } 3449128ee2fSEnrico Granata 345b9c1b51eSKate Stone bool SBData::GetDescription(lldb::SBStream &description, 346b9c1b51eSKate Stone lldb::addr_t base_addr) { 347da7bc7d0SGreg Clayton Stream &strm = description.ref(); 348da7bc7d0SGreg Clayton 349b9c1b51eSKate Stone if (m_opaque_sp) { 350b9c1b51eSKate Stone m_opaque_sp->Dump(&strm, 0, lldb::eFormatBytesWithASCII, 1, 351b9c1b51eSKate Stone m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0); 352b9c1b51eSKate Stone } else 353da7bc7d0SGreg Clayton strm.PutCString("No value"); 3549128ee2fSEnrico Granata 3559128ee2fSEnrico Granata return true; 3569128ee2fSEnrico Granata } 3579128ee2fSEnrico Granata 358b9c1b51eSKate Stone size_t SBData::ReadRawData(lldb::SBError &error, lldb::offset_t offset, 359b9c1b51eSKate Stone void *buf, size_t size) { 3605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3619128ee2fSEnrico Granata void *ok = NULL; 362b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3639128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 364b9c1b51eSKate Stone } else { 3659128ee2fSEnrico Granata uint32_t old_offset = offset; 3669128ee2fSEnrico Granata ok = m_opaque_sp->GetU8(&offset, buf, size); 3679128ee2fSEnrico Granata if ((offset == old_offset) || (ok == NULL)) 3689128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3699128ee2fSEnrico Granata } 3709128ee2fSEnrico Granata if (log) 371b9c1b51eSKate Stone log->Printf("SBData::ReadRawData (error=%p,offset=%" PRIu64 372b9c1b51eSKate Stone ",buf=%p,size=%" PRIu64 ") => " 373b9c1b51eSKate Stone "(%p)", 374b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, 375324a1036SSaleem Abdulrasool static_cast<void *>(buf), static_cast<uint64_t>(size), 376324a1036SSaleem Abdulrasool static_cast<void *>(ok)); 3779128ee2fSEnrico Granata return ok ? size : 0; 3789128ee2fSEnrico Granata } 3799128ee2fSEnrico Granata 380b9c1b51eSKate Stone void SBData::SetData(lldb::SBError &error, const void *buf, size_t size, 381b9c1b51eSKate Stone lldb::ByteOrder endian, uint8_t addr_size) { 3825160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3839128ee2fSEnrico Granata if (!m_opaque_sp.get()) 3849128ee2fSEnrico Granata m_opaque_sp.reset(new DataExtractor(buf, size, endian, addr_size)); 3859128ee2fSEnrico Granata else 386896b4513SGreg Clayton { 3879128ee2fSEnrico Granata m_opaque_sp->SetData(buf, size, endian); 388896b4513SGreg Clayton m_opaque_sp->SetAddressByteSize(addr_size); 389896b4513SGreg Clayton } 390896b4513SGreg Clayton 3919128ee2fSEnrico Granata if (log) 392b9c1b51eSKate Stone log->Printf("SBData::SetData (error=%p,buf=%p,size=%" PRIu64 393b9c1b51eSKate Stone ",endian=%d,addr_size=%c) => " 394b9c1b51eSKate Stone "(%p)", 395b9c1b51eSKate Stone static_cast<void *>(error.get()), 396324a1036SSaleem Abdulrasool static_cast<const void *>(buf), static_cast<uint64_t>(size), 397324a1036SSaleem Abdulrasool endian, addr_size, static_cast<void *>(m_opaque_sp.get())); 3989128ee2fSEnrico Granata } 3999128ee2fSEnrico Granata 400b9c1b51eSKate Stone bool SBData::Append(const SBData &rhs) { 4015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4029128ee2fSEnrico Granata bool value = false; 4039128ee2fSEnrico Granata if (m_opaque_sp.get() && rhs.m_opaque_sp.get()) 4049128ee2fSEnrico Granata value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp); 4059128ee2fSEnrico Granata if (log) 406324a1036SSaleem Abdulrasool log->Printf("SBData::Append (rhs=%p) => (%s)", 407324a1036SSaleem Abdulrasool static_cast<void *>(rhs.get()), value ? "true" : "false"); 4089128ee2fSEnrico Granata return value; 4099128ee2fSEnrico Granata } 4100f28986aSGreg Clayton 411b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromCString(lldb::ByteOrder endian, 412b9c1b51eSKate Stone uint32_t addr_byte_size, 413b9c1b51eSKate Stone const char *data) { 4140f28986aSGreg Clayton if (!data || !data[0]) 4150f28986aSGreg Clayton return SBData(); 4160f28986aSGreg Clayton 4170f28986aSGreg Clayton uint32_t data_len = strlen(data); 4180f28986aSGreg Clayton 4190f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len)); 420b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 421b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4220f28986aSGreg Clayton 4230f28986aSGreg Clayton SBData ret(data_sp); 4240f28986aSGreg Clayton 4250f28986aSGreg Clayton return ret; 4260f28986aSGreg Clayton } 4270f28986aSGreg Clayton 428b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt64Array(lldb::ByteOrder endian, 429b9c1b51eSKate Stone uint32_t addr_byte_size, 430b9c1b51eSKate Stone uint64_t *array, 431b9c1b51eSKate Stone size_t array_len) { 4320f28986aSGreg Clayton if (!array || array_len == 0) 4330f28986aSGreg Clayton return SBData(); 4340f28986aSGreg Clayton 4350f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint64_t); 4360f28986aSGreg Clayton 4370f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 438b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 439b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4400f28986aSGreg Clayton 4410f28986aSGreg Clayton SBData ret(data_sp); 4420f28986aSGreg Clayton 4430f28986aSGreg Clayton return ret; 4440f28986aSGreg Clayton } 4450f28986aSGreg Clayton 446b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt32Array(lldb::ByteOrder endian, 447b9c1b51eSKate Stone uint32_t addr_byte_size, 448b9c1b51eSKate Stone uint32_t *array, 449b9c1b51eSKate Stone size_t array_len) { 4500f28986aSGreg Clayton if (!array || array_len == 0) 4510f28986aSGreg Clayton return SBData(); 4520f28986aSGreg Clayton 4530f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint32_t); 4540f28986aSGreg Clayton 4550f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 456b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 457b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4580f28986aSGreg Clayton 4590f28986aSGreg Clayton SBData ret(data_sp); 4600f28986aSGreg Clayton 4610f28986aSGreg Clayton return ret; 4620f28986aSGreg Clayton } 4630f28986aSGreg Clayton 464b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt64Array(lldb::ByteOrder endian, 465b9c1b51eSKate Stone uint32_t addr_byte_size, 466b9c1b51eSKate Stone int64_t *array, 467b9c1b51eSKate Stone size_t array_len) { 4680f28986aSGreg Clayton if (!array || array_len == 0) 4690f28986aSGreg Clayton return SBData(); 4700f28986aSGreg Clayton 4710f28986aSGreg Clayton size_t data_len = array_len * sizeof(int64_t); 4720f28986aSGreg Clayton 4730f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 474b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 475b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4760f28986aSGreg Clayton 4770f28986aSGreg Clayton SBData ret(data_sp); 4780f28986aSGreg Clayton 4790f28986aSGreg Clayton return ret; 4800f28986aSGreg Clayton } 4810f28986aSGreg Clayton 482b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt32Array(lldb::ByteOrder endian, 483b9c1b51eSKate Stone uint32_t addr_byte_size, 484b9c1b51eSKate Stone int32_t *array, 485b9c1b51eSKate Stone size_t array_len) { 4860f28986aSGreg Clayton if (!array || array_len == 0) 4870f28986aSGreg Clayton return SBData(); 4880f28986aSGreg Clayton 4890f28986aSGreg Clayton size_t data_len = array_len * sizeof(int32_t); 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 4970f28986aSGreg Clayton return ret; 4980f28986aSGreg Clayton } 4990f28986aSGreg Clayton 500b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromDoubleArray(lldb::ByteOrder endian, 501b9c1b51eSKate Stone uint32_t addr_byte_size, 502b9c1b51eSKate Stone double *array, 503b9c1b51eSKate Stone size_t array_len) { 5040f28986aSGreg Clayton if (!array || array_len == 0) 5050f28986aSGreg Clayton return SBData(); 5060f28986aSGreg Clayton 5070f28986aSGreg Clayton size_t data_len = array_len * sizeof(double); 5080f28986aSGreg Clayton 5090f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 510b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 511b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 5120f28986aSGreg Clayton 5130f28986aSGreg Clayton SBData ret(data_sp); 5140f28986aSGreg Clayton 5150f28986aSGreg Clayton return ret; 5160f28986aSGreg Clayton } 5170f28986aSGreg Clayton 518b9c1b51eSKate Stone bool SBData::SetDataFromCString(const char *data) { 5195160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5200f28986aSGreg Clayton 521b9c1b51eSKate Stone if (!data) { 5220f28986aSGreg Clayton if (log) 523324a1036SSaleem Abdulrasool log->Printf("SBData::SetDataFromCString (data=%p) => false", 524324a1036SSaleem Abdulrasool static_cast<const void *>(data)); 5250f28986aSGreg Clayton return false; 5260f28986aSGreg Clayton } 5270f28986aSGreg Clayton 5280f28986aSGreg Clayton size_t data_len = strlen(data); 5290f28986aSGreg Clayton 5300f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len)); 5310f28986aSGreg Clayton 5320f28986aSGreg Clayton if (!m_opaque_sp.get()) 533b9c1b51eSKate Stone m_opaque_sp.reset( 534b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 5350f28986aSGreg Clayton else 5360f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5370f28986aSGreg Clayton 5380f28986aSGreg Clayton if (log) 539324a1036SSaleem Abdulrasool log->Printf("SBData::SetDataFromCString (data=%p) => true", 540324a1036SSaleem Abdulrasool static_cast<const void *>(data)); 5410f28986aSGreg Clayton 5420f28986aSGreg Clayton return true; 5430f28986aSGreg Clayton } 5440f28986aSGreg Clayton 545b9c1b51eSKate Stone bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) { 5465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5470f28986aSGreg Clayton 548b9c1b51eSKate Stone if (!array || array_len == 0) { 5490f28986aSGreg Clayton if (log) 550b9c1b51eSKate Stone log->Printf( 551b9c1b51eSKate Stone "SBData::SetDataFromUInt64Array (array=%p, array_len = %" PRIu64 552b9c1b51eSKate Stone ") => " 553b9c1b51eSKate Stone "false", 554b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 5550f28986aSGreg Clayton return false; 5560f28986aSGreg Clayton } 5570f28986aSGreg Clayton 5580f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint64_t); 5590f28986aSGreg Clayton 5600f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 5610f28986aSGreg Clayton 5620f28986aSGreg Clayton if (!m_opaque_sp.get()) 563b9c1b51eSKate Stone m_opaque_sp.reset( 564b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 5650f28986aSGreg Clayton else 5660f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5670f28986aSGreg Clayton 5680f28986aSGreg Clayton if (log) 569b9c1b51eSKate Stone log->Printf("SBData::SetDataFromUInt64Array (array=%p, array_len = %" PRIu64 570b9c1b51eSKate Stone ") => " 571b9c1b51eSKate Stone "true", 572b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 5730f28986aSGreg Clayton 5740f28986aSGreg Clayton return true; 5750f28986aSGreg Clayton } 5760f28986aSGreg Clayton 577b9c1b51eSKate Stone bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) { 5785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5790f28986aSGreg Clayton 580b9c1b51eSKate Stone if (!array || array_len == 0) { 5810f28986aSGreg Clayton if (log) 582b9c1b51eSKate Stone log->Printf( 583b9c1b51eSKate Stone "SBData::SetDataFromUInt32Array (array=%p, array_len = %" PRIu64 584b9c1b51eSKate Stone ") => " 585b9c1b51eSKate Stone "false", 586b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 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()) 595b9c1b51eSKate Stone m_opaque_sp.reset( 596b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 5970f28986aSGreg Clayton else 5980f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5990f28986aSGreg Clayton 6000f28986aSGreg Clayton if (log) 601b9c1b51eSKate Stone log->Printf("SBData::SetDataFromUInt32Array (array=%p, array_len = %" PRIu64 602b9c1b51eSKate Stone ") => " 603b9c1b51eSKate Stone "true", 604b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6050f28986aSGreg Clayton 6060f28986aSGreg Clayton return true; 6070f28986aSGreg Clayton } 6080f28986aSGreg Clayton 609b9c1b51eSKate Stone bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) { 6105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6110f28986aSGreg Clayton 612b9c1b51eSKate Stone if (!array || array_len == 0) { 6130f28986aSGreg Clayton if (log) 614b9c1b51eSKate Stone log->Printf( 615b9c1b51eSKate Stone "SBData::SetDataFromSInt64Array (array=%p, array_len = %" PRIu64 616b9c1b51eSKate Stone ") => " 617b9c1b51eSKate Stone "false", 618b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6190f28986aSGreg Clayton return false; 6200f28986aSGreg Clayton } 6210f28986aSGreg Clayton 6220f28986aSGreg Clayton size_t data_len = array_len * sizeof(int64_t); 6230f28986aSGreg Clayton 6240f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6250f28986aSGreg Clayton 6260f28986aSGreg Clayton if (!m_opaque_sp.get()) 627b9c1b51eSKate Stone m_opaque_sp.reset( 628b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 6290f28986aSGreg Clayton else 6300f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6310f28986aSGreg Clayton 6320f28986aSGreg Clayton if (log) 633b9c1b51eSKate Stone log->Printf("SBData::SetDataFromSInt64Array (array=%p, array_len = %" PRIu64 634b9c1b51eSKate Stone ") => " 635b9c1b51eSKate Stone "true", 636b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6370f28986aSGreg Clayton 6380f28986aSGreg Clayton return true; 6390f28986aSGreg Clayton } 6400f28986aSGreg Clayton 641b9c1b51eSKate Stone bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) { 6425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6430f28986aSGreg Clayton 644b9c1b51eSKate Stone if (!array || array_len == 0) { 6450f28986aSGreg Clayton if (log) 646b9c1b51eSKate Stone log->Printf( 647b9c1b51eSKate Stone "SBData::SetDataFromSInt32Array (array=%p, array_len = %" PRIu64 648b9c1b51eSKate Stone ") => " 649b9c1b51eSKate Stone "false", 650b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6510f28986aSGreg Clayton return false; 6520f28986aSGreg Clayton } 6530f28986aSGreg Clayton 6540f28986aSGreg Clayton size_t data_len = array_len * sizeof(int32_t); 6550f28986aSGreg Clayton 6560f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6570f28986aSGreg Clayton 6580f28986aSGreg Clayton if (!m_opaque_sp.get()) 659b9c1b51eSKate Stone m_opaque_sp.reset( 660b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 6610f28986aSGreg Clayton else 6620f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6630f28986aSGreg Clayton 6640f28986aSGreg Clayton if (log) 665b9c1b51eSKate Stone log->Printf("SBData::SetDataFromSInt32Array (array=%p, array_len = %" PRIu64 666b9c1b51eSKate Stone ") => " 667b9c1b51eSKate Stone "true", 668b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6690f28986aSGreg Clayton 6700f28986aSGreg Clayton return true; 6710f28986aSGreg Clayton } 6720f28986aSGreg Clayton 673b9c1b51eSKate Stone bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) { 6745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6750f28986aSGreg Clayton 676b9c1b51eSKate Stone if (!array || array_len == 0) { 6770f28986aSGreg Clayton if (log) 678b9c1b51eSKate Stone log->Printf( 679b9c1b51eSKate Stone "SBData::SetDataFromDoubleArray (array=%p, array_len = %" PRIu64 680b9c1b51eSKate Stone ") => " 681b9c1b51eSKate Stone "false", 682b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6830f28986aSGreg Clayton return false; 6840f28986aSGreg Clayton } 6850f28986aSGreg Clayton 6860f28986aSGreg Clayton size_t data_len = array_len * sizeof(double); 6870f28986aSGreg Clayton 6880f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6890f28986aSGreg Clayton 6900f28986aSGreg Clayton if (!m_opaque_sp.get()) 691b9c1b51eSKate Stone m_opaque_sp.reset( 692b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 6930f28986aSGreg Clayton else 6940f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6950f28986aSGreg Clayton 6960f28986aSGreg Clayton if (log) 697b9c1b51eSKate Stone log->Printf("SBData::SetDataFromDoubleArray (array=%p, array_len = %" PRIu64 698b9c1b51eSKate Stone ") => " 699b9c1b51eSKate Stone "true", 700b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 7010f28986aSGreg Clayton 7020f28986aSGreg Clayton return true; 7030f28986aSGreg Clayton } 704