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