124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DataExtractor.h -----------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_DataExtractor_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_DataExtractor_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (__cplusplus) 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <limits.h> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdint.h> 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string.h> 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class DataExtractor DataExtractor.h "lldb/Core/DataExtractor.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief An data extractor class. 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// DataExtractor is a class that can extract data (swapping if needed) 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// from a data buffer. The data buffer can be caller owned, or can be 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// shared data that can be shared between multiple DataExtractor 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// instances. Multiple DataExtractor objects can share the same data, 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// yet extract values in different address sizes and byte order modes. 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Each object can have a unique position in the shared data and extract 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// data from different offsets. 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @see DataBuffer 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DataExtractor 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @typedef DataExtractor::Type 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @brief Type enumerations used in the dump routines. 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @see DataExtractor::Dump() 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @see DataExtractor::DumpRawHexBytes() 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef enum 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt8, ///< Format output as unsigned 8 bit integers 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeChar, ///< Format output as characters 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt16, ///< Format output as unsigned 16 bit integers 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt32, ///< Format output as unsigned 32 bit integers 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeUInt64, ///< Format output as unsigned 64 bit integers 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypePointer, ///< Format output as pointers 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeULEB128, ///< Format output as ULEB128 numbers 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeSLEB128 ///< Format output as SLEB128 numbers 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } Type; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton static void 58d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton DumpHexBytes (Stream *s, 59d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton const void *src, 60d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton size_t src_len, 618d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton uint32_t bytes_per_line, 628d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton lldb::addr_t base_addr); // Pass LLDB_INVALID_ADDRESS to not show address at start of line 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Default constructor. 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Initialize all members to a default empty state. 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataExtractor (); 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Construct with a buffer that is owned by the caller. 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// This constructor allows us to use data that is owned by the 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// caller. The data must stay around as long as this object is 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// valid. 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] data 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to caller owned data. 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] data_length 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The length in bytes of \a data. 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_order 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A byte order of the data that we are extracting from. 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_size 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A new address byte size value. 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 8936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton DataExtractor (const void* data, lldb::offset_t data_length, lldb::ByteOrder byte_order, uint32_t addr_size); 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Construct with shared data. 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Copies the data shared pointer which adds a reference to the 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// contained in \a data_sp. The shared data reference is reference 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// counted to ensure the data lives as long as anyone still has a 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// valid shared pointer to the data in \a data_sp. 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] data_sp 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A shared pointer to data. 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_order 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A byte order of the data that we are extracting from. 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_size 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A new address byte size value. 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 10836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton DataExtractor (const lldb::DataBufferSP& data_sp, lldb::ByteOrder byte_order, uint32_t addr_size); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Construct with a subset of \a data. 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Initialize this object with a subset of the data bytes in \a 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// data. If \a data contains shared data, then a reference to the 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// shared data will be added to ensure the shared data stays around 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// as long as any objects have references to the shared data. The 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// byte order value and the address size settings are copied from \a 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// data. If \a offset is not a valid offset in \a data, then no 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// reference to the shared data will be added. If there are not 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a length bytes available in \a data starting at \a offset, 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the length will be truncated to contain as many bytes as 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// possible. 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] data 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Another DataExtractor object that contains data. 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset into \a data at which the subset starts. 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] length 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The length in bytes of the subset of data. 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 13336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton DataExtractor (const DataExtractor& data, lldb::offset_t offset, lldb::offset_t length); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton DataExtractor (const DataExtractor& rhs); 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Assignment operator. 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Copies all data, byte order and address size settings from \a rhs into 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// this object. If \a rhs contains shared data, a reference to that 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// shared data will be added. 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] rhs 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Another DataExtractor object to copy. 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A const reference to this object. 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DataExtractor& 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner operator= (const DataExtractor& rhs); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Destructor 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// If this object contains a valid shared data reference, the 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// reference count on the data will be decremented, and if zero, 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the data will be freed. 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~DataExtractor (); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Clears the object state. 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Clears the object contents back to a default invalid state, and 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// release any references to shared data that this object may 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// contain. 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear (); 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Dumps the binary data as \a type objects to stream \a s (or to 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Log() if \a s is NULL) starting \a offset bytes into the data 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and stopping after dumping \a length bytes. The offset into the 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// data is displayed at the beginning of each line and can be 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset by base address \a base_addr. \a num_per_line objects 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// will be displayed on each line. 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] s 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The stream to dump the output to. If NULL the output will 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be dumped to Log(). 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset into the data at which to start dumping. 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] length 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of bytes to dump. 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] base_addr 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The base address that gets added to the offset displayed on 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// each line. 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] num_per_line 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of \a type objects to display on each line. 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] type 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The type of objects to use when dumping data from this 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// object. See DataExtractor::Type. 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] type_format 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The optional format to use for the \a type objects. If this 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is NULL, the default format for the \a type will be used. 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset at which dumping ended. 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 20736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutToLog (Log *log, 20936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset, 21036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t length, 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t base_addr, 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_per_line, 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type type, 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *type_format = NULL) const; 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Dumps \a item_count objects into the stream \a s. 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Dumps \a item_count objects using \a item_format, each of which 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// are \a item_byte_size bytes long starting at offset \a offset 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// bytes into the contained data, into the stream \a s. \a 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// num_per_line objects will be dumped on each line before a new 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// line will be output. If \a base_addr is a valid address, then 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// each new line of output will be prededed by the address value 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// plus appropriate offset, and a colon and space. Bitfield values 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// can be dumped by calling this function multiple times with the 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// same start offset, format and size, yet differing \a 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// item_bit_size and \a item_bit_offset values. 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] s 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The stream to dump the output to. This value can not be NULL. 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset into the data at which to start dumping. 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] item_format 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The format to use when dumping each item. 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] item_byte_size 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The byte size of each item. 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] item_count 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of items to dump. 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] num_per_line 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of items to display on each line. 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] base_addr 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The base address that gets added to the offset displayed on 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// each line if the value is valid. Is \a base_addr is 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// LLDB_INVALID_ADDRESS then no address values will be prepended 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to any lines. 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] item_bit_size 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// If the value to display is a bitfield, this value should 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be the number of bits that the bitfield item has within the 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// item's byte size value. This function will need to be called 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// multiple times with identical \a offset and \a item_byte_size 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// values in order to display multiple bitfield values that 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// exist within the same integer value. If the items being 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// displayed are not bitfields, this value should be zero. 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] item_bit_offset 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// If the value to display is a bitfield, this value should 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be the offset in bits, or shift right amount, that the 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// bitfield item occupies within the item's byte size value. 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// This function will need to be called multiple times with 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// identical \a offset and \a item_byte_size values in order 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to display multiple bitfield values that exist within the 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// same integer value. If the items being displayed are not 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// bitfields, this value should be zero. 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset at which dumping ended. 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 27636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t 27724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton Dump (Stream *s, 27836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset, 27924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton lldb::Format item_format, 28036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t item_byte_size, 28136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t item_count, 28236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_per_line, 28324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton uint64_t base_addr, 28424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton uint32_t item_bit_size, 28524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton uint32_t item_bit_offset, 28624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton ExecutionContextScope *exe_scope = NULL) const; 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Dump a UUID value at \a offset. 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Dump a UUID starting at \a offset bytes into this object's data. 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// If the stream \a s is NULL, the output will be sent to Log(). 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] s 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The stream to dump the output to. If NULL the output will 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be dumped to Log(). 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset into the data at which to extract and dump a 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// UUID value. 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 30336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton DumpUUID (Stream *s, lldb::offset_t offset) const; 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an arbitrary number of bytes in the specified byte 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// order. 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Attemps to extract \a length bytes starting at \a offset bytes 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// into this data in the requested byte order (\a dst_byte_order) 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and place the results in \a dst. \a dst must be at least \a 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// length bytes long. 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset in bytes into the contained data at which to 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// start extracting. 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] length 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of bytes to extract. 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] dst_byte_order 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A byte order of the data that we want when the value in 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// copied to \a dst. 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[out] dst 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The buffer that will receive the extracted value if there 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// are enough bytes available in the current data. 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of bytes that were extracted which will be \a 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// length when the value is successfully extracted, or zero 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// if there aren't enough bytes at the specified offset. 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 33536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton ExtractBytes (lldb::offset_t offset, lldb::offset_t length, lldb::ByteOrder dst_byte_order, void *dst) const; 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an address from \a *offset_ptr. 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single address from the data and update the offset 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr. The size of the extracted address 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// comes from the \a m_addr_size member variable and should be 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// set correctly prior to extracting any address values. 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted address value. 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t 35636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetAddress (lldb::offset_t *offset_ptr) const; 3570fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton 3580fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton uint64_t 35936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetAddress_unchecked (lldb::offset_t *offset_ptr) const; 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Get the current address size. 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Return the size in bytes of any address values this object will 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// extract. 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in bytes of address values that will be extracted. 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 37036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t 371915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata GetAddressByteSize () const 372915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 373915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_addr_size; 374915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Get the number of bytes contained in this object. 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The total number of bytes of data this object refers to. 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 38236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint64_t 383915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata GetByteSize () const 384915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 385915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_end - m_start; 386915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a C string from \a *offset_ptr. 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns a pointer to a C String from the data at the offset 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr. A variable length NULL terminated C 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// string will be extracted and the \a offset_ptr will be 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// updated with the offset of the byte that follows the NULL 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// terminator byte. 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the C string value in the data. If the offset 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr is out of bounds, or if the 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset plus the length of the C string is out of bounds, 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// NULL will be returned. 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * 41136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetCStr (lldb::offset_t *offset_ptr) const; 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 4140bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// Extract a C string from \a *offset_ptr with field size \a len. 4150bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// 4160bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// Returns a pointer to a C String from the data at the offset 4170bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// pointed to by \a offset_ptr, with a field length of \a len. 4180bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// A NULL terminated C string will be extracted and the \a offset_ptr 4190bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// will be updated with the offset of the byte that follows the fixed 4200bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// length field. 4210bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// 4220bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// @param[in,out] offset_ptr 4230bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// A pointer to an offset within the data that will be advanced 4240bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// by the appropriate number of bytes if the value is extracted 4250bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// correctly. If the offset is out of bounds or there are not 4260bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// enough bytes to extract this value, the offset will be left 4270bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// unmodified. 4280bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// 4290bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// @return 4300bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// A pointer to the C string value in the data. If the offset 4310bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// pointed to by \a offset_ptr is out of bounds, or if the 4320bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// offset plus the length of the field is out of bounds, or if 4330bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// the field does not contain a NULL terminator byte, NULL will 4340bf2d699067d434fe3dd187caf526ff94f19494fEd Maste /// be returned. 4350bf2d699067d434fe3dd187caf526ff94f19494fEd Maste const char * 4360bf2d699067d434fe3dd187caf526ff94f19494fEd Maste GetCStr (lldb::offset_t *offset_ptr, lldb::offset_t len) const; 4370bf2d699067d434fe3dd187caf526ff94f19494fEd Maste 4380bf2d699067d434fe3dd187caf526ff94f19494fEd Maste //------------------------------------------------------------------ 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a length bytes from \a *offset_ptr. 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns a pointer to a bytes in this object's data at the offset 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr. If \a length is zero or too large, 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// then the offset pointed to by \a offset_ptr will not be updated 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and NULL will be returned. 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] length 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The optional length of a string to extract. If the value is 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// zero, a NULL terminated C string will be extracted. 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the bytes in this object's data if the offset 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and length are valid, or NULL otherwise. 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const void* 462940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton GetData (lldb::offset_t *offset_ptr, lldb::offset_t length) const 463940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton { 464940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint8_t *ptr = PeekData (*offset_ptr, length); 465940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (ptr) 466940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton *offset_ptr += length; 467940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return ptr; 468940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton } 469061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 470061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton //------------------------------------------------------------------ 471061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// Copy \a dst_len bytes from \a *offset_ptr and ensure the copied 472061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// data is treated as a value that can be swapped to match the 473061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// specified byte order. 474061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// 475061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// For values that are larger than the supported integer sizes, 476061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// this function can be used to extract data in a specified byte 477061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// order. It can also be used to copy a smaller integer value from 478061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// to a larger value. The extra bytes left over will be padded 479061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// correctly according to the byte order of this object and the 480061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// \a dst_byte_order. This can be very handy when say copying a 481061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// partial data value into a register. 482061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// 483061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// @param[in] src_offset 484061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// The offset into this data from which to start copying an 485061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// endian entity 486061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// 487061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// @param[in] src_len 488061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// The length of the endian data to copy from this object 489061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// into the \a dst object 490061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// 491061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// @param[out] dst 492061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// The buffer where to place the endian data. The data might 493061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// need to be byte swapped (and appropriately padded with 494061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// zeroes if \a src_len != \a dst_len) if \a dst_byte_order 495061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// does not match the byte order in this object. 496061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// 497061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// @param[in] dst_len 498061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// The length number of bytes that the endian value will 499061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// occupy is \a dst. 500061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// 501061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// @param[in] byte_order 502061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// The byte order that the endian value should be in the \a dst 503061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// buffer. 504061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// 505061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// @return 506061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// Returns the number of bytes that were copied, or zero if 507061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton /// anything goes wrong. 508061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton //------------------------------------------------------------------ 50936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t 51036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton CopyByteOrderedData (lldb::offset_t src_offset, 51136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t src_len, 512061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void *dst, 51336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t dst_len, 514061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::ByteOrder dst_byte_order) const; 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Get the data end pointer. 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns a pointer to the next byte contained in this 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// object's data, or NULL of there is no data in this object. 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * 524915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata GetDataEnd () const 525915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 526915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_end; 527915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Get the shared data offset. 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Get the offset of the first byte of data in the shared data (if 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// any). 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// If this object contains shared data, this function returns 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the offset in bytes into that shared data, zero otherwise. 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetSharedDataOffset () const; 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Get a the data start pointer. 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns a pointer to the first byte contained in this 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// object's data, or NULL of there is no data in this object. 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * 550915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata GetDataStart () const 551915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 552915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_start; 553915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a float from \a *offset_ptr. 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single float value. 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 569915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata /// The floating value that was extracted, or zero on failure. 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float 57236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetFloat (lldb::offset_t *offset_ptr) const; 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner double 57536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetDouble (lldb::offset_t *offset_ptr) const; 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long double 57836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetLongDouble (lldb::offset_t *offset_ptr) const; 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a GNU encoded pointer value from \a *offset_ptr. 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] eh_ptr_enc 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The GNU pointer encoding type. 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] pc_rel_addr 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The PC relative address to use when the encoding is 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \c DW_GNU_EH_PE_pcrel. 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] text_addr 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The text (code) relative address to use when the encoding is 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \c DW_GNU_EH_PE_textrel. 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] data_addr 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The data relative address to use when the encoding is 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \c DW_GNU_EH_PE_datarel. 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted GNU encoded pointer value. 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t 60936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetGNUEHPointer (lldb::offset_t *offset_ptr, 61036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t eh_ptr_enc, 61136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::addr_t pc_rel_addr, 61236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::addr_t text_addr, 61336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::addr_t data_addr); 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an integer of size \a byte_size from \a *offset_ptr. 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single integer value and update the offset pointed to 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by \a offset_ptr. The size of the extracted integer is specified 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the \a byte_size argument. \a byte_size should have a value 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// >= 1 and <= 4 since the return value is only 32 bits wide. Any 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a byte_size values less than 1 or greater than 4 will result in 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// nothing being extracted, and zero being returned. 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_size 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in byte of the integer to extract. 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The integer value that was extracted, or zero on failure. 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 63936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetMaxU32 (lldb::offset_t *offset_ptr, size_t byte_size) const; 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an unsigned integer of size \a byte_size from \a 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// *offset_ptr. 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single unsigned integer value and update the offset 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr. The size of the extracted integer 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is specified by the \a byte_size argument. \a byte_size should 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// have a value greater than or equal to one and less than or equal 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to eight since the return value is 64 bits wide. Any 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a byte_size values less than 1 or greater than 8 will result in 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// nothing being extracted, and zero being returned. 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_size 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in byte of the integer to extract. 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The unsigned integer value that was extracted, or zero on 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// failure. 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t 66836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetMaxU64 (lldb::offset_t *offset_ptr, size_t byte_size) const; 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6700fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton uint64_t 67136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetMaxU64_unchecked (lldb::offset_t *offset_ptr, size_t byte_size) const; 6720fea0512e47d1820dd78de2748b874c81eea77d6Greg Clayton 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an signed integer of size \a byte_size from \a *offset_ptr. 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single signed integer value (sign extending if required) 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and update the offset pointed to by \a offset_ptr. The size of 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the extracted integer is specified by the \a byte_size argument. 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a byte_size should have a value greater than or equal to one 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and less than or equal to eight since the return value is 64 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// bits wide. Any \a byte_size values less than 1 or greater than 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8 will result in nothing being extracted, and zero being returned. 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_size 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in byte of the integer to extract. 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The sign extended signed integer value that was extracted, 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// or zero on failure. 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t 69936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetMaxS64 (lldb::offset_t *offset_ptr, size_t size) const; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an unsigned integer of size \a byte_size from \a 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// *offset_ptr, then extract the bitfield from this value if 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a bitfield_bit_size is non-zero. 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single unsigned integer value and update the offset 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr. The size of the extracted integer 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is specified by the \a byte_size argument. \a byte_size should 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// have a value greater than or equal to one and less than or equal 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to 8 since the return value is 64 bits wide. Any 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a byte_size values less than 1 or greater than 8 will result in 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// nothing being extracted, and zero being returned. 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_size 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in byte of the integer to extract. 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] bitfield_bit_size 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in bits of the bitfield value to extract, or zero 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to just extract the entire integer value. 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] bitfield_bit_offset 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The bit offset of the bitfield value in the extracted 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// integer (the number of bits to shift the integer to the 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// right). 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The unsigned bitfield integer value that was extracted, or 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// zero on failure. 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t 73836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetMaxU64Bitfield (lldb::offset_t *offset_ptr, 73936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t size, 74036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t bitfield_bit_size, 74136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t bitfield_bit_offset) const; 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an signed integer of size \a byte_size from \a 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// *offset_ptr, then extract and signe extend the bitfield from 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// this value if \a bitfield_bit_size is non-zero. 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single signed integer value (sign extending if required) 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and update the offset pointed to by \a offset_ptr. The size of 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the extracted integer is specified by the \a byte_size argument. 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a byte_size should have a value greater than or equal to one 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and less than or equal to eight since the return value is 64 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// bits wide. Any \a byte_size values less than 1 or greater than 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 8 will result in nothing being extracted, and zero being returned. 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_size 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in bytes of the integer to extract. 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] bitfield_bit_size 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in bits of the bitfield value to extract, or zero 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to just extract the entire integer value. 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] bitfield_bit_offset 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The bit offset of the bitfield value in the extracted 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// integer (the number of bits to shift the integer to the 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// right). 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The signed bitfield integer value that was extracted, or 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// zero on failure. 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t 78036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetMaxS64Bitfield (lldb::offset_t *offset_ptr, 78136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t size, 78236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t bitfield_bit_size, 78336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t bitfield_bit_offset) const; 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract an pointer from \a *offset_ptr. 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single pointer from the data and update the offset 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr. The size of the extracted pointer 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// comes from the \a m_addr_size member variable and should be 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// set correctly prior to extracting any pointer values. 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted pointer value as a 64 integer. 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t 80436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetPointer (lldb::offset_t *offset_ptr) const; 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Get the current byte order value. 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The current byte order value from this object's internal 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// state. 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ByteOrder 814915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata GetByteOrder() const 815915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 816915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_byte_order; 817915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a uint8_t value from \a *offset_ptr. 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single uint8_t from the binary data at the offset 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr, and advance the offset on success. 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted uint8_t value. 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t 83636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU8 ( lldb::offset_t *offset_ptr) const; 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8385fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton uint8_t 83936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU8_unchecked (lldb::offset_t *offset_ptr) const 8405fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton { 8415fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton uint8_t val = m_start[*offset_ptr]; 842bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton *offset_ptr += 1; 8435fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton return val; 8445fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton } 8455fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8465fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton uint16_t 84736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU16_unchecked (lldb::offset_t *offset_ptr) const; 8485fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8495fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton uint32_t 85036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU32_unchecked (lldb::offset_t *offset_ptr) const; 8515fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 8525fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton uint64_t 85336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU64_unchecked (lldb::offset_t *offset_ptr) const; 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint8_t values from \a *offset_ptr. 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint8_t values from the binary data at the 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset pointed to by \a offset_ptr, and advance the offset on 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// success. The extracted values are copied into \a dst. 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[out] dst 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A buffer to copy \a count uint8_t values into. \a dst must 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be large enough to hold all requested data. 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] count 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of uint8_t values to extract. 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a dst if all values were properly extracted and copied, 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// NULL otherise. 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void * 88036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU8 (lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a uint16_t value from \a *offset_ptr. 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single uint16_t from the binary data at the offset 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr, and update the offset on success. 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted uint16_t value. 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint16_t 89936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU16 (lldb::offset_t *offset_ptr) const; 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint16_t values from \a *offset_ptr. 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint16_t values from the binary data at the 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset pointed to by \a offset_ptr, and advance the offset on 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// success. The extracted values are copied into \a dst. 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[out] dst 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A buffer to copy \a count uint16_t values into. \a dst must 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be large enough to hold all requested data. 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] count 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of uint16_t values to extract. 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a dst if all values were properly extracted and copied, 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// NULL otherise. 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void * 92736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU16 (lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a uint32_t value from \a *offset_ptr. 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single uint32_t from the binary data at the offset 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr, and update the offset on success. 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted uint32_t value. 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 94636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU32 (lldb::offset_t *offset_ptr) const; 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint32_t values from \a *offset_ptr. 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint32_t values from the binary data at the 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset pointed to by \a offset_ptr, and advance the offset on 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// success. The extracted values are copied into \a dst. 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[out] dst 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A buffer to copy \a count uint32_t values into. \a dst must 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be large enough to hold all requested data. 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] count 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of uint32_t values to extract. 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a dst if all values were properly extracted and copied, 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// NULL otherise. 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void * 97436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU32 (lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a uint64_t value from \a *offset_ptr. 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a single uint64_t from the binary data at the offset 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr, and update the offset on success. 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted uint64_t value. 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t 99336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU64 (lldb::offset_t *offset_ptr) const; 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint64_t values from \a *offset_ptr. 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract \a count uint64_t values from the binary data at the 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset pointed to by \a offset_ptr, and advance the offset on 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// success. The extracted values are copied into \a dst. 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[out] dst 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A buffer to copy \a count uint64_t values into. \a dst must 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// be large enough to hold all requested data. 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] count 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of uint64_t values to extract. 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a dst if all values were properly extracted and copied, 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// NULL otherise. 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void * 102136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetU64 ( lldb::offset_t *offset_ptr, void *dst, uint32_t count) const; 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a signed LEB128 value from \a *offset_ptr. 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extracts an signed LEB128 number from this object's data 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// starting at the offset pointed to by \a offset_ptr. The offset 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr will be updated with the offset of 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the byte following the last extracted byte. 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted signed integer value. 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t 104236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetSLEB128 (lldb::offset_t *offset_ptr) const; 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extract a unsigned LEB128 value from \a *offset_ptr. 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Extracts an unsigned LEB128 number from this object's data 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// starting at the offset pointed to by \a offset_ptr. The offset 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// pointed to by \a offset_ptr will be updated with the offset of 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the byte following the last extracted byte. 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The extracted unsigned integer value. 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t 106336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetULEB128 (lldb::offset_t *offset_ptr) const; 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton lldb::DataBufferSP & 106637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetSharedDataBuffer () 106737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 106837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return m_data_sp; 106937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 107037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Peek at a C string at \a offset. 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Peeks at a string in the contained data. No verification is done 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to make sure the entire string lies within the bounds of this 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// object's data, only \a offset is verified to be a valid offset. 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// An offset into the data. 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A non-NULL C string pointer if \a offset is a valid offset, 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// NULL otherwise. 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * 108636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton PeekCStr (lldb::offset_t offset) const; 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Peek at a bytes at \a offset. 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns a pointer to \a length bytes at \a offset as long as 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// there are \a length bytes available starting at \a offset. 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A non-NULL data pointer if \a offset is a valid offset and 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// there are \a length bytes available at that offset, NULL 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// otherwise. 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t* 1100940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton PeekData (lldb::offset_t offset, lldb::offset_t length) const 1101940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton { 1102940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (length > 0 && ValidOffsetForDataOfSize(offset, length)) 1103940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return m_start + offset; 1104940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return NULL; 1105940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton } 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Set the address byte size. 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Set the size in bytes that will be used when extracting any 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// address and pointer values from data contained in this object. 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_size 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The size in bytes to use when extracting addresses. 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 111736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton SetAddressByteSize (uint32_t addr_size) 1118915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 1119915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata m_addr_size = addr_size; 1120915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Set data with a buffer that is caller owned. 112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Use data that is owned by the caller when extracting values. 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The data must stay around as long as this object, or any object 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// that copies a subset of this object's data, is valid. If \a 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// bytes is NULL, or \a length is zero, this object will contain 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// no data. 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] bytes 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to caller owned data. 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] length 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The length in bytes of \a bytes. 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_order 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A byte order of the data that we are extracting from. 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of bytes that this object now contains. 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 114336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t 114436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton SetData (const void *bytes, lldb::offset_t length, lldb::ByteOrder byte_order); 114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Adopt a subset of \a data. 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Set this object's data to be a subset of the data bytes in \a 115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// data. If \a data contains shared data, then a reference to the 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// shared data will be added to ensure the shared data stays around 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// as long as any objects have references to the shared data. The 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// byte order and the address size settings are copied from \a 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// data. If \a offset is not a valid offset in \a data, then no 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// reference to the shared data will be added. If there are not 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a length bytes available in \a data starting at \a offset, 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// the length will be truncated to contains as many bytes as 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// possible. 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] data 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Another DataExtractor object that contains data. 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset into \a data at which the subset starts. 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] length 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The length in bytes of the subset of \a data. 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of bytes that this object now contains. 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 117236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t 117336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton SetData (const DataExtractor& data, lldb::offset_t offset, lldb::offset_t length); 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Adopt a subset of shared data in \a data_sp. 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Copies the data shared pointer which adds a reference to the 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// contained in \a data_sp. The shared data reference is reference 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// counted to ensure the data lives as long as anyone still has a 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// valid shared pointer to the data in \a data_sp. The byte order 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// and address byte size settings remain the same. If 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a offset is not a valid offset in \a data_sp, then no reference 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to the shared data will be added. If there are not \a length 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// bytes available in \a data starting at \a offset, the length 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// will be truncated to contains as many bytes as possible. 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] data_sp 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A shared pointer to data. 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] offset 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The offset into \a data_sp at which the subset starts. 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] length 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The length in bytes of the subset of \a data_sp. 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The number of bytes that this object now contains. 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 120036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t 120136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton SetData (const lldb::DataBufferSP& data_sp, lldb::offset_t offset = 0, lldb::offset_t length = LLDB_INVALID_OFFSET); 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Set the byte_order value. 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Sets the byte order of the data to extract. Extracted values 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// will be swapped if necessary when decoding. 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] byte_order 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The byte order value to use when extracting data. 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 1213915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata SetByteOrder (lldb::ByteOrder byte_order) 1214915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 1215915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata m_byte_order = byte_order; 1216915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Skip an LEB128 number at \a *offset_ptr. 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Skips a LEB128 number (signed or unsigned) from this object's 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// data starting at the offset pointed to by \a offset_ptr. The 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset pointed to by \a offset_ptr will be updated with the 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// offset of the byte following the last extracted byte. 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in,out] offset_ptr 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to an offset within the data that will be advanced 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// by the appropriate number of bytes if the value is extracted 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// correctly. If the offset is out of bounds or there are not 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// enough bytes to extract this value, the offset will be left 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// unmodified. 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The number of bytes consumed during the extraction. 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 123736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Skip_LEB128 (lldb::offset_t *offset_ptr) const; 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Test the validity of \a offset. 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if \a offset is a valid offset into the data in this 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// object, \b false otherwise. 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 124736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton ValidOffset (lldb::offset_t offset) const 1248915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 1249915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return offset < GetByteSize(); 1250915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Test the availability of \a length bytes of data from \a offset. 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if \a offset is a valid offset and there are \a 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// length bytes available at that offset, \b false otherwise. 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 1260940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton ValidOffsetForDataOfSize (lldb::offset_t offset, lldb::offset_t length) const 1261940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton { 12624bc40781466dd9d2de0d51fec5feb342ea45e87fGreg Clayton return length <= BytesLeft (offset); 1263940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton } 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1265915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata size_t 1266915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Copy (DataExtractor& dest_data) const; 1267915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1268915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool 1269915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Append (DataExtractor& rhs); 1270915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1271915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool 127236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Append (void* bytes, lldb::offset_t length); 1273d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton 1274940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton lldb::offset_t 1275940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton BytesLeft (lldb::offset_t offset) const 1276940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton { 1277940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const lldb::offset_t size = GetByteSize(); 12784bc40781466dd9d2de0d51fec5feb342ea45e87fGreg Clayton if (size > offset) 12794bc40781466dd9d2de0d51fec5feb342ea45e87fGreg Clayton return size - offset; 12804bc40781466dd9d2de0d51fec5feb342ea45e87fGreg Clayton return 0; 1281940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton } 1282d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton 1283d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Claytonprotected: 1284940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Member variables 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * m_start; ///< A pointer to the first byte of data. 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * m_end; ///< A pointer to the byte that is past the end of the data. 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ByteOrder m_byte_order; ///< The byte order of the data we are extracting from. 129136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t m_addr_size; ///< The address size to use when extracting pointers or addresses 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mutable lldb::DataBufferSP m_data_sp; ///< The shared pointer to data that can be shared among multilple instances 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #if defined (__cplusplus) 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #ifndef liblldb_DataExtractor_h_ 1299