1 //===-- SBData.h -----------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_API_SBDATA_H 10 #define LLDB_API_SBDATA_H 11 12 #include "lldb/API/SBDefines.h" 13 14 namespace lldb_private { 15 class ScriptInterpreter; 16 } // namespace lldb_private 17 18 namespace lldb { 19 20 class LLDB_API SBData { 21 public: 22 SBData(); 23 24 SBData(const SBData &rhs); 25 26 const SBData &operator=(const SBData &rhs); 27 28 ~SBData(); 29 30 uint8_t GetAddressByteSize(); 31 32 void SetAddressByteSize(uint8_t addr_byte_size); 33 34 void Clear(); 35 36 explicit operator bool() const; 37 38 bool IsValid(); 39 40 size_t GetByteSize(); 41 42 lldb::ByteOrder GetByteOrder(); 43 44 void SetByteOrder(lldb::ByteOrder endian); 45 46 float GetFloat(lldb::SBError &error, lldb::offset_t offset); 47 48 double GetDouble(lldb::SBError &error, lldb::offset_t offset); 49 50 long double GetLongDouble(lldb::SBError &error, lldb::offset_t offset); 51 52 lldb::addr_t GetAddress(lldb::SBError &error, lldb::offset_t offset); 53 54 uint8_t GetUnsignedInt8(lldb::SBError &error, lldb::offset_t offset); 55 56 uint16_t GetUnsignedInt16(lldb::SBError &error, lldb::offset_t offset); 57 58 uint32_t GetUnsignedInt32(lldb::SBError &error, lldb::offset_t offset); 59 60 uint64_t GetUnsignedInt64(lldb::SBError &error, lldb::offset_t offset); 61 62 int8_t GetSignedInt8(lldb::SBError &error, lldb::offset_t offset); 63 64 int16_t GetSignedInt16(lldb::SBError &error, lldb::offset_t offset); 65 66 int32_t GetSignedInt32(lldb::SBError &error, lldb::offset_t offset); 67 68 int64_t GetSignedInt64(lldb::SBError &error, lldb::offset_t offset); 69 70 const char *GetString(lldb::SBError &error, lldb::offset_t offset); 71 72 size_t ReadRawData(lldb::SBError &error, lldb::offset_t offset, void *buf, 73 size_t size); 74 75 bool GetDescription(lldb::SBStream &description, 76 lldb::addr_t base_addr = LLDB_INVALID_ADDRESS); 77 78 // it would be nice to have SetData(SBError, const void*, size_t) when 79 // endianness and address size can be inferred from the existing 80 // DataExtractor, but having two SetData() signatures triggers a SWIG bug 81 // where the typemap isn't applied before resolving the overload, and thus 82 // the right function never gets called 83 void SetData(lldb::SBError &error, const void *buf, size_t size, 84 lldb::ByteOrder endian, uint8_t addr_size); 85 86 void SetDataWithOwnership(lldb::SBError &error, const void *buf, size_t size, 87 lldb::ByteOrder endian, uint8_t addr_size); 88 89 // see SetData() for why we don't have Append(const void* buf, size_t size) 90 bool Append(const SBData &rhs); 91 92 static lldb::SBData CreateDataFromCString(lldb::ByteOrder endian, 93 uint32_t addr_byte_size, 94 const char *data); 95 96 // in the following CreateData*() and SetData*() prototypes, the two 97 // parameters array and array_len should not be renamed or rearranged, 98 // because doing so will break the SWIG typemap 99 static lldb::SBData CreateDataFromUInt64Array(lldb::ByteOrder endian, 100 uint32_t addr_byte_size, 101 uint64_t *array, 102 size_t array_len); 103 104 static lldb::SBData CreateDataFromUInt32Array(lldb::ByteOrder endian, 105 uint32_t addr_byte_size, 106 uint32_t *array, 107 size_t array_len); 108 109 static lldb::SBData CreateDataFromSInt64Array(lldb::ByteOrder endian, 110 uint32_t addr_byte_size, 111 int64_t *array, 112 size_t array_len); 113 114 static lldb::SBData CreateDataFromSInt32Array(lldb::ByteOrder endian, 115 uint32_t addr_byte_size, 116 int32_t *array, 117 size_t array_len); 118 119 static lldb::SBData CreateDataFromDoubleArray(lldb::ByteOrder endian, 120 uint32_t addr_byte_size, 121 double *array, 122 size_t array_len); 123 124 bool SetDataFromCString(const char *data); 125 126 bool SetDataFromUInt64Array(uint64_t *array, size_t array_len); 127 128 bool SetDataFromUInt32Array(uint32_t *array, size_t array_len); 129 130 bool SetDataFromSInt64Array(int64_t *array, size_t array_len); 131 132 bool SetDataFromSInt32Array(int32_t *array, size_t array_len); 133 134 bool SetDataFromDoubleArray(double *array, size_t array_len); 135 136 protected: 137 // Mimic shared pointer... 138 lldb_private::DataExtractor *get() const; 139 140 lldb_private::DataExtractor *operator->() const; 141 142 lldb::DataExtractorSP &operator*(); 143 144 const lldb::DataExtractorSP &operator*() const; 145 146 SBData(const lldb::DataExtractorSP &data_sp); 147 148 void SetOpaque(const lldb::DataExtractorSP &data_sp); 149 150 private: 151 friend class SBInstruction; 152 friend class SBProcess; 153 friend class SBSection; 154 friend class SBTarget; 155 friend class SBValue; 156 157 friend class lldb_private::ScriptInterpreter; 158 159 lldb::DataExtractorSP m_opaque_sp; 160 }; 161 162 } // namespace lldb 163 164 #endif // LLDB_API_SBDATA_H 165