1d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//===-- DataEncoder.cpp ---------------------------------------*- C++ -*-===// 2d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// 3d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// The LLVM Compiler Infrastructure 4d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// 5d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// This file is distributed under the University of Illinois Open Source 6d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// License. See LICENSE.TXT for details. 7d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// 8d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//===----------------------------------------------------------------------===// 9d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 10d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton#include "lldb/Core/DataEncoder.h" 11d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 12d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton#include <assert.h> 13d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton#include <stddef.h> 14d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 15d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton#include "llvm/Support/MathExtras.h" 16d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 17d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton#include "lldb/Core/DataBuffer.h" 18d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton#include "lldb/Host/Endian.h" 19d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 20d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonusing namespace lldb; 21d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonusing namespace lldb_private; 22d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 23d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonstatic inline void 24d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonWriteInt16(const unsigned char* ptr, unsigned offset, uint16_t value) 25d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 26d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton *(uint16_t *)(ptr + offset) = value; 27d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 28d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonstatic inline void 29d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonWriteInt32 (const unsigned char* ptr, unsigned offset, uint32_t value) 30d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 31d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton *(uint32_t *)(ptr + offset) = value; 32d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 33d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 34d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonstatic inline void 35d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonWriteInt64(const unsigned char* ptr, unsigned offset, uint64_t value) 36d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 37d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton *(uint64_t *)(ptr + offset) = value; 38d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 39d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 40d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonstatic inline void 41d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonWriteSwappedInt16(const unsigned char* ptr, unsigned offset, uint16_t value) 42d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 43d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton *(uint16_t *)(ptr + offset) = llvm::ByteSwap_16(value); 44d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 45d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 46d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonstatic inline void 47d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonWriteSwappedInt32 (const unsigned char* ptr, unsigned offset, uint32_t value) 48d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 49d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton *(uint32_t *)(ptr + offset) = llvm::ByteSwap_32(value); 50d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 51d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 52d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonstatic inline void 53d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonWriteSwappedInt64(const unsigned char* ptr, unsigned offset, uint64_t value) 54d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 55d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton *(uint64_t *)(ptr + offset) = llvm::ByteSwap_64(value); 56d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 57d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 58d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 59d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Default constructor. 60d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 61d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::DataEncoder () : 62d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start (NULL), 63d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end (NULL), 64d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_byte_order(lldb::endian::InlHostByteOrder()), 65d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_addr_size (sizeof(void*)), 66d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_data_sp () 67d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 68d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 69d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 70d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 71d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// This constructor allows us to use data that is owned by someone else. 72d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// The data must stay around as long as this object is valid. 73d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 74d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::DataEncoder (void* data, uint32_t length, ByteOrder endian, uint8_t addr_size) : 75d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start ((uint8_t*)data), 76d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end ((uint8_t*)data + length), 77d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_byte_order(endian), 78d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_addr_size (addr_size), 79d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_data_sp () 80d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 81d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 82d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 83d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 84d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Make a shared pointer reference to the shared data in "data_sp" and 85d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// set the endian swapping setting to "swap", and the address size to 86d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// "addr_size". The shared data reference will ensure the data lives 87d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// as long as any DataEncoder objects exist that have a reference to 88d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// this data. 89d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 90d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::DataEncoder (const DataBufferSP& data_sp, ByteOrder endian, uint8_t addr_size) : 91d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start (NULL), 92d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end (NULL), 93d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_byte_order(endian), 94d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_addr_size (addr_size), 95d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_data_sp () 96d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 97d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton SetData (data_sp); 98d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 99d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 100d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 101d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Destructor 102d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 103d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::~DataEncoder () 104d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 105d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 106d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 107d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//------------------------------------------------------------------ 108d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Clears the object contents back to a default invalid state, and 109d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// release any references to shared data that this object may 110d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// contain. 111d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//------------------------------------------------------------------ 112d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonvoid 113d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::Clear () 114d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 115d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start = NULL; 116d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end = NULL; 117d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_byte_order = lldb::endian::InlHostByteOrder(); 118d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_addr_size = sizeof(void*); 119d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_data_sp.reset(); 120d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 121d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 122d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//------------------------------------------------------------------ 123d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// If this object contains shared data, this function returns the 124d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// offset into that shared data. Else zero is returned. 125d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//------------------------------------------------------------------ 126d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonsize_t 127d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::GetSharedDataOffset () const 128d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 129d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (m_start != NULL) 130d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 131d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton const DataBuffer * data = m_data_sp.get(); 132d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (data != NULL) 133d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 134d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton const uint8_t * data_bytes = data->GetBytes(); 135d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (data_bytes != NULL) 136d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 137d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton assert(m_start >= data_bytes); 138d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return m_start - data_bytes; 139d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 140d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 141d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 142d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return 0; 143d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 144d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 145d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 146d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Set the data with which this object will extract from to data 147d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// starting at BYTES and set the length of the data to LENGTH bytes 148d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// long. The data is externally owned must be around at least as 149d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// long as this object points to the data. No copy of the data is 150d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// made, this object just refers to this data and can extract from 151d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// it. If this object refers to any shared data upon entry, the 152d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// reference to that data will be released. Is SWAP is set to true, 153d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// any data extracted will be endian swapped. 154d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 155d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 156d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::SetData (const void *bytes, uint32_t length, ByteOrder endian) 157d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 158d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_byte_order = endian; 159d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_data_sp.reset(); 160d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (bytes == NULL || length == 0) 161d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 162d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start = NULL; 163d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end = NULL; 164d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 165d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton else 166d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 167d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start = (uint8_t *)bytes; 168d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end = m_start + length; 169d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 170d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return GetByteSize(); 171d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 172d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 173d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 174d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Assign the data for this object to be a subrange of the shared 175d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// data in "data_sp" starting "data_offset" bytes into "data_sp" 176d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// and ending "data_length" bytes later. If "data_offset" is not 177d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// a valid offset into "data_sp", then this object will contain no 178d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// bytes. If "data_offset" is within "data_sp" yet "data_length" is 179d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// too large, the length will be capped at the number of bytes 180d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// remaining in "data_sp". A ref counted pointer to the data in 181d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// "data_sp" will be made in this object IF the number of bytes this 182d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// object refers to in greater than zero (if at least one byte was 183d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// available starting at "data_offset") to ensure the data stays 184d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// around as long as it is needed. The address size and endian swap 185d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// settings will remain unchanged from their current settings. 186d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 187d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 188d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::SetData (const DataBufferSP& data_sp, uint32_t data_offset, uint32_t data_length) 189d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 190d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start = m_end = NULL; 191d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 192d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (data_length > 0) 193d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 194d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_data_sp = data_sp; 195d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (data_sp.get()) 196d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 197d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton const size_t data_size = data_sp->GetByteSize(); 198d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (data_offset < data_size) 199d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 200d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start = data_sp->GetBytes() + data_offset; 201d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton const size_t bytes_left = data_size - data_offset; 202d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton // Cap the length of we asked for too many 203d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (data_length <= bytes_left) 204d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end = m_start + data_length; // We got all the bytes we wanted 205d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton else 206d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_end = m_start + bytes_left; // Not all the bytes requested were available in the shared data 207d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 208d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 209d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 210d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 211d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton uint32_t new_size = GetByteSize(); 212d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 213d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton // Don't hold a shared pointer to the data buffer if we don't share 214d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton // any valid bytes in the shared buffer. 215d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (new_size == 0) 216d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_data_sp.reset(); 217d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 218d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return new_size; 219d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 220d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 221d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 222d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Extract a single unsigned char from the binary data and update 223d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// the offset pointed to by "offset_ptr". 224d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// 225d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// RETURNS the byte that was extracted, or zero on failure. 226d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 227d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 228d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutU8 (uint32_t offset, uint8_t value) 229d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 230d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (ValidOffset(offset)) 231d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 232d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton m_start[offset] = value; 233d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return offset + 1; 234d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 235d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return UINT32_MAX; 236d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 237d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 238d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 239d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutU16 (uint32_t offset, uint16_t value) 240d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 241d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (ValidOffsetForDataOfSize(offset, sizeof(value))) 242d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 243d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (m_byte_order != lldb::endian::InlHostByteOrder()) 244d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton WriteSwappedInt16 (m_start, offset, value); 245d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton else 246d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton WriteInt16 (m_start, offset, value); 247d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 248d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return offset + sizeof (value); 249d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 250d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return UINT32_MAX; 251d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 252d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 253d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 254d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutU32 (uint32_t offset, uint32_t value) 255d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 256d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (ValidOffsetForDataOfSize(offset, sizeof(value))) 257d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 258d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (m_byte_order != lldb::endian::InlHostByteOrder()) 259d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton WriteSwappedInt32 (m_start, offset, value); 260d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton else 261d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton WriteInt32 (m_start, offset, value); 262d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 263d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return offset + sizeof (value); 264d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 265d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return UINT32_MAX; 266d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 267d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 268d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 269d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutU64 (uint32_t offset, uint64_t value) 270d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 271d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (ValidOffsetForDataOfSize(offset, sizeof(value))) 272d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 273d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (m_byte_order != lldb::endian::InlHostByteOrder()) 274d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton WriteSwappedInt64 (m_start, offset, value); 275d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton else 276d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton WriteInt64 (m_start, offset, value); 277d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 278d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return offset + sizeof (value); 279d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 280d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return UINT32_MAX; 281d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 282d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 283d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 284d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// Extract a single integer value from the data and update the offset 285d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// pointed to by "offset_ptr". The size of the extracted integer 286d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// is specified by the "byte_size" argument. "byte_size" should have 287d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// a value >= 1 and <= 8 since the return value is only 64 bits 288d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// wide. Any "byte_size" values less than 1 or greater than 8 will 289d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// result in nothing being extracted, and zero being returned. 290d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// 291d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton// RETURNS the integer value that was extracted, or zero on failure. 292d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton//---------------------------------------------------------------------- 293d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 294d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutMaxU64 (uint32_t offset, uint32_t byte_size, uint64_t value) 295d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 296d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton switch (byte_size) 297d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 298d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton case 1: return PutU8 (offset, value); 299d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton case 2: return PutU16(offset, value); 300d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton case 4: return PutU32(offset, value); 301d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton case 8: return PutU64(offset, value); 302d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton default: 303d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton assert(!"GetMax64 unhandled case!"); 304d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton break; 305d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 306d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return UINT32_MAX; 307d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 308d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 309d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 310d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutData (uint32_t offset, const void *src, uint32_t src_len) 311d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 312d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (src == NULL || src_len == 0) 313d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return offset; 314d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 315d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (ValidOffsetForDataOfSize(offset, src_len)) 316d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton { 317d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton memcpy (m_start + offset, src, src_len); 318d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return offset + src_len; 319d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton } 320d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return UINT32_MAX; 321d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 322d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 323d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 324d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutAddress (uint32_t offset, lldb::addr_t addr) 325d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 326d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return PutMaxU64 (offset, GetAddressByteSize(), addr); 327d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 328d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton 329d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Claytonuint32_t 330d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg ClaytonDataEncoder::PutCString (uint32_t offset, const char *cstr) 331d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton{ 332d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton if (cstr) 33397b8f66b4f4d1b47c94155b1a9917d9652a8aceaGreg Clayton return PutData (offset, cstr, strlen(cstr) + 1); 334d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton return UINT32_MAX; 335d84cc042a09c9aa7f89f8b032ba3a346a25d9447Greg Clayton} 336