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