LLDB mainline
SBData.cpp
Go to the documentation of this file.
1//===-- SBData.cpp --------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/API/SBData.h"
10#include "lldb/API/SBError.h"
11#include "lldb/API/SBStream.h"
14
19#include "lldb/Utility/Stream.h"
20
21#include <cinttypes>
22#include <memory>
23
24using namespace lldb;
25using namespace lldb_private;
26
30
32
34 LLDB_INSTRUMENT_VA(this, rhs);
35}
36
37const SBData &SBData::operator=(const SBData &rhs) {
38 LLDB_INSTRUMENT_VA(this, rhs);
39
40 if (this != &rhs)
42 return *this;
43}
44
45SBData::~SBData() = default;
46
48 m_opaque_sp = data_sp;
49}
50
52
54 return m_opaque_sp.operator->();
55}
56
58
60
63 return this->operator bool();
64}
65SBData::operator bool() const {
67
68 return m_opaque_sp.get() != nullptr;
69}
70
73
74 uint8_t value = 0;
75 if (m_opaque_sp.get())
76 value = m_opaque_sp->GetAddressByteSize();
77 return value;
78}
79
80void SBData::SetAddressByteSize(uint8_t addr_byte_size) {
81 LLDB_INSTRUMENT_VA(this, addr_byte_size);
82
83 if (m_opaque_sp.get())
84 m_opaque_sp->SetAddressByteSize(addr_byte_size);
85}
86
89
90 if (m_opaque_sp.get())
91 m_opaque_sp->Clear();
92}
93
96
97 size_t value = 0;
98 if (m_opaque_sp.get())
99 value = m_opaque_sp->GetByteSize();
100 return value;
101}
102
104 LLDB_INSTRUMENT_VA(this);
105
107 if (m_opaque_sp.get())
108 value = m_opaque_sp->GetByteOrder();
109 return value;
110}
111
114
115 if (m_opaque_sp.get())
116 m_opaque_sp->SetByteOrder(endian);
117}
118
120 LLDB_INSTRUMENT_VA(this, error, offset);
121
122 float value = 0;
123 if (!m_opaque_sp.get()) {
124 error.SetErrorString("no value to read from");
125 } else {
126 uint32_t old_offset = offset;
127 value = m_opaque_sp->GetFloat(&offset);
128 if (offset == old_offset)
129 error.SetErrorString("unable to read data");
130 }
131 return value;
132}
133
135 LLDB_INSTRUMENT_VA(this, error, offset);
136
137 double value = 0;
138 if (!m_opaque_sp.get()) {
139 error.SetErrorString("no value to read from");
140 } else {
141 uint32_t old_offset = offset;
142 value = m_opaque_sp->GetDouble(&offset);
143 if (offset == old_offset)
144 error.SetErrorString("unable to read data");
145 }
146 return value;
147}
148
150 LLDB_INSTRUMENT_VA(this, error, offset);
151
152 long double value = 0;
153 if (!m_opaque_sp.get()) {
154 error.SetErrorString("no value to read from");
155 } else {
156 uint32_t old_offset = offset;
157 value = m_opaque_sp->GetLongDouble(&offset);
158 if (offset == old_offset)
159 error.SetErrorString("unable to read data");
160 }
161 return value;
162}
163
165 LLDB_INSTRUMENT_VA(this, error, offset);
166
167 lldb::addr_t value = 0;
168 if (!m_opaque_sp.get()) {
169 error.SetErrorString("no value to read from");
170 } else {
171 uint32_t old_offset = offset;
172 value = m_opaque_sp->GetAddress(&offset);
173 if (offset == old_offset)
174 error.SetErrorString("unable to read data");
175 }
176 return value;
177}
178
180 LLDB_INSTRUMENT_VA(this, error, offset);
181
182 uint8_t value = 0;
183 if (!m_opaque_sp.get()) {
184 error.SetErrorString("no value to read from");
185 } else {
186 uint32_t old_offset = offset;
187 value = m_opaque_sp->GetU8(&offset);
188 if (offset == old_offset)
189 error.SetErrorString("unable to read data");
190 }
191 return value;
192}
193
195 LLDB_INSTRUMENT_VA(this, error, offset);
196
197 uint16_t value = 0;
198 if (!m_opaque_sp.get()) {
199 error.SetErrorString("no value to read from");
200 } else {
201 uint32_t old_offset = offset;
202 value = m_opaque_sp->GetU16(&offset);
203 if (offset == old_offset)
204 error.SetErrorString("unable to read data");
205 }
206 return value;
207}
208
210 LLDB_INSTRUMENT_VA(this, error, offset);
211
212 uint32_t value = 0;
213 if (!m_opaque_sp.get()) {
214 error.SetErrorString("no value to read from");
215 } else {
216 uint32_t old_offset = offset;
217 value = m_opaque_sp->GetU32(&offset);
218 if (offset == old_offset)
219 error.SetErrorString("unable to read data");
220 }
221 return value;
222}
223
225 LLDB_INSTRUMENT_VA(this, error, offset);
226
227 uint64_t value = 0;
228 if (!m_opaque_sp.get()) {
229 error.SetErrorString("no value to read from");
230 } else {
231 uint32_t old_offset = offset;
232 value = m_opaque_sp->GetU64(&offset);
233 if (offset == old_offset)
234 error.SetErrorString("unable to read data");
235 }
236 return value;
237}
238
240 LLDB_INSTRUMENT_VA(this, error, offset);
241
242 int8_t value = 0;
243 if (!m_opaque_sp.get()) {
244 error.SetErrorString("no value to read from");
245 } else {
246 uint32_t old_offset = offset;
247 value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
248 if (offset == old_offset)
249 error.SetErrorString("unable to read data");
250 }
251 return value;
252}
253
255 LLDB_INSTRUMENT_VA(this, error, offset);
256
257 int16_t value = 0;
258 if (!m_opaque_sp.get()) {
259 error.SetErrorString("no value to read from");
260 } else {
261 uint32_t old_offset = offset;
262 value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
263 if (offset == old_offset)
264 error.SetErrorString("unable to read data");
265 }
266 return value;
267}
268
270 LLDB_INSTRUMENT_VA(this, error, offset);
271
272 int32_t value = 0;
273 if (!m_opaque_sp.get()) {
274 error.SetErrorString("no value to read from");
275 } else {
276 uint32_t old_offset = offset;
277 value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
278 if (offset == old_offset)
279 error.SetErrorString("unable to read data");
280 }
281 return value;
282}
283
285 LLDB_INSTRUMENT_VA(this, error, offset);
286
287 int64_t value = 0;
288 if (!m_opaque_sp.get()) {
289 error.SetErrorString("no value to read from");
290 } else {
291 uint32_t old_offset = offset;
292 value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
293 if (offset == old_offset)
294 error.SetErrorString("unable to read data");
295 }
296 return value;
297}
298
300 LLDB_INSTRUMENT_VA(this, error, offset);
301
302 if (!m_opaque_sp) {
303 error.SetErrorString("no value to read from");
304 return nullptr;
305 }
306
307 lldb::offset_t old_offset = offset;
308 const char *value = m_opaque_sp->GetCStr(&offset);
309 if (offset == old_offset || value == nullptr) {
310 error.SetErrorString("unable to read data");
311 return nullptr;
312 }
313
314 return StringPool::GetSystemPool().Intern(value);
315}
316
318 lldb::addr_t base_addr) {
319 LLDB_INSTRUMENT_VA(this, description, base_addr);
320
321 Stream &strm = description.ref();
322
323 if (m_opaque_sp) {
325 m_opaque_sp->GetByteSize(), 16, base_addr, 0, 0);
326 } else
327 strm.PutCString("No value");
328
329 return true;
330}
331
333 void *buf, size_t size) {
334 LLDB_INSTRUMENT_VA(this, error, offset, buf, size);
335
336 void *ok = nullptr;
337 if (!m_opaque_sp.get()) {
338 error.SetErrorString("no value to read from");
339 } else {
340 uint32_t old_offset = offset;
341 ok = m_opaque_sp->GetU8(&offset, buf, size);
342 if ((offset == old_offset) || (ok == nullptr))
343 error.SetErrorString("unable to read data");
344 }
345 return ok ? size : 0;
346}
347
348void SBData::SetData(lldb::SBError &error, const void *buf, size_t size,
349 lldb::ByteOrder endian, uint8_t addr_size) {
350 LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
351
352 if (!m_opaque_sp.get())
353 m_opaque_sp = std::make_shared<DataExtractor>(buf, size, endian, addr_size);
354 else {
355 m_opaque_sp->SetData(buf, size, endian);
356 m_opaque_sp->SetAddressByteSize(addr_size);
357 }
358}
359
361 size_t size, lldb::ByteOrder endian,
362 uint8_t addr_size) {
363 LLDB_INSTRUMENT_VA(this, error, buf, size, endian, addr_size);
364
365 lldb::DataBufferSP buffer_sp = std::make_shared<DataBufferHeap>(buf, size);
366
367 if (!m_opaque_sp)
368 m_opaque_sp = std::make_shared<DataExtractor>();
369
370 m_opaque_sp->SetData(buffer_sp);
371 m_opaque_sp->SetByteOrder(endian);
372 m_opaque_sp->SetAddressByteSize(addr_size);
373}
374
375bool SBData::Append(const SBData &rhs) {
376 LLDB_INSTRUMENT_VA(this, rhs);
377
378 bool value = false;
379 if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
380 value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
381 return value;
382}
383
385 uint32_t addr_byte_size,
386 const char *data) {
387 LLDB_INSTRUMENT_VA(endian, addr_byte_size, data);
388
389 if (!data || !data[0])
390 return SBData();
391
392 uint32_t data_len = strlen(data);
393
394 lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
395 lldb::DataExtractorSP data_sp(
396 new DataExtractor(buffer_sp, endian, addr_byte_size));
397
398 SBData ret(data_sp);
399
400 return ret;
401}
402
404 uint32_t addr_byte_size,
405 uint64_t *array,
406 size_t array_len) {
407 LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
408
409 if (!array || array_len == 0)
410 return SBData();
411
412 size_t data_len = array_len * sizeof(uint64_t);
413
414 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
415 lldb::DataExtractorSP data_sp(
416 new DataExtractor(buffer_sp, endian, addr_byte_size));
417
418 SBData ret(data_sp);
419
420 return ret;
421}
422
424 uint32_t addr_byte_size,
425 uint32_t *array,
426 size_t array_len) {
427 LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
428
429 if (!array || array_len == 0)
430 return SBData();
431
432 size_t data_len = array_len * sizeof(uint32_t);
433
434 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
435 lldb::DataExtractorSP data_sp(
436 new DataExtractor(buffer_sp, endian, addr_byte_size));
437
438 SBData ret(data_sp);
439
440 return ret;
441}
442
444 uint32_t addr_byte_size,
445 int64_t *array,
446 size_t array_len) {
447 LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
448
449 if (!array || array_len == 0)
450 return SBData();
451
452 size_t data_len = array_len * sizeof(int64_t);
453
454 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
455 lldb::DataExtractorSP data_sp(
456 new DataExtractor(buffer_sp, endian, addr_byte_size));
457
458 SBData ret(data_sp);
459
460 return ret;
461}
462
464 uint32_t addr_byte_size,
465 int32_t *array,
466 size_t array_len) {
467 LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
468
469 if (!array || array_len == 0)
470 return SBData();
471
472 size_t data_len = array_len * sizeof(int32_t);
473
474 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
475 lldb::DataExtractorSP data_sp(
476 new DataExtractor(buffer_sp, endian, addr_byte_size));
477
478 SBData ret(data_sp);
479
480 return ret;
481}
482
484 uint32_t addr_byte_size,
485 double *array,
486 size_t array_len) {
487 LLDB_INSTRUMENT_VA(endian, addr_byte_size, array, array_len);
488
489 if (!array || array_len == 0)
490 return SBData();
491
492 size_t data_len = array_len * sizeof(double);
493
494 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
495 lldb::DataExtractorSP data_sp(
496 new DataExtractor(buffer_sp, endian, addr_byte_size));
497
498 SBData ret(data_sp);
499
500 return ret;
501}
502
503bool SBData::SetDataFromCString(const char *data) {
504 LLDB_INSTRUMENT_VA(this, data);
505
506 if (!data) {
507 return false;
508 }
509
510 size_t data_len = strlen(data);
511
512 lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
513
514 if (!m_opaque_sp.get())
515 m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
517 else
518 m_opaque_sp->SetData(buffer_sp);
519
520 return true;
521}
522
523bool SBData::SetDataFromUInt64Array(uint64_t *array, size_t array_len) {
524 LLDB_INSTRUMENT_VA(this, array, array_len);
525
526 if (!array || array_len == 0) {
527 return false;
528 }
529
530 size_t data_len = array_len * sizeof(uint64_t);
531
532 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
533
534 if (!m_opaque_sp.get())
535 m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
537 else
538 m_opaque_sp->SetData(buffer_sp);
539
540 return true;
541}
542
543bool SBData::SetDataFromUInt32Array(uint32_t *array, size_t array_len) {
544 LLDB_INSTRUMENT_VA(this, array, array_len);
545
546 if (!array || array_len == 0) {
547 return false;
548 }
549
550 size_t data_len = array_len * sizeof(uint32_t);
551
552 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
553
554 if (!m_opaque_sp.get())
555 m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
557 else
558 m_opaque_sp->SetData(buffer_sp);
559
560 return true;
561}
562
563bool SBData::SetDataFromSInt64Array(int64_t *array, size_t array_len) {
564 LLDB_INSTRUMENT_VA(this, array, array_len);
565
566 if (!array || array_len == 0) {
567 return false;
568 }
569
570 size_t data_len = array_len * sizeof(int64_t);
571
572 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
573
574 if (!m_opaque_sp.get())
575 m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
577 else
578 m_opaque_sp->SetData(buffer_sp);
579
580 return true;
581}
582
583bool SBData::SetDataFromSInt32Array(int32_t *array, size_t array_len) {
584 LLDB_INSTRUMENT_VA(this, array, array_len);
585
586 if (!array || array_len == 0) {
587 return false;
588 }
589
590 size_t data_len = array_len * sizeof(int32_t);
591
592 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
593
594 if (!m_opaque_sp.get())
595 m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
597 else
598 m_opaque_sp->SetData(buffer_sp);
599
600 return true;
601}
602
603bool SBData::SetDataFromDoubleArray(double *array, size_t array_len) {
604 LLDB_INSTRUMENT_VA(this, array, array_len);
605
606 if (!array || array_len == 0) {
607 return false;
608 }
609
610 size_t data_len = array_len * sizeof(double);
611
612 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
613
614 if (!m_opaque_sp.get())
615 m_opaque_sp = std::make_shared<DataExtractor>(buffer_sp, GetByteOrder(),
617 else
618 m_opaque_sp->SetData(buffer_sp);
619
620 return true;
621}
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_INSTRUMENT_VA(...)
void SetDataWithOwnership(lldb::SBError &error, const void *buf, size_t size, lldb::ByteOrder endian, uint8_t addr_size)
Definition SBData.cpp:360
lldb_private::DataExtractor * get() const
Definition SBData.cpp:51
lldb::ByteOrder GetByteOrder()
Definition SBData.cpp:103
void SetByteOrder(lldb::ByteOrder endian)
Definition SBData.cpp:112
void Clear()
Definition SBData.cpp:87
uint8_t GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:179
uint64_t GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:224
uint8_t GetAddressByteSize()
Definition SBData.cpp:71
double GetDouble(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:134
bool IsValid()
Definition SBData.cpp:61
bool SetDataFromSInt64Array(int64_t *array, size_t array_len)
Definition SBData.cpp:563
size_t ReadRawData(lldb::SBError &error, lldb::offset_t offset, void *buf, size_t size)
Definition SBData.cpp:332
static lldb::SBData CreateDataFromSInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t *array, size_t array_len)
Definition SBData.cpp:443
int8_t GetSignedInt8(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:239
bool Append(const SBData &rhs)
Definition SBData.cpp:375
bool GetDescription(lldb::SBStream &description, lldb::addr_t base_addr=LLDB_INVALID_ADDRESS)
Definition SBData.cpp:317
int16_t GetSignedInt16(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:254
lldb_private::DataExtractor * operator->() const
Definition SBData.cpp:53
lldb::addr_t GetAddress(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:164
bool SetDataFromUInt32Array(uint32_t *array, size_t array_len)
Definition SBData.cpp:543
void SetAddressByteSize(uint8_t addr_byte_size)
Definition SBData.cpp:80
const char * GetString(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:299
size_t GetByteSize()
Definition SBData.cpp:94
uint32_t GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:209
static lldb::SBData CreateDataFromCString(lldb::ByteOrder endian, uint32_t addr_byte_size, const char *data)
Definition SBData.cpp:384
static lldb::SBData CreateDataFromUInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t *array, size_t array_len)
Definition SBData.cpp:423
bool SetDataFromCString(const char *data)
Definition SBData.cpp:503
int32_t GetSignedInt32(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:269
void SetOpaque(const lldb::DataExtractorSP &data_sp)
Definition SBData.cpp:47
static lldb::SBData CreateDataFromDoubleArray(lldb::ByteOrder endian, uint32_t addr_byte_size, double *array, size_t array_len)
Definition SBData.cpp:483
bool SetDataFromUInt64Array(uint64_t *array, size_t array_len)
Definition SBData.cpp:523
lldb::DataExtractorSP & operator*()
Definition SBData.cpp:57
static lldb::SBData CreateDataFromUInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t *array, size_t array_len)
Definition SBData.cpp:403
bool SetDataFromDoubleArray(double *array, size_t array_len)
Definition SBData.cpp:603
uint16_t GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:194
long double GetLongDouble(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:149
float GetFloat(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:119
const SBData & operator=(const SBData &rhs)
Definition SBData.cpp:37
static lldb::SBData CreateDataFromSInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t *array, size_t array_len)
Definition SBData.cpp:463
int64_t GetSignedInt64(lldb::SBError &error, lldb::offset_t offset)
Definition SBData.cpp:284
bool SetDataFromSInt32Array(int32_t *array, size_t array_len)
Definition SBData.cpp:583
void SetData(lldb::SBError &error, const void *buf, size_t size, lldb::ByteOrder endian, uint8_t addr_size)
Definition SBData.cpp:348
lldb::DataExtractorSP m_opaque_sp
Definition SBData.h:159
lldb_private::Stream & ref()
Definition SBStream.cpp:179
A subclass of DataBuffer that stores a data buffer on the heap.
An data extractor class.
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition Stream.cpp:63
const char * Intern(llvm::StringRef str) const
Definition StringPool.h:78
static StringPoolRef GetSystemPool()
The system pool. Only valid between Initialize and Terminate.
A class that represents a running process on the host machine.
lldb::offset_t DumpDataExtractor(const DataExtractor &DE, Stream *s, lldb::offset_t offset, lldb::Format item_format, size_t item_byte_size, size_t item_count, size_t num_per_line, uint64_t base_addr, uint32_t item_bit_size, uint32_t item_bit_offset, ExecutionContextScope *exe_scope=nullptr, bool show_memory_tags=false)
Dumps item_count objects into the stream s.
@ eFormatBytesWithASCII
uint64_t offset_t
Definition lldb-types.h:86
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
uint64_t addr_t
Definition lldb-types.h:80
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP