18c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer//===-- DataExtractor.h -----------------------------------------*- C++ -*-===// 28c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// 38c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// The LLVM Compiler Infrastructure 48c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// 58c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// This file is distributed under the University of Illinois Open Source 68c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// License. See LICENSE.TXT for details. 78c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer// 88c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer//===----------------------------------------------------------------------===// 98c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 108c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer#ifndef LLVM_SUPPORT_DATAEXTRACTOR_H 118c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer#define LLVM_SUPPORT_DATAEXTRACTOR_H 128c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 138c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer#include "llvm/ADT/StringRef.h" 148c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer#include "llvm/Support/DataTypes.h" 158c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 168c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramernamespace llvm { 178c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramerclass DataExtractor { 188c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer StringRef Data; 198c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint8_t IsLittleEndian; 208c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint8_t PointerSize; 218c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramerpublic: 228c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Construct with a buffer that is owned by the caller. 238c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 248c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// This constructor allows us to use data that is owned by the 258c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// caller. The data must stay around as long as this object is 268c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// valid. 278c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer DataExtractor(StringRef Data, bool IsLittleEndian, uint8_t PointerSize) 288c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer : Data(Data), IsLittleEndian(IsLittleEndian), PointerSize(PointerSize) {} 298c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 308c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// getData - Get the data pointed to by this extractor. 318c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer StringRef getData() const { return Data; } 328c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// isLittleEndian - Get the endianess for this extractor. 338c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer bool isLittleEndian() const { return IsLittleEndian; } 348c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// getAddressSize - Get the address size for this extractor. 358c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint8_t getAddressSize() const { return PointerSize; } 368c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 378c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a C string from \a *offset_ptr. 388c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 398c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Returns a pointer to a C String from the data at the offset 408c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr. A variable length NULL terminated C 418c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// string will be extracted and the \a offset_ptr will be 428c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// updated with the offset of the byte that follows the NULL 438c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// terminator byte. 448c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 458c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 468c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 478c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 488c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 498c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 508c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 518c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 528c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 538c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to the C string value in the data. If the offset 548c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr is out of bounds, or if the 558c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// offset plus the length of the C string is out of bounds, 568c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// NULL will be returned. 578c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer const char *getCStr(uint32_t *offset_ptr) const; 588c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 598c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract an unsigned integer of size \a byte_size from \a 608c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// *offset_ptr. 618c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 628c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a single unsigned integer value and update the offset 638c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr. The size of the extracted integer 648c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// is specified by the \a byte_size argument. \a byte_size should 658c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// have a value greater than or equal to one and less than or equal 668c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// to eight since the return value is 64 bits wide. Any 678c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \a byte_size values less than 1 or greater than 8 will result in 688c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// nothing being extracted, and zero being returned. 698c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 708c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 718c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 728c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 738c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 748c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 758c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 768c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 778c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in] byte_size 788c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The size in byte of the integer to extract. 798c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 808c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 818c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The unsigned integer value that was extracted, or zero on 828c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// failure. 838c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint64_t getUnsigned(uint32_t *offset_ptr, uint32_t byte_size) const; 848c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 858c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract an signed integer of size \a byte_size from \a *offset_ptr. 868c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 878c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a single signed integer value (sign extending if required) 888c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// and update the offset pointed to by \a offset_ptr. The size of 898c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// the extracted integer is specified by the \a byte_size argument. 908c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \a byte_size should have a value greater than or equal to one 918c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// and less than or equal to eight since the return value is 64 928c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// bits wide. Any \a byte_size values less than 1 or greater than 938c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 8 will result in nothing being extracted, and zero being returned. 948c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 958c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 968c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 978c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 988c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 998c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 1008c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 1018c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 102a00b80b04c5edb08639c1c6b32e9231fd8b066f7Dmitri Gribenko /// @param[in] size 103a00b80b04c5edb08639c1c6b32e9231fd8b066f7Dmitri Gribenko /// The size in bytes of the integer to extract. 1048c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1058c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 1068c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The sign extended signed integer value that was extracted, 1078c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// or zero on failure. 1088c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer int64_t getSigned(uint32_t *offset_ptr, uint32_t size) const; 1098c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1108c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer //------------------------------------------------------------------ 1118c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract an pointer from \a *offset_ptr. 1128c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1138c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a single pointer from the data and update the offset 1148c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr. The size of the extracted pointer 1158c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// comes from the \a m_addr_size member variable and should be 1168c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// set correctly prior to extracting any pointer values. 1178c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1188c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 1198c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 1208c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 1218c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 1228c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 1238c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 1248c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1258c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 1268c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The extracted pointer value as a 64 integer. 1278c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint64_t getAddress(uint32_t *offset_ptr) const { 1288c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer return getUnsigned(offset_ptr, PointerSize); 1298c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer } 1308c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1318c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a uint8_t value from \a *offset_ptr. 1328c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1338c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a single uint8_t from the binary data at the offset 1348c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr, and advance the offset on success. 1358c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1368c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 1378c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 1388c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 1398c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 1408c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 1418c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 1428c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1438c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 1448c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The extracted uint8_t value. 1458c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint8_t getU8(uint32_t *offset_ptr) const; 1468c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1478c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint8_t values from \a *offset_ptr. 1488c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1498c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint8_t values from the binary data at the 1508c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// offset pointed to by \a offset_ptr, and advance the offset on 1518c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// success. The extracted values are copied into \a dst. 1528c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1538c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 1548c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 1558c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 1568c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 1578c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 1588c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 1598c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1608c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[out] dst 1618c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A buffer to copy \a count uint8_t values into. \a dst must 1628c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// be large enough to hold all requested data. 1638c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1648c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in] count 1658c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The number of uint8_t values to extract. 1668c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1678c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 1688c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \a dst if all values were properly extracted and copied, 1698c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// NULL otherise. 1708c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint8_t *getU8(uint32_t *offset_ptr, uint8_t *dst, uint32_t count) const; 1718c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1728c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer //------------------------------------------------------------------ 1738c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a uint16_t value from \a *offset_ptr. 1748c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1758c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a single uint16_t from the binary data at the offset 1768c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr, and update the offset on success. 1778c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1788c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 1798c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 1808c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 1818c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 1828c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 1838c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 1848c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1858c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 1868c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The extracted uint16_t value. 1878c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer //------------------------------------------------------------------ 1888c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint16_t getU16(uint32_t *offset_ptr) const; 1898c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 1908c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint16_t values from \a *offset_ptr. 1918c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1928c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint16_t values from the binary data at the 1938c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// offset pointed to by \a offset_ptr, and advance the offset on 1948c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// success. The extracted values are copied into \a dst. 1958c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 1968c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 1978c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 1988c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 1998c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 2008c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 2018c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 2028c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2038c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[out] dst 2048c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A buffer to copy \a count uint16_t values into. \a dst must 2058c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// be large enough to hold all requested data. 2068c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2078c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in] count 2088c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The number of uint16_t values to extract. 2098c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2108c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 2118c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \a dst if all values were properly extracted and copied, 2128c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// NULL otherise. 2138c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint16_t *getU16(uint32_t *offset_ptr, uint16_t *dst, uint32_t count) const; 2148c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 2158c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a uint32_t value from \a *offset_ptr. 2168c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2178c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a single uint32_t from the binary data at the offset 2188c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr, and update the offset on success. 2198c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2208c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 2218c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 2228c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 2238c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 2248c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 2258c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 2268c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2278c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 2288c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The extracted uint32_t value. 2298c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint32_t getU32(uint32_t *offset_ptr) const; 2308c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 2318c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint32_t values from \a *offset_ptr. 2328c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2338c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint32_t values from the binary data at the 2348c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// offset pointed to by \a offset_ptr, and advance the offset on 2358c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// success. The extracted values are copied into \a dst. 2368c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2378c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 2388c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 2398c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 2408c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 2418c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 2428c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 2438c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2448c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[out] dst 2458c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A buffer to copy \a count uint32_t values into. \a dst must 2468c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// be large enough to hold all requested data. 2478c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2488c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in] count 2498c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The number of uint32_t values to extract. 2508c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2518c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 2528c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \a dst if all values were properly extracted and copied, 2538c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// NULL otherise. 2548c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint32_t *getU32(uint32_t *offset_ptr, uint32_t *dst, uint32_t count) const; 2558c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 2568c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a uint64_t value from \a *offset_ptr. 2578c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2588c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a single uint64_t from the binary data at the offset 2598c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr, and update the offset on success. 2608c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2618c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 2628c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 2638c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 2648c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 2658c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 2668c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 2678c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2688c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 2698c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The extracted uint64_t value. 2708c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint64_t getU64(uint32_t *offset_ptr) const; 2718c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 2728c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint64_t values from \a *offset_ptr. 2738c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2748c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract \a count uint64_t values from the binary data at the 2758c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// offset pointed to by \a offset_ptr, and advance the offset on 2768c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// success. The extracted values are copied into \a dst. 2778c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2788c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 2798c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 2808c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 2818c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 2828c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 2838c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 2848c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2858c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[out] dst 2868c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A buffer to copy \a count uint64_t values into. \a dst must 2878c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// be large enough to hold all requested data. 2888c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2898c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in] count 2908c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The number of uint64_t values to extract. 2918c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2928c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 2938c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \a dst if all values were properly extracted and copied, 2948c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// NULL otherise. 2958c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint64_t *getU64(uint32_t *offset_ptr, uint64_t *dst, uint32_t count) const; 2968c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 2978c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a signed LEB128 value from \a *offset_ptr. 2988c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 2998c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extracts an signed LEB128 number from this object's data 3008c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// starting at the offset pointed to by \a offset_ptr. The offset 3018c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr will be updated with the offset of 3028c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// the byte following the last extracted byte. 3038c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 3048c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 3058c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 3068c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 3078c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 3088c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 3098c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 3108c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 3118c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 3128c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The extracted signed integer value. 3138c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer int64_t getSLEB128(uint32_t *offset_ptr) const; 3148c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 3158c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extract a unsigned LEB128 value from \a *offset_ptr. 3168c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 3178c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Extracts an unsigned LEB128 number from this object's data 3188c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// starting at the offset pointed to by \a offset_ptr. The offset 3198c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// pointed to by \a offset_ptr will be updated with the offset of 3208c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// the byte following the last extracted byte. 3218c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 3228c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @param[in,out] offset_ptr 3238c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// A pointer to an offset within the data that will be advanced 3248c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// by the appropriate number of bytes if the value is extracted 3258c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// correctly. If the offset is out of bounds or there are not 3268c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// enough bytes to extract this value, the offset will be left 3278c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// unmodified. 3288c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 3298c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 3308c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// The extracted unsigned integer value. 3318c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer uint64_t getULEB128(uint32_t *offset_ptr) const; 3328c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 3338c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Test the validity of \a offset. 3348c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 3358c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 3368c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \b true if \a offset is a valid offset into the data in this 3378c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// object, \b false otherwise. 3388c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer bool isValidOffset(uint32_t offset) const { return Data.size() > offset; } 3398c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 3408c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// Test the availability of \a length bytes of data from \a offset. 3418c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// 3428c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// @return 3438c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// \b true if \a offset is a valid offset and there are \a 3448c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer /// length bytes available at that offset, \b false otherwise. 3458c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer bool isValidOffsetForDataOfSize(uint32_t offset, uint32_t length) const { 3468c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer return offset + length >= offset && isValidOffset(offset + length - 1); 3478c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer } 3488c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer}; 3498c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 3508c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer} // namespace llvm 3518c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer 3528c74f7f2991a10977fd5a003b2901b56eb2e19a8Benjamin Kramer#endif 353