blob: a58585295a217337f55e9be54082e11ac70667d1 [file] [log] [blame]
Enrico Granata9128ee22011-09-06 19:20:51 +00001//===-- 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
Sean Callananaf90cf52014-04-19 03:09:28 +000010#include <inttypes.h> // PRIu64
11
Enrico Granata9128ee22011-09-06 19:20:51 +000012#include "lldb/API/SBData.h"
13#include "lldb/API/SBError.h"
14#include "lldb/API/SBStream.h"
15
Greg Clayton0f289862012-01-07 00:45:50 +000016#include "lldb/Core/DataBufferHeap.h"
Enrico Granata9128ee22011-09-06 19:20:51 +000017#include "lldb/Core/DataExtractor.h"
18#include "lldb/Core/Log.h"
Greg Claytonda7bc7d2011-11-13 06:57:31 +000019#include "lldb/Core/Stream.h"
20
Enrico Granata9128ee22011-09-06 19:20:51 +000021
22using namespace lldb;
23using namespace lldb_private;
24
Greg Clayton0f289862012-01-07 00:45:50 +000025SBData::SBData () :
26 m_opaque_sp(new DataExtractor())
Enrico Granata9128ee22011-09-06 19:20:51 +000027{
28}
29
30SBData::SBData (const lldb::DataExtractorSP& data_sp) :
31 m_opaque_sp (data_sp)
32{
33}
34
35SBData::SBData(const SBData &rhs) :
36 m_opaque_sp (rhs.m_opaque_sp)
37{
38}
39
40const SBData &
41SBData::operator = (const SBData &rhs)
42{
43 if (this != &rhs)
44 m_opaque_sp = rhs.m_opaque_sp;
45 return *this;
46}
47
48SBData::~SBData ()
49{
50}
51
52void
53SBData::SetOpaque (const lldb::DataExtractorSP &data_sp)
54{
55 m_opaque_sp = data_sp;
56}
57
58lldb_private::DataExtractor *
59SBData::get() const
60{
61 return m_opaque_sp.get();
62}
63
64lldb_private::DataExtractor *
65SBData::operator->() const
66{
67 return m_opaque_sp.operator->();
68}
69
70lldb::DataExtractorSP &
71SBData::operator*()
72{
73 return m_opaque_sp;
74}
75
76const lldb::DataExtractorSP &
77SBData::operator*() const
78{
79 return m_opaque_sp;
80}
81
82bool
83SBData::IsValid()
84{
85 return m_opaque_sp.get() != NULL;
86}
87
88uint8_t
89SBData::GetAddressByteSize ()
90{
Greg Clayton5160ce52013-03-27 23:08:40 +000091 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +000092 uint8_t value = 0;
93 if (m_opaque_sp.get())
94 value = m_opaque_sp->GetAddressByteSize();
95 if (log)
96 log->Printf ("SBData::GetAddressByteSize () => "
97 "(%i)", value);
98 return value;
99}
100
101void
Greg Clayton0f289862012-01-07 00:45:50 +0000102SBData::SetAddressByteSize (uint8_t addr_byte_size)
103{
Greg Clayton5160ce52013-03-27 23:08:40 +0000104 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0f289862012-01-07 00:45:50 +0000105 if (m_opaque_sp.get())
106 m_opaque_sp->SetAddressByteSize(addr_byte_size);
107 if (log)
108 log->Printf ("SBData::SetAddressByteSize (%i)", addr_byte_size);
109}
110
111void
Enrico Granata9128ee22011-09-06 19:20:51 +0000112SBData::Clear ()
113{
114 if (m_opaque_sp.get())
115 m_opaque_sp->Clear();
116}
117
118size_t
119SBData::GetByteSize ()
120{
Greg Clayton5160ce52013-03-27 23:08:40 +0000121 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000122 size_t value = 0;
123 if (m_opaque_sp.get())
124 value = m_opaque_sp->GetByteSize();
125 if (log)
126 log->Printf ("SBData::GetByteSize () => "
Greg Clayton6fea17e2014-03-03 19:15:20 +0000127 "( %" PRIu64 " )", (uint64_t)value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000128 return value;
129}
130
131lldb::ByteOrder
132SBData::GetByteOrder ()
133{
Greg Clayton5160ce52013-03-27 23:08:40 +0000134 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000135 lldb::ByteOrder value = eByteOrderInvalid;
136 if (m_opaque_sp.get())
137 value = m_opaque_sp->GetByteOrder();
138 if (log)
139 log->Printf ("SBData::GetByteOrder () => "
140 "(%i)", value);
141 return value;
142}
143
Greg Clayton0f289862012-01-07 00:45:50 +0000144void
145SBData::SetByteOrder (lldb::ByteOrder endian)
146{
Greg Clayton5160ce52013-03-27 23:08:40 +0000147 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0f289862012-01-07 00:45:50 +0000148 if (m_opaque_sp.get())
149 m_opaque_sp->SetByteOrder(endian);
150 if (log)
151 log->Printf ("SBData::GetByteOrder (%i)", endian);
152}
153
154
Enrico Granata9128ee22011-09-06 19:20:51 +0000155float
Greg Claytonc7bece562013-01-25 18:06:21 +0000156SBData::GetFloat (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000157{
Greg Clayton5160ce52013-03-27 23:08:40 +0000158 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000159 float value = 0;
160 if (!m_opaque_sp.get())
161 {
162 error.SetErrorString("no value to read from");
163 }
164 else
165 {
166 uint32_t old_offset = offset;
167 value = m_opaque_sp->GetFloat(&offset);
168 if (offset == old_offset)
169 error.SetErrorString("unable to read data");
170 }
171 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000172 log->Printf ("SBData::GetFloat (error=%p,offset=%" PRIu64 ") => (%f)",
173 static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000174 return value;
175}
176
177double
Greg Claytonc7bece562013-01-25 18:06:21 +0000178SBData::GetDouble (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000179{
Greg Clayton5160ce52013-03-27 23:08:40 +0000180 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000181 double value = 0;
182 if (!m_opaque_sp.get())
183 {
184 error.SetErrorString("no value to read from");
185 }
186 else
187 {
188 uint32_t old_offset = offset;
189 value = m_opaque_sp->GetDouble(&offset);
190 if (offset == old_offset)
191 error.SetErrorString("unable to read data");
192 }
193 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000194 log->Printf ("SBData::GetDouble (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000195 "(%f)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000196 return value;
197}
198
199long double
Greg Claytonc7bece562013-01-25 18:06:21 +0000200SBData::GetLongDouble (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000201{
Greg Clayton5160ce52013-03-27 23:08:40 +0000202 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000203 long double value = 0;
204 if (!m_opaque_sp.get())
205 {
206 error.SetErrorString("no value to read from");
207 }
208 else
209 {
210 uint32_t old_offset = offset;
211 value = m_opaque_sp->GetLongDouble(&offset);
212 if (offset == old_offset)
213 error.SetErrorString("unable to read data");
214 }
215 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000216 log->Printf ("SBData::GetLongDouble (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000217 "(%Lf)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000218 return value;
219}
220
221lldb::addr_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000222SBData::GetAddress (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000223{
Greg Clayton5160ce52013-03-27 23:08:40 +0000224 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000225 lldb::addr_t value = 0;
226 if (!m_opaque_sp.get())
227 {
228 error.SetErrorString("no value to read from");
229 }
230 else
231 {
232 uint32_t old_offset = offset;
233 value = m_opaque_sp->GetAddress(&offset);
234 if (offset == old_offset)
235 error.SetErrorString("unable to read data");
236 }
237 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000238 log->Printf ("SBData::GetAddress (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000239 "(%p)", static_cast<void*>(error.get()), offset,
240 reinterpret_cast<void*>(value));
Enrico Granata9128ee22011-09-06 19:20:51 +0000241 return value;
242}
243
244uint8_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000245SBData::GetUnsignedInt8 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000246{
Greg Clayton5160ce52013-03-27 23:08:40 +0000247 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000248 uint8_t value = 0;
249 if (!m_opaque_sp.get())
250 {
251 error.SetErrorString("no value to read from");
252 }
253 else
254 {
255 uint32_t old_offset = offset;
256 value = m_opaque_sp->GetU8(&offset);
257 if (offset == old_offset)
258 error.SetErrorString("unable to read data");
259 }
260 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000261 log->Printf ("SBData::GetUnsignedInt8 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000262 "(%c)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000263 return value;
264}
265
266uint16_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000267SBData::GetUnsignedInt16 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000268{
Greg Clayton5160ce52013-03-27 23:08:40 +0000269 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000270 uint16_t value = 0;
271 if (!m_opaque_sp.get())
272 {
273 error.SetErrorString("no value to read from");
274 }
275 else
276 {
277 uint32_t old_offset = offset;
278 value = m_opaque_sp->GetU16(&offset);
279 if (offset == old_offset)
280 error.SetErrorString("unable to read data");
281 }
282 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000283 log->Printf ("SBData::GetUnsignedInt16 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000284 "(%hd)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000285 return value;
286}
287
288uint32_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000289SBData::GetUnsignedInt32 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000290{
Greg Clayton5160ce52013-03-27 23:08:40 +0000291 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000292 uint32_t value = 0;
293 if (!m_opaque_sp.get())
294 {
295 error.SetErrorString("no value to read from");
296 }
297 else
298 {
299 uint32_t old_offset = offset;
300 value = m_opaque_sp->GetU32(&offset);
301 if (offset == old_offset)
302 error.SetErrorString("unable to read data");
303 }
304 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000305 log->Printf ("SBData::GetUnsignedInt32 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000306 "(%d)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000307 return value;
308}
309
310uint64_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000311SBData::GetUnsignedInt64 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000312{
Greg Clayton5160ce52013-03-27 23:08:40 +0000313 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000314 uint64_t value = 0;
315 if (!m_opaque_sp.get())
316 {
317 error.SetErrorString("no value to read from");
318 }
319 else
320 {
321 uint32_t old_offset = offset;
322 value = m_opaque_sp->GetU64(&offset);
323 if (offset == old_offset)
324 error.SetErrorString("unable to read data");
325 }
326 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000327 log->Printf ("SBData::GetUnsignedInt64 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000328 "(%" PRId64 ")", static_cast<void*>(error.get()), offset,
329 value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000330 return value;
331}
332
333int8_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000334SBData::GetSignedInt8 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000335{
Greg Clayton5160ce52013-03-27 23:08:40 +0000336 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000337 int8_t value = 0;
338 if (!m_opaque_sp.get())
339 {
340 error.SetErrorString("no value to read from");
341 }
342 else
343 {
344 uint32_t old_offset = offset;
345 value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
346 if (offset == old_offset)
347 error.SetErrorString("unable to read data");
348 }
349 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000350 log->Printf ("SBData::GetSignedInt8 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000351 "(%c)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000352 return value;
353}
354
355int16_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000356SBData::GetSignedInt16 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000357{
Greg Clayton5160ce52013-03-27 23:08:40 +0000358 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000359 int16_t value = 0;
360 if (!m_opaque_sp.get())
361 {
362 error.SetErrorString("no value to read from");
363 }
364 else
365 {
366 uint32_t old_offset = offset;
367 value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
368 if (offset == old_offset)
369 error.SetErrorString("unable to read data");
370 }
371 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000372 log->Printf ("SBData::GetSignedInt16 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000373 "(%hd)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000374 return value;
375}
376
377int32_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000378SBData::GetSignedInt32 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000379{
Greg Clayton5160ce52013-03-27 23:08:40 +0000380 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000381 int32_t value = 0;
382 if (!m_opaque_sp.get())
383 {
384 error.SetErrorString("no value to read from");
385 }
386 else
387 {
388 uint32_t old_offset = offset;
389 value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
390 if (offset == old_offset)
391 error.SetErrorString("unable to read data");
392 }
393 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000394 log->Printf ("SBData::GetSignedInt32 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000395 "(%d)", static_cast<void*>(error.get()), offset, value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000396 return value;
397}
398
399int64_t
Greg Claytonc7bece562013-01-25 18:06:21 +0000400SBData::GetSignedInt64 (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000401{
Greg Clayton5160ce52013-03-27 23:08:40 +0000402 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000403 int64_t value = 0;
404 if (!m_opaque_sp.get())
405 {
406 error.SetErrorString("no value to read from");
407 }
408 else
409 {
410 uint32_t old_offset = offset;
411 value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
412 if (offset == old_offset)
413 error.SetErrorString("unable to read data");
414 }
415 if (log)
Greg Claytonc7bece562013-01-25 18:06:21 +0000416 log->Printf ("SBData::GetSignedInt64 (error=%p,offset=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000417 "(%" PRId64 ")", static_cast<void*>(error.get()), offset,
418 value);
Enrico Granata9128ee22011-09-06 19:20:51 +0000419 return value;
420}
421
422const char*
Greg Claytonc7bece562013-01-25 18:06:21 +0000423SBData::GetString (lldb::SBError& error, lldb::offset_t offset)
Enrico Granata9128ee22011-09-06 19:20:51 +0000424{
Greg Clayton5160ce52013-03-27 23:08:40 +0000425 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000426 const char* value = 0;
427 if (!m_opaque_sp.get())
428 {
429 error.SetErrorString("no value to read from");
430 }
431 else
432 {
433 uint32_t old_offset = offset;
434 value = m_opaque_sp->GetCStr(&offset);
435 if (offset == old_offset || (value == NULL))
436 error.SetErrorString("unable to read data");
437 }
438 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000439 log->Printf ("SBData::GetString (error=%p,offset=%" PRIu64 ") => (%p)",
440 static_cast<void*>(error.get()), offset,
441 static_cast<const void*>(value));
Enrico Granata9128ee22011-09-06 19:20:51 +0000442 return value;
443}
444
445bool
Greg Claytond9dc52d2011-09-24 05:04:40 +0000446SBData::GetDescription (lldb::SBStream &description, lldb::addr_t base_addr)
Enrico Granata9128ee22011-09-06 19:20:51 +0000447{
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000448 Stream &strm = description.ref();
449
Enrico Granata9128ee22011-09-06 19:20:51 +0000450 if (m_opaque_sp)
451 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000452 m_opaque_sp->Dump (&strm,
453 0,
454 lldb::eFormatBytesWithASCII,
455 1,
456 m_opaque_sp->GetByteSize(),
457 16,
458 base_addr,
459 0,
460 0);
Enrico Granata9128ee22011-09-06 19:20:51 +0000461 }
462 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000463 strm.PutCString ("No value");
Enrico Granata9128ee22011-09-06 19:20:51 +0000464
465 return true;
466}
467
468size_t
469SBData::ReadRawData (lldb::SBError& error,
Greg Claytonc7bece562013-01-25 18:06:21 +0000470 lldb::offset_t offset,
Enrico Granata9128ee22011-09-06 19:20:51 +0000471 void *buf,
472 size_t size)
473{
Greg Clayton5160ce52013-03-27 23:08:40 +0000474 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000475 void* ok = NULL;
476 if (!m_opaque_sp.get())
477 {
478 error.SetErrorString("no value to read from");
479 }
480 else
481 {
482 uint32_t old_offset = offset;
483 ok = m_opaque_sp->GetU8(&offset, buf, size);
484 if ((offset == old_offset) || (ok == NULL))
485 error.SetErrorString("unable to read data");
486 }
487 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000488 log->Printf("SBData::ReadRawData (error=%p,offset=%" PRIu64 ",buf=%p,size=%" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000489 "(%p)", static_cast<void*>(error.get()), offset,
490 static_cast<void*>(buf), static_cast<uint64_t>(size),
491 static_cast<void*>(ok));
Enrico Granata9128ee22011-09-06 19:20:51 +0000492 return ok ? size : 0;
493}
494
495void
Greg Clayton0f289862012-01-07 00:45:50 +0000496SBData::SetData (lldb::SBError& error,
497 const void *buf,
498 size_t size,
499 lldb::ByteOrder endian,
500 uint8_t addr_size)
Enrico Granata9128ee22011-09-06 19:20:51 +0000501{
Greg Clayton5160ce52013-03-27 23:08:40 +0000502 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000503 if (!m_opaque_sp.get())
504 m_opaque_sp.reset(new DataExtractor(buf, size, endian, addr_size));
505 else
506 m_opaque_sp->SetData(buf, size, endian);
507 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000508 log->Printf("SBData::SetData (error=%p,buf=%p,size=%" PRIu64 ",endian=%d,addr_size=%c) => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000509 "(%p)", static_cast<void*>(error.get()),
510 static_cast<const void*>(buf), static_cast<uint64_t>(size),
511 endian, addr_size, static_cast<void*>(m_opaque_sp.get()));
Enrico Granata9128ee22011-09-06 19:20:51 +0000512}
513
514bool
Greg Clayton0f289862012-01-07 00:45:50 +0000515SBData::Append (const SBData& rhs)
Enrico Granata9128ee22011-09-06 19:20:51 +0000516{
Greg Clayton5160ce52013-03-27 23:08:40 +0000517 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000518 bool value = false;
519 if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
520 value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
521 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000522 log->Printf ("SBData::Append (rhs=%p) => (%s)",
523 static_cast<void*>(rhs.get()), value ? "true" : "false");
Enrico Granata9128ee22011-09-06 19:20:51 +0000524 return value;
Greg Claytond4e25522011-10-12 00:53:29 +0000525}
Greg Clayton0f289862012-01-07 00:45:50 +0000526
527lldb::SBData
528SBData::CreateDataFromCString (lldb::ByteOrder endian, uint32_t addr_byte_size, const char* data)
529{
530 if (!data || !data[0])
531 return SBData();
532
533 uint32_t data_len = strlen(data);
534
535 lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
536 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
537
538 SBData ret(data_sp);
539
540 return ret;
541}
542
543lldb::SBData
544SBData::CreateDataFromUInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t* array, size_t array_len)
545{
546 if (!array || array_len == 0)
547 return SBData();
548
549 size_t data_len = array_len * sizeof(uint64_t);
550
551 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
552 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
553
554 SBData ret(data_sp);
555
556 return ret;
557}
558
559lldb::SBData
560SBData::CreateDataFromUInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t* array, size_t array_len)
561{
562 if (!array || array_len == 0)
563 return SBData();
564
565 size_t data_len = array_len * sizeof(uint32_t);
566
567 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
568 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
569
570 SBData ret(data_sp);
571
572 return ret;
573}
574
575lldb::SBData
576SBData::CreateDataFromSInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t* array, size_t array_len)
577{
578 if (!array || array_len == 0)
579 return SBData();
580
581 size_t data_len = array_len * sizeof(int64_t);
582
583 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
584 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
585
586 SBData ret(data_sp);
587
588 return ret;
589}
590
591lldb::SBData
592SBData::CreateDataFromSInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t* array, size_t array_len)
593{
594 if (!array || array_len == 0)
595 return SBData();
596
597 size_t data_len = array_len * sizeof(int32_t);
598
599 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
600 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
601
602 SBData ret(data_sp);
603
604 return ret;
605}
606
607lldb::SBData
608SBData::CreateDataFromDoubleArray (lldb::ByteOrder endian, uint32_t addr_byte_size, double* array, size_t array_len)
609{
610 if (!array || array_len == 0)
611 return SBData();
612
613 size_t data_len = array_len * sizeof(double);
614
615 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
616 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
617
618 SBData ret(data_sp);
619
620 return ret;
621}
622
623bool
624SBData::SetDataFromCString (const char* data)
625{
Greg Clayton5160ce52013-03-27 23:08:40 +0000626 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000627
Greg Clayton0f289862012-01-07 00:45:50 +0000628 if (!data)
629 {
630 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000631 log->Printf ("SBData::SetDataFromCString (data=%p) => false",
632 static_cast<const void*>(data));
Greg Clayton0f289862012-01-07 00:45:50 +0000633 return false;
634 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000635
Greg Clayton0f289862012-01-07 00:45:50 +0000636 size_t data_len = strlen(data);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000637
Greg Clayton0f289862012-01-07 00:45:50 +0000638 lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000639
Greg Clayton0f289862012-01-07 00:45:50 +0000640 if (!m_opaque_sp.get())
641 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
642 else
643 m_opaque_sp->SetData(buffer_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000644
Greg Clayton0f289862012-01-07 00:45:50 +0000645 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000646 log->Printf ("SBData::SetDataFromCString (data=%p) => true",
647 static_cast<const void*>(data));
648
Greg Clayton0f289862012-01-07 00:45:50 +0000649 return true;
650}
651
652bool
653SBData::SetDataFromUInt64Array (uint64_t* array, size_t array_len)
654{
Greg Clayton5160ce52013-03-27 23:08:40 +0000655 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000656
Greg Clayton0f289862012-01-07 00:45:50 +0000657 if (!array || array_len == 0)
658 {
659 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000660 log->Printf("SBData::SetDataFromUInt64Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000661 "false", static_cast<void*>(array),
662 static_cast<uint64_t>(array_len));
Greg Clayton0f289862012-01-07 00:45:50 +0000663 return false;
664 }
665
666 size_t data_len = array_len * sizeof(uint64_t);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000667
Greg Clayton0f289862012-01-07 00:45:50 +0000668 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000669
Greg Clayton0f289862012-01-07 00:45:50 +0000670 if (!m_opaque_sp.get())
671 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
672 else
673 m_opaque_sp->SetData(buffer_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000674
Greg Clayton0f289862012-01-07 00:45:50 +0000675 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000676 log->Printf("SBData::SetDataFromUInt64Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000677 "true", static_cast<void*>(array),
678 static_cast<uint64_t>(array_len));
679
Greg Clayton0f289862012-01-07 00:45:50 +0000680 return true;
681}
682
683bool
684SBData::SetDataFromUInt32Array (uint32_t* array, size_t array_len)
685{
Greg Clayton5160ce52013-03-27 23:08:40 +0000686 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000687
Greg Clayton0f289862012-01-07 00:45:50 +0000688 if (!array || array_len == 0)
689 {
690 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000691 log->Printf("SBData::SetDataFromUInt32Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000692 "false", static_cast<void*>(array),
693 static_cast<uint64_t>(array_len));
Greg Clayton0f289862012-01-07 00:45:50 +0000694 return false;
695 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000696
Greg Clayton0f289862012-01-07 00:45:50 +0000697 size_t data_len = array_len * sizeof(uint32_t);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000698
Greg Clayton0f289862012-01-07 00:45:50 +0000699 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000700
Greg Clayton0f289862012-01-07 00:45:50 +0000701 if (!m_opaque_sp.get())
702 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
703 else
704 m_opaque_sp->SetData(buffer_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000705
Greg Clayton0f289862012-01-07 00:45:50 +0000706 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000707 log->Printf("SBData::SetDataFromUInt32Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000708 "true", static_cast<void*>(array),
709 static_cast<uint64_t>(array_len));
710
Greg Clayton0f289862012-01-07 00:45:50 +0000711 return true;
712}
713
714bool
715SBData::SetDataFromSInt64Array (int64_t* array, size_t array_len)
716{
Greg Clayton5160ce52013-03-27 23:08:40 +0000717 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000718
Greg Clayton0f289862012-01-07 00:45:50 +0000719 if (!array || array_len == 0)
720 {
721 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000722 log->Printf("SBData::SetDataFromSInt64Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000723 "false", static_cast<void*>(array),
724 static_cast<uint64_t>(array_len));
Greg Clayton0f289862012-01-07 00:45:50 +0000725 return false;
726 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000727
Greg Clayton0f289862012-01-07 00:45:50 +0000728 size_t data_len = array_len * sizeof(int64_t);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000729
Greg Clayton0f289862012-01-07 00:45:50 +0000730 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000731
Greg Clayton0f289862012-01-07 00:45:50 +0000732 if (!m_opaque_sp.get())
733 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
734 else
735 m_opaque_sp->SetData(buffer_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000736
Greg Clayton0f289862012-01-07 00:45:50 +0000737 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000738 log->Printf("SBData::SetDataFromSInt64Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000739 "true", static_cast<void*>(array),
740 static_cast<uint64_t>(array_len));
741
Greg Clayton0f289862012-01-07 00:45:50 +0000742 return true;
743}
744
745bool
746SBData::SetDataFromSInt32Array (int32_t* array, size_t array_len)
747{
Greg Clayton5160ce52013-03-27 23:08:40 +0000748 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000749
Greg Clayton0f289862012-01-07 00:45:50 +0000750 if (!array || array_len == 0)
751 {
752 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000753 log->Printf("SBData::SetDataFromSInt32Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000754 "false", static_cast<void*>(array),
755 static_cast<uint64_t>(array_len));
Greg Clayton0f289862012-01-07 00:45:50 +0000756 return false;
757 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000758
Greg Clayton0f289862012-01-07 00:45:50 +0000759 size_t data_len = array_len * sizeof(int32_t);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000760
Greg Clayton0f289862012-01-07 00:45:50 +0000761 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000762
Greg Clayton0f289862012-01-07 00:45:50 +0000763 if (!m_opaque_sp.get())
764 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
765 else
766 m_opaque_sp->SetData(buffer_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000767
Greg Clayton0f289862012-01-07 00:45:50 +0000768 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000769 log->Printf("SBData::SetDataFromSInt32Array (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000770 "true", static_cast<void*>(array),
771 static_cast<uint64_t>(array_len));
772
Greg Clayton0f289862012-01-07 00:45:50 +0000773 return true;
774}
775
776bool
777SBData::SetDataFromDoubleArray (double* array, size_t array_len)
778{
Greg Clayton5160ce52013-03-27 23:08:40 +0000779 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000780
Greg Clayton0f289862012-01-07 00:45:50 +0000781 if (!array || array_len == 0)
782 {
783 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000784 log->Printf("SBData::SetDataFromDoubleArray (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000785 "false", static_cast<void*>(array),
786 static_cast<uint64_t>(array_len));
Greg Clayton0f289862012-01-07 00:45:50 +0000787 return false;
788 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000789
Greg Clayton0f289862012-01-07 00:45:50 +0000790 size_t data_len = array_len * sizeof(double);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000791
Greg Clayton0f289862012-01-07 00:45:50 +0000792 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000793
Greg Clayton0f289862012-01-07 00:45:50 +0000794 if (!m_opaque_sp.get())
795 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
796 else
797 m_opaque_sp->SetData(buffer_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000798
Greg Clayton0f289862012-01-07 00:45:50 +0000799 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000800 log->Printf("SBData::SetDataFromDoubleArray (array=%p, array_len = %" PRIu64 ") => "
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000801 "true", static_cast<void*>(array),
802 static_cast<uint64_t>(array_len));
803
Greg Clayton0f289862012-01-07 00:45:50 +0000804 return true;
805}