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   // see SetData() for why we don't have Append(const void* buf, size_t size)
87   bool Append(const SBData &rhs);
88 
89   static lldb::SBData CreateDataFromCString(lldb::ByteOrder endian,
90                                             uint32_t addr_byte_size,
91                                             const char *data);
92 
93   // in the following CreateData*() and SetData*() prototypes, the two
94   // parameters array and array_len should not be renamed or rearranged,
95   // because doing so will break the SWIG typemap
96   static lldb::SBData CreateDataFromUInt64Array(lldb::ByteOrder endian,
97                                                 uint32_t addr_byte_size,
98                                                 uint64_t *array,
99                                                 size_t array_len);
100 
101   static lldb::SBData CreateDataFromUInt32Array(lldb::ByteOrder endian,
102                                                 uint32_t addr_byte_size,
103                                                 uint32_t *array,
104                                                 size_t array_len);
105 
106   static lldb::SBData CreateDataFromSInt64Array(lldb::ByteOrder endian,
107                                                 uint32_t addr_byte_size,
108                                                 int64_t *array,
109                                                 size_t array_len);
110 
111   static lldb::SBData CreateDataFromSInt32Array(lldb::ByteOrder endian,
112                                                 uint32_t addr_byte_size,
113                                                 int32_t *array,
114                                                 size_t array_len);
115 
116   static lldb::SBData CreateDataFromDoubleArray(lldb::ByteOrder endian,
117                                                 uint32_t addr_byte_size,
118                                                 double *array,
119                                                 size_t array_len);
120 
121   bool SetDataFromCString(const char *data);
122 
123   bool SetDataFromUInt64Array(uint64_t *array, size_t array_len);
124 
125   bool SetDataFromUInt32Array(uint32_t *array, size_t array_len);
126 
127   bool SetDataFromSInt64Array(int64_t *array, size_t array_len);
128 
129   bool SetDataFromSInt32Array(int32_t *array, size_t array_len);
130 
131   bool SetDataFromDoubleArray(double *array, size_t array_len);
132 
133 protected:
134   // Mimic shared pointer...
135   lldb_private::DataExtractor *get() const;
136 
137   lldb_private::DataExtractor *operator->() const;
138 
139   lldb::DataExtractorSP &operator*();
140 
141   const lldb::DataExtractorSP &operator*() const;
142 
143   SBData(const lldb::DataExtractorSP &data_sp);
144 
145   void SetOpaque(const lldb::DataExtractorSP &data_sp);
146 
147 private:
148   friend class SBInstruction;
149   friend class SBProcess;
150   friend class SBSection;
151   friend class SBTarget;
152   friend class SBValue;
153 
154   friend class lldb_private::ScriptInterpreter;
155 
156   lldb::DataExtractorSP m_opaque_sp;
157 };
158 
159 } // namespace lldb
160 
161 #endif // LLDB_API_SBDATA_H
162