//===-- SBData.h -----------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_API_SBDATA_H #define LLDB_API_SBDATA_H #include "lldb/API/SBDefines.h" namespace lldb_private { class ScriptInterpreter; } // namespace lldb_private namespace lldb { class LLDB_API SBData { public: SBData(); SBData(const SBData &rhs); const SBData &operator=(const SBData &rhs); ~SBData(); uint8_t GetAddressByteSize(); void SetAddressByteSize(uint8_t addr_byte_size); void Clear(); explicit operator bool() const; bool IsValid(); size_t GetByteSize(); lldb::ByteOrder GetByteOrder(); void SetByteOrder(lldb::ByteOrder endian); float GetFloat(lldb::SBError &error, lldb::offset_t offset); double GetDouble(lldb::SBError &error, lldb::offset_t offset); long double GetLongDouble(lldb::SBError &error, lldb::offset_t offset); lldb::addr_t GetAddress(lldb::SBError &error, lldb::offset_t offset); uint8_t GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset); uint16_t GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset); uint32_t GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset); uint64_t GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset); int8_t GetSignedInt8(lldb::SBError &error, lldb::offset_t offset); int16_t GetSignedInt16(lldb::SBError &error, lldb::offset_t offset); int32_t GetSignedInt32(lldb::SBError &error, lldb::offset_t offset); int64_t GetSignedInt64(lldb::SBError &error, lldb::offset_t offset); const char *GetString(lldb::SBError &error, lldb::offset_t offset); size_t ReadRawData(lldb::SBError &error, lldb::offset_t offset, void *buf, size_t size); bool GetDescription(lldb::SBStream &description, lldb::addr_t base_addr = LLDB_INVALID_ADDRESS); // it would be nice to have SetData(SBError, const void*, size_t) when // endianness and address size can be inferred from the existing // DataExtractor, but having two SetData() signatures triggers a SWIG bug // where the typemap isn't applied before resolving the overload, and thus // the right function never gets called void SetData(lldb::SBError &error, const void *buf, size_t size, lldb::ByteOrder endian, uint8_t addr_size); void SetDataWithOwnership(lldb::SBError &error, const void *buf, size_t size, lldb::ByteOrder endian, uint8_t addr_size); // see SetData() for why we don't have Append(const void* buf, size_t size) bool Append(const SBData &rhs); static lldb::SBData CreateDataFromCString(lldb::ByteOrder endian, uint32_t addr_byte_size, const char *data); // in the following CreateData*() and SetData*() prototypes, the two // parameters array and array_len should not be renamed or rearranged, // because doing so will break the SWIG typemap static lldb::SBData CreateDataFromUInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t *array, size_t array_len); static lldb::SBData CreateDataFromUInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t *array, size_t array_len); static lldb::SBData CreateDataFromSInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t *array, size_t array_len); static lldb::SBData CreateDataFromSInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t *array, size_t array_len); static lldb::SBData CreateDataFromDoubleArray(lldb::ByteOrder endian, uint32_t addr_byte_size, double *array, size_t array_len); bool SetDataFromCString(const char *data); bool SetDataFromUInt64Array(uint64_t *array, size_t array_len); bool SetDataFromUInt32Array(uint32_t *array, size_t array_len); bool SetDataFromSInt64Array(int64_t *array, size_t array_len); bool SetDataFromSInt32Array(int32_t *array, size_t array_len); bool SetDataFromDoubleArray(double *array, size_t array_len); protected: // Mimic shared pointer... lldb_private::DataExtractor *get() const; lldb_private::DataExtractor *operator->() const; lldb::DataExtractorSP &operator*(); const lldb::DataExtractorSP &operator*() const; SBData(const lldb::DataExtractorSP &data_sp); void SetOpaque(const lldb::DataExtractorSP &data_sp); private: friend class SBInstruction; friend class SBProcess; friend class SBSection; friend class SBTarget; friend class SBValue; friend class lldb_private::ScriptInterpreter; lldb::DataExtractorSP m_opaque_sp; }; } // namespace lldb #endif // LLDB_API_SBDATA_H