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