Home | History | Annotate | Download | only in API
      1 //===-- SBData.cpp ----------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/API/SBData.h"
     11 #include "lldb/API/SBError.h"
     12 #include "lldb/API/SBStream.h"
     13 
     14 #include "lldb/Core/DataBufferHeap.h"
     15 #include "lldb/Core/DataExtractor.h"
     16 #include "lldb/Core/Log.h"
     17 #include "lldb/Core/Stream.h"
     18 
     19 
     20 using namespace lldb;
     21 using namespace lldb_private;
     22 
     23 SBData::SBData () :
     24     m_opaque_sp(new DataExtractor())
     25 {
     26 }
     27 
     28 SBData::SBData (const lldb::DataExtractorSP& data_sp) :
     29     m_opaque_sp (data_sp)
     30 {
     31 }
     32 
     33 SBData::SBData(const SBData &rhs) :
     34     m_opaque_sp (rhs.m_opaque_sp)
     35 {
     36 }
     37 
     38 const SBData &
     39 SBData::operator = (const SBData &rhs)
     40 {
     41     if (this != &rhs)
     42         m_opaque_sp = rhs.m_opaque_sp;
     43     return *this;
     44 }
     45 
     46 SBData::~SBData ()
     47 {
     48 }
     49 
     50 void
     51 SBData::SetOpaque (const lldb::DataExtractorSP &data_sp)
     52 {
     53     m_opaque_sp = data_sp;
     54 }
     55 
     56 lldb_private::DataExtractor *
     57 SBData::get() const
     58 {
     59     return m_opaque_sp.get();
     60 }
     61 
     62 lldb_private::DataExtractor *
     63 SBData::operator->() const
     64 {
     65     return m_opaque_sp.operator->();
     66 }
     67 
     68 lldb::DataExtractorSP &
     69 SBData::operator*()
     70 {
     71     return m_opaque_sp;
     72 }
     73 
     74 const lldb::DataExtractorSP &
     75 SBData::operator*() const
     76 {
     77     return m_opaque_sp;
     78 }
     79 
     80 bool
     81 SBData::IsValid()
     82 {
     83     return m_opaque_sp.get() != NULL;
     84 }
     85 
     86 uint8_t
     87 SBData::GetAddressByteSize ()
     88 {
     89     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     90     uint8_t value = 0;
     91     if (m_opaque_sp.get())
     92         value = m_opaque_sp->GetAddressByteSize();
     93     if (log)
     94         log->Printf ("SBData::GetAddressByteSize () => "
     95                      "(%i)", value);
     96     return value;
     97 }
     98 
     99 void
    100 SBData::SetAddressByteSize (uint8_t addr_byte_size)
    101 {
    102     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    103     if (m_opaque_sp.get())
    104         m_opaque_sp->SetAddressByteSize(addr_byte_size);
    105     if (log)
    106         log->Printf ("SBData::SetAddressByteSize (%i)", addr_byte_size);
    107 }
    108 
    109 void
    110 SBData::Clear ()
    111 {
    112     if (m_opaque_sp.get())
    113         m_opaque_sp->Clear();
    114 }
    115 
    116 size_t
    117 SBData::GetByteSize ()
    118 {
    119     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    120     size_t value = 0;
    121     if (m_opaque_sp.get())
    122         value = m_opaque_sp->GetByteSize();
    123     if (log)
    124         log->Printf ("SBData::GetByteSize () => "
    125                      "(%lu)", value);
    126     return value;
    127 }
    128 
    129 lldb::ByteOrder
    130 SBData::GetByteOrder ()
    131 {
    132     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    133     lldb::ByteOrder value = eByteOrderInvalid;
    134     if (m_opaque_sp.get())
    135         value = m_opaque_sp->GetByteOrder();
    136     if (log)
    137         log->Printf ("SBData::GetByteOrder () => "
    138                      "(%i)", value);
    139     return value;
    140 }
    141 
    142 void
    143 SBData::SetByteOrder (lldb::ByteOrder endian)
    144 {
    145     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    146     if (m_opaque_sp.get())
    147         m_opaque_sp->SetByteOrder(endian);
    148     if (log)
    149         log->Printf ("SBData::GetByteOrder (%i)", endian);
    150 }
    151 
    152 
    153 float
    154 SBData::GetFloat (lldb::SBError& error, lldb::offset_t offset)
    155 {
    156     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    157     float value = 0;
    158     if (!m_opaque_sp.get())
    159     {
    160         error.SetErrorString("no value to read from");
    161     }
    162     else
    163     {
    164         uint32_t old_offset = offset;
    165         value = m_opaque_sp->GetFloat(&offset);
    166         if (offset == old_offset)
    167             error.SetErrorString("unable to read data");
    168     }
    169     if (log)
    170         log->Printf ("SBData::GetFloat (error=%p,offset=%" PRIu64 ") => "
    171                      "(%f)", error.get(), offset, value);
    172     return value;
    173 }
    174 
    175 double
    176 SBData::GetDouble (lldb::SBError& error, lldb::offset_t offset)
    177 {
    178     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    179     double value = 0;
    180     if (!m_opaque_sp.get())
    181     {
    182         error.SetErrorString("no value to read from");
    183     }
    184     else
    185     {
    186         uint32_t old_offset = offset;
    187         value = m_opaque_sp->GetDouble(&offset);
    188         if (offset == old_offset)
    189             error.SetErrorString("unable to read data");
    190     }
    191     if (log)
    192         log->Printf ("SBData::GetDouble (error=%p,offset=%" PRIu64 ") => "
    193                      "(%f)", error.get(), offset, value);
    194     return value;
    195 }
    196 
    197 long double
    198 SBData::GetLongDouble (lldb::SBError& error, lldb::offset_t offset)
    199 {
    200     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    201     long double value = 0;
    202     if (!m_opaque_sp.get())
    203     {
    204         error.SetErrorString("no value to read from");
    205     }
    206     else
    207     {
    208         uint32_t old_offset = offset;
    209         value = m_opaque_sp->GetLongDouble(&offset);
    210         if (offset == old_offset)
    211             error.SetErrorString("unable to read data");
    212     }
    213     if (log)
    214         log->Printf ("SBData::GetLongDouble (error=%p,offset=%" PRIu64 ") => "
    215                      "(%Lf)", error.get(), offset, value);
    216     return value;
    217 }
    218 
    219 lldb::addr_t
    220 SBData::GetAddress (lldb::SBError& error, lldb::offset_t offset)
    221 {
    222     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    223     lldb::addr_t value = 0;
    224     if (!m_opaque_sp.get())
    225     {
    226         error.SetErrorString("no value to read from");
    227     }
    228     else
    229     {
    230         uint32_t old_offset = offset;
    231         value = m_opaque_sp->GetAddress(&offset);
    232         if (offset == old_offset)
    233             error.SetErrorString("unable to read data");
    234     }
    235     if (log)
    236         log->Printf ("SBData::GetAddress (error=%p,offset=%" PRIu64 ") => "
    237                      "(%p)", error.get(), offset, (void*)value);
    238     return value;
    239 }
    240 
    241 uint8_t
    242 SBData::GetUnsignedInt8 (lldb::SBError& error, lldb::offset_t offset)
    243 {
    244     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    245     uint8_t value = 0;
    246     if (!m_opaque_sp.get())
    247     {
    248         error.SetErrorString("no value to read from");
    249     }
    250     else
    251     {
    252         uint32_t old_offset = offset;
    253         value = m_opaque_sp->GetU8(&offset);
    254         if (offset == old_offset)
    255             error.SetErrorString("unable to read data");
    256     }
    257     if (log)
    258         log->Printf ("SBData::GetUnsignedInt8 (error=%p,offset=%" PRIu64 ") => "
    259                      "(%c)", error.get(), offset, value);
    260     return value;
    261 }
    262 
    263 uint16_t
    264 SBData::GetUnsignedInt16 (lldb::SBError& error, lldb::offset_t offset)
    265 {
    266     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    267     uint16_t value = 0;
    268     if (!m_opaque_sp.get())
    269     {
    270         error.SetErrorString("no value to read from");
    271     }
    272     else
    273     {
    274         uint32_t old_offset = offset;
    275         value = m_opaque_sp->GetU16(&offset);
    276         if (offset == old_offset)
    277             error.SetErrorString("unable to read data");
    278     }
    279     if (log)
    280         log->Printf ("SBData::GetUnsignedInt16 (error=%p,offset=%" PRIu64 ") => "
    281                      "(%hd)", error.get(), offset, value);
    282     return value;
    283 }
    284 
    285 uint32_t
    286 SBData::GetUnsignedInt32 (lldb::SBError& error, lldb::offset_t offset)
    287 {
    288     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    289     uint32_t value = 0;
    290     if (!m_opaque_sp.get())
    291     {
    292         error.SetErrorString("no value to read from");
    293     }
    294     else
    295     {
    296         uint32_t old_offset = offset;
    297         value = m_opaque_sp->GetU32(&offset);
    298         if (offset == old_offset)
    299             error.SetErrorString("unable to read data");
    300     }
    301     if (log)
    302         log->Printf ("SBData::GetUnsignedInt32 (error=%p,offset=%" PRIu64 ") => "
    303                      "(%d)", error.get(), offset, value);
    304     return value;
    305 }
    306 
    307 uint64_t
    308 SBData::GetUnsignedInt64 (lldb::SBError& error, lldb::offset_t offset)
    309 {
    310     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    311     uint64_t value = 0;
    312     if (!m_opaque_sp.get())
    313     {
    314         error.SetErrorString("no value to read from");
    315     }
    316     else
    317     {
    318         uint32_t old_offset = offset;
    319         value = m_opaque_sp->GetU64(&offset);
    320         if (offset == old_offset)
    321             error.SetErrorString("unable to read data");
    322     }
    323     if (log)
    324         log->Printf ("SBData::GetUnsignedInt64 (error=%p,offset=%" PRIu64 ") => "
    325                      "(%" PRId64 ")", error.get(), offset, value);
    326     return value;
    327 }
    328 
    329 int8_t
    330 SBData::GetSignedInt8 (lldb::SBError& error, lldb::offset_t offset)
    331 {
    332     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    333     int8_t value = 0;
    334     if (!m_opaque_sp.get())
    335     {
    336         error.SetErrorString("no value to read from");
    337     }
    338     else
    339     {
    340         uint32_t old_offset = offset;
    341         value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
    342         if (offset == old_offset)
    343             error.SetErrorString("unable to read data");
    344     }
    345     if (log)
    346         log->Printf ("SBData::GetSignedInt8 (error=%p,offset=%" PRIu64 ") => "
    347                      "(%c)", error.get(), offset, value);
    348     return value;
    349 }
    350 
    351 int16_t
    352 SBData::GetSignedInt16 (lldb::SBError& error, lldb::offset_t offset)
    353 {
    354     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    355     int16_t value = 0;
    356     if (!m_opaque_sp.get())
    357     {
    358         error.SetErrorString("no value to read from");
    359     }
    360     else
    361     {
    362         uint32_t old_offset = offset;
    363         value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
    364         if (offset == old_offset)
    365             error.SetErrorString("unable to read data");
    366     }
    367     if (log)
    368         log->Printf ("SBData::GetSignedInt16 (error=%p,offset=%" PRIu64 ") => "
    369                      "(%hd)", error.get(), offset, value);
    370     return value;
    371 }
    372 
    373 int32_t
    374 SBData::GetSignedInt32 (lldb::SBError& error, lldb::offset_t offset)
    375 {
    376     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    377     int32_t value = 0;
    378     if (!m_opaque_sp.get())
    379     {
    380         error.SetErrorString("no value to read from");
    381     }
    382     else
    383     {
    384         uint32_t old_offset = offset;
    385         value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
    386         if (offset == old_offset)
    387             error.SetErrorString("unable to read data");
    388     }
    389     if (log)
    390         log->Printf ("SBData::GetSignedInt32 (error=%p,offset=%" PRIu64 ") => "
    391                      "(%d)", error.get(), offset, value);
    392     return value;
    393 }
    394 
    395 int64_t
    396 SBData::GetSignedInt64 (lldb::SBError& error, lldb::offset_t offset)
    397 {
    398     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    399     int64_t value = 0;
    400     if (!m_opaque_sp.get())
    401     {
    402         error.SetErrorString("no value to read from");
    403     }
    404     else
    405     {
    406         uint32_t old_offset = offset;
    407         value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
    408         if (offset == old_offset)
    409             error.SetErrorString("unable to read data");
    410     }
    411     if (log)
    412         log->Printf ("SBData::GetSignedInt64 (error=%p,offset=%" PRIu64 ") => "
    413                      "(%" PRId64 ")", error.get(), offset, value);
    414     return value;
    415 }
    416 
    417 const char*
    418 SBData::GetString (lldb::SBError& error, lldb::offset_t offset)
    419 {
    420     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    421     const char* value = 0;
    422     if (!m_opaque_sp.get())
    423     {
    424         error.SetErrorString("no value to read from");
    425     }
    426     else
    427     {
    428         uint32_t old_offset = offset;
    429         value = m_opaque_sp->GetCStr(&offset);
    430         if (offset == old_offset || (value == NULL))
    431             error.SetErrorString("unable to read data");
    432     }
    433     if (log)
    434         log->Printf ("SBData::GetString (error=%p,offset=%" PRIu64 ") => "
    435                      "(%p)", error.get(), offset, value);
    436     return value;
    437 }
    438 
    439 bool
    440 SBData::GetDescription (lldb::SBStream &description, lldb::addr_t base_addr)
    441 {
    442     Stream &strm = description.ref();
    443 
    444     if (m_opaque_sp)
    445     {
    446         m_opaque_sp->Dump (&strm,
    447                            0,
    448                            lldb::eFormatBytesWithASCII,
    449                            1,
    450                            m_opaque_sp->GetByteSize(),
    451                            16,
    452                            base_addr,
    453                            0,
    454                            0);
    455     }
    456     else
    457         strm.PutCString ("No value");
    458 
    459     return true;
    460 }
    461 
    462 size_t
    463 SBData::ReadRawData (lldb::SBError& error,
    464                      lldb::offset_t offset,
    465                      void *buf,
    466                      size_t size)
    467 {
    468     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    469     void* ok = NULL;
    470     if (!m_opaque_sp.get())
    471     {
    472         error.SetErrorString("no value to read from");
    473     }
    474     else
    475     {
    476         uint32_t old_offset = offset;
    477         ok = m_opaque_sp->GetU8(&offset, buf, size);
    478         if ((offset == old_offset) || (ok == NULL))
    479             error.SetErrorString("unable to read data");
    480     }
    481     if (log)
    482         log->Printf ("SBData::ReadRawData (error=%p,offset=%" PRIu64 ",buf=%p,size=%lu) => "
    483                      "(%p)", error.get(), offset, buf, size, ok);
    484     return ok ? size : 0;
    485 }
    486 
    487 void
    488 SBData::SetData (lldb::SBError& error,
    489                  const void *buf,
    490                  size_t size,
    491                  lldb::ByteOrder endian,
    492                  uint8_t addr_size)
    493 {
    494     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    495     if (!m_opaque_sp.get())
    496         m_opaque_sp.reset(new DataExtractor(buf, size, endian, addr_size));
    497     else
    498         m_opaque_sp->SetData(buf, size, endian);
    499     if (log)
    500         log->Printf ("SBData::SetData (error=%p,buf=%p,size=%lu,endian=%d,addr_size=%c) => "
    501                      "(%p)", error.get(), buf, size, endian, addr_size, m_opaque_sp.get());
    502 }
    503 
    504 bool
    505 SBData::Append (const SBData& rhs)
    506 {
    507     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    508     bool value = false;
    509     if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
    510         value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
    511     if (log)
    512         log->Printf ("SBData::Append (rhs=%p) => "
    513                      "(%s)", rhs.get(), value ? "true" : "false");
    514     return value;
    515 }
    516 
    517 lldb::SBData
    518 SBData::CreateDataFromCString (lldb::ByteOrder endian, uint32_t addr_byte_size, const char* data)
    519 {
    520     if (!data || !data[0])
    521         return SBData();
    522 
    523     uint32_t data_len = strlen(data);
    524 
    525     lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
    526     lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
    527 
    528     SBData ret(data_sp);
    529 
    530     return ret;
    531 }
    532 
    533 lldb::SBData
    534 SBData::CreateDataFromUInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t* array, size_t array_len)
    535 {
    536     if (!array || array_len == 0)
    537         return SBData();
    538 
    539     size_t data_len = array_len * sizeof(uint64_t);
    540 
    541     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    542     lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
    543 
    544     SBData ret(data_sp);
    545 
    546     return ret;
    547 }
    548 
    549 lldb::SBData
    550 SBData::CreateDataFromUInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t* array, size_t array_len)
    551 {
    552     if (!array || array_len == 0)
    553         return SBData();
    554 
    555     size_t data_len = array_len * sizeof(uint32_t);
    556 
    557     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    558     lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
    559 
    560     SBData ret(data_sp);
    561 
    562     return ret;
    563 }
    564 
    565 lldb::SBData
    566 SBData::CreateDataFromSInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t* array, size_t array_len)
    567 {
    568     if (!array || array_len == 0)
    569         return SBData();
    570 
    571     size_t data_len = array_len * sizeof(int64_t);
    572 
    573     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    574     lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
    575 
    576     SBData ret(data_sp);
    577 
    578     return ret;
    579 }
    580 
    581 lldb::SBData
    582 SBData::CreateDataFromSInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t* array, size_t array_len)
    583 {
    584     if (!array || array_len == 0)
    585         return SBData();
    586 
    587     size_t data_len = array_len * sizeof(int32_t);
    588 
    589     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    590     lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
    591 
    592     SBData ret(data_sp);
    593 
    594     return ret;
    595 }
    596 
    597 lldb::SBData
    598 SBData::CreateDataFromDoubleArray (lldb::ByteOrder endian, uint32_t addr_byte_size, double* array, size_t array_len)
    599 {
    600     if (!array || array_len == 0)
    601         return SBData();
    602 
    603     size_t data_len = array_len * sizeof(double);
    604 
    605     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    606     lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
    607 
    608     SBData ret(data_sp);
    609 
    610     return ret;
    611 }
    612 
    613 bool
    614 SBData::SetDataFromCString (const char* data)
    615 {
    616     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    617 
    618     if (!data)
    619     {
    620         if (log)
    621             log->Printf ("SBData::SetDataFromCString (data=%p) => "
    622                          "false", data);
    623         return false;
    624     }
    625 
    626     size_t data_len = strlen(data);
    627 
    628     lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
    629 
    630     if (!m_opaque_sp.get())
    631         m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
    632     else
    633         m_opaque_sp->SetData(buffer_sp);
    634 
    635     if (log)
    636         log->Printf ("SBData::SetDataFromCString (data=%p) => "
    637                      "true", data);
    638 
    639     return true;
    640 }
    641 
    642 bool
    643 SBData::SetDataFromUInt64Array (uint64_t* array, size_t array_len)
    644 {
    645     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    646 
    647     if (!array || array_len == 0)
    648     {
    649         if (log)
    650             log->Printf ("SBData::SetDataFromUInt64Array (array=%p, array_len = %lu) => "
    651                          "false", array, array_len);
    652         return false;
    653     }
    654 
    655     size_t data_len = array_len * sizeof(uint64_t);
    656 
    657     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    658 
    659     if (!m_opaque_sp.get())
    660         m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
    661     else
    662         m_opaque_sp->SetData(buffer_sp);
    663 
    664     if (log)
    665         log->Printf ("SBData::SetDataFromUInt64Array (array=%p, array_len = %lu) => "
    666                      "true", array, array_len);
    667 
    668     return true;
    669 }
    670 
    671 bool
    672 SBData::SetDataFromUInt32Array (uint32_t* array, size_t array_len)
    673 {
    674     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    675 
    676     if (!array || array_len == 0)
    677     {
    678         if (log)
    679             log->Printf ("SBData::SetDataFromUInt32Array (array=%p, array_len = %lu) => "
    680                          "false", array, array_len);
    681         return false;
    682     }
    683 
    684     size_t data_len = array_len * sizeof(uint32_t);
    685 
    686     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    687 
    688     if (!m_opaque_sp.get())
    689         m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
    690     else
    691         m_opaque_sp->SetData(buffer_sp);
    692 
    693     if (log)
    694         log->Printf ("SBData::SetDataFromUInt32Array (array=%p, array_len = %lu) => "
    695                      "true", array, array_len);
    696 
    697     return true;
    698 }
    699 
    700 bool
    701 SBData::SetDataFromSInt64Array (int64_t* array, size_t array_len)
    702 {
    703     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    704 
    705     if (!array || array_len == 0)
    706     {
    707         if (log)
    708             log->Printf ("SBData::SetDataFromSInt64Array (array=%p, array_len = %lu) => "
    709                          "false", array, array_len);
    710         return false;
    711     }
    712 
    713     size_t data_len = array_len * sizeof(int64_t);
    714 
    715     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    716 
    717     if (!m_opaque_sp.get())
    718         m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
    719     else
    720         m_opaque_sp->SetData(buffer_sp);
    721 
    722     if (log)
    723         log->Printf ("SBData::SetDataFromSInt64Array (array=%p, array_len = %lu) => "
    724                      "true", array, array_len);
    725 
    726     return true;
    727 }
    728 
    729 bool
    730 SBData::SetDataFromSInt32Array (int32_t* array, size_t array_len)
    731 {
    732     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    733 
    734     if (!array || array_len == 0)
    735     {
    736         if (log)
    737             log->Printf ("SBData::SetDataFromSInt32Array (array=%p, array_len = %lu) => "
    738                          "false", array, array_len);
    739         return false;
    740     }
    741 
    742     size_t data_len = array_len * sizeof(int32_t);
    743 
    744     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    745 
    746     if (!m_opaque_sp.get())
    747         m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
    748     else
    749         m_opaque_sp->SetData(buffer_sp);
    750 
    751     if (log)
    752         log->Printf ("SBData::SetDataFromSInt32Array (array=%p, array_len = %lu) => "
    753                      "true", array, array_len);
    754 
    755     return true;
    756 }
    757 
    758 bool
    759 SBData::SetDataFromDoubleArray (double* array, size_t array_len)
    760 {
    761     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    762 
    763     if (!array || array_len == 0)
    764     {
    765         if (log)
    766             log->Printf ("SBData::SetDataFromDoubleArray (array=%p, array_len = %lu) => "
    767                          "false", array, array_len);
    768         return false;
    769     }
    770 
    771     size_t data_len = array_len * sizeof(double);
    772 
    773     lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
    774 
    775     if (!m_opaque_sp.get())
    776         m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
    777     else
    778         m_opaque_sp->SetData(buffer_sp);
    779 
    780     if (log)
    781         log->Printf ("SBData::SetDataFromDoubleArray (array=%p, array_len = %lu) => "
    782                      "true", array, array_len);
    783 
    784     return true;
    785 }
    786