1254721Semaste//===-- SBData.cpp ----------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/API/SBData.h"
11254721Semaste#include "lldb/API/SBError.h"
12254721Semaste#include "lldb/API/SBStream.h"
13254721Semaste
14254721Semaste#include "lldb/Core/DataBufferHeap.h"
15254721Semaste#include "lldb/Core/DataExtractor.h"
16254721Semaste#include "lldb/Core/Log.h"
17254721Semaste#include "lldb/Core/Stream.h"
18254721Semaste
19254721Semaste
20254721Semasteusing namespace lldb;
21254721Semasteusing namespace lldb_private;
22254721Semaste
23254721SemasteSBData::SBData () :
24254721Semaste    m_opaque_sp(new DataExtractor())
25254721Semaste{
26254721Semaste}
27254721Semaste
28254721SemasteSBData::SBData (const lldb::DataExtractorSP& data_sp) :
29254721Semaste    m_opaque_sp (data_sp)
30254721Semaste{
31254721Semaste}
32254721Semaste
33254721SemasteSBData::SBData(const SBData &rhs) :
34254721Semaste    m_opaque_sp (rhs.m_opaque_sp)
35254721Semaste{
36254721Semaste}
37254721Semaste
38254721Semasteconst SBData &
39254721SemasteSBData::operator = (const SBData &rhs)
40254721Semaste{
41254721Semaste    if (this != &rhs)
42254721Semaste        m_opaque_sp = rhs.m_opaque_sp;
43254721Semaste    return *this;
44254721Semaste}
45254721Semaste
46254721SemasteSBData::~SBData ()
47254721Semaste{
48254721Semaste}
49254721Semaste
50254721Semastevoid
51254721SemasteSBData::SetOpaque (const lldb::DataExtractorSP &data_sp)
52254721Semaste{
53254721Semaste    m_opaque_sp = data_sp;
54254721Semaste}
55254721Semaste
56254721Semastelldb_private::DataExtractor *
57254721SemasteSBData::get() const
58254721Semaste{
59254721Semaste    return m_opaque_sp.get();
60254721Semaste}
61254721Semaste
62254721Semastelldb_private::DataExtractor *
63254721SemasteSBData::operator->() const
64254721Semaste{
65254721Semaste    return m_opaque_sp.operator->();
66254721Semaste}
67254721Semaste
68254721Semastelldb::DataExtractorSP &
69254721SemasteSBData::operator*()
70254721Semaste{
71254721Semaste    return m_opaque_sp;
72254721Semaste}
73254721Semaste
74254721Semasteconst lldb::DataExtractorSP &
75254721SemasteSBData::operator*() const
76254721Semaste{
77254721Semaste    return m_opaque_sp;
78254721Semaste}
79254721Semaste
80254721Semastebool
81254721SemasteSBData::IsValid()
82254721Semaste{
83254721Semaste    return m_opaque_sp.get() != NULL;
84254721Semaste}
85254721Semaste
86254721Semasteuint8_t
87254721SemasteSBData::GetAddressByteSize ()
88254721Semaste{
89254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
90254721Semaste    uint8_t value = 0;
91254721Semaste    if (m_opaque_sp.get())
92254721Semaste        value = m_opaque_sp->GetAddressByteSize();
93254721Semaste    if (log)
94254721Semaste        log->Printf ("SBData::GetAddressByteSize () => "
95254721Semaste                     "(%i)", value);
96254721Semaste    return value;
97254721Semaste}
98254721Semaste
99254721Semastevoid
100254721SemasteSBData::SetAddressByteSize (uint8_t addr_byte_size)
101254721Semaste{
102254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
103254721Semaste    if (m_opaque_sp.get())
104254721Semaste        m_opaque_sp->SetAddressByteSize(addr_byte_size);
105254721Semaste    if (log)
106254721Semaste        log->Printf ("SBData::SetAddressByteSize (%i)", addr_byte_size);
107254721Semaste}
108254721Semaste
109254721Semastevoid
110254721SemasteSBData::Clear ()
111254721Semaste{
112254721Semaste    if (m_opaque_sp.get())
113254721Semaste        m_opaque_sp->Clear();
114254721Semaste}
115254721Semaste
116254721Semastesize_t
117254721SemasteSBData::GetByteSize ()
118254721Semaste{
119254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
120254721Semaste    size_t value = 0;
121254721Semaste    if (m_opaque_sp.get())
122254721Semaste        value = m_opaque_sp->GetByteSize();
123254721Semaste    if (log)
124254721Semaste        log->Printf ("SBData::GetByteSize () => "
125263363Semaste                     "(%zu)", value);
126254721Semaste    return value;
127254721Semaste}
128254721Semaste
129254721Semastelldb::ByteOrder
130254721SemasteSBData::GetByteOrder ()
131254721Semaste{
132254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
133254721Semaste    lldb::ByteOrder value = eByteOrderInvalid;
134254721Semaste    if (m_opaque_sp.get())
135254721Semaste        value = m_opaque_sp->GetByteOrder();
136254721Semaste    if (log)
137254721Semaste        log->Printf ("SBData::GetByteOrder () => "
138254721Semaste                     "(%i)", value);
139254721Semaste    return value;
140254721Semaste}
141254721Semaste
142254721Semastevoid
143254721SemasteSBData::SetByteOrder (lldb::ByteOrder endian)
144254721Semaste{
145254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
146254721Semaste    if (m_opaque_sp.get())
147254721Semaste        m_opaque_sp->SetByteOrder(endian);
148254721Semaste    if (log)
149254721Semaste        log->Printf ("SBData::GetByteOrder (%i)", endian);
150254721Semaste}
151254721Semaste
152254721Semaste
153254721Semastefloat
154254721SemasteSBData::GetFloat (lldb::SBError& error, lldb::offset_t offset)
155254721Semaste{
156254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
157254721Semaste    float value = 0;
158254721Semaste    if (!m_opaque_sp.get())
159254721Semaste    {
160254721Semaste        error.SetErrorString("no value to read from");
161254721Semaste    }
162254721Semaste    else
163254721Semaste    {
164254721Semaste        uint32_t old_offset = offset;
165254721Semaste        value = m_opaque_sp->GetFloat(&offset);
166254721Semaste        if (offset == old_offset)
167254721Semaste            error.SetErrorString("unable to read data");
168254721Semaste    }
169254721Semaste    if (log)
170254721Semaste        log->Printf ("SBData::GetFloat (error=%p,offset=%" PRIu64 ") => "
171254721Semaste                     "(%f)", error.get(), offset, value);
172254721Semaste    return value;
173254721Semaste}
174254721Semaste
175254721Semastedouble
176254721SemasteSBData::GetDouble (lldb::SBError& error, lldb::offset_t offset)
177254721Semaste{
178254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
179254721Semaste    double value = 0;
180254721Semaste    if (!m_opaque_sp.get())
181254721Semaste    {
182254721Semaste        error.SetErrorString("no value to read from");
183254721Semaste    }
184254721Semaste    else
185254721Semaste    {
186254721Semaste        uint32_t old_offset = offset;
187254721Semaste        value = m_opaque_sp->GetDouble(&offset);
188254721Semaste        if (offset == old_offset)
189254721Semaste            error.SetErrorString("unable to read data");
190254721Semaste    }
191254721Semaste    if (log)
192254721Semaste        log->Printf ("SBData::GetDouble (error=%p,offset=%" PRIu64 ") => "
193254721Semaste                     "(%f)", error.get(), offset, value);
194254721Semaste    return value;
195254721Semaste}
196254721Semaste
197254721Semastelong double
198254721SemasteSBData::GetLongDouble (lldb::SBError& error, lldb::offset_t offset)
199254721Semaste{
200254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
201254721Semaste    long double value = 0;
202254721Semaste    if (!m_opaque_sp.get())
203254721Semaste    {
204254721Semaste        error.SetErrorString("no value to read from");
205254721Semaste    }
206254721Semaste    else
207254721Semaste    {
208254721Semaste        uint32_t old_offset = offset;
209254721Semaste        value = m_opaque_sp->GetLongDouble(&offset);
210254721Semaste        if (offset == old_offset)
211254721Semaste            error.SetErrorString("unable to read data");
212254721Semaste    }
213254721Semaste    if (log)
214254721Semaste        log->Printf ("SBData::GetLongDouble (error=%p,offset=%" PRIu64 ") => "
215254721Semaste                     "(%Lf)", error.get(), offset, value);
216254721Semaste    return value;
217254721Semaste}
218254721Semaste
219254721Semastelldb::addr_t
220254721SemasteSBData::GetAddress (lldb::SBError& error, lldb::offset_t offset)
221254721Semaste{
222254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
223254721Semaste    lldb::addr_t value = 0;
224254721Semaste    if (!m_opaque_sp.get())
225254721Semaste    {
226254721Semaste        error.SetErrorString("no value to read from");
227254721Semaste    }
228254721Semaste    else
229254721Semaste    {
230254721Semaste        uint32_t old_offset = offset;
231254721Semaste        value = m_opaque_sp->GetAddress(&offset);
232254721Semaste        if (offset == old_offset)
233254721Semaste            error.SetErrorString("unable to read data");
234254721Semaste    }
235254721Semaste    if (log)
236254721Semaste        log->Printf ("SBData::GetAddress (error=%p,offset=%" PRIu64 ") => "
237254721Semaste                     "(%p)", error.get(), offset, (void*)value);
238254721Semaste    return value;
239254721Semaste}
240254721Semaste
241254721Semasteuint8_t
242254721SemasteSBData::GetUnsignedInt8 (lldb::SBError& error, lldb::offset_t offset)
243254721Semaste{
244254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
245254721Semaste    uint8_t value = 0;
246254721Semaste    if (!m_opaque_sp.get())
247254721Semaste    {
248254721Semaste        error.SetErrorString("no value to read from");
249254721Semaste    }
250254721Semaste    else
251254721Semaste    {
252254721Semaste        uint32_t old_offset = offset;
253254721Semaste        value = m_opaque_sp->GetU8(&offset);
254254721Semaste        if (offset == old_offset)
255254721Semaste            error.SetErrorString("unable to read data");
256254721Semaste    }
257254721Semaste    if (log)
258254721Semaste        log->Printf ("SBData::GetUnsignedInt8 (error=%p,offset=%" PRIu64 ") => "
259254721Semaste                     "(%c)", error.get(), offset, value);
260254721Semaste    return value;
261254721Semaste}
262254721Semaste
263254721Semasteuint16_t
264254721SemasteSBData::GetUnsignedInt16 (lldb::SBError& error, lldb::offset_t offset)
265254721Semaste{
266254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
267254721Semaste    uint16_t value = 0;
268254721Semaste    if (!m_opaque_sp.get())
269254721Semaste    {
270254721Semaste        error.SetErrorString("no value to read from");
271254721Semaste    }
272254721Semaste    else
273254721Semaste    {
274254721Semaste        uint32_t old_offset = offset;
275254721Semaste        value = m_opaque_sp->GetU16(&offset);
276254721Semaste        if (offset == old_offset)
277254721Semaste            error.SetErrorString("unable to read data");
278254721Semaste    }
279254721Semaste    if (log)
280254721Semaste        log->Printf ("SBData::GetUnsignedInt16 (error=%p,offset=%" PRIu64 ") => "
281254721Semaste                     "(%hd)", error.get(), offset, value);
282254721Semaste    return value;
283254721Semaste}
284254721Semaste
285254721Semasteuint32_t
286254721SemasteSBData::GetUnsignedInt32 (lldb::SBError& error, lldb::offset_t offset)
287254721Semaste{
288254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
289254721Semaste    uint32_t value = 0;
290254721Semaste    if (!m_opaque_sp.get())
291254721Semaste    {
292254721Semaste        error.SetErrorString("no value to read from");
293254721Semaste    }
294254721Semaste    else
295254721Semaste    {
296254721Semaste        uint32_t old_offset = offset;
297254721Semaste        value = m_opaque_sp->GetU32(&offset);
298254721Semaste        if (offset == old_offset)
299254721Semaste            error.SetErrorString("unable to read data");
300254721Semaste    }
301254721Semaste    if (log)
302254721Semaste        log->Printf ("SBData::GetUnsignedInt32 (error=%p,offset=%" PRIu64 ") => "
303254721Semaste                     "(%d)", error.get(), offset, value);
304254721Semaste    return value;
305254721Semaste}
306254721Semaste
307254721Semasteuint64_t
308254721SemasteSBData::GetUnsignedInt64 (lldb::SBError& error, lldb::offset_t offset)
309254721Semaste{
310254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
311254721Semaste    uint64_t value = 0;
312254721Semaste    if (!m_opaque_sp.get())
313254721Semaste    {
314254721Semaste        error.SetErrorString("no value to read from");
315254721Semaste    }
316254721Semaste    else
317254721Semaste    {
318254721Semaste        uint32_t old_offset = offset;
319254721Semaste        value = m_opaque_sp->GetU64(&offset);
320254721Semaste        if (offset == old_offset)
321254721Semaste            error.SetErrorString("unable to read data");
322254721Semaste    }
323254721Semaste    if (log)
324254721Semaste        log->Printf ("SBData::GetUnsignedInt64 (error=%p,offset=%" PRIu64 ") => "
325254721Semaste                     "(%" PRId64 ")", error.get(), offset, value);
326254721Semaste    return value;
327254721Semaste}
328254721Semaste
329254721Semasteint8_t
330254721SemasteSBData::GetSignedInt8 (lldb::SBError& error, lldb::offset_t offset)
331254721Semaste{
332254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
333254721Semaste    int8_t value = 0;
334254721Semaste    if (!m_opaque_sp.get())
335254721Semaste    {
336254721Semaste        error.SetErrorString("no value to read from");
337254721Semaste    }
338254721Semaste    else
339254721Semaste    {
340254721Semaste        uint32_t old_offset = offset;
341254721Semaste        value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
342254721Semaste        if (offset == old_offset)
343254721Semaste            error.SetErrorString("unable to read data");
344254721Semaste    }
345254721Semaste    if (log)
346254721Semaste        log->Printf ("SBData::GetSignedInt8 (error=%p,offset=%" PRIu64 ") => "
347254721Semaste                     "(%c)", error.get(), offset, value);
348254721Semaste    return value;
349254721Semaste}
350254721Semaste
351254721Semasteint16_t
352254721SemasteSBData::GetSignedInt16 (lldb::SBError& error, lldb::offset_t offset)
353254721Semaste{
354254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
355254721Semaste    int16_t value = 0;
356254721Semaste    if (!m_opaque_sp.get())
357254721Semaste    {
358254721Semaste        error.SetErrorString("no value to read from");
359254721Semaste    }
360254721Semaste    else
361254721Semaste    {
362254721Semaste        uint32_t old_offset = offset;
363254721Semaste        value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
364254721Semaste        if (offset == old_offset)
365254721Semaste            error.SetErrorString("unable to read data");
366254721Semaste    }
367254721Semaste    if (log)
368254721Semaste        log->Printf ("SBData::GetSignedInt16 (error=%p,offset=%" PRIu64 ") => "
369254721Semaste                     "(%hd)", error.get(), offset, value);
370254721Semaste    return value;
371254721Semaste}
372254721Semaste
373254721Semasteint32_t
374254721SemasteSBData::GetSignedInt32 (lldb::SBError& error, lldb::offset_t offset)
375254721Semaste{
376254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
377254721Semaste    int32_t value = 0;
378254721Semaste    if (!m_opaque_sp.get())
379254721Semaste    {
380254721Semaste        error.SetErrorString("no value to read from");
381254721Semaste    }
382254721Semaste    else
383254721Semaste    {
384254721Semaste        uint32_t old_offset = offset;
385254721Semaste        value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
386254721Semaste        if (offset == old_offset)
387254721Semaste            error.SetErrorString("unable to read data");
388254721Semaste    }
389254721Semaste    if (log)
390254721Semaste        log->Printf ("SBData::GetSignedInt32 (error=%p,offset=%" PRIu64 ") => "
391254721Semaste                     "(%d)", error.get(), offset, value);
392254721Semaste    return value;
393254721Semaste}
394254721Semaste
395254721Semasteint64_t
396254721SemasteSBData::GetSignedInt64 (lldb::SBError& error, lldb::offset_t offset)
397254721Semaste{
398254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
399254721Semaste    int64_t value = 0;
400254721Semaste    if (!m_opaque_sp.get())
401254721Semaste    {
402254721Semaste        error.SetErrorString("no value to read from");
403254721Semaste    }
404254721Semaste    else
405254721Semaste    {
406254721Semaste        uint32_t old_offset = offset;
407254721Semaste        value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
408254721Semaste        if (offset == old_offset)
409254721Semaste            error.SetErrorString("unable to read data");
410254721Semaste    }
411254721Semaste    if (log)
412254721Semaste        log->Printf ("SBData::GetSignedInt64 (error=%p,offset=%" PRIu64 ") => "
413254721Semaste                     "(%" PRId64 ")", error.get(), offset, value);
414254721Semaste    return value;
415254721Semaste}
416254721Semaste
417254721Semasteconst char*
418254721SemasteSBData::GetString (lldb::SBError& error, lldb::offset_t offset)
419254721Semaste{
420254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
421254721Semaste    const char* value = 0;
422254721Semaste    if (!m_opaque_sp.get())
423254721Semaste    {
424254721Semaste        error.SetErrorString("no value to read from");
425254721Semaste    }
426254721Semaste    else
427254721Semaste    {
428254721Semaste        uint32_t old_offset = offset;
429254721Semaste        value = m_opaque_sp->GetCStr(&offset);
430254721Semaste        if (offset == old_offset || (value == NULL))
431254721Semaste            error.SetErrorString("unable to read data");
432254721Semaste    }
433254721Semaste    if (log)
434254721Semaste        log->Printf ("SBData::GetString (error=%p,offset=%" PRIu64 ") => "
435254721Semaste                     "(%p)", error.get(), offset, value);
436254721Semaste    return value;
437254721Semaste}
438254721Semaste
439254721Semastebool
440254721SemasteSBData::GetDescription (lldb::SBStream &description, lldb::addr_t base_addr)
441254721Semaste{
442254721Semaste    Stream &strm = description.ref();
443254721Semaste
444254721Semaste    if (m_opaque_sp)
445254721Semaste    {
446254721Semaste        m_opaque_sp->Dump (&strm,
447254721Semaste                           0,
448254721Semaste                           lldb::eFormatBytesWithASCII,
449254721Semaste                           1,
450254721Semaste                           m_opaque_sp->GetByteSize(),
451254721Semaste                           16,
452254721Semaste                           base_addr,
453254721Semaste                           0,
454254721Semaste                           0);
455254721Semaste    }
456254721Semaste    else
457254721Semaste        strm.PutCString ("No value");
458254721Semaste
459254721Semaste    return true;
460254721Semaste}
461254721Semaste
462254721Semastesize_t
463254721SemasteSBData::ReadRawData (lldb::SBError& error,
464254721Semaste                     lldb::offset_t offset,
465254721Semaste                     void *buf,
466254721Semaste                     size_t size)
467254721Semaste{
468254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
469254721Semaste    void* ok = NULL;
470254721Semaste    if (!m_opaque_sp.get())
471254721Semaste    {
472254721Semaste        error.SetErrorString("no value to read from");
473254721Semaste    }
474254721Semaste    else
475254721Semaste    {
476254721Semaste        uint32_t old_offset = offset;
477254721Semaste        ok = m_opaque_sp->GetU8(&offset, buf, size);
478254721Semaste        if ((offset == old_offset) || (ok == NULL))
479254721Semaste            error.SetErrorString("unable to read data");
480254721Semaste    }
481254721Semaste    if (log)
482263363Semaste        log->Printf ("SBData::ReadRawData (error=%p,offset=%" PRIu64 ",buf=%p,size=%zu) => "
483254721Semaste                     "(%p)", error.get(), offset, buf, size, ok);
484254721Semaste    return ok ? size : 0;
485254721Semaste}
486254721Semaste
487254721Semastevoid
488254721SemasteSBData::SetData (lldb::SBError& error,
489254721Semaste                 const void *buf,
490254721Semaste                 size_t size,
491254721Semaste                 lldb::ByteOrder endian,
492254721Semaste                 uint8_t addr_size)
493254721Semaste{
494254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
495254721Semaste    if (!m_opaque_sp.get())
496254721Semaste        m_opaque_sp.reset(new DataExtractor(buf, size, endian, addr_size));
497254721Semaste    else
498254721Semaste        m_opaque_sp->SetData(buf, size, endian);
499254721Semaste    if (log)
500263363Semaste        log->Printf ("SBData::SetData (error=%p,buf=%p,size=%zu,endian=%d,addr_size=%c) => "
501254721Semaste                     "(%p)", error.get(), buf, size, endian, addr_size, m_opaque_sp.get());
502254721Semaste}
503254721Semaste
504254721Semastebool
505254721SemasteSBData::Append (const SBData& rhs)
506254721Semaste{
507254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
508254721Semaste    bool value = false;
509254721Semaste    if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
510254721Semaste        value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
511254721Semaste    if (log)
512254721Semaste        log->Printf ("SBData::Append (rhs=%p) => "
513254721Semaste                     "(%s)", rhs.get(), value ? "true" : "false");
514254721Semaste    return value;
515254721Semaste}
516254721Semaste
517254721Semastelldb::SBData
518254721SemasteSBData::CreateDataFromCString (lldb::ByteOrder endian, uint32_t addr_byte_size, const char* data)
519254721Semaste{
520254721Semaste    if (!data || !data[0])
521254721Semaste        return SBData();
522254721Semaste
523254721Semaste    uint32_t data_len = strlen(data);
524254721Semaste
525254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
526254721Semaste    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
527254721Semaste
528254721Semaste    SBData ret(data_sp);
529254721Semaste
530254721Semaste    return ret;
531254721Semaste}
532254721Semaste
533254721Semastelldb::SBData
534254721SemasteSBData::CreateDataFromUInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t* array, size_t array_len)
535254721Semaste{
536254721Semaste    if (!array || array_len == 0)
537254721Semaste        return SBData();
538254721Semaste
539254721Semaste    size_t data_len = array_len * sizeof(uint64_t);
540254721Semaste
541254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
542254721Semaste    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
543254721Semaste
544254721Semaste    SBData ret(data_sp);
545254721Semaste
546254721Semaste    return ret;
547254721Semaste}
548254721Semaste
549254721Semastelldb::SBData
550254721SemasteSBData::CreateDataFromUInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t* array, size_t array_len)
551254721Semaste{
552254721Semaste    if (!array || array_len == 0)
553254721Semaste        return SBData();
554254721Semaste
555254721Semaste    size_t data_len = array_len * sizeof(uint32_t);
556254721Semaste
557254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
558254721Semaste    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
559254721Semaste
560254721Semaste    SBData ret(data_sp);
561254721Semaste
562254721Semaste    return ret;
563254721Semaste}
564254721Semaste
565254721Semastelldb::SBData
566254721SemasteSBData::CreateDataFromSInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t* array, size_t array_len)
567254721Semaste{
568254721Semaste    if (!array || array_len == 0)
569254721Semaste        return SBData();
570254721Semaste
571254721Semaste    size_t data_len = array_len * sizeof(int64_t);
572254721Semaste
573254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
574254721Semaste    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
575254721Semaste
576254721Semaste    SBData ret(data_sp);
577254721Semaste
578254721Semaste    return ret;
579254721Semaste}
580254721Semaste
581254721Semastelldb::SBData
582254721SemasteSBData::CreateDataFromSInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t* array, size_t array_len)
583254721Semaste{
584254721Semaste    if (!array || array_len == 0)
585254721Semaste        return SBData();
586254721Semaste
587254721Semaste    size_t data_len = array_len * sizeof(int32_t);
588254721Semaste
589254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
590254721Semaste    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
591254721Semaste
592254721Semaste    SBData ret(data_sp);
593254721Semaste
594254721Semaste    return ret;
595254721Semaste}
596254721Semaste
597254721Semastelldb::SBData
598254721SemasteSBData::CreateDataFromDoubleArray (lldb::ByteOrder endian, uint32_t addr_byte_size, double* array, size_t array_len)
599254721Semaste{
600254721Semaste    if (!array || array_len == 0)
601254721Semaste        return SBData();
602254721Semaste
603254721Semaste    size_t data_len = array_len * sizeof(double);
604254721Semaste
605254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
606254721Semaste    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
607254721Semaste
608254721Semaste    SBData ret(data_sp);
609254721Semaste
610254721Semaste    return ret;
611254721Semaste}
612254721Semaste
613254721Semastebool
614254721SemasteSBData::SetDataFromCString (const char* data)
615254721Semaste{
616254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
617254721Semaste
618254721Semaste    if (!data)
619254721Semaste    {
620254721Semaste        if (log)
621254721Semaste            log->Printf ("SBData::SetDataFromCString (data=%p) => "
622254721Semaste                         "false", data);
623254721Semaste        return false;
624254721Semaste    }
625254721Semaste
626254721Semaste    size_t data_len = strlen(data);
627254721Semaste
628254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
629254721Semaste
630254721Semaste    if (!m_opaque_sp.get())
631254721Semaste        m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
632254721Semaste    else
633254721Semaste        m_opaque_sp->SetData(buffer_sp);
634254721Semaste
635254721Semaste    if (log)
636254721Semaste        log->Printf ("SBData::SetDataFromCString (data=%p) => "
637254721Semaste                     "true", data);
638254721Semaste
639254721Semaste    return true;
640254721Semaste}
641254721Semaste
642254721Semastebool
643254721SemasteSBData::SetDataFromUInt64Array (uint64_t* array, size_t array_len)
644254721Semaste{
645254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
646254721Semaste
647254721Semaste    if (!array || array_len == 0)
648254721Semaste    {
649254721Semaste        if (log)
650263363Semaste            log->Printf ("SBData::SetDataFromUInt64Array (array=%p, array_len = %zu) => "
651254721Semaste                         "false", array, array_len);
652254721Semaste        return false;
653254721Semaste    }
654254721Semaste
655254721Semaste    size_t data_len = array_len * sizeof(uint64_t);
656254721Semaste
657254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
658254721Semaste
659254721Semaste    if (!m_opaque_sp.get())
660254721Semaste        m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
661254721Semaste    else
662254721Semaste        m_opaque_sp->SetData(buffer_sp);
663254721Semaste
664254721Semaste    if (log)
665263363Semaste        log->Printf ("SBData::SetDataFromUInt64Array (array=%p, array_len = %zu) => "
666254721Semaste                     "true", array, array_len);
667254721Semaste
668254721Semaste    return true;
669254721Semaste}
670254721Semaste
671254721Semastebool
672254721SemasteSBData::SetDataFromUInt32Array (uint32_t* array, size_t array_len)
673254721Semaste{
674254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
675254721Semaste
676254721Semaste    if (!array || array_len == 0)
677254721Semaste    {
678254721Semaste        if (log)
679263363Semaste            log->Printf ("SBData::SetDataFromUInt32Array (array=%p, array_len = %zu) => "
680254721Semaste                         "false", array, array_len);
681254721Semaste        return false;
682254721Semaste    }
683254721Semaste
684254721Semaste    size_t data_len = array_len * sizeof(uint32_t);
685254721Semaste
686254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
687254721Semaste
688254721Semaste    if (!m_opaque_sp.get())
689254721Semaste        m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
690254721Semaste    else
691254721Semaste        m_opaque_sp->SetData(buffer_sp);
692254721Semaste
693254721Semaste    if (log)
694263363Semaste        log->Printf ("SBData::SetDataFromUInt32Array (array=%p, array_len = %zu) => "
695254721Semaste                     "true", array, array_len);
696254721Semaste
697254721Semaste    return true;
698254721Semaste}
699254721Semaste
700254721Semastebool
701254721SemasteSBData::SetDataFromSInt64Array (int64_t* array, size_t array_len)
702254721Semaste{
703254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
704254721Semaste
705254721Semaste    if (!array || array_len == 0)
706254721Semaste    {
707254721Semaste        if (log)
708263363Semaste            log->Printf ("SBData::SetDataFromSInt64Array (array=%p, array_len = %zu) => "
709254721Semaste                         "false", array, array_len);
710254721Semaste        return false;
711254721Semaste    }
712254721Semaste
713254721Semaste    size_t data_len = array_len * sizeof(int64_t);
714254721Semaste
715254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
716254721Semaste
717254721Semaste    if (!m_opaque_sp.get())
718254721Semaste        m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
719254721Semaste    else
720254721Semaste        m_opaque_sp->SetData(buffer_sp);
721254721Semaste
722254721Semaste    if (log)
723263363Semaste        log->Printf ("SBData::SetDataFromSInt64Array (array=%p, array_len = %zu) => "
724254721Semaste                     "true", array, array_len);
725254721Semaste
726254721Semaste    return true;
727254721Semaste}
728254721Semaste
729254721Semastebool
730254721SemasteSBData::SetDataFromSInt32Array (int32_t* array, size_t array_len)
731254721Semaste{
732254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
733254721Semaste
734254721Semaste    if (!array || array_len == 0)
735254721Semaste    {
736254721Semaste        if (log)
737263363Semaste            log->Printf ("SBData::SetDataFromSInt32Array (array=%p, array_len = %zu) => "
738254721Semaste                         "false", array, array_len);
739254721Semaste        return false;
740254721Semaste    }
741254721Semaste
742254721Semaste    size_t data_len = array_len * sizeof(int32_t);
743254721Semaste
744254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
745254721Semaste
746254721Semaste    if (!m_opaque_sp.get())
747254721Semaste        m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
748254721Semaste    else
749254721Semaste        m_opaque_sp->SetData(buffer_sp);
750254721Semaste
751254721Semaste    if (log)
752263363Semaste        log->Printf ("SBData::SetDataFromSInt32Array (array=%p, array_len = %zu) => "
753254721Semaste                     "true", array, array_len);
754254721Semaste
755254721Semaste    return true;
756254721Semaste}
757254721Semaste
758254721Semastebool
759254721SemasteSBData::SetDataFromDoubleArray (double* array, size_t array_len)
760254721Semaste{
761254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
762254721Semaste
763254721Semaste    if (!array || array_len == 0)
764254721Semaste    {
765254721Semaste        if (log)
766263363Semaste            log->Printf ("SBData::SetDataFromDoubleArray (array=%p, array_len = %zu) => "
767254721Semaste                         "false", array, array_len);
768254721Semaste        return false;
769254721Semaste    }
770254721Semaste
771254721Semaste    size_t data_len = array_len * sizeof(double);
772254721Semaste
773254721Semaste    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
774254721Semaste
775254721Semaste    if (!m_opaque_sp.get())
776254721Semaste        m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
777254721Semaste    else
778254721Semaste        m_opaque_sp->SetData(buffer_sp);
779254721Semaste
780254721Semaste    if (log)
781263363Semaste        log->Printf ("SBData::SetDataFromDoubleArray (array=%p, array_len = %zu) => "
782254721Semaste                     "true", array, array_len);
783254721Semaste
784254721Semaste    return true;
785254721Semaste}
786