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