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 1629cb868aSZachary Turner #include "lldb/Core/DumpDataExtractor.h" 17*666cc0b2SZachary Turner #include "lldb/Utility/DataBufferHeap.h" 18*666cc0b2SZachary Turner #include "lldb/Utility/DataExtractor.h" 196f9e6901SZachary Turner #include "lldb/Utility/Log.h" 20bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 21da7bc7d0SGreg Clayton 229128ee2fSEnrico Granata using namespace lldb; 239128ee2fSEnrico Granata using namespace lldb_private; 249128ee2fSEnrico Granata 25b9c1b51eSKate Stone SBData::SBData() : m_opaque_sp(new DataExtractor()) {} 269128ee2fSEnrico Granata 27b9c1b51eSKate Stone SBData::SBData(const lldb::DataExtractorSP &data_sp) : m_opaque_sp(data_sp) {} 289128ee2fSEnrico Granata 29b9c1b51eSKate Stone SBData::SBData(const SBData &rhs) : m_opaque_sp(rhs.m_opaque_sp) {} 309128ee2fSEnrico Granata 31b9c1b51eSKate Stone const SBData &SBData::operator=(const SBData &rhs) { 329128ee2fSEnrico Granata if (this != &rhs) 339128ee2fSEnrico Granata m_opaque_sp = rhs.m_opaque_sp; 349128ee2fSEnrico Granata return *this; 359128ee2fSEnrico Granata } 369128ee2fSEnrico Granata 37b9c1b51eSKate Stone SBData::~SBData() {} 389128ee2fSEnrico Granata 39b9c1b51eSKate Stone void SBData::SetOpaque(const lldb::DataExtractorSP &data_sp) { 409128ee2fSEnrico Granata m_opaque_sp = data_sp; 419128ee2fSEnrico Granata } 429128ee2fSEnrico Granata 43b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::get() const { return m_opaque_sp.get(); } 449128ee2fSEnrico Granata 45b9c1b51eSKate Stone lldb_private::DataExtractor *SBData::operator->() const { 469128ee2fSEnrico Granata return m_opaque_sp.operator->(); 479128ee2fSEnrico Granata } 489128ee2fSEnrico Granata 49b9c1b51eSKate Stone lldb::DataExtractorSP &SBData::operator*() { return m_opaque_sp; } 509128ee2fSEnrico Granata 51b9c1b51eSKate Stone const lldb::DataExtractorSP &SBData::operator*() const { return m_opaque_sp; } 529128ee2fSEnrico Granata 53b9c1b51eSKate Stone bool SBData::IsValid() { return m_opaque_sp.get() != NULL; } 549128ee2fSEnrico Granata 55b9c1b51eSKate Stone uint8_t SBData::GetAddressByteSize() { 565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 579128ee2fSEnrico Granata uint8_t value = 0; 589128ee2fSEnrico Granata if (m_opaque_sp.get()) 599128ee2fSEnrico Granata value = m_opaque_sp->GetAddressByteSize(); 609128ee2fSEnrico Granata if (log) 619128ee2fSEnrico Granata log->Printf("SBData::GetAddressByteSize () => " 62b9c1b51eSKate Stone "(%i)", 63b9c1b51eSKate Stone value); 649128ee2fSEnrico Granata return value; 659128ee2fSEnrico Granata } 669128ee2fSEnrico Granata 67b9c1b51eSKate Stone void SBData::SetAddressByteSize(uint8_t addr_byte_size) { 685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 690f28986aSGreg Clayton if (m_opaque_sp.get()) 700f28986aSGreg Clayton m_opaque_sp->SetAddressByteSize(addr_byte_size); 710f28986aSGreg Clayton if (log) 720f28986aSGreg Clayton log->Printf("SBData::SetAddressByteSize (%i)", addr_byte_size); 730f28986aSGreg Clayton } 740f28986aSGreg Clayton 75b9c1b51eSKate Stone void SBData::Clear() { 769128ee2fSEnrico Granata if (m_opaque_sp.get()) 779128ee2fSEnrico Granata m_opaque_sp->Clear(); 789128ee2fSEnrico Granata } 799128ee2fSEnrico Granata 80b9c1b51eSKate Stone size_t SBData::GetByteSize() { 815160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 829128ee2fSEnrico Granata size_t value = 0; 839128ee2fSEnrico Granata if (m_opaque_sp.get()) 849128ee2fSEnrico Granata value = m_opaque_sp->GetByteSize(); 859128ee2fSEnrico Granata if (log) 869128ee2fSEnrico Granata log->Printf("SBData::GetByteSize () => " 87b9c1b51eSKate Stone "( %" PRIu64 " )", 88b9c1b51eSKate Stone (uint64_t)value); 899128ee2fSEnrico Granata return value; 909128ee2fSEnrico Granata } 919128ee2fSEnrico Granata 92b9c1b51eSKate Stone lldb::ByteOrder SBData::GetByteOrder() { 935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 949128ee2fSEnrico Granata lldb::ByteOrder value = eByteOrderInvalid; 959128ee2fSEnrico Granata if (m_opaque_sp.get()) 969128ee2fSEnrico Granata value = m_opaque_sp->GetByteOrder(); 979128ee2fSEnrico Granata if (log) 989128ee2fSEnrico Granata log->Printf("SBData::GetByteOrder () => " 99b9c1b51eSKate Stone "(%i)", 100b9c1b51eSKate Stone value); 1019128ee2fSEnrico Granata return value; 1029128ee2fSEnrico Granata } 1039128ee2fSEnrico Granata 104b9c1b51eSKate Stone void SBData::SetByteOrder(lldb::ByteOrder endian) { 1055160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1060f28986aSGreg Clayton if (m_opaque_sp.get()) 1070f28986aSGreg Clayton m_opaque_sp->SetByteOrder(endian); 1080f28986aSGreg Clayton if (log) 1090f28986aSGreg Clayton log->Printf("SBData::GetByteOrder (%i)", endian); 1100f28986aSGreg Clayton } 1110f28986aSGreg Clayton 112b9c1b51eSKate Stone float SBData::GetFloat(lldb::SBError &error, lldb::offset_t offset) { 1135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1149128ee2fSEnrico Granata float value = 0; 115b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1169128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 117b9c1b51eSKate Stone } else { 1189128ee2fSEnrico Granata uint32_t old_offset = offset; 1199128ee2fSEnrico Granata value = m_opaque_sp->GetFloat(&offset); 1209128ee2fSEnrico Granata if (offset == old_offset) 1219128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1229128ee2fSEnrico Granata } 1239128ee2fSEnrico Granata if (log) 124324a1036SSaleem Abdulrasool log->Printf("SBData::GetFloat (error=%p,offset=%" PRIu64 ") => (%f)", 125324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), offset, value); 1269128ee2fSEnrico Granata return value; 1279128ee2fSEnrico Granata } 1289128ee2fSEnrico Granata 129b9c1b51eSKate Stone double SBData::GetDouble(lldb::SBError &error, lldb::offset_t offset) { 1305160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1319128ee2fSEnrico Granata double value = 0; 132b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1339128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 134b9c1b51eSKate Stone } else { 1359128ee2fSEnrico Granata uint32_t old_offset = offset; 1369128ee2fSEnrico Granata value = m_opaque_sp->GetDouble(&offset); 1379128ee2fSEnrico Granata if (offset == old_offset) 1389128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1399128ee2fSEnrico Granata } 1409128ee2fSEnrico Granata if (log) 141c7bece56SGreg Clayton log->Printf("SBData::GetDouble (error=%p,offset=%" PRIu64 ") => " 142b9c1b51eSKate Stone "(%f)", 143b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 1449128ee2fSEnrico Granata return value; 1459128ee2fSEnrico Granata } 1469128ee2fSEnrico Granata 147b9c1b51eSKate Stone long double SBData::GetLongDouble(lldb::SBError &error, lldb::offset_t offset) { 1485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1499128ee2fSEnrico Granata long double value = 0; 150b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1519128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 152b9c1b51eSKate Stone } else { 1539128ee2fSEnrico Granata uint32_t old_offset = offset; 1549128ee2fSEnrico Granata value = m_opaque_sp->GetLongDouble(&offset); 1559128ee2fSEnrico Granata if (offset == old_offset) 1569128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1579128ee2fSEnrico Granata } 1589128ee2fSEnrico Granata if (log) 159c7bece56SGreg Clayton log->Printf("SBData::GetLongDouble (error=%p,offset=%" PRIu64 ") => " 160b9c1b51eSKate Stone "(%Lf)", 161b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 1629128ee2fSEnrico Granata return value; 1639128ee2fSEnrico Granata } 1649128ee2fSEnrico Granata 165b9c1b51eSKate Stone lldb::addr_t SBData::GetAddress(lldb::SBError &error, lldb::offset_t offset) { 1665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1679128ee2fSEnrico Granata lldb::addr_t value = 0; 168b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1699128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 170b9c1b51eSKate Stone } else { 1719128ee2fSEnrico Granata uint32_t old_offset = offset; 1729128ee2fSEnrico Granata value = m_opaque_sp->GetAddress(&offset); 1739128ee2fSEnrico Granata if (offset == old_offset) 1749128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1759128ee2fSEnrico Granata } 1769128ee2fSEnrico Granata if (log) 177c7bece56SGreg Clayton log->Printf("SBData::GetAddress (error=%p,offset=%" PRIu64 ") => " 178b9c1b51eSKate Stone "(%p)", 179b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, 180324a1036SSaleem Abdulrasool reinterpret_cast<void *>(value)); 1819128ee2fSEnrico Granata return value; 1829128ee2fSEnrico Granata } 1839128ee2fSEnrico Granata 184b9c1b51eSKate Stone uint8_t SBData::GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset) { 1855160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1869128ee2fSEnrico Granata uint8_t value = 0; 187b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 1889128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 189b9c1b51eSKate Stone } else { 1909128ee2fSEnrico Granata uint32_t old_offset = offset; 1919128ee2fSEnrico Granata value = m_opaque_sp->GetU8(&offset); 1929128ee2fSEnrico Granata if (offset == old_offset) 1939128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 1949128ee2fSEnrico Granata } 1959128ee2fSEnrico Granata if (log) 196c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt8 (error=%p,offset=%" PRIu64 ") => " 197b9c1b51eSKate Stone "(%c)", 198b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 1999128ee2fSEnrico Granata return value; 2009128ee2fSEnrico Granata } 2019128ee2fSEnrico Granata 202b9c1b51eSKate Stone uint16_t SBData::GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset) { 2035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2049128ee2fSEnrico Granata uint16_t value = 0; 205b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2069128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 207b9c1b51eSKate Stone } else { 2089128ee2fSEnrico Granata uint32_t old_offset = offset; 2099128ee2fSEnrico Granata value = m_opaque_sp->GetU16(&offset); 2109128ee2fSEnrico Granata if (offset == old_offset) 2119128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2129128ee2fSEnrico Granata } 2139128ee2fSEnrico Granata if (log) 214c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt16 (error=%p,offset=%" PRIu64 ") => " 215b9c1b51eSKate Stone "(%hd)", 216b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2179128ee2fSEnrico Granata return value; 2189128ee2fSEnrico Granata } 2199128ee2fSEnrico Granata 220b9c1b51eSKate Stone uint32_t SBData::GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset) { 2215160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2229128ee2fSEnrico Granata uint32_t value = 0; 223b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2249128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 225b9c1b51eSKate Stone } else { 2269128ee2fSEnrico Granata uint32_t old_offset = offset; 2279128ee2fSEnrico Granata value = m_opaque_sp->GetU32(&offset); 2289128ee2fSEnrico Granata if (offset == old_offset) 2299128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2309128ee2fSEnrico Granata } 2319128ee2fSEnrico Granata if (log) 232c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt32 (error=%p,offset=%" PRIu64 ") => " 233b9c1b51eSKate Stone "(%d)", 234b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2359128ee2fSEnrico Granata return value; 2369128ee2fSEnrico Granata } 2379128ee2fSEnrico Granata 238b9c1b51eSKate Stone uint64_t SBData::GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset) { 2395160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2409128ee2fSEnrico Granata uint64_t value = 0; 241b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2429128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 243b9c1b51eSKate Stone } else { 2449128ee2fSEnrico Granata uint32_t old_offset = offset; 2459128ee2fSEnrico Granata value = m_opaque_sp->GetU64(&offset); 2469128ee2fSEnrico Granata if (offset == old_offset) 2479128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2489128ee2fSEnrico Granata } 2499128ee2fSEnrico Granata if (log) 250c7bece56SGreg Clayton log->Printf("SBData::GetUnsignedInt64 (error=%p,offset=%" PRIu64 ") => " 251b9c1b51eSKate Stone "(%" PRId64 ")", 252b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2539128ee2fSEnrico Granata return value; 2549128ee2fSEnrico Granata } 2559128ee2fSEnrico Granata 256b9c1b51eSKate Stone int8_t SBData::GetSignedInt8(lldb::SBError &error, lldb::offset_t offset) { 2575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2589128ee2fSEnrico Granata int8_t value = 0; 259b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2609128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 261b9c1b51eSKate Stone } else { 2629128ee2fSEnrico Granata uint32_t old_offset = offset; 2639128ee2fSEnrico Granata value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1); 2649128ee2fSEnrico Granata if (offset == old_offset) 2659128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2669128ee2fSEnrico Granata } 2679128ee2fSEnrico Granata if (log) 268c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt8 (error=%p,offset=%" PRIu64 ") => " 269b9c1b51eSKate Stone "(%c)", 270b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2719128ee2fSEnrico Granata return value; 2729128ee2fSEnrico Granata } 2739128ee2fSEnrico Granata 274b9c1b51eSKate Stone int16_t SBData::GetSignedInt16(lldb::SBError &error, lldb::offset_t offset) { 2755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2769128ee2fSEnrico Granata int16_t value = 0; 277b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2789128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 279b9c1b51eSKate Stone } else { 2809128ee2fSEnrico Granata uint32_t old_offset = offset; 2819128ee2fSEnrico Granata value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2); 2829128ee2fSEnrico Granata if (offset == old_offset) 2839128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 2849128ee2fSEnrico Granata } 2859128ee2fSEnrico Granata if (log) 286c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt16 (error=%p,offset=%" PRIu64 ") => " 287b9c1b51eSKate Stone "(%hd)", 288b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 2899128ee2fSEnrico Granata return value; 2909128ee2fSEnrico Granata } 2919128ee2fSEnrico Granata 292b9c1b51eSKate Stone int32_t SBData::GetSignedInt32(lldb::SBError &error, lldb::offset_t offset) { 2935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2949128ee2fSEnrico Granata int32_t value = 0; 295b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 2969128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 297b9c1b51eSKate Stone } else { 2989128ee2fSEnrico Granata uint32_t old_offset = offset; 2999128ee2fSEnrico Granata value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4); 3009128ee2fSEnrico Granata if (offset == old_offset) 3019128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3029128ee2fSEnrico Granata } 3039128ee2fSEnrico Granata if (log) 304c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt32 (error=%p,offset=%" PRIu64 ") => " 305b9c1b51eSKate Stone "(%d)", 306b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 3079128ee2fSEnrico Granata return value; 3089128ee2fSEnrico Granata } 3099128ee2fSEnrico Granata 310b9c1b51eSKate Stone int64_t SBData::GetSignedInt64(lldb::SBError &error, lldb::offset_t offset) { 3115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3129128ee2fSEnrico Granata int64_t value = 0; 313b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3149128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 315b9c1b51eSKate Stone } else { 3169128ee2fSEnrico Granata uint32_t old_offset = offset; 3179128ee2fSEnrico Granata value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8); 3189128ee2fSEnrico Granata if (offset == old_offset) 3199128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3209128ee2fSEnrico Granata } 3219128ee2fSEnrico Granata if (log) 322c7bece56SGreg Clayton log->Printf("SBData::GetSignedInt64 (error=%p,offset=%" PRIu64 ") => " 323b9c1b51eSKate Stone "(%" PRId64 ")", 324b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, value); 3259128ee2fSEnrico Granata return value; 3269128ee2fSEnrico Granata } 3279128ee2fSEnrico Granata 328b9c1b51eSKate Stone const char *SBData::GetString(lldb::SBError &error, lldb::offset_t offset) { 3295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3309128ee2fSEnrico Granata const char *value = 0; 331b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3329128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 333b9c1b51eSKate Stone } else { 3349128ee2fSEnrico Granata uint32_t old_offset = offset; 3359128ee2fSEnrico Granata value = m_opaque_sp->GetCStr(&offset); 3369128ee2fSEnrico Granata if (offset == old_offset || (value == NULL)) 3379128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3389128ee2fSEnrico Granata } 3399128ee2fSEnrico Granata if (log) 340324a1036SSaleem Abdulrasool log->Printf("SBData::GetString (error=%p,offset=%" PRIu64 ") => (%p)", 341324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), offset, 342324a1036SSaleem Abdulrasool static_cast<const void *>(value)); 3439128ee2fSEnrico Granata return value; 3449128ee2fSEnrico Granata } 3459128ee2fSEnrico Granata 346b9c1b51eSKate Stone bool SBData::GetDescription(lldb::SBStream &description, 347b9c1b51eSKate Stone lldb::addr_t base_addr) { 348da7bc7d0SGreg Clayton Stream &strm = description.ref(); 349da7bc7d0SGreg Clayton 350b9c1b51eSKate Stone if (m_opaque_sp) { 35129cb868aSZachary Turner DumpDataExtractor(*m_opaque_sp, &strm, 0, lldb::eFormatBytesWithASCII, 1, 352b9c1b51eSKate Stone m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0); 353b9c1b51eSKate Stone } else 354da7bc7d0SGreg Clayton strm.PutCString("No value"); 3559128ee2fSEnrico Granata 3569128ee2fSEnrico Granata return true; 3579128ee2fSEnrico Granata } 3589128ee2fSEnrico Granata 359b9c1b51eSKate Stone size_t SBData::ReadRawData(lldb::SBError &error, lldb::offset_t offset, 360b9c1b51eSKate Stone void *buf, size_t size) { 3615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3629128ee2fSEnrico Granata void *ok = NULL; 363b9c1b51eSKate Stone if (!m_opaque_sp.get()) { 3649128ee2fSEnrico Granata error.SetErrorString("no value to read from"); 365b9c1b51eSKate Stone } else { 3669128ee2fSEnrico Granata uint32_t old_offset = offset; 3679128ee2fSEnrico Granata ok = m_opaque_sp->GetU8(&offset, buf, size); 3689128ee2fSEnrico Granata if ((offset == old_offset) || (ok == NULL)) 3699128ee2fSEnrico Granata error.SetErrorString("unable to read data"); 3709128ee2fSEnrico Granata } 3719128ee2fSEnrico Granata if (log) 372b9c1b51eSKate Stone log->Printf("SBData::ReadRawData (error=%p,offset=%" PRIu64 373b9c1b51eSKate Stone ",buf=%p,size=%" PRIu64 ") => " 374b9c1b51eSKate Stone "(%p)", 375b9c1b51eSKate Stone static_cast<void *>(error.get()), offset, 376324a1036SSaleem Abdulrasool static_cast<void *>(buf), static_cast<uint64_t>(size), 377324a1036SSaleem Abdulrasool static_cast<void *>(ok)); 3789128ee2fSEnrico Granata return ok ? size : 0; 3799128ee2fSEnrico Granata } 3809128ee2fSEnrico Granata 381b9c1b51eSKate Stone void SBData::SetData(lldb::SBError &error, const void *buf, size_t size, 382b9c1b51eSKate Stone lldb::ByteOrder endian, uint8_t addr_size) { 3835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3849128ee2fSEnrico Granata if (!m_opaque_sp.get()) 3859128ee2fSEnrico Granata m_opaque_sp.reset(new DataExtractor(buf, size, endian, addr_size)); 3869128ee2fSEnrico Granata else 387896b4513SGreg Clayton { 3889128ee2fSEnrico Granata m_opaque_sp->SetData(buf, size, endian); 389896b4513SGreg Clayton m_opaque_sp->SetAddressByteSize(addr_size); 390896b4513SGreg Clayton } 391896b4513SGreg Clayton 3929128ee2fSEnrico Granata if (log) 393b9c1b51eSKate Stone log->Printf("SBData::SetData (error=%p,buf=%p,size=%" PRIu64 394b9c1b51eSKate Stone ",endian=%d,addr_size=%c) => " 395b9c1b51eSKate Stone "(%p)", 396b9c1b51eSKate Stone static_cast<void *>(error.get()), 397324a1036SSaleem Abdulrasool static_cast<const void *>(buf), static_cast<uint64_t>(size), 398324a1036SSaleem Abdulrasool endian, addr_size, static_cast<void *>(m_opaque_sp.get())); 3999128ee2fSEnrico Granata } 4009128ee2fSEnrico Granata 401b9c1b51eSKate Stone bool SBData::Append(const SBData &rhs) { 4025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4039128ee2fSEnrico Granata bool value = false; 4049128ee2fSEnrico Granata if (m_opaque_sp.get() && rhs.m_opaque_sp.get()) 4059128ee2fSEnrico Granata value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp); 4069128ee2fSEnrico Granata if (log) 407324a1036SSaleem Abdulrasool log->Printf("SBData::Append (rhs=%p) => (%s)", 408324a1036SSaleem Abdulrasool static_cast<void *>(rhs.get()), value ? "true" : "false"); 4099128ee2fSEnrico Granata return value; 4109128ee2fSEnrico Granata } 4110f28986aSGreg Clayton 412b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromCString(lldb::ByteOrder endian, 413b9c1b51eSKate Stone uint32_t addr_byte_size, 414b9c1b51eSKate Stone const char *data) { 4150f28986aSGreg Clayton if (!data || !data[0]) 4160f28986aSGreg Clayton return SBData(); 4170f28986aSGreg Clayton 4180f28986aSGreg Clayton uint32_t data_len = strlen(data); 4190f28986aSGreg Clayton 4200f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len)); 421b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 422b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4230f28986aSGreg Clayton 4240f28986aSGreg Clayton SBData ret(data_sp); 4250f28986aSGreg Clayton 4260f28986aSGreg Clayton return ret; 4270f28986aSGreg Clayton } 4280f28986aSGreg Clayton 429b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt64Array(lldb::ByteOrder endian, 430b9c1b51eSKate Stone uint32_t addr_byte_size, 431b9c1b51eSKate Stone uint64_t *array, 432b9c1b51eSKate Stone size_t array_len) { 4330f28986aSGreg Clayton if (!array || array_len == 0) 4340f28986aSGreg Clayton return SBData(); 4350f28986aSGreg Clayton 4360f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint64_t); 4370f28986aSGreg Clayton 4380f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 439b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 440b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4410f28986aSGreg Clayton 4420f28986aSGreg Clayton SBData ret(data_sp); 4430f28986aSGreg Clayton 4440f28986aSGreg Clayton return ret; 4450f28986aSGreg Clayton } 4460f28986aSGreg Clayton 447b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromUInt32Array(lldb::ByteOrder endian, 448b9c1b51eSKate Stone uint32_t addr_byte_size, 449b9c1b51eSKate Stone uint32_t *array, 450b9c1b51eSKate Stone size_t array_len) { 4510f28986aSGreg Clayton if (!array || array_len == 0) 4520f28986aSGreg Clayton return SBData(); 4530f28986aSGreg Clayton 4540f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint32_t); 4550f28986aSGreg Clayton 4560f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 457b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 458b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4590f28986aSGreg Clayton 4600f28986aSGreg Clayton SBData ret(data_sp); 4610f28986aSGreg Clayton 4620f28986aSGreg Clayton return ret; 4630f28986aSGreg Clayton } 4640f28986aSGreg Clayton 465b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt64Array(lldb::ByteOrder endian, 466b9c1b51eSKate Stone uint32_t addr_byte_size, 467b9c1b51eSKate Stone int64_t *array, 468b9c1b51eSKate Stone size_t array_len) { 4690f28986aSGreg Clayton if (!array || array_len == 0) 4700f28986aSGreg Clayton return SBData(); 4710f28986aSGreg Clayton 4720f28986aSGreg Clayton size_t data_len = array_len * sizeof(int64_t); 4730f28986aSGreg Clayton 4740f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 475b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 476b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4770f28986aSGreg Clayton 4780f28986aSGreg Clayton SBData ret(data_sp); 4790f28986aSGreg Clayton 4800f28986aSGreg Clayton return ret; 4810f28986aSGreg Clayton } 4820f28986aSGreg Clayton 483b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromSInt32Array(lldb::ByteOrder endian, 484b9c1b51eSKate Stone uint32_t addr_byte_size, 485b9c1b51eSKate Stone int32_t *array, 486b9c1b51eSKate Stone size_t array_len) { 4870f28986aSGreg Clayton if (!array || array_len == 0) 4880f28986aSGreg Clayton return SBData(); 4890f28986aSGreg Clayton 4900f28986aSGreg Clayton size_t data_len = array_len * sizeof(int32_t); 4910f28986aSGreg Clayton 4920f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 493b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 494b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 4950f28986aSGreg Clayton 4960f28986aSGreg Clayton SBData ret(data_sp); 4970f28986aSGreg Clayton 4980f28986aSGreg Clayton return ret; 4990f28986aSGreg Clayton } 5000f28986aSGreg Clayton 501b9c1b51eSKate Stone lldb::SBData SBData::CreateDataFromDoubleArray(lldb::ByteOrder endian, 502b9c1b51eSKate Stone uint32_t addr_byte_size, 503b9c1b51eSKate Stone double *array, 504b9c1b51eSKate Stone size_t array_len) { 5050f28986aSGreg Clayton if (!array || array_len == 0) 5060f28986aSGreg Clayton return SBData(); 5070f28986aSGreg Clayton 5080f28986aSGreg Clayton size_t data_len = array_len * sizeof(double); 5090f28986aSGreg Clayton 5100f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 511b9c1b51eSKate Stone lldb::DataExtractorSP data_sp( 512b9c1b51eSKate Stone new DataExtractor(buffer_sp, endian, addr_byte_size)); 5130f28986aSGreg Clayton 5140f28986aSGreg Clayton SBData ret(data_sp); 5150f28986aSGreg Clayton 5160f28986aSGreg Clayton return ret; 5170f28986aSGreg Clayton } 5180f28986aSGreg Clayton 519b9c1b51eSKate Stone bool SBData::SetDataFromCString(const char *data) { 5205160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5210f28986aSGreg Clayton 522b9c1b51eSKate Stone if (!data) { 5230f28986aSGreg Clayton if (log) 524324a1036SSaleem Abdulrasool log->Printf("SBData::SetDataFromCString (data=%p) => false", 525324a1036SSaleem Abdulrasool static_cast<const void *>(data)); 5260f28986aSGreg Clayton return false; 5270f28986aSGreg Clayton } 5280f28986aSGreg Clayton 5290f28986aSGreg Clayton size_t data_len = strlen(data); 5300f28986aSGreg Clayton 5310f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len)); 5320f28986aSGreg Clayton 5330f28986aSGreg Clayton if (!m_opaque_sp.get()) 534b9c1b51eSKate Stone m_opaque_sp.reset( 535b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 5360f28986aSGreg Clayton else 5370f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5380f28986aSGreg Clayton 5390f28986aSGreg Clayton if (log) 540324a1036SSaleem Abdulrasool log->Printf("SBData::SetDataFromCString (data=%p) => true", 541324a1036SSaleem Abdulrasool static_cast<const void *>(data)); 5420f28986aSGreg Clayton 5430f28986aSGreg Clayton return true; 5440f28986aSGreg Clayton } 5450f28986aSGreg Clayton 546b9c1b51eSKate Stone bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) { 5475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5480f28986aSGreg Clayton 549b9c1b51eSKate Stone if (!array || array_len == 0) { 5500f28986aSGreg Clayton if (log) 551b9c1b51eSKate Stone log->Printf( 552b9c1b51eSKate Stone "SBData::SetDataFromUInt64Array (array=%p, array_len = %" PRIu64 553b9c1b51eSKate Stone ") => " 554b9c1b51eSKate Stone "false", 555b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 5560f28986aSGreg Clayton return false; 5570f28986aSGreg Clayton } 5580f28986aSGreg Clayton 5590f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint64_t); 5600f28986aSGreg Clayton 5610f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 5620f28986aSGreg Clayton 5630f28986aSGreg Clayton if (!m_opaque_sp.get()) 564b9c1b51eSKate Stone m_opaque_sp.reset( 565b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 5660f28986aSGreg Clayton else 5670f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 5680f28986aSGreg Clayton 5690f28986aSGreg Clayton if (log) 570b9c1b51eSKate Stone log->Printf("SBData::SetDataFromUInt64Array (array=%p, array_len = %" PRIu64 571b9c1b51eSKate Stone ") => " 572b9c1b51eSKate Stone "true", 573b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 5740f28986aSGreg Clayton 5750f28986aSGreg Clayton return true; 5760f28986aSGreg Clayton } 5770f28986aSGreg Clayton 578b9c1b51eSKate Stone bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) { 5795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5800f28986aSGreg Clayton 581b9c1b51eSKate Stone if (!array || array_len == 0) { 5820f28986aSGreg Clayton if (log) 583b9c1b51eSKate Stone log->Printf( 584b9c1b51eSKate Stone "SBData::SetDataFromUInt32Array (array=%p, array_len = %" PRIu64 585b9c1b51eSKate Stone ") => " 586b9c1b51eSKate Stone "false", 587b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 5880f28986aSGreg Clayton return false; 5890f28986aSGreg Clayton } 5900f28986aSGreg Clayton 5910f28986aSGreg Clayton size_t data_len = array_len * sizeof(uint32_t); 5920f28986aSGreg Clayton 5930f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 5940f28986aSGreg Clayton 5950f28986aSGreg Clayton if (!m_opaque_sp.get()) 596b9c1b51eSKate Stone m_opaque_sp.reset( 597b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 5980f28986aSGreg Clayton else 5990f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6000f28986aSGreg Clayton 6010f28986aSGreg Clayton if (log) 602b9c1b51eSKate Stone log->Printf("SBData::SetDataFromUInt32Array (array=%p, array_len = %" PRIu64 603b9c1b51eSKate Stone ") => " 604b9c1b51eSKate Stone "true", 605b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6060f28986aSGreg Clayton 6070f28986aSGreg Clayton return true; 6080f28986aSGreg Clayton } 6090f28986aSGreg Clayton 610b9c1b51eSKate Stone bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) { 6115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6120f28986aSGreg Clayton 613b9c1b51eSKate Stone if (!array || array_len == 0) { 6140f28986aSGreg Clayton if (log) 615b9c1b51eSKate Stone log->Printf( 616b9c1b51eSKate Stone "SBData::SetDataFromSInt64Array (array=%p, array_len = %" PRIu64 617b9c1b51eSKate Stone ") => " 618b9c1b51eSKate Stone "false", 619b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6200f28986aSGreg Clayton return false; 6210f28986aSGreg Clayton } 6220f28986aSGreg Clayton 6230f28986aSGreg Clayton size_t data_len = array_len * sizeof(int64_t); 6240f28986aSGreg Clayton 6250f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6260f28986aSGreg Clayton 6270f28986aSGreg Clayton if (!m_opaque_sp.get()) 628b9c1b51eSKate Stone m_opaque_sp.reset( 629b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 6300f28986aSGreg Clayton else 6310f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6320f28986aSGreg Clayton 6330f28986aSGreg Clayton if (log) 634b9c1b51eSKate Stone log->Printf("SBData::SetDataFromSInt64Array (array=%p, array_len = %" PRIu64 635b9c1b51eSKate Stone ") => " 636b9c1b51eSKate Stone "true", 637b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6380f28986aSGreg Clayton 6390f28986aSGreg Clayton return true; 6400f28986aSGreg Clayton } 6410f28986aSGreg Clayton 642b9c1b51eSKate Stone bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) { 6435160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6440f28986aSGreg Clayton 645b9c1b51eSKate Stone if (!array || array_len == 0) { 6460f28986aSGreg Clayton if (log) 647b9c1b51eSKate Stone log->Printf( 648b9c1b51eSKate Stone "SBData::SetDataFromSInt32Array (array=%p, array_len = %" PRIu64 649b9c1b51eSKate Stone ") => " 650b9c1b51eSKate Stone "false", 651b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6520f28986aSGreg Clayton return false; 6530f28986aSGreg Clayton } 6540f28986aSGreg Clayton 6550f28986aSGreg Clayton size_t data_len = array_len * sizeof(int32_t); 6560f28986aSGreg Clayton 6570f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6580f28986aSGreg Clayton 6590f28986aSGreg Clayton if (!m_opaque_sp.get()) 660b9c1b51eSKate Stone m_opaque_sp.reset( 661b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 6620f28986aSGreg Clayton else 6630f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6640f28986aSGreg Clayton 6650f28986aSGreg Clayton if (log) 666b9c1b51eSKate Stone log->Printf("SBData::SetDataFromSInt32Array (array=%p, array_len = %" PRIu64 667b9c1b51eSKate Stone ") => " 668b9c1b51eSKate Stone "true", 669b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6700f28986aSGreg Clayton 6710f28986aSGreg Clayton return true; 6720f28986aSGreg Clayton } 6730f28986aSGreg Clayton 674b9c1b51eSKate Stone bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) { 6755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6760f28986aSGreg Clayton 677b9c1b51eSKate Stone if (!array || array_len == 0) { 6780f28986aSGreg Clayton if (log) 679b9c1b51eSKate Stone log->Printf( 680b9c1b51eSKate Stone "SBData::SetDataFromDoubleArray (array=%p, array_len = %" PRIu64 681b9c1b51eSKate Stone ") => " 682b9c1b51eSKate Stone "false", 683b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 6840f28986aSGreg Clayton return false; 6850f28986aSGreg Clayton } 6860f28986aSGreg Clayton 6870f28986aSGreg Clayton size_t data_len = array_len * sizeof(double); 6880f28986aSGreg Clayton 6890f28986aSGreg Clayton lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len)); 6900f28986aSGreg Clayton 6910f28986aSGreg Clayton if (!m_opaque_sp.get()) 692b9c1b51eSKate Stone m_opaque_sp.reset( 693b9c1b51eSKate Stone new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize())); 6940f28986aSGreg Clayton else 6950f28986aSGreg Clayton m_opaque_sp->SetData(buffer_sp); 6960f28986aSGreg Clayton 6970f28986aSGreg Clayton if (log) 698b9c1b51eSKate Stone log->Printf("SBData::SetDataFromDoubleArray (array=%p, array_len = %" PRIu64 699b9c1b51eSKate Stone ") => " 700b9c1b51eSKate Stone "true", 701b9c1b51eSKate Stone static_cast<void *>(array), static_cast<uint64_t>(array_len)); 7020f28986aSGreg Clayton 7030f28986aSGreg Clayton return true; 7040f28986aSGreg Clayton } 705