/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Utility/DataExtractor.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- DataExtractor.h -----------------------------------------*- C++ -*-===// |
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 | | #ifndef LLDB_UTILITY_DATAEXTRACTOR_H |
10 | | #define LLDB_UTILITY_DATAEXTRACTOR_H |
11 | | |
12 | | #include "lldb/Utility/Endian.h" |
13 | | #include "lldb/lldb-defines.h" |
14 | | #include "lldb/lldb-enumerations.h" |
15 | | #include "lldb/lldb-forward.h" |
16 | | #include "lldb/lldb-types.h" |
17 | | #include "llvm/ADT/ArrayRef.h" |
18 | | #include "llvm/Support/DataExtractor.h" |
19 | | #include "llvm/Support/SwapByteOrder.h" |
20 | | |
21 | | #include <cassert> |
22 | | #include <cstdint> |
23 | | #include <cstring> |
24 | | |
25 | | namespace lldb_private { |
26 | | class Log; |
27 | | class Stream; |
28 | | } |
29 | | namespace llvm { |
30 | | template <typename T> class SmallVectorImpl; |
31 | | } |
32 | | |
33 | | |
34 | | namespace lldb_private { |
35 | | |
36 | | /// \class DataExtractor DataExtractor.h "lldb/Core/DataExtractor.h" An data |
37 | | /// extractor class. |
38 | | /// |
39 | | /// DataExtractor is a class that can extract data (swapping if needed) from a |
40 | | /// data buffer. The data buffer can be caller owned, or can be shared data |
41 | | /// that can be shared between multiple DataExtractor instances. Multiple |
42 | | /// DataExtractor objects can share the same data, yet extract values in |
43 | | /// different address sizes and byte order modes. Each object can have a |
44 | | /// unique position in the shared data and extract data from different |
45 | | /// offsets. |
46 | | /// |
47 | | /// \see DataBuffer |
48 | | class DataExtractor { |
49 | | public: |
50 | | /// \typedef DataExtractor::Type |
51 | | /// Type enumerations used in the dump routines. |
52 | | enum Type { |
53 | | TypeUInt8, ///< Format output as unsigned 8 bit integers |
54 | | TypeChar, ///< Format output as characters |
55 | | TypeUInt16, ///< Format output as unsigned 16 bit integers |
56 | | TypeUInt32, ///< Format output as unsigned 32 bit integers |
57 | | TypeUInt64, ///< Format output as unsigned 64 bit integers |
58 | | TypePointer, ///< Format output as pointers |
59 | | TypeULEB128, ///< Format output as ULEB128 numbers |
60 | | TypeSLEB128 ///< Format output as SLEB128 numbers |
61 | | }; |
62 | | |
63 | | /// Default constructor. |
64 | | /// |
65 | | /// Initialize all members to a default empty state. |
66 | | DataExtractor(); |
67 | | |
68 | | /// Construct with a buffer that is owned by the caller. |
69 | | /// |
70 | | /// This constructor allows us to use data that is owned by the caller. The |
71 | | /// data must stay around as long as this object is valid. |
72 | | /// |
73 | | /// \param[in] data |
74 | | /// A pointer to caller owned data. |
75 | | /// |
76 | | /// \param[in] data_length |
77 | | /// The length in bytes of \a data. |
78 | | /// |
79 | | /// \param[in] byte_order |
80 | | /// A byte order of the data that we are extracting from. |
81 | | /// |
82 | | /// \param[in] addr_size |
83 | | /// A new address byte size value. |
84 | | /// |
85 | | /// \param[in] target_byte_size |
86 | | /// A size of a target byte in 8-bit host bytes |
87 | | DataExtractor(const void *data, lldb::offset_t data_length, |
88 | | lldb::ByteOrder byte_order, uint32_t addr_size, |
89 | | uint32_t target_byte_size = 1); |
90 | | |
91 | | /// Construct with shared data. |
92 | | /// |
93 | | /// Copies the data shared pointer which adds a reference to the contained |
94 | | /// in \a data_sp. The shared data reference is reference counted to ensure |
95 | | /// the data lives as long as anyone still has a valid shared pointer to the |
96 | | /// data in \a data_sp. |
97 | | /// |
98 | | /// \param[in] data_sp |
99 | | /// A shared pointer to data. |
100 | | /// |
101 | | /// \param[in] byte_order |
102 | | /// A byte order of the data that we are extracting from. |
103 | | /// |
104 | | /// \param[in] addr_size |
105 | | /// A new address byte size value. |
106 | | /// |
107 | | /// \param[in] target_byte_size |
108 | | /// A size of a target byte in 8-bit host bytes |
109 | | DataExtractor(const lldb::DataBufferSP &data_sp, lldb::ByteOrder byte_order, |
110 | | uint32_t addr_size, uint32_t target_byte_size = 1); |
111 | | |
112 | | /// Construct with a subset of \a data. |
113 | | /// |
114 | | /// Initialize this object with a subset of the data bytes in \a data. If \a |
115 | | /// data contains shared data, then a reference to the shared data will be |
116 | | /// added to ensure the shared data stays around as long as any objects have |
117 | | /// references to the shared data. The byte order value and the address size |
118 | | /// settings are copied from \a data. If \a offset is not a valid offset in |
119 | | /// \a data, then no reference to the shared data will be added. If there |
120 | | /// are not \a length bytes available in \a data starting at \a offset, the |
121 | | /// length will be truncated to contain as many bytes as possible. |
122 | | /// |
123 | | /// \param[in] data |
124 | | /// Another DataExtractor object that contains data. |
125 | | /// |
126 | | /// \param[in] offset |
127 | | /// The offset into \a data at which the subset starts. |
128 | | /// |
129 | | /// \param[in] length |
130 | | /// The length in bytes of the subset of data. |
131 | | /// |
132 | | /// \param[in] target_byte_size |
133 | | /// A size of a target byte in 8-bit host bytes |
134 | | DataExtractor(const DataExtractor &data, lldb::offset_t offset, |
135 | | lldb::offset_t length, uint32_t target_byte_size = 1); |
136 | | |
137 | | /// Copy constructor. |
138 | | /// |
139 | | /// The copy constructor is explicit as otherwise it is easy to make |
140 | | /// unintended modification of a local copy instead of a caller's instance. |
141 | | /// Also a needless copy of the \a m_data_sp shared pointer is/ expensive. |
142 | | explicit DataExtractor(const DataExtractor &rhs); |
143 | | |
144 | | /// Assignment operator. |
145 | | /// |
146 | | /// Copies all data, byte order and address size settings from \a rhs into |
147 | | /// this object. If \a rhs contains shared data, a reference to that shared |
148 | | /// data will be added. |
149 | | /// |
150 | | /// \param[in] rhs |
151 | | /// Another DataExtractor object to copy. |
152 | | /// |
153 | | /// \return |
154 | | /// A const reference to this object. |
155 | | const DataExtractor &operator=(const DataExtractor &rhs); |
156 | | |
157 | | /// Move constructor and move assignment operators to complete the rule of 5. |
158 | | /// |
159 | | /// They would get deleted as we already defined those of rule of 3. |
160 | 1.93k | DataExtractor(DataExtractor &&rhs) = default; |
161 | 325k | DataExtractor &operator=(DataExtractor &&rhs) = default; |
162 | | |
163 | | /// Destructor |
164 | | /// |
165 | | /// If this object contains a valid shared data reference, the reference |
166 | | /// count on the data will be decremented, and if zero, the data will be |
167 | | /// freed. |
168 | | virtual ~DataExtractor(); |
169 | | |
170 | 953 | uint32_t getTargetByteSize() const { return m_target_byte_size; } |
171 | | |
172 | | /// Clears the object state. |
173 | | /// |
174 | | /// Clears the object contents back to a default invalid state, and release |
175 | | /// any references to shared data that this object may contain. |
176 | | void Clear(); |
177 | | |
178 | | /// Dumps the binary data as \a type objects to stream \a s (or to Log() if |
179 | | /// \a s is nullptr) starting \a offset bytes into the data and stopping |
180 | | /// after dumping \a length bytes. The offset into the data is displayed at |
181 | | /// the beginning of each line and can be offset by base address \a |
182 | | /// base_addr. \a num_per_line objects will be displayed on each line. |
183 | | /// |
184 | | /// \param[in] log |
185 | | /// The log to dump the output to. |
186 | | /// |
187 | | /// \param[in] offset |
188 | | /// The offset into the data at which to start dumping. |
189 | | /// |
190 | | /// \param[in] length |
191 | | /// The number of bytes to dump. |
192 | | /// |
193 | | /// \param[in] base_addr |
194 | | /// The base address that gets added to the offset displayed on |
195 | | /// each line. |
196 | | /// |
197 | | /// \param[in] num_per_line |
198 | | /// The number of \a type objects to display on each line. |
199 | | /// |
200 | | /// \param[in] type |
201 | | /// The type of objects to use when dumping data from this |
202 | | /// object. See DataExtractor::Type. |
203 | | /// |
204 | | /// \return |
205 | | /// The offset at which dumping ended. |
206 | | lldb::offset_t PutToLog(Log *log, lldb::offset_t offset, |
207 | | lldb::offset_t length, uint64_t base_addr, |
208 | | uint32_t num_per_line, Type type) const; |
209 | | |
210 | | /// Extract an arbitrary number of bytes in the specified byte order. |
211 | | /// |
212 | | /// Attemps to extract \a length bytes starting at \a offset bytes into this |
213 | | /// data in the requested byte order (\a dst_byte_order) and place the |
214 | | /// results in \a dst. \a dst must be at least \a length bytes long. |
215 | | /// |
216 | | /// \param[in] offset |
217 | | /// The offset in bytes into the contained data at which to |
218 | | /// start extracting. |
219 | | /// |
220 | | /// \param[in] length |
221 | | /// The number of bytes to extract. |
222 | | /// |
223 | | /// \param[in] dst_byte_order |
224 | | /// A byte order of the data that we want when the value in |
225 | | /// copied to \a dst. |
226 | | /// |
227 | | /// \param[out] dst |
228 | | /// The buffer that will receive the extracted value if there |
229 | | /// are enough bytes available in the current data. |
230 | | /// |
231 | | /// \return |
232 | | /// The number of bytes that were extracted which will be \a |
233 | | /// length when the value is successfully extracted, or zero |
234 | | /// if there aren't enough bytes at the specified offset. |
235 | | size_t ExtractBytes(lldb::offset_t offset, lldb::offset_t length, |
236 | | lldb::ByteOrder dst_byte_order, void *dst) const; |
237 | | |
238 | | /// Extract an address from \a *offset_ptr. |
239 | | /// |
240 | | /// Extract a single address from the data and update the offset pointed to |
241 | | /// by \a offset_ptr. The size of the extracted address comes from the \a |
242 | | /// m_addr_size member variable and should be set correctly prior to |
243 | | /// extracting any address values. |
244 | | /// |
245 | | /// \param[in,out] offset_ptr |
246 | | /// A pointer to an offset within the data that will be advanced |
247 | | /// by the appropriate number of bytes if the value is extracted |
248 | | /// correctly. If the offset is out of bounds or there are not |
249 | | /// enough bytes to extract this value, the offset will be left |
250 | | /// unmodified. |
251 | | /// |
252 | | /// \return |
253 | | /// The extracted address value. |
254 | | uint64_t GetAddress(lldb::offset_t *offset_ptr) const; |
255 | | |
256 | | uint64_t GetAddress_unchecked(lldb::offset_t *offset_ptr) const; |
257 | | |
258 | | /// Get the current address size. |
259 | | /// |
260 | | /// Return the size in bytes of any address values this object will extract. |
261 | | /// |
262 | | /// \return |
263 | | /// The size in bytes of address values that will be extracted. |
264 | 738k | uint32_t GetAddressByteSize() const { return m_addr_size; } |
265 | | |
266 | | /// Get the number of bytes contained in this object. |
267 | | /// |
268 | | /// \return |
269 | | /// The total number of bytes of data this object refers to. |
270 | 936M | uint64_t GetByteSize() const { return m_end - m_start; } |
271 | | |
272 | | /// Extract a C string from \a *offset_ptr. |
273 | | /// |
274 | | /// Returns a pointer to a C String from the data at the offset pointed to |
275 | | /// by \a offset_ptr. A variable length NULL terminated C string will be |
276 | | /// extracted and the \a offset_ptr will be updated with the offset of the |
277 | | /// byte that follows the NULL terminator byte. |
278 | | /// |
279 | | /// \param[in,out] offset_ptr |
280 | | /// A pointer to an offset within the data that will be advanced |
281 | | /// by the appropriate number of bytes if the value is extracted |
282 | | /// correctly. If the offset is out of bounds or there are not |
283 | | /// enough bytes to extract this value, the offset will be left |
284 | | /// unmodified. |
285 | | /// |
286 | | /// \return |
287 | | /// A pointer to the C string value in the data. If the offset |
288 | | /// pointed to by \a offset_ptr is out of bounds, or if the |
289 | | /// offset plus the length of the C string is out of bounds, |
290 | | /// nullptr will be returned. |
291 | | const char *GetCStr(lldb::offset_t *offset_ptr) const; |
292 | | |
293 | | /// Extract a C string from \a *offset_ptr with field size \a len. |
294 | | /// |
295 | | /// Returns a pointer to a C String from the data at the offset pointed to |
296 | | /// by \a offset_ptr, with a field length of \a len. |
297 | | /// A NULL terminated C string will be extracted and the \a offset_ptr |
298 | | /// will be updated with the offset of the byte that follows the fixed |
299 | | /// length field. |
300 | | /// |
301 | | /// \param[in,out] offset_ptr |
302 | | /// A pointer to an offset within the data that will be advanced |
303 | | /// by the appropriate number of bytes if the value is extracted |
304 | | /// correctly. If the offset is out of bounds or there are not |
305 | | /// enough bytes to extract this value, the offset will be left |
306 | | /// unmodified. |
307 | | /// |
308 | | /// \return |
309 | | /// A pointer to the C string value in the data. If the offset |
310 | | /// pointed to by \a offset_ptr is out of bounds, or if the |
311 | | /// offset plus the length of the field is out of bounds, or if |
312 | | /// the field does not contain a NULL terminator byte, nullptr will |
313 | | /// be returned. |
314 | | const char *GetCStr(lldb::offset_t *offset_ptr, lldb::offset_t len) const; |
315 | | |
316 | | /// Extract \a length bytes from \a *offset_ptr. |
317 | | /// |
318 | | /// Returns a pointer to a bytes in this object's data at the offset pointed |
319 | | /// to by \a offset_ptr. If \a length is zero or too large, then the offset |
320 | | /// pointed to by \a offset_ptr will not be updated and nullptr will be |
321 | | /// returned. |
322 | | /// |
323 | | /// \param[in,out] offset_ptr |
324 | | /// A pointer to an offset within the data that will be advanced |
325 | | /// by the appropriate number of bytes if the value is extracted |
326 | | /// correctly. If the offset is out of bounds or there are not |
327 | | /// enough bytes to extract this value, the offset will be left |
328 | | /// unmodified. |
329 | | /// |
330 | | /// \param[in] length |
331 | | /// The optional length of a string to extract. If the value is |
332 | | /// zero, a NULL terminated C string will be extracted. |
333 | | /// |
334 | | /// \return |
335 | | /// A pointer to the bytes in this object's data if the offset |
336 | | /// and length are valid, or nullptr otherwise. |
337 | 267M | const void *GetData(lldb::offset_t *offset_ptr, lldb::offset_t length) const { |
338 | 267M | const uint8_t *ptr = PeekData(*offset_ptr, length); |
339 | 267M | if (ptr) |
340 | 267M | *offset_ptr += length; |
341 | 267M | return ptr; |
342 | 267M | } |
343 | | |
344 | | /// Copy \a length bytes from \a *offset, without swapping bytes. |
345 | | /// |
346 | | /// \param[in] offset |
347 | | /// The offset into this data from which to start copying |
348 | | /// |
349 | | /// \param[in] length |
350 | | /// The length of the data to copy from this object |
351 | | /// |
352 | | /// \param[out] dst |
353 | | /// The buffer to place the output data. |
354 | | /// |
355 | | /// \return |
356 | | /// Returns the number of bytes that were copied, or zero if |
357 | | /// anything goes wrong. |
358 | | lldb::offset_t CopyData(lldb::offset_t offset, lldb::offset_t length, |
359 | | void *dst) const; |
360 | | |
361 | | /// Copy \a dst_len bytes from \a *offset_ptr and ensure the copied data is |
362 | | /// treated as a value that can be swapped to match the specified byte |
363 | | /// order. |
364 | | /// |
365 | | /// For values that are larger than the supported integer sizes, this |
366 | | /// function can be used to extract data in a specified byte order. It can |
367 | | /// also be used to copy a smaller integer value from to a larger value. The |
368 | | /// extra bytes left over will be padded correctly according to the byte |
369 | | /// order of this object and the \a dst_byte_order. This can be very handy |
370 | | /// when say copying a partial data value into a register. |
371 | | /// |
372 | | /// \param[in] src_offset |
373 | | /// The offset into this data from which to start copying an endian |
374 | | /// entity |
375 | | /// |
376 | | /// \param[in] src_len |
377 | | /// The length of the endian data to copy from this object into the \a |
378 | | /// dst object |
379 | | /// |
380 | | /// \param[out] dst |
381 | | /// The buffer where to place the endian data. The data might need to be |
382 | | /// byte swapped (and appropriately padded with zeroes if \a src_len != |
383 | | /// \a dst_len) if \a dst_byte_order does not match the byte order in |
384 | | /// this object. |
385 | | /// |
386 | | /// \param[in] dst_len |
387 | | /// The length number of bytes that the endian value will occupy is \a |
388 | | /// dst. |
389 | | /// |
390 | | /// \param[in] dst_byte_order |
391 | | /// The byte order that the endian value should be in the \a dst buffer. |
392 | | /// |
393 | | /// \return |
394 | | /// Returns the number of bytes that were copied, or zero if anything |
395 | | /// goes wrong. |
396 | | lldb::offset_t CopyByteOrderedData(lldb::offset_t src_offset, |
397 | | lldb::offset_t src_len, void *dst, |
398 | | lldb::offset_t dst_len, |
399 | | lldb::ByteOrder dst_byte_order) const; |
400 | | |
401 | | /// Get the data end pointer. |
402 | | /// |
403 | | /// \return |
404 | | /// Returns a pointer to the next byte contained in this |
405 | | /// object's data, or nullptr of there is no data in this object. |
406 | 3.03k | const uint8_t *GetDataEnd() const { return m_end; } |
407 | | |
408 | | /// Get the shared data offset. |
409 | | /// |
410 | | /// Get the offset of the first byte of data in the shared data (if any). |
411 | | /// |
412 | | /// \return |
413 | | /// If this object contains shared data, this function returns |
414 | | /// the offset in bytes into that shared data, zero otherwise. |
415 | | size_t GetSharedDataOffset() const; |
416 | | |
417 | | /// Get the data start pointer. |
418 | | /// |
419 | | /// \return |
420 | | /// Returns a pointer to the first byte contained in this |
421 | | /// object's data, or nullptr of there is no data in this object. |
422 | 1.13M | const uint8_t *GetDataStart() const { return m_start; } |
423 | | |
424 | | /// Extract a float from \a *offset_ptr. |
425 | | /// |
426 | | /// Extract a single float value. |
427 | | /// |
428 | | /// \param[in,out] offset_ptr |
429 | | /// A pointer to an offset within the data that will be advanced |
430 | | /// by the appropriate number of bytes if the value is extracted |
431 | | /// correctly. If the offset is out of bounds or there are not |
432 | | /// enough bytes to extract this value, the offset will be left |
433 | | /// unmodified. |
434 | | /// |
435 | | /// \return |
436 | | /// The floating value that was extracted, or zero on failure. |
437 | | float GetFloat(lldb::offset_t *offset_ptr) const; |
438 | | |
439 | | double GetDouble(lldb::offset_t *offset_ptr) const; |
440 | | |
441 | | long double GetLongDouble(lldb::offset_t *offset_ptr) const; |
442 | | |
443 | | /// Extract an integer of size \a byte_size from \a *offset_ptr. |
444 | | /// |
445 | | /// Extract a single integer value and update the offset pointed to by \a |
446 | | /// offset_ptr. The size of the extracted integer is specified by the \a |
447 | | /// byte_size argument. \a byte_size must have a value >= 1 and <= 4 since |
448 | | /// the return value is only 32 bits wide. |
449 | | /// |
450 | | /// \param[in,out] offset_ptr |
451 | | /// A pointer to an offset within the data that will be advanced |
452 | | /// by the appropriate number of bytes if the value is extracted |
453 | | /// correctly. If the offset is out of bounds or there are not |
454 | | /// enough bytes to extract this value, the offset will be left |
455 | | /// unmodified. |
456 | | /// |
457 | | /// \param[in] byte_size |
458 | | /// The size in byte of the integer to extract. |
459 | | /// |
460 | | /// \return |
461 | | /// The integer value that was extracted, or zero on failure. |
462 | | uint32_t GetMaxU32(lldb::offset_t *offset_ptr, size_t byte_size) const; |
463 | | |
464 | | /// Extract an unsigned integer of size \a byte_size from \a *offset_ptr. |
465 | | /// |
466 | | /// Extract a single unsigned integer value and update the offset pointed to |
467 | | /// by \a offset_ptr. The size of the extracted integer is specified by the |
468 | | /// \a byte_size argument. \a byte_size must have a value greater than or |
469 | | /// equal to one and less than or equal to eight since the return value is |
470 | | /// 64 bits wide. |
471 | | /// |
472 | | /// \param[in,out] offset_ptr |
473 | | /// A pointer to an offset within the data that will be advanced |
474 | | /// by the appropriate number of bytes if the value is extracted |
475 | | /// correctly. If the offset is out of bounds or there are not |
476 | | /// enough bytes to extract this value, the offset will be left |
477 | | /// unmodified. |
478 | | /// |
479 | | /// \param[in] byte_size |
480 | | /// The size in byte of the integer to extract. |
481 | | /// |
482 | | /// \return |
483 | | /// The unsigned integer value that was extracted, or zero on |
484 | | /// failure. |
485 | | uint64_t GetMaxU64(lldb::offset_t *offset_ptr, size_t byte_size) const; |
486 | | |
487 | | uint64_t GetMaxU64_unchecked(lldb::offset_t *offset_ptr, |
488 | | size_t byte_size) const; |
489 | | |
490 | | /// Extract an signed integer of size \a byte_size from \a *offset_ptr. |
491 | | /// |
492 | | /// Extract a single signed integer value (sign extending if required) and |
493 | | /// update the offset pointed to by \a offset_ptr. The size of the extracted |
494 | | /// integer is specified by the \a byte_size argument. \a byte_size must |
495 | | /// have a value greater than or equal to one and less than or equal to |
496 | | /// eight since the return value is 64 bits wide. |
497 | | /// |
498 | | /// \param[in,out] offset_ptr |
499 | | /// A pointer to an offset within the data that will be advanced |
500 | | /// by the appropriate number of bytes if the value is extracted |
501 | | /// correctly. If the offset is out of bounds or there are not |
502 | | /// enough bytes to extract this value, the offset will be left |
503 | | /// unmodified. |
504 | | /// |
505 | | /// \param[in] byte_size |
506 | | /// The size in byte of the integer to extract. |
507 | | /// |
508 | | /// \return |
509 | | /// The sign extended signed integer value that was extracted, |
510 | | /// or zero on failure. |
511 | | int64_t GetMaxS64(lldb::offset_t *offset_ptr, size_t byte_size) const; |
512 | | |
513 | | /// Extract an unsigned integer of size \a byte_size from \a *offset_ptr, |
514 | | /// then extract the bitfield from this value if \a bitfield_bit_size is |
515 | | /// non-zero. |
516 | | /// |
517 | | /// Extract a single unsigned integer value and update the offset pointed to |
518 | | /// by \a offset_ptr. The size of the extracted integer is specified by the |
519 | | /// \a byte_size argument. \a byte_size must have a value greater than or |
520 | | /// equal to one and less than or equal to 8 since the return value is 64 |
521 | | /// bits wide. |
522 | | /// |
523 | | /// \param[in,out] offset_ptr |
524 | | /// A pointer to an offset within the data that will be advanced |
525 | | /// by the appropriate number of bytes if the value is extracted |
526 | | /// correctly. If the offset is out of bounds or there are not |
527 | | /// enough bytes to extract this value, the offset will be left |
528 | | /// unmodified. |
529 | | /// |
530 | | /// \param[in] size |
531 | | /// The size in byte of the integer to extract. |
532 | | /// |
533 | | /// \param[in] bitfield_bit_size |
534 | | /// The size in bits of the bitfield value to extract, or zero |
535 | | /// to just extract the entire integer value. |
536 | | /// |
537 | | /// \param[in] bitfield_bit_offset |
538 | | /// The bit offset of the bitfield value in the extracted |
539 | | /// integer. For little-endian data, this is the offset of |
540 | | /// the LSB of the bitfield from the LSB of the integer. |
541 | | /// For big-endian data, this is the offset of the MSB of the |
542 | | /// bitfield from the MSB of the integer. |
543 | | /// |
544 | | /// \return |
545 | | /// The unsigned bitfield integer value that was extracted, or |
546 | | /// zero on failure. |
547 | | uint64_t GetMaxU64Bitfield(lldb::offset_t *offset_ptr, size_t size, |
548 | | uint32_t bitfield_bit_size, |
549 | | uint32_t bitfield_bit_offset) const; |
550 | | |
551 | | /// Extract an signed integer of size \a size from \a *offset_ptr, then |
552 | | /// extract and sign-extend the bitfield from this value if \a |
553 | | /// bitfield_bit_size is non-zero. |
554 | | /// |
555 | | /// Extract a single signed integer value (sign-extending if required) and |
556 | | /// update the offset pointed to by \a offset_ptr. The size of the extracted |
557 | | /// integer is specified by the \a size argument. \a size must |
558 | | /// have a value greater than or equal to one and less than or equal to |
559 | | /// eight since the return value is 64 bits wide. |
560 | | /// |
561 | | /// \param[in,out] offset_ptr |
562 | | /// A pointer to an offset within the data that will be advanced |
563 | | /// by the appropriate number of bytes if the value is extracted |
564 | | /// correctly. If the offset is out of bounds or there are not |
565 | | /// enough bytes to extract this value, the offset will be left |
566 | | /// unmodified. |
567 | | /// |
568 | | /// \param[in] size |
569 | | /// The size in bytes of the integer to extract. |
570 | | /// |
571 | | /// \param[in] bitfield_bit_size |
572 | | /// The size in bits of the bitfield value to extract, or zero |
573 | | /// to just extract the entire integer value. |
574 | | /// |
575 | | /// \param[in] bitfield_bit_offset |
576 | | /// The bit offset of the bitfield value in the extracted |
577 | | /// integer. For little-endian data, this is the offset of |
578 | | /// the LSB of the bitfield from the LSB of the integer. |
579 | | /// For big-endian data, this is the offset of the MSB of the |
580 | | /// bitfield from the MSB of the integer. |
581 | | /// |
582 | | /// \return |
583 | | /// The signed bitfield integer value that was extracted, or |
584 | | /// zero on failure. |
585 | | int64_t GetMaxS64Bitfield(lldb::offset_t *offset_ptr, size_t size, |
586 | | uint32_t bitfield_bit_size, |
587 | | uint32_t bitfield_bit_offset) const; |
588 | | |
589 | | /// Get the current byte order value. |
590 | | /// |
591 | | /// \return |
592 | | /// The current byte order value from this object's internal |
593 | | /// state. |
594 | 3.04M | lldb::ByteOrder GetByteOrder() const { return m_byte_order; } |
595 | | |
596 | | /// Extract a uint8_t value from \a *offset_ptr. |
597 | | /// |
598 | | /// Extract a single uint8_t from the binary data at the offset pointed to |
599 | | /// by \a offset_ptr, and advance the offset on success. |
600 | | /// |
601 | | /// \param[in,out] offset_ptr |
602 | | /// A pointer to an offset within the data that will be advanced |
603 | | /// by the appropriate number of bytes if the value is extracted |
604 | | /// correctly. If the offset is out of bounds or there are not |
605 | | /// enough bytes to extract this value, the offset will be left |
606 | | /// unmodified. |
607 | | /// |
608 | | /// \return |
609 | | /// The extracted uint8_t value. |
610 | | uint8_t GetU8(lldb::offset_t *offset_ptr) const; |
611 | | |
612 | 251M | uint8_t GetU8_unchecked(lldb::offset_t *offset_ptr) const { |
613 | 251M | uint8_t val = m_start[*offset_ptr]; |
614 | 251M | *offset_ptr += 1; |
615 | 251M | return val; |
616 | 251M | } |
617 | | |
618 | | uint16_t GetU16_unchecked(lldb::offset_t *offset_ptr) const; |
619 | | |
620 | | uint32_t GetU32_unchecked(lldb::offset_t *offset_ptr) const; |
621 | | |
622 | | uint64_t GetU64_unchecked(lldb::offset_t *offset_ptr) const; |
623 | | /// Extract \a count uint8_t values from \a *offset_ptr. |
624 | | /// |
625 | | /// Extract \a count uint8_t values from the binary data at the offset |
626 | | /// pointed to by \a offset_ptr, and advance the offset on success. The |
627 | | /// extracted values are copied into \a dst. |
628 | | /// |
629 | | /// \param[in,out] offset_ptr |
630 | | /// A pointer to an offset within the data that will be advanced |
631 | | /// by the appropriate number of bytes if the value is extracted |
632 | | /// correctly. If the offset is out of bounds or there are not |
633 | | /// enough bytes to extract this value, the offset will be left |
634 | | /// unmodified. |
635 | | /// |
636 | | /// \param[out] dst |
637 | | /// A buffer to copy \a count uint8_t values into. \a dst must |
638 | | /// be large enough to hold all requested data. |
639 | | /// |
640 | | /// \param[in] count |
641 | | /// The number of uint8_t values to extract. |
642 | | /// |
643 | | /// \return |
644 | | /// \a dst if all values were properly extracted and copied, |
645 | | /// nullptr otherwise. |
646 | | void *GetU8(lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; |
647 | | |
648 | | /// Extract a uint16_t value from \a *offset_ptr. |
649 | | /// |
650 | | /// Extract a single uint16_t from the binary data at the offset pointed to |
651 | | /// by \a offset_ptr, and update the offset on success. |
652 | | /// |
653 | | /// \param[in,out] offset_ptr |
654 | | /// A pointer to an offset within the data that will be advanced |
655 | | /// by the appropriate number of bytes if the value is extracted |
656 | | /// correctly. If the offset is out of bounds or there are not |
657 | | /// enough bytes to extract this value, the offset will be left |
658 | | /// unmodified. |
659 | | /// |
660 | | /// \return |
661 | | /// The extracted uint16_t value. |
662 | | uint16_t GetU16(lldb::offset_t *offset_ptr) const; |
663 | | |
664 | | /// Extract \a count uint16_t values from \a *offset_ptr. |
665 | | /// |
666 | | /// Extract \a count uint16_t values from the binary data at the offset |
667 | | /// pointed to by \a offset_ptr, and advance the offset on success. The |
668 | | /// extracted values are copied into \a dst. |
669 | | /// |
670 | | /// \param[in,out] offset_ptr |
671 | | /// A pointer to an offset within the data that will be advanced |
672 | | /// by the appropriate number of bytes if the value is extracted |
673 | | /// correctly. If the offset is out of bounds or there are not |
674 | | /// enough bytes to extract this value, the offset will be left |
675 | | /// unmodified. |
676 | | /// |
677 | | /// \param[out] dst |
678 | | /// A buffer to copy \a count uint16_t values into. \a dst must |
679 | | /// be large enough to hold all requested data. |
680 | | /// |
681 | | /// \param[in] count |
682 | | /// The number of uint16_t values to extract. |
683 | | /// |
684 | | /// \return |
685 | | /// \a dst if all values were properly extracted and copied, |
686 | | /// nullptr otherwise. |
687 | | void *GetU16(lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; |
688 | | |
689 | | /// Extract a uint32_t value from \a *offset_ptr. |
690 | | /// |
691 | | /// Extract a single uint32_t from the binary data at the offset pointed to |
692 | | /// by \a offset_ptr, and update the offset on success. |
693 | | /// |
694 | | /// \param[in,out] offset_ptr |
695 | | /// A pointer to an offset within the data that will be advanced |
696 | | /// by the appropriate number of bytes if the value is extracted |
697 | | /// correctly. If the offset is out of bounds or there are not |
698 | | /// enough bytes to extract this value, the offset will be left |
699 | | /// unmodified. |
700 | | /// |
701 | | /// \return |
702 | | /// The extracted uint32_t value. |
703 | | uint32_t GetU32(lldb::offset_t *offset_ptr) const; |
704 | | |
705 | | /// Extract \a count uint32_t values from \a *offset_ptr. |
706 | | /// |
707 | | /// Extract \a count uint32_t values from the binary data at the offset |
708 | | /// pointed to by \a offset_ptr, and advance the offset on success. The |
709 | | /// extracted values are copied into \a dst. |
710 | | /// |
711 | | /// \param[in,out] offset_ptr |
712 | | /// A pointer to an offset within the data that will be advanced |
713 | | /// by the appropriate number of bytes if the value is extracted |
714 | | /// correctly. If the offset is out of bounds or there are not |
715 | | /// enough bytes to extract this value, the offset will be left |
716 | | /// unmodified. |
717 | | /// |
718 | | /// \param[out] dst |
719 | | /// A buffer to copy \a count uint32_t values into. \a dst must |
720 | | /// be large enough to hold all requested data. |
721 | | /// |
722 | | /// \param[in] count |
723 | | /// The number of uint32_t values to extract. |
724 | | /// |
725 | | /// \return |
726 | | /// \a dst if all values were properly extracted and copied, |
727 | | /// nullptr otherwise. |
728 | | void *GetU32(lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; |
729 | | |
730 | | /// Extract a uint64_t value from \a *offset_ptr. |
731 | | /// |
732 | | /// Extract a single uint64_t from the binary data at the offset pointed to |
733 | | /// by \a offset_ptr, and update the offset on success. |
734 | | /// |
735 | | /// \param[in,out] offset_ptr |
736 | | /// A pointer to an offset within the data that will be advanced |
737 | | /// by the appropriate number of bytes if the value is extracted |
738 | | /// correctly. If the offset is out of bounds or there are not |
739 | | /// enough bytes to extract this value, the offset will be left |
740 | | /// unmodified. |
741 | | /// |
742 | | /// \return |
743 | | /// The extracted uint64_t value. |
744 | | uint64_t GetU64(lldb::offset_t *offset_ptr) const; |
745 | | |
746 | | /// Extract \a count uint64_t values from \a *offset_ptr. |
747 | | /// |
748 | | /// Extract \a count uint64_t values from the binary data at the offset |
749 | | /// pointed to by \a offset_ptr, and advance the offset on success. The |
750 | | /// extracted values are copied into \a dst. |
751 | | /// |
752 | | /// \param[in,out] offset_ptr |
753 | | /// A pointer to an offset within the data that will be advanced |
754 | | /// by the appropriate number of bytes if the value is extracted |
755 | | /// correctly. If the offset is out of bounds or there are not |
756 | | /// enough bytes to extract this value, the offset will be left |
757 | | /// unmodified. |
758 | | /// |
759 | | /// \param[out] dst |
760 | | /// A buffer to copy \a count uint64_t values into. \a dst must |
761 | | /// be large enough to hold all requested data. |
762 | | /// |
763 | | /// \param[in] count |
764 | | /// The number of uint64_t values to extract. |
765 | | /// |
766 | | /// \return |
767 | | /// \a dst if all values were properly extracted and copied, |
768 | | /// nullptr otherwise. |
769 | | void *GetU64(lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; |
770 | | |
771 | | /// Extract a signed LEB128 value from \a *offset_ptr. |
772 | | /// |
773 | | /// Extracts an signed LEB128 number from this object's data starting at the |
774 | | /// offset pointed to by \a offset_ptr. The offset pointed to by \a |
775 | | /// offset_ptr will be updated with the offset of the byte following the |
776 | | /// last extracted byte. |
777 | | /// |
778 | | /// \param[in,out] offset_ptr |
779 | | /// A pointer to an offset within the data that will be advanced |
780 | | /// by the appropriate number of bytes if the value is extracted |
781 | | /// correctly. If the offset is out of bounds or there are not |
782 | | /// enough bytes to extract this value, the offset will be left |
783 | | /// unmodified. |
784 | | /// |
785 | | /// \return |
786 | | /// The extracted signed integer value. |
787 | | int64_t GetSLEB128(lldb::offset_t *offset_ptr) const; |
788 | | |
789 | | /// Extract a unsigned LEB128 value from \a *offset_ptr. |
790 | | /// |
791 | | /// Extracts an unsigned LEB128 number from this object's data starting at |
792 | | /// the offset pointed to by \a offset_ptr. The offset pointed to by \a |
793 | | /// offset_ptr will be updated with the offset of the byte following the |
794 | | /// last extracted byte. |
795 | | /// |
796 | | /// \param[in,out] offset_ptr |
797 | | /// A pointer to an offset within the data that will be advanced |
798 | | /// by the appropriate number of bytes if the value is extracted |
799 | | /// correctly. If the offset is out of bounds or there are not |
800 | | /// enough bytes to extract this value, the offset will be left |
801 | | /// unmodified. |
802 | | /// |
803 | | /// \return |
804 | | /// The extracted unsigned integer value. |
805 | | uint64_t GetULEB128(lldb::offset_t *offset_ptr) const; |
806 | | |
807 | 26.1k | lldb::DataBufferSP &GetSharedDataBuffer() { return m_data_sp; } |
808 | | |
809 | | /// Peek at a C string at \a offset. |
810 | | /// |
811 | | /// Peeks at a string in the contained data. No verification is done to make |
812 | | /// sure the entire string lies within the bounds of this object's data, |
813 | | /// only \a offset is verified to be a valid offset. |
814 | | /// |
815 | | /// \param[in] offset |
816 | | /// An offset into the data. |
817 | | /// |
818 | | /// \return |
819 | | /// A non-nullptr C string pointer if \a offset is a valid offset, |
820 | | /// nullptr otherwise. |
821 | | const char *PeekCStr(lldb::offset_t offset) const; |
822 | | |
823 | | /// Peek at a bytes at \a offset. |
824 | | /// |
825 | | /// Returns a pointer to \a length bytes at \a offset as long as there are |
826 | | /// \a length bytes available starting at \a offset. |
827 | | /// |
828 | | /// \return |
829 | | /// A non-nullptr data pointer if \a offset is a valid offset and |
830 | | /// there are \a length bytes available at that offset, nullptr |
831 | | /// otherwise. |
832 | 733M | const uint8_t *PeekData(lldb::offset_t offset, lldb::offset_t length) const { |
833 | 733M | if (ValidOffsetForDataOfSize(offset, length)) |
834 | 733M | return m_start + offset; |
835 | 912 | return nullptr; |
836 | 733M | } |
837 | | |
838 | | /// Set the address byte size. |
839 | | /// |
840 | | /// Set the size in bytes that will be used when extracting any address and |
841 | | /// pointer values from data contained in this object. |
842 | | /// |
843 | | /// \param[in] addr_size |
844 | | /// The size in bytes to use when extracting addresses. |
845 | 539k | void SetAddressByteSize(uint32_t addr_size) { |
846 | 539k | assert(addr_size == 2 || addr_size == 4 || addr_size == 8); |
847 | 539k | m_addr_size = addr_size; |
848 | 539k | } |
849 | | |
850 | | /// Set data with a buffer that is caller owned. |
851 | | /// |
852 | | /// Use data that is owned by the caller when extracting values. The data |
853 | | /// must stay around as long as this object, or any object that copies a |
854 | | /// subset of this object's data, is valid. If \a bytes is nullptr, or \a |
855 | | /// length is zero, this object will contain no data. |
856 | | /// |
857 | | /// \param[in] bytes |
858 | | /// A pointer to caller owned data. |
859 | | /// |
860 | | /// \param[in] length |
861 | | /// The length in bytes of \a bytes. |
862 | | /// |
863 | | /// \param[in] byte_order |
864 | | /// A byte order of the data that we are extracting from. |
865 | | /// |
866 | | /// \return |
867 | | /// The number of bytes that this object now contains. |
868 | | lldb::offset_t SetData(const void *bytes, lldb::offset_t length, |
869 | | lldb::ByteOrder byte_order); |
870 | | |
871 | | /// Adopt a subset of \a data. |
872 | | /// |
873 | | /// Set this object's data to be a subset of the data bytes in \a data. If |
874 | | /// \a data contains shared data, then a reference to the shared data will |
875 | | /// be added to ensure the shared data stays around as long as any objects |
876 | | /// have references to the shared data. The byte order and the address size |
877 | | /// settings are copied from \a data. If \a offset is not a valid offset in |
878 | | /// \a data, then no reference to the shared data will be added. If there |
879 | | /// are not \a length bytes available in \a data starting at \a offset, the |
880 | | /// length will be truncated to contains as many bytes as possible. |
881 | | /// |
882 | | /// \param[in] data |
883 | | /// Another DataExtractor object that contains data. |
884 | | /// |
885 | | /// \param[in] offset |
886 | | /// The offset into \a data at which the subset starts. |
887 | | /// |
888 | | /// \param[in] length |
889 | | /// The length in bytes of the subset of \a data. |
890 | | /// |
891 | | /// \return |
892 | | /// The number of bytes that this object now contains. |
893 | | lldb::offset_t SetData(const DataExtractor &data, lldb::offset_t offset, |
894 | | lldb::offset_t length); |
895 | | |
896 | | /// Adopt a subset of shared data in \a data_sp. |
897 | | /// |
898 | | /// Copies the data shared pointer which adds a reference to the contained |
899 | | /// in \a data_sp. The shared data reference is reference counted to ensure |
900 | | /// the data lives as long as anyone still has a valid shared pointer to the |
901 | | /// data in \a data_sp. The byte order and address byte size settings remain |
902 | | /// the same. If \a offset is not a valid offset in \a data_sp, then no |
903 | | /// reference to the shared data will be added. If there are not \a length |
904 | | /// bytes available in \a data starting at \a offset, the length will be |
905 | | /// truncated to contains as many bytes as possible. |
906 | | /// |
907 | | /// \param[in] data_sp |
908 | | /// A shared pointer to data. |
909 | | /// |
910 | | /// \param[in] offset |
911 | | /// The offset into \a data_sp at which the subset starts. |
912 | | /// |
913 | | /// \param[in] length |
914 | | /// The length in bytes of the subset of \a data_sp. |
915 | | /// |
916 | | /// \return |
917 | | /// The number of bytes that this object now contains. |
918 | | lldb::offset_t SetData(const lldb::DataBufferSP &data_sp, |
919 | | lldb::offset_t offset = 0, |
920 | | lldb::offset_t length = LLDB_INVALID_OFFSET); |
921 | | |
922 | | /// Set the byte_order value. |
923 | | /// |
924 | | /// Sets the byte order of the data to extract. Extracted values will be |
925 | | /// swapped if necessary when decoding. |
926 | | /// |
927 | | /// \param[in] byte_order |
928 | | /// The byte order value to use when extracting data. |
929 | 2.00M | void SetByteOrder(lldb::ByteOrder byte_order) { m_byte_order = byte_order; } |
930 | | |
931 | | /// Skip an LEB128 number at \a *offset_ptr. |
932 | | /// |
933 | | /// Skips a LEB128 number (signed or unsigned) from this object's data |
934 | | /// starting at the offset pointed to by \a offset_ptr. The offset pointed |
935 | | /// to by \a offset_ptr will be updated with the offset of the byte |
936 | | /// following the last extracted byte. |
937 | | /// |
938 | | /// \param[in,out] offset_ptr |
939 | | /// A pointer to an offset within the data that will be advanced |
940 | | /// by the appropriate number of bytes if the value is extracted |
941 | | /// correctly. If the offset is out of bounds or there are not |
942 | | /// enough bytes to extract this value, the offset will be left |
943 | | /// unmodified. |
944 | | /// |
945 | | /// \return |
946 | | /// The number of bytes consumed during the extraction. |
947 | | uint32_t Skip_LEB128(lldb::offset_t *offset_ptr) const; |
948 | | |
949 | | /// Test the validity of \a offset. |
950 | | /// |
951 | | /// \return |
952 | | /// true if \a offset is a valid offset into the data in this object, |
953 | | /// false otherwise. |
954 | 57.5M | bool ValidOffset(lldb::offset_t offset) const { |
955 | 57.5M | return offset < GetByteSize(); |
956 | 57.5M | } |
957 | | |
958 | | /// Test the availability of \a length bytes of data from \a offset. |
959 | | /// |
960 | | /// \return |
961 | | /// true if \a offset is a valid offset and there are \a |
962 | | /// length bytes available at that offset, false otherwise. |
963 | | bool ValidOffsetForDataOfSize(lldb::offset_t offset, |
964 | 871M | lldb::offset_t length) const { |
965 | 871M | return length <= BytesLeft(offset); |
966 | 871M | } |
967 | | |
968 | | size_t Copy(DataExtractor &dest_data) const; |
969 | | |
970 | | bool Append(DataExtractor &rhs); |
971 | | |
972 | | bool Append(void *bytes, lldb::offset_t length); |
973 | | |
974 | 872M | lldb::offset_t BytesLeft(lldb::offset_t offset) const { |
975 | 872M | const lldb::offset_t size = GetByteSize(); |
976 | 872M | if (size > offset) |
977 | 871M | return size - offset; |
978 | 118k | return 0; |
979 | 872M | } |
980 | | |
981 | | void Checksum(llvm::SmallVectorImpl<uint8_t> &dest, uint64_t max_data = 0); |
982 | | |
983 | 12.3k | llvm::ArrayRef<uint8_t> GetData() const { |
984 | 12.3k | return {GetDataStart(), size_t(GetByteSize())}; |
985 | 12.3k | } |
986 | | |
987 | 143 | llvm::DataExtractor GetAsLLVM() const { |
988 | 143 | return {GetData(), GetByteOrder() == lldb::eByteOrderLittle, |
989 | 143 | uint8_t(GetAddressByteSize())}; |
990 | 143 | } |
991 | | |
992 | | protected: |
993 | 615 | template <typename T> T Get(lldb::offset_t *offset_ptr, T fail_value) const { |
994 | 615 | constexpr size_t src_size = sizeof(T); |
995 | 615 | T val = fail_value; |
996 | | |
997 | 615 | const T *src = static_cast<const T *>(GetData(offset_ptr, src_size)); |
998 | 615 | if (!src) |
999 | 0 | return val; |
1000 | | |
1001 | 615 | memcpy(&val, src, src_size); |
1002 | 615 | if (m_byte_order != endian::InlHostByteOrder()) |
1003 | 4 | llvm::sys::swapByteOrder(val); |
1004 | | |
1005 | 615 | return val; |
1006 | 615 | } float lldb_private::DataExtractor::Get<float>(unsigned long long*, float) const Line | Count | Source | 993 | 335 | template <typename T> T Get(lldb::offset_t *offset_ptr, T fail_value) const { | 994 | 335 | constexpr size_t src_size = sizeof(T); | 995 | 335 | T val = fail_value; | 996 | | | 997 | 335 | const T *src = static_cast<const T *>(GetData(offset_ptr, src_size)); | 998 | 335 | if (!src) | 999 | 0 | return val; | 1000 | | | 1001 | 335 | memcpy(&val, src, src_size); | 1002 | 335 | if (m_byte_order != endian::InlHostByteOrder()) | 1003 | 2 | llvm::sys::swapByteOrder(val); | 1004 | | | 1005 | 335 | return val; | 1006 | 335 | } |
double lldb_private::DataExtractor::Get<double>(unsigned long long*, double) const Line | Count | Source | 993 | 280 | template <typename T> T Get(lldb::offset_t *offset_ptr, T fail_value) const { | 994 | 280 | constexpr size_t src_size = sizeof(T); | 995 | 280 | T val = fail_value; | 996 | | | 997 | 280 | const T *src = static_cast<const T *>(GetData(offset_ptr, src_size)); | 998 | 280 | if (!src) | 999 | 0 | return val; | 1000 | | | 1001 | 280 | memcpy(&val, src, src_size); | 1002 | 280 | if (m_byte_order != endian::InlHostByteOrder()) | 1003 | 2 | llvm::sys::swapByteOrder(val); | 1004 | | | 1005 | 280 | return val; | 1006 | 280 | } |
|
1007 | | |
1008 | | // Member variables |
1009 | | const uint8_t *m_start = nullptr; ///< A pointer to the first byte of data. |
1010 | | const uint8_t *m_end = |
1011 | | nullptr; ///< A pointer to the byte that is past the end of the data. |
1012 | | lldb::ByteOrder |
1013 | | m_byte_order; ///< The byte order of the data we are extracting from. |
1014 | | uint32_t m_addr_size; ///< The address size to use when extracting addresses. |
1015 | | /// The shared pointer to data that can be shared among multiple instances |
1016 | | lldb::DataBufferSP m_data_sp; |
1017 | | /// Making it const would require implementation of move assignment operator. |
1018 | | uint32_t m_target_byte_size = 1; |
1019 | | }; |
1020 | | |
1021 | | } // namespace lldb_private |
1022 | | |
1023 | | #endif // LLDB_UTILITY_DATAEXTRACTOR_H |