1 //===-- DataExtractor.h -----------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_DataExtractor_h_ 11 #define liblldb_DataExtractor_h_ 12 #if defined (__cplusplus) 13 14 15 #include "lldb/lldb-private.h" 16 #include <limits.h> 17 #include <stdint.h> 18 #include <string.h> 19 20 namespace lldb_private { 21 22 //---------------------------------------------------------------------- 23 /// @class DataExtractor DataExtractor.h "lldb/Core/DataExtractor.h" 24 /// @brief An data extractor class. 25 /// 26 /// DataExtractor is a class that can extract data (swapping if needed) 27 /// from a data buffer. The data buffer can be caller owned, or can be 28 /// shared data that can be shared between multiple DataExtractor 29 /// instances. Multiple DataExtractor objects can share the same data, 30 /// yet extract values in different address sizes and byte order modes. 31 /// Each object can have a unique position in the shared data and extract 32 /// data from different offsets. 33 /// 34 /// @see DataBuffer 35 //---------------------------------------------------------------------- 36 class DataExtractor 37 { 38 public: 39 //------------------------------------------------------------------ 40 /// @typedef DataExtractor::Type 41 /// @brief Type enumerations used in the dump routines. 42 /// @see DataExtractor::Dump() 43 /// @see DataExtractor::DumpRawHexBytes() 44 //------------------------------------------------------------------ 45 typedef enum 46 { 47 TypeUInt8, ///< Format output as unsigned 8 bit integers 48 TypeChar, ///< Format output as characters 49 TypeUInt16, ///< Format output as unsigned 16 bit integers 50 TypeUInt32, ///< Format output as unsigned 32 bit integers 51 TypeUInt64, ///< Format output as unsigned 64 bit integers 52 TypePointer, ///< Format output as pointers 53 TypeULEB128, ///< Format output as ULEB128 numbers 54 TypeSLEB128 ///< Format output as SLEB128 numbers 55 } Type; 56 57 static void 58 DumpHexBytes (Stream *s, 59 const void *src, 60 size_t src_len, 61 uint32_t bytes_per_line, 62 lldb::addr_t base_addr); // Pass LLDB_INVALID_ADDRESS to not show address at start of line 63 //------------------------------------------------------------------ 64 /// Default constructor. 65 /// 66 /// Initialize all members to a default empty state. 67 //------------------------------------------------------------------ 68 DataExtractor (); 69 70 //------------------------------------------------------------------ 71 /// Construct with a buffer that is owned by the caller. 72 /// 73 /// This constructor allows us to use data that is owned by the 74 /// caller. The data must stay around as long as this object is 75 /// valid. 76 /// 77 /// @param[in] data 78 /// A pointer to caller owned data. 79 /// 80 /// @param[in] data_length 81 /// The length in bytes of \a data. 82 /// 83 /// @param[in] byte_order 84 /// A byte order of the data that we are extracting from. 85 /// 86 /// @param[in] addr_size 87 /// A new address byte size value. 88 //------------------------------------------------------------------ 89 DataExtractor (const void* data, lldb::offset_t data_length, lldb::ByteOrder byte_order, uint32_t addr_size); 90 91 //------------------------------------------------------------------ 92 /// Construct with shared data. 93 /// 94 /// Copies the data shared pointer which adds a reference to the 95 /// contained in \a data_sp. The shared data reference is reference 96 /// counted to ensure the data lives as long as anyone still has a 97 /// valid shared pointer to the data in \a data_sp. 98 /// 99 /// @param[in] data_sp 100 /// A shared pointer to data. 101 /// 102 /// @param[in] byte_order 103 /// A byte order of the data that we are extracting from. 104 /// 105 /// @param[in] addr_size 106 /// A new address byte size value. 107 //------------------------------------------------------------------ 108 DataExtractor (const lldb::DataBufferSP& data_sp, lldb::ByteOrder byte_order, uint32_t addr_size); 109 110 //------------------------------------------------------------------ 111 /// Construct with a subset of \a data. 112 /// 113 /// Initialize this object with a subset of the data bytes in \a 114 /// data. If \a data contains shared data, then a reference to the 115 /// shared data will be added to ensure the shared data stays around 116 /// as long as any objects have references to the shared data. The 117 /// byte order value and the address size settings are copied from \a 118 /// data. If \a offset is not a valid offset in \a data, then no 119 /// reference to the shared data will be added. If there are not 120 /// \a length bytes available in \a data starting at \a offset, 121 /// the length will be truncated to contain as many bytes as 122 /// possible. 123 /// 124 /// @param[in] data 125 /// Another DataExtractor object that contains data. 126 /// 127 /// @param[in] offset 128 /// The offset into \a data at which the subset starts. 129 /// 130 /// @param[in] length 131 /// The length in bytes of the subset of data. 132 //------------------------------------------------------------------ 133 DataExtractor (const DataExtractor& data, lldb::offset_t offset, lldb::offset_t length); 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 141 /// shared 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 //------------------------------------------------------------------ 149 const DataExtractor& 150 operator= (const DataExtractor& rhs); 151 152 //------------------------------------------------------------------ 153 /// Destructor 154 /// 155 /// If this object contains a valid shared data reference, the 156 /// reference count on the data will be decremented, and if zero, 157 /// the data will be freed. 158 //------------------------------------------------------------------ 159 ~DataExtractor (); 160 161 //------------------------------------------------------------------ 162 /// Clears the object state. 163 /// 164 /// Clears the object contents back to a default invalid state, and 165 /// release any references to shared data that this object may 166 /// contain. 167 //------------------------------------------------------------------ 168 void 169 Clear (); 170 171 //------------------------------------------------------------------ 172 /// Dumps the binary data as \a type objects to stream \a s (or to 173 /// Log() if \a s is NULL) starting \a offset bytes into the data 174 /// and stopping after dumping \a length bytes. The offset into the 175 /// data is displayed at the beginning of each line and can be 176 /// offset by base address \a base_addr. \a num_per_line objects 177 /// will be displayed on each line. 178 /// 179 /// @param[in] s 180 /// The stream to dump the output to. If NULL the output will 181 /// be dumped to Log(). 182 /// 183 /// @param[in] offset 184 /// The offset into the data at which to start dumping. 185 /// 186 /// @param[in] length 187 /// The number of bytes to dump. 188 /// 189 /// @param[in] base_addr 190 /// The base address that gets added to the offset displayed on 191 /// each line. 192 /// 193 /// @param[in] num_per_line 194 /// The number of \a type objects to display on each line. 195 /// 196 /// @param[in] type 197 /// The type of objects to use when dumping data from this 198 /// object. See DataExtractor::Type. 199 /// 200 /// @param[in] type_format 201 /// The optional format to use for the \a type objects. If this 202 /// is NULL, the default format for the \a type will be used. 203 /// 204 /// @return 205 /// The offset at which dumping ended. 206 //------------------------------------------------------------------ 207 lldb::offset_t 208 PutToLog (Log *log, 209 lldb::offset_t offset, 210 lldb::offset_t length, 211 uint64_t base_addr, 212 uint32_t num_per_line, 213 Type type, 214 const char *type_format = NULL) const; 215 216 //------------------------------------------------------------------ 217 /// Dumps \a item_count objects into the stream \a s. 218 /// 219 /// Dumps \a item_count objects using \a item_format, each of which 220 /// are \a item_byte_size bytes long starting at offset \a offset 221 /// bytes into the contained data, into the stream \a s. \a 222 /// num_per_line objects will be dumped on each line before a new 223 /// line will be output. If \a base_addr is a valid address, then 224 /// each new line of output will be prededed by the address value 225 /// plus appropriate offset, and a colon and space. Bitfield values 226 /// can be dumped by calling this function multiple times with the 227 /// same start offset, format and size, yet differing \a 228 /// item_bit_size and \a item_bit_offset values. 229 /// 230 /// @param[in] s 231 /// The stream to dump the output to. This value can not be NULL. 232 /// 233 /// @param[in] offset 234 /// The offset into the data at which to start dumping. 235 /// 236 /// @param[in] item_format 237 /// The format to use when dumping each item. 238 /// 239 /// @param[in] item_byte_size 240 /// The byte size of each item. 241 /// 242 /// @param[in] item_count 243 /// The number of items to dump. 244 /// 245 /// @param[in] num_per_line 246 /// The number of items to display on each line. 247 /// 248 /// @param[in] base_addr 249 /// The base address that gets added to the offset displayed on 250 /// each line if the value is valid. Is \a base_addr is 251 /// LLDB_INVALID_ADDRESS then no address values will be prepended 252 /// to any lines. 253 /// 254 /// @param[in] item_bit_size 255 /// If the value to display is a bitfield, this value should 256 /// be the number of bits that the bitfield item has within the 257 /// item's byte size value. This function will need to be called 258 /// multiple times with identical \a offset and \a item_byte_size 259 /// values in order to display multiple bitfield values that 260 /// exist within the same integer value. If the items being 261 /// displayed are not bitfields, this value should be zero. 262 /// 263 /// @param[in] item_bit_offset 264 /// If the value to display is a bitfield, this value should 265 /// be the offset in bits, or shift right amount, that the 266 /// bitfield item occupies within the item's byte size value. 267 /// This function will need to be called multiple times with 268 /// identical \a offset and \a item_byte_size values in order 269 /// to display multiple bitfield values that exist within the 270 /// same integer value. If the items being displayed are not 271 /// bitfields, this value should be zero. 272 /// 273 /// @return 274 /// The offset at which dumping ended. 275 //------------------------------------------------------------------ 276 lldb::offset_t 277 Dump (Stream *s, 278 lldb::offset_t offset, 279 lldb::Format item_format, 280 size_t item_byte_size, 281 size_t item_count, 282 size_t num_per_line, 283 uint64_t base_addr, 284 uint32_t item_bit_size, 285 uint32_t item_bit_offset, 286 ExecutionContextScope *exe_scope = NULL) const; 287 288 //------------------------------------------------------------------ 289 /// Dump a UUID value at \a offset. 290 /// 291 /// Dump a UUID starting at \a offset bytes into this object's data. 292 /// If the stream \a s is NULL, the output will be sent to Log(). 293 /// 294 /// @param[in] s 295 /// The stream to dump the output to. If NULL the output will 296 /// be dumped to Log(). 297 /// 298 /// @param[in] offset 299 /// The offset into the data at which to extract and dump a 300 /// UUID value. 301 //------------------------------------------------------------------ 302 void 303 DumpUUID (Stream *s, lldb::offset_t offset) const; 304 305 //------------------------------------------------------------------ 306 /// Extract an arbitrary number of bytes in the specified byte 307 /// order. 308 /// 309 /// Attemps to extract \a length bytes starting at \a offset bytes 310 /// into this data in the requested byte order (\a dst_byte_order) 311 /// and place the results in \a dst. \a dst must be at least \a 312 /// length bytes long. 313 /// 314 /// @param[in] offset 315 /// The offset in bytes into the contained data at which to 316 /// start extracting. 317 /// 318 /// @param[in] length 319 /// The number of bytes to extract. 320 /// 321 /// @param[in] dst_byte_order 322 /// A byte order of the data that we want when the value in 323 /// copied to \a dst. 324 /// 325 /// @param[out] dst 326 /// The buffer that will receive the extracted value if there 327 /// are enough bytes available in the current data. 328 /// 329 /// @return 330 /// The number of bytes that were extracted which will be \a 331 /// length when the value is successfully extracted, or zero 332 /// if there aren't enough bytes at the specified offset. 333 //------------------------------------------------------------------ 334 size_t 335 ExtractBytes (lldb::offset_t offset, lldb::offset_t length, lldb::ByteOrder dst_byte_order, void *dst) const; 336 337 //------------------------------------------------------------------ 338 /// Extract an address from \a *offset_ptr. 339 /// 340 /// Extract a single address from the data and update the offset 341 /// pointed to by \a offset_ptr. The size of the extracted address 342 /// comes from the \a m_addr_size member variable and should be 343 /// set correctly prior to extracting any address values. 344 /// 345 /// @param[in,out] offset_ptr 346 /// A pointer to an offset within the data that will be advanced 347 /// by the appropriate number of bytes if the value is extracted 348 /// correctly. If the offset is out of bounds or there are not 349 /// enough bytes to extract this value, the offset will be left 350 /// unmodified. 351 /// 352 /// @return 353 /// The extracted address value. 354 //------------------------------------------------------------------ 355 uint64_t 356 GetAddress (lldb::offset_t *offset_ptr) const; 357 358 uint64_t 359 GetAddress_unchecked (lldb::offset_t *offset_ptr) const; 360 361 //------------------------------------------------------------------ 362 /// Get the current address size. 363 /// 364 /// Return the size in bytes of any address values this object will 365 /// extract. 366 /// 367 /// @return 368 /// The size in bytes of address values that will be extracted. 369 //------------------------------------------------------------------ 370 uint32_t GetAddressByteSize()371 GetAddressByteSize () const 372 { 373 return m_addr_size; 374 } 375 376 //------------------------------------------------------------------ 377 /// Get the number of bytes contained in this object. 378 /// 379 /// @return 380 /// The total number of bytes of data this object refers to. 381 //------------------------------------------------------------------ 382 uint64_t GetByteSize()383 GetByteSize () const 384 { 385 return m_end - m_start; 386 } 387 388 //------------------------------------------------------------------ 389 /// Extract a C string from \a *offset_ptr. 390 /// 391 /// Returns a pointer to a C String from the data at the offset 392 /// pointed to by \a offset_ptr. A variable length NULL terminated C 393 /// string will be extracted and the \a offset_ptr will be 394 /// updated with the offset of the byte that follows the NULL 395 /// terminator byte. 396 /// 397 /// @param[in,out] offset_ptr 398 /// A pointer to an offset within the data that will be advanced 399 /// by the appropriate number of bytes if the value is extracted 400 /// correctly. If the offset is out of bounds or there are not 401 /// enough bytes to extract this value, the offset will be left 402 /// unmodified. 403 /// 404 /// @return 405 /// A pointer to the C string value in the data. If the offset 406 /// pointed to by \a offset_ptr is out of bounds, or if the 407 /// offset plus the length of the C string is out of bounds, 408 /// NULL will be returned. 409 //------------------------------------------------------------------ 410 const char * 411 GetCStr (lldb::offset_t *offset_ptr) const; 412 413 //------------------------------------------------------------------ 414 /// Extract a C string from \a *offset_ptr with field size \a len. 415 /// 416 /// Returns a pointer to a C String from the data at the offset 417 /// pointed to by \a offset_ptr, with a field length of \a len. 418 /// A NULL terminated C string will be extracted and the \a offset_ptr 419 /// will be updated with the offset of the byte that follows the fixed 420 /// length field. 421 /// 422 /// @param[in,out] offset_ptr 423 /// A pointer to an offset within the data that will be advanced 424 /// by the appropriate number of bytes if the value is extracted 425 /// correctly. If the offset is out of bounds or there are not 426 /// enough bytes to extract this value, the offset will be left 427 /// unmodified. 428 /// 429 /// @return 430 /// A pointer to the C string value in the data. If the offset 431 /// pointed to by \a offset_ptr is out of bounds, or if the 432 /// offset plus the length of the field is out of bounds, or if 433 /// the field does not contain a NULL terminator byte, NULL will 434 /// be returned. 435 const char * 436 GetCStr (lldb::offset_t *offset_ptr, lldb::offset_t len) const; 437 438 //------------------------------------------------------------------ 439 /// Extract \a length bytes from \a *offset_ptr. 440 /// 441 /// Returns a pointer to a bytes in this object's data at the offset 442 /// pointed to by \a offset_ptr. If \a length is zero or too large, 443 /// then the offset pointed to by \a offset_ptr will not be updated 444 /// and NULL will be returned. 445 /// 446 /// @param[in,out] offset_ptr 447 /// A pointer to an offset within the data that will be advanced 448 /// by the appropriate number of bytes if the value is extracted 449 /// correctly. If the offset is out of bounds or there are not 450 /// enough bytes to extract this value, the offset will be left 451 /// unmodified. 452 /// 453 /// @param[in] length 454 /// The optional length of a string to extract. If the value is 455 /// zero, a NULL terminated C string will be extracted. 456 /// 457 /// @return 458 /// A pointer to the bytes in this object's data if the offset 459 /// and length are valid, or NULL otherwise. 460 //------------------------------------------------------------------ 461 const void* GetData(lldb::offset_t * offset_ptr,lldb::offset_t length)462 GetData (lldb::offset_t *offset_ptr, lldb::offset_t length) const 463 { 464 const uint8_t *ptr = PeekData (*offset_ptr, length); 465 if (ptr) 466 *offset_ptr += length; 467 return ptr; 468 } 469 470 //------------------------------------------------------------------ 471 /// Copy \a dst_len bytes from \a *offset_ptr and ensure the copied 472 /// data is treated as a value that can be swapped to match the 473 /// specified byte order. 474 /// 475 /// For values that are larger than the supported integer sizes, 476 /// this function can be used to extract data in a specified byte 477 /// order. It can also be used to copy a smaller integer value from 478 /// to a larger value. The extra bytes left over will be padded 479 /// correctly according to the byte order of this object and the 480 /// \a dst_byte_order. This can be very handy when say copying a 481 /// partial data value into a register. 482 /// 483 /// @param[in] src_offset 484 /// The offset into this data from which to start copying an 485 /// endian entity 486 /// 487 /// @param[in] src_len 488 /// The length of the endian data to copy from this object 489 /// into the \a dst object 490 /// 491 /// @param[out] dst 492 /// The buffer where to place the endian data. The data might 493 /// need to be byte swapped (and appropriately padded with 494 /// zeroes if \a src_len != \a dst_len) if \a dst_byte_order 495 /// does not match the byte order in this object. 496 /// 497 /// @param[in] dst_len 498 /// The length number of bytes that the endian value will 499 /// occupy is \a dst. 500 /// 501 /// @param[in] byte_order 502 /// The byte order that the endian value should be in the \a dst 503 /// buffer. 504 /// 505 /// @return 506 /// Returns the number of bytes that were copied, or zero if 507 /// anything goes wrong. 508 //------------------------------------------------------------------ 509 lldb::offset_t 510 CopyByteOrderedData (lldb::offset_t src_offset, 511 lldb::offset_t src_len, 512 void *dst, 513 lldb::offset_t dst_len, 514 lldb::ByteOrder dst_byte_order) const; 515 516 //------------------------------------------------------------------ 517 /// Get the data end pointer. 518 /// 519 /// @return 520 /// Returns a pointer to the next byte contained in this 521 /// object's data, or NULL of there is no data in this object. 522 //------------------------------------------------------------------ 523 const uint8_t * GetDataEnd()524 GetDataEnd () const 525 { 526 return m_end; 527 } 528 529 //------------------------------------------------------------------ 530 /// Get the shared data offset. 531 /// 532 /// Get the offset of the first byte of data in the shared data (if 533 /// any). 534 /// 535 /// @return 536 /// If this object contains shared data, this function returns 537 /// the offset in bytes into that shared data, zero otherwise. 538 //------------------------------------------------------------------ 539 size_t 540 GetSharedDataOffset () const; 541 542 //------------------------------------------------------------------ 543 /// Get a the data start pointer. 544 /// 545 /// @return 546 /// Returns a pointer to the first byte contained in this 547 /// object's data, or NULL of there is no data in this object. 548 //------------------------------------------------------------------ 549 const uint8_t * GetDataStart()550 GetDataStart () const 551 { 552 return m_start; 553 } 554 555 556 //------------------------------------------------------------------ 557 /// Extract a float from \a *offset_ptr. 558 /// 559 /// Extract a single float value. 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 /// @return 569 /// The floating value that was extracted, or zero on failure. 570 //------------------------------------------------------------------ 571 float 572 GetFloat (lldb::offset_t *offset_ptr) const; 573 574 double 575 GetDouble (lldb::offset_t *offset_ptr) const; 576 577 long double 578 GetLongDouble (lldb::offset_t *offset_ptr) const; 579 580 //------------------------------------------------------------------ 581 /// Extract a GNU encoded pointer value from \a *offset_ptr. 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 /// @param[in] eh_ptr_enc 591 /// The GNU pointer encoding type. 592 /// 593 /// @param[in] pc_rel_addr 594 /// The PC relative address to use when the encoding is 595 /// \c DW_GNU_EH_PE_pcrel. 596 /// 597 /// @param[in] text_addr 598 /// The text (code) relative address to use when the encoding is 599 /// \c DW_GNU_EH_PE_textrel. 600 /// 601 /// @param[in] data_addr 602 /// The data relative address to use when the encoding is 603 /// \c DW_GNU_EH_PE_datarel. 604 /// 605 /// @return 606 /// The extracted GNU encoded pointer value. 607 //------------------------------------------------------------------ 608 uint64_t 609 GetGNUEHPointer (lldb::offset_t *offset_ptr, 610 uint32_t eh_ptr_enc, 611 lldb::addr_t pc_rel_addr, 612 lldb::addr_t text_addr, 613 lldb::addr_t data_addr); 614 615 //------------------------------------------------------------------ 616 /// Extract an integer of size \a byte_size from \a *offset_ptr. 617 /// 618 /// Extract a single integer value and update the offset pointed to 619 /// by \a offset_ptr. The size of the extracted integer is specified 620 /// by the \a byte_size argument. \a byte_size should have a value 621 /// >= 1 and <= 4 since the return value is only 32 bits wide. Any 622 /// \a byte_size values less than 1 or greater than 4 will result in 623 /// nothing being extracted, and zero being returned. 624 /// 625 /// @param[in,out] offset_ptr 626 /// A pointer to an offset within the data that will be advanced 627 /// by the appropriate number of bytes if the value is extracted 628 /// correctly. If the offset is out of bounds or there are not 629 /// enough bytes to extract this value, the offset will be left 630 /// unmodified. 631 /// 632 /// @param[in] byte_size 633 /// The size in byte of the integer to extract. 634 /// 635 /// @return 636 /// The integer value that was extracted, or zero on failure. 637 //------------------------------------------------------------------ 638 uint32_t 639 GetMaxU32 (lldb::offset_t *offset_ptr, size_t byte_size) const; 640 641 //------------------------------------------------------------------ 642 /// Extract an unsigned integer of size \a byte_size from \a 643 /// *offset_ptr. 644 /// 645 /// Extract a single unsigned integer value and update the offset 646 /// pointed to by \a offset_ptr. The size of the extracted integer 647 /// is specified by the \a byte_size argument. \a byte_size should 648 /// have a value greater than or equal to one and less than or equal 649 /// to eight since the return value is 64 bits wide. Any 650 /// \a byte_size values less than 1 or greater than 8 will result in 651 /// nothing being extracted, and zero being returned. 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 /// @param[in] byte_size 661 /// The size in byte of the integer to extract. 662 /// 663 /// @return 664 /// The unsigned integer value that was extracted, or zero on 665 /// failure. 666 //------------------------------------------------------------------ 667 uint64_t 668 GetMaxU64 (lldb::offset_t *offset_ptr, size_t byte_size) const; 669 670 uint64_t 671 GetMaxU64_unchecked (lldb::offset_t *offset_ptr, size_t byte_size) const; 672 673 //------------------------------------------------------------------ 674 /// Extract an signed integer of size \a byte_size from \a *offset_ptr. 675 /// 676 /// Extract a single signed integer value (sign extending if required) 677 /// and update the offset pointed to by \a offset_ptr. The size of 678 /// the extracted integer is specified by the \a byte_size argument. 679 /// \a byte_size should have a value greater than or equal to one 680 /// and less than or equal to eight since the return value is 64 681 /// bits wide. Any \a byte_size values less than 1 or greater than 682 /// 8 will result in nothing being extracted, and zero being returned. 683 /// 684 /// @param[in,out] offset_ptr 685 /// A pointer to an offset within the data that will be advanced 686 /// by the appropriate number of bytes if the value is extracted 687 /// correctly. If the offset is out of bounds or there are not 688 /// enough bytes to extract this value, the offset will be left 689 /// unmodified. 690 /// 691 /// @param[in] byte_size 692 /// The size in byte of the integer to extract. 693 /// 694 /// @return 695 /// The sign extended signed integer value that was extracted, 696 /// or zero on failure. 697 //------------------------------------------------------------------ 698 int64_t 699 GetMaxS64 (lldb::offset_t *offset_ptr, size_t size) const; 700 701 //------------------------------------------------------------------ 702 /// Extract an unsigned integer of size \a byte_size from \a 703 /// *offset_ptr, then extract the bitfield from this value if 704 /// \a bitfield_bit_size is non-zero. 705 /// 706 /// Extract a single unsigned integer value and update the offset 707 /// pointed to by \a offset_ptr. The size of the extracted integer 708 /// is specified by the \a byte_size argument. \a byte_size should 709 /// have a value greater than or equal to one and less than or equal 710 /// to 8 since the return value is 64 bits wide. Any 711 /// \a byte_size values less than 1 or greater than 8 will result in 712 /// nothing being extracted, and zero being returned. 713 /// 714 /// @param[in,out] offset_ptr 715 /// A pointer to an offset within the data that will be advanced 716 /// by the appropriate number of bytes if the value is extracted 717 /// correctly. If the offset is out of bounds or there are not 718 /// enough bytes to extract this value, the offset will be left 719 /// unmodified. 720 /// 721 /// @param[in] byte_size 722 /// The size in byte of the integer to extract. 723 /// 724 /// @param[in] bitfield_bit_size 725 /// The size in bits of the bitfield value to extract, or zero 726 /// to just extract the entire integer value. 727 /// 728 /// @param[in] bitfield_bit_offset 729 /// The bit offset of the bitfield value in the extracted 730 /// integer (the number of bits to shift the integer to the 731 /// right). 732 /// 733 /// @return 734 /// The unsigned bitfield integer value that was extracted, or 735 /// zero on failure. 736 //------------------------------------------------------------------ 737 uint64_t 738 GetMaxU64Bitfield (lldb::offset_t *offset_ptr, 739 size_t size, 740 uint32_t bitfield_bit_size, 741 uint32_t bitfield_bit_offset) const; 742 743 //------------------------------------------------------------------ 744 /// Extract an signed integer of size \a byte_size from \a 745 /// *offset_ptr, then extract and signe extend the bitfield from 746 /// this value if \a bitfield_bit_size is non-zero. 747 /// 748 /// Extract a single signed integer value (sign extending if required) 749 /// and update the offset pointed to by \a offset_ptr. The size of 750 /// the extracted integer is specified by the \a byte_size argument. 751 /// \a byte_size should have a value greater than or equal to one 752 /// and less than or equal to eight since the return value is 64 753 /// bits wide. Any \a byte_size values less than 1 or greater than 754 /// 8 will result in nothing being extracted, and zero being returned. 755 /// 756 /// @param[in,out] offset_ptr 757 /// A pointer to an offset within the data that will be advanced 758 /// by the appropriate number of bytes if the value is extracted 759 /// correctly. If the offset is out of bounds or there are not 760 /// enough bytes to extract this value, the offset will be left 761 /// unmodified. 762 /// 763 /// @param[in] byte_size 764 /// The size in bytes of the integer to extract. 765 /// 766 /// @param[in] bitfield_bit_size 767 /// The size in bits of the bitfield value to extract, or zero 768 /// to just extract the entire integer value. 769 /// 770 /// @param[in] bitfield_bit_offset 771 /// The bit offset of the bitfield value in the extracted 772 /// integer (the number of bits to shift the integer to the 773 /// right). 774 /// 775 /// @return 776 /// The signed bitfield integer value that was extracted, or 777 /// zero on failure. 778 //------------------------------------------------------------------ 779 int64_t 780 GetMaxS64Bitfield (lldb::offset_t *offset_ptr, 781 size_t size, 782 uint32_t bitfield_bit_size, 783 uint32_t bitfield_bit_offset) const; 784 785 //------------------------------------------------------------------ 786 /// Extract an pointer from \a *offset_ptr. 787 /// 788 /// Extract a single pointer from the data and update the offset 789 /// pointed to by \a offset_ptr. The size of the extracted pointer 790 /// comes from the \a m_addr_size member variable and should be 791 /// set correctly prior to extracting any pointer values. 792 /// 793 /// @param[in,out] offset_ptr 794 /// A pointer to an offset within the data that will be advanced 795 /// by the appropriate number of bytes if the value is extracted 796 /// correctly. If the offset is out of bounds or there are not 797 /// enough bytes to extract this value, the offset will be left 798 /// unmodified. 799 /// 800 /// @return 801 /// The extracted pointer value as a 64 integer. 802 //------------------------------------------------------------------ 803 uint64_t 804 GetPointer (lldb::offset_t *offset_ptr) const; 805 806 //------------------------------------------------------------------ 807 /// Get the current byte order value. 808 /// 809 /// @return 810 /// The current byte order value from this object's internal 811 /// state. 812 //------------------------------------------------------------------ 813 lldb::ByteOrder GetByteOrder()814 GetByteOrder() const 815 { 816 return m_byte_order; 817 } 818 819 //------------------------------------------------------------------ 820 /// Extract a uint8_t value from \a *offset_ptr. 821 /// 822 /// Extract a single uint8_t from the binary data at the offset 823 /// pointed to by \a offset_ptr, and advance the offset on success. 824 /// 825 /// @param[in,out] offset_ptr 826 /// A pointer to an offset within the data that will be advanced 827 /// by the appropriate number of bytes if the value is extracted 828 /// correctly. If the offset is out of bounds or there are not 829 /// enough bytes to extract this value, the offset will be left 830 /// unmodified. 831 /// 832 /// @return 833 /// The extracted uint8_t value. 834 //------------------------------------------------------------------ 835 uint8_t 836 GetU8 ( lldb::offset_t *offset_ptr) const; 837 838 uint8_t GetU8_unchecked(lldb::offset_t * offset_ptr)839 GetU8_unchecked (lldb::offset_t *offset_ptr) const 840 { 841 uint8_t val = m_start[*offset_ptr]; 842 *offset_ptr += 1; 843 return val; 844 } 845 846 uint16_t 847 GetU16_unchecked (lldb::offset_t *offset_ptr) const; 848 849 uint32_t 850 GetU32_unchecked (lldb::offset_t *offset_ptr) const; 851 852 uint64_t 853 GetU64_unchecked (lldb::offset_t *offset_ptr) const; 854 //------------------------------------------------------------------ 855 /// Extract \a count uint8_t values from \a *offset_ptr. 856 /// 857 /// Extract \a count uint8_t values from the binary data at the 858 /// offset pointed to by \a offset_ptr, and advance the offset on 859 /// success. The extracted values are copied into \a dst. 860 /// 861 /// @param[in,out] offset_ptr 862 /// A pointer to an offset within the data that will be advanced 863 /// by the appropriate number of bytes if the value is extracted 864 /// correctly. If the offset is out of bounds or there are not 865 /// enough bytes to extract this value, the offset will be left 866 /// unmodified. 867 /// 868 /// @param[out] dst 869 /// A buffer to copy \a count uint8_t values into. \a dst must 870 /// be large enough to hold all requested data. 871 /// 872 /// @param[in] count 873 /// The number of uint8_t values to extract. 874 /// 875 /// @return 876 /// \a dst if all values were properly extracted and copied, 877 /// NULL otherise. 878 //------------------------------------------------------------------ 879 void * 880 GetU8 (lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 881 882 //------------------------------------------------------------------ 883 /// Extract a uint16_t value from \a *offset_ptr. 884 /// 885 /// Extract a single uint16_t from the binary data at the offset 886 /// pointed to by \a offset_ptr, and update the offset on success. 887 /// 888 /// @param[in,out] offset_ptr 889 /// A pointer to an offset within the data that will be advanced 890 /// by the appropriate number of bytes if the value is extracted 891 /// correctly. If the offset is out of bounds or there are not 892 /// enough bytes to extract this value, the offset will be left 893 /// unmodified. 894 /// 895 /// @return 896 /// The extracted uint16_t value. 897 //------------------------------------------------------------------ 898 uint16_t 899 GetU16 (lldb::offset_t *offset_ptr) const; 900 901 //------------------------------------------------------------------ 902 /// Extract \a count uint16_t values from \a *offset_ptr. 903 /// 904 /// Extract \a count uint16_t values from the binary data at the 905 /// offset pointed to by \a offset_ptr, and advance the offset on 906 /// success. The extracted values are copied into \a dst. 907 /// 908 /// @param[in,out] offset_ptr 909 /// A pointer to an offset within the data that will be advanced 910 /// by the appropriate number of bytes if the value is extracted 911 /// correctly. If the offset is out of bounds or there are not 912 /// enough bytes to extract this value, the offset will be left 913 /// unmodified. 914 /// 915 /// @param[out] dst 916 /// A buffer to copy \a count uint16_t values into. \a dst must 917 /// be large enough to hold all requested data. 918 /// 919 /// @param[in] count 920 /// The number of uint16_t values to extract. 921 /// 922 /// @return 923 /// \a dst if all values were properly extracted and copied, 924 /// NULL otherise. 925 //------------------------------------------------------------------ 926 void * 927 GetU16 (lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 928 929 //------------------------------------------------------------------ 930 /// Extract a uint32_t value from \a *offset_ptr. 931 /// 932 /// Extract a single uint32_t from the binary data at the offset 933 /// pointed to by \a offset_ptr, and update the offset on success. 934 /// 935 /// @param[in,out] offset_ptr 936 /// A pointer to an offset within the data that will be advanced 937 /// by the appropriate number of bytes if the value is extracted 938 /// correctly. If the offset is out of bounds or there are not 939 /// enough bytes to extract this value, the offset will be left 940 /// unmodified. 941 /// 942 /// @return 943 /// The extracted uint32_t value. 944 //------------------------------------------------------------------ 945 uint32_t 946 GetU32 (lldb::offset_t *offset_ptr) const; 947 948 //------------------------------------------------------------------ 949 /// Extract \a count uint32_t values from \a *offset_ptr. 950 /// 951 /// Extract \a count uint32_t values from the binary data at the 952 /// offset pointed to by \a offset_ptr, and advance the offset on 953 /// success. The extracted values are copied into \a dst. 954 /// 955 /// @param[in,out] offset_ptr 956 /// A pointer to an offset within the data that will be advanced 957 /// by the appropriate number of bytes if the value is extracted 958 /// correctly. If the offset is out of bounds or there are not 959 /// enough bytes to extract this value, the offset will be left 960 /// unmodified. 961 /// 962 /// @param[out] dst 963 /// A buffer to copy \a count uint32_t values into. \a dst must 964 /// be large enough to hold all requested data. 965 /// 966 /// @param[in] count 967 /// The number of uint32_t values to extract. 968 /// 969 /// @return 970 /// \a dst if all values were properly extracted and copied, 971 /// NULL otherise. 972 //------------------------------------------------------------------ 973 void * 974 GetU32 (lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 975 976 //------------------------------------------------------------------ 977 /// Extract a uint64_t value from \a *offset_ptr. 978 /// 979 /// Extract a single uint64_t from the binary data at the offset 980 /// pointed to by \a offset_ptr, and update the offset on success. 981 /// 982 /// @param[in,out] offset_ptr 983 /// A pointer to an offset within the data that will be advanced 984 /// by the appropriate number of bytes if the value is extracted 985 /// correctly. If the offset is out of bounds or there are not 986 /// enough bytes to extract this value, the offset will be left 987 /// unmodified. 988 /// 989 /// @return 990 /// The extracted uint64_t value. 991 //------------------------------------------------------------------ 992 uint64_t 993 GetU64 (lldb::offset_t *offset_ptr) const; 994 995 //------------------------------------------------------------------ 996 /// Extract \a count uint64_t values from \a *offset_ptr. 997 /// 998 /// Extract \a count uint64_t values from the binary data at the 999 /// offset pointed to by \a offset_ptr, and advance the offset on 1000 /// success. The extracted values are copied into \a dst. 1001 /// 1002 /// @param[in,out] offset_ptr 1003 /// A pointer to an offset within the data that will be advanced 1004 /// by the appropriate number of bytes if the value is extracted 1005 /// correctly. If the offset is out of bounds or there are not 1006 /// enough bytes to extract this value, the offset will be left 1007 /// unmodified. 1008 /// 1009 /// @param[out] dst 1010 /// A buffer to copy \a count uint64_t values into. \a dst must 1011 /// be large enough to hold all requested data. 1012 /// 1013 /// @param[in] count 1014 /// The number of uint64_t values to extract. 1015 /// 1016 /// @return 1017 /// \a dst if all values were properly extracted and copied, 1018 /// NULL otherise. 1019 //------------------------------------------------------------------ 1020 void * 1021 GetU64 ( lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 1022 1023 //------------------------------------------------------------------ 1024 /// Extract a signed LEB128 value from \a *offset_ptr. 1025 /// 1026 /// Extracts an signed LEB128 number from this object's data 1027 /// starting at the offset pointed to by \a offset_ptr. The offset 1028 /// pointed to by \a offset_ptr will be updated with the offset of 1029 /// the byte following the last extracted byte. 1030 /// 1031 /// @param[in,out] offset_ptr 1032 /// A pointer to an offset within the data that will be advanced 1033 /// by the appropriate number of bytes if the value is extracted 1034 /// correctly. If the offset is out of bounds or there are not 1035 /// enough bytes to extract this value, the offset will be left 1036 /// unmodified. 1037 /// 1038 /// @return 1039 /// The extracted signed integer value. 1040 //------------------------------------------------------------------ 1041 int64_t 1042 GetSLEB128 (lldb::offset_t *offset_ptr) const; 1043 1044 //------------------------------------------------------------------ 1045 /// Extract a unsigned LEB128 value from \a *offset_ptr. 1046 /// 1047 /// Extracts an unsigned LEB128 number from this object's data 1048 /// starting at the offset pointed to by \a offset_ptr. The offset 1049 /// pointed to by \a offset_ptr will be updated with the offset of 1050 /// the byte following the last extracted byte. 1051 /// 1052 /// @param[in,out] offset_ptr 1053 /// A pointer to an offset within the data that will be advanced 1054 /// by the appropriate number of bytes if the value is extracted 1055 /// correctly. If the offset is out of bounds or there are not 1056 /// enough bytes to extract this value, the offset will be left 1057 /// unmodified. 1058 /// 1059 /// @return 1060 /// The extracted unsigned integer value. 1061 //------------------------------------------------------------------ 1062 uint64_t 1063 GetULEB128 (lldb::offset_t *offset_ptr) const; 1064 1065 lldb::DataBufferSP & GetSharedDataBuffer()1066 GetSharedDataBuffer () 1067 { 1068 return m_data_sp; 1069 } 1070 1071 //------------------------------------------------------------------ 1072 /// Peek at a C string at \a offset. 1073 /// 1074 /// Peeks at a string in the contained data. No verification is done 1075 /// to make sure the entire string lies within the bounds of this 1076 /// object's data, only \a offset is verified to be a valid offset. 1077 /// 1078 /// @param[in] offset 1079 /// An offset into the data. 1080 /// 1081 /// @return 1082 /// A non-NULL C string pointer if \a offset is a valid offset, 1083 /// NULL otherwise. 1084 //------------------------------------------------------------------ 1085 const char * 1086 PeekCStr (lldb::offset_t offset) const; 1087 1088 //------------------------------------------------------------------ 1089 /// Peek at a bytes at \a offset. 1090 /// 1091 /// Returns a pointer to \a length bytes at \a offset as long as 1092 /// there are \a length bytes available starting at \a offset. 1093 /// 1094 /// @return 1095 /// A non-NULL data pointer if \a offset is a valid offset and 1096 /// there are \a length bytes available at that offset, NULL 1097 /// otherwise. 1098 //------------------------------------------------------------------ 1099 const uint8_t* PeekData(lldb::offset_t offset,lldb::offset_t length)1100 PeekData (lldb::offset_t offset, lldb::offset_t length) const 1101 { 1102 if (length > 0 && ValidOffsetForDataOfSize(offset, length)) 1103 return m_start + offset; 1104 return NULL; 1105 } 1106 1107 //------------------------------------------------------------------ 1108 /// Set the address byte size. 1109 /// 1110 /// Set the size in bytes that will be used when extracting any 1111 /// address and pointer values from data contained in this object. 1112 /// 1113 /// @param[in] addr_size 1114 /// The size in bytes to use when extracting addresses. 1115 //------------------------------------------------------------------ 1116 void SetAddressByteSize(uint32_t addr_size)1117 SetAddressByteSize (uint32_t addr_size) 1118 { 1119 m_addr_size = addr_size; 1120 } 1121 1122 //------------------------------------------------------------------ 1123 /// Set data with a buffer that is caller owned. 1124 /// 1125 /// Use data that is owned by the caller when extracting values. 1126 /// The data must stay around as long as this object, or any object 1127 /// that copies a subset of this object's data, is valid. If \a 1128 /// bytes is NULL, or \a length is zero, this object will contain 1129 /// no data. 1130 /// 1131 /// @param[in] bytes 1132 /// A pointer to caller owned data. 1133 /// 1134 /// @param[in] length 1135 /// The length in bytes of \a bytes. 1136 /// 1137 /// @param[in] byte_order 1138 /// A byte order of the data that we are extracting from. 1139 /// 1140 /// @return 1141 /// The number of bytes that this object now contains. 1142 //------------------------------------------------------------------ 1143 lldb::offset_t 1144 SetData (const void *bytes, lldb::offset_t length, lldb::ByteOrder byte_order); 1145 1146 //------------------------------------------------------------------ 1147 /// Adopt a subset of \a data. 1148 /// 1149 /// Set this object's data to be a subset of the data bytes in \a 1150 /// data. If \a data contains shared data, then a reference to the 1151 /// shared data will be added to ensure the shared data stays around 1152 /// as long as any objects have references to the shared data. The 1153 /// byte order and the address size settings are copied from \a 1154 /// data. If \a offset is not a valid offset in \a data, then no 1155 /// reference to the shared data will be added. If there are not 1156 /// \a length bytes available in \a data starting at \a offset, 1157 /// the length will be truncated to contains as many bytes as 1158 /// possible. 1159 /// 1160 /// @param[in] data 1161 /// Another DataExtractor object that contains data. 1162 /// 1163 /// @param[in] offset 1164 /// The offset into \a data at which the subset starts. 1165 /// 1166 /// @param[in] length 1167 /// The length in bytes of the subset of \a data. 1168 /// 1169 /// @return 1170 /// The number of bytes that this object now contains. 1171 //------------------------------------------------------------------ 1172 lldb::offset_t 1173 SetData (const DataExtractor& data, lldb::offset_t offset, lldb::offset_t length); 1174 1175 //------------------------------------------------------------------ 1176 /// Adopt a subset of shared data in \a data_sp. 1177 /// 1178 /// Copies the data shared pointer which adds a reference to the 1179 /// contained in \a data_sp. The shared data reference is reference 1180 /// counted to ensure the data lives as long as anyone still has a 1181 /// valid shared pointer to the data in \a data_sp. The byte order 1182 /// and address byte size settings remain the same. If 1183 /// \a offset is not a valid offset in \a data_sp, then no reference 1184 /// to the shared data will be added. If there are not \a length 1185 /// bytes available in \a data starting at \a offset, the length 1186 /// will be truncated to contains as many bytes as possible. 1187 /// 1188 /// @param[in] data_sp 1189 /// A shared pointer to data. 1190 /// 1191 /// @param[in] offset 1192 /// The offset into \a data_sp at which the subset starts. 1193 /// 1194 /// @param[in] length 1195 /// The length in bytes of the subset of \a data_sp. 1196 /// 1197 /// @return 1198 /// The number of bytes that this object now contains. 1199 //------------------------------------------------------------------ 1200 lldb::offset_t 1201 SetData (const lldb::DataBufferSP& data_sp, lldb::offset_t offset = 0, lldb::offset_t length = LLDB_INVALID_OFFSET); 1202 1203 //------------------------------------------------------------------ 1204 /// Set the byte_order value. 1205 /// 1206 /// Sets the byte order of the data to extract. Extracted values 1207 /// will be swapped if necessary when decoding. 1208 /// 1209 /// @param[in] byte_order 1210 /// The byte order value to use when extracting data. 1211 //------------------------------------------------------------------ 1212 void SetByteOrder(lldb::ByteOrder byte_order)1213 SetByteOrder (lldb::ByteOrder byte_order) 1214 { 1215 m_byte_order = byte_order; 1216 } 1217 1218 //------------------------------------------------------------------ 1219 /// Skip an LEB128 number at \a *offset_ptr. 1220 /// 1221 /// Skips a LEB128 number (signed or unsigned) from this object's 1222 /// data starting at the offset pointed to by \a offset_ptr. The 1223 /// offset pointed to by \a offset_ptr will be updated with the 1224 /// offset of the byte following the last extracted byte. 1225 /// 1226 /// @param[in,out] offset_ptr 1227 /// A pointer to an offset within the data that will be advanced 1228 /// by the appropriate number of bytes if the value is extracted 1229 /// correctly. If the offset is out of bounds or there are not 1230 /// enough bytes to extract this value, the offset will be left 1231 /// unmodified. 1232 /// 1233 /// @return 1234 // The number of bytes consumed during the extraction. 1235 //------------------------------------------------------------------ 1236 uint32_t 1237 Skip_LEB128 (lldb::offset_t *offset_ptr) const; 1238 1239 //------------------------------------------------------------------ 1240 /// Test the validity of \a offset. 1241 /// 1242 /// @return 1243 /// \b true if \a offset is a valid offset into the data in this 1244 /// object, \b false otherwise. 1245 //------------------------------------------------------------------ 1246 bool ValidOffset(lldb::offset_t offset)1247 ValidOffset (lldb::offset_t offset) const 1248 { 1249 return offset < GetByteSize(); 1250 } 1251 1252 //------------------------------------------------------------------ 1253 /// Test the availability of \a length bytes of data from \a offset. 1254 /// 1255 /// @return 1256 /// \b true if \a offset is a valid offset and there are \a 1257 /// length bytes available at that offset, \b false otherwise. 1258 //------------------------------------------------------------------ 1259 bool ValidOffsetForDataOfSize(lldb::offset_t offset,lldb::offset_t length)1260 ValidOffsetForDataOfSize (lldb::offset_t offset, lldb::offset_t length) const 1261 { 1262 return length <= BytesLeft (offset); 1263 } 1264 1265 size_t 1266 Copy (DataExtractor& dest_data) const; 1267 1268 bool 1269 Append (DataExtractor& rhs); 1270 1271 bool 1272 Append (void* bytes, lldb::offset_t length); 1273 1274 lldb::offset_t BytesLeft(lldb::offset_t offset)1275 BytesLeft (lldb::offset_t offset) const 1276 { 1277 const lldb::offset_t size = GetByteSize(); 1278 if (size > offset) 1279 return size - offset; 1280 return 0; 1281 } 1282 1283 protected: 1284 1285 //------------------------------------------------------------------ 1286 // Member variables 1287 //------------------------------------------------------------------ 1288 const uint8_t * m_start; ///< A pointer to the first byte of data. 1289 const uint8_t * m_end; ///< A pointer to the byte that is past the end of the data. 1290 lldb::ByteOrder m_byte_order; ///< The byte order of the data we are extracting from. 1291 uint32_t m_addr_size; ///< The address size to use when extracting pointers or addresses 1292 mutable lldb::DataBufferSP m_data_sp; ///< The shared pointer to data that can be shared among multilple instances 1293 }; 1294 1295 } // namespace lldb_private 1296 1297 #endif // #if defined (__cplusplus) 1298 #endif // #ifndef liblldb_DataExtractor_h_ 1299