1254721Semaste//===-- RegisterValue.h ------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef lldb_RegisterValue_h
11254721Semaste#define lldb_RegisterValue_h
12254721Semaste
13254721Semaste// C Includes
14254721Semaste#include <string.h>
15254721Semaste
16254721Semaste// C++ Includes
17254721Semaste// Other libraries and framework includes
18254721Semaste// Project includes
19254721Semaste#include "lldb/lldb-public.h"
20254721Semaste#include "lldb/lldb-private.h"
21254721Semaste#include "lldb/Host/Endian.h"
22254721Semaste
23254721Semaste//#define ENABLE_128_BIT_SUPPORT 1
24254721Semastenamespace lldb_private {
25254721Semaste
26254721Semaste    class RegisterValue
27254721Semaste    {
28254721Semaste    public:
29254721Semaste        enum
30254721Semaste        {
31254721Semaste            kMaxRegisterByteSize = 32u
32254721Semaste        };
33254721Semaste        enum Type
34254721Semaste        {
35254721Semaste            eTypeInvalid,
36254721Semaste            eTypeUInt8,
37254721Semaste            eTypeUInt16,
38254721Semaste            eTypeUInt32,
39254721Semaste            eTypeUInt64,
40254721Semaste#if defined (ENABLE_128_BIT_SUPPORT)
41254721Semaste            eTypeUInt128,
42254721Semaste#endif
43254721Semaste            eTypeFloat,
44254721Semaste            eTypeDouble,
45254721Semaste            eTypeLongDouble,
46254721Semaste            eTypeBytes
47254721Semaste        };
48254721Semaste
49254721Semaste        RegisterValue () :
50254721Semaste            m_type (eTypeInvalid)
51254721Semaste        {
52254721Semaste        }
53254721Semaste
54254721Semaste        explicit
55254721Semaste        RegisterValue (uint8_t inst) :
56254721Semaste            m_type (eTypeUInt8)
57254721Semaste        {
58254721Semaste            m_data.uint8 = inst;
59254721Semaste        }
60254721Semaste
61254721Semaste        explicit
62254721Semaste        RegisterValue (uint16_t inst) :
63254721Semaste            m_type (eTypeUInt16)
64254721Semaste        {
65254721Semaste            m_data.uint16 = inst;
66254721Semaste        }
67254721Semaste
68254721Semaste        explicit
69254721Semaste        RegisterValue (uint32_t inst) :
70254721Semaste            m_type (eTypeUInt32)
71254721Semaste        {
72254721Semaste            m_data.uint32 = inst;
73254721Semaste        }
74254721Semaste
75254721Semaste        explicit
76254721Semaste        RegisterValue (uint64_t inst) :
77254721Semaste            m_type (eTypeUInt64)
78254721Semaste        {
79254721Semaste            m_data.uint64 = inst;
80254721Semaste        }
81254721Semaste
82254721Semaste#if defined (ENABLE_128_BIT_SUPPORT)
83254721Semaste        explicit
84254721Semaste        RegisterValue (__uint128_t inst) :
85254721Semaste            m_type (eTypeUInt128)
86254721Semaste        {
87254721Semaste            m_data.uint128 = inst;
88254721Semaste        }
89254721Semaste#endif
90254721Semaste        explicit
91254721Semaste        RegisterValue (float value) :
92254721Semaste            m_type (eTypeFloat)
93254721Semaste        {
94254721Semaste            m_data.ieee_float = value;
95254721Semaste        }
96254721Semaste
97254721Semaste        explicit
98254721Semaste        RegisterValue (double value) :
99254721Semaste            m_type (eTypeDouble)
100254721Semaste        {
101254721Semaste            m_data.ieee_double = value;
102254721Semaste        }
103254721Semaste
104254721Semaste        explicit
105254721Semaste        RegisterValue (long double value) :
106254721Semaste            m_type (eTypeLongDouble)
107254721Semaste        {
108254721Semaste            m_data.ieee_long_double = value;
109254721Semaste        }
110254721Semaste
111254721Semaste        explicit
112254721Semaste        RegisterValue (uint8_t *bytes, size_t length, lldb::ByteOrder byte_order)
113254721Semaste        {
114254721Semaste            SetBytes (bytes, length, byte_order);
115254721Semaste        }
116254721Semaste
117254721Semaste        RegisterValue::Type
118254721Semaste        GetType () const
119254721Semaste        {
120254721Semaste            return m_type;
121254721Semaste        }
122254721Semaste
123254721Semaste        bool
124254721Semaste        CopyValue (const RegisterValue &rhs);
125254721Semaste
126254721Semaste        void
127254721Semaste        SetType (RegisterValue::Type type)
128254721Semaste        {
129254721Semaste            m_type = type;
130254721Semaste        }
131254721Semaste
132254721Semaste        RegisterValue::Type
133254721Semaste        SetType (const RegisterInfo *reg_info);
134254721Semaste
135254721Semaste        bool
136254721Semaste        GetData (DataExtractor &data) const;
137254721Semaste
138254721Semaste        // Copy the register value from this object into a buffer in "dst"
139254721Semaste        // and obey the "dst_byte_order" when copying the data. Also watch out
140254721Semaste        // in case "dst_len" is longer or shorter than the register value
141254721Semaste        // described by "reg_info" and only copy the least significant bytes
142254721Semaste        // of the register value, or pad the destination with zeroes if the
143254721Semaste        // register byte size is shorter that "dst_len" (all while correctly
144254721Semaste        // abiding the "dst_byte_order"). Returns the number of bytes copied
145254721Semaste        // into "dst".
146254721Semaste        uint32_t
147254721Semaste        GetAsMemoryData (const RegisterInfo *reg_info,
148254721Semaste                         void *dst,
149254721Semaste                         uint32_t dst_len,
150254721Semaste                         lldb::ByteOrder dst_byte_order,
151254721Semaste                         Error &error) const;
152254721Semaste
153254721Semaste        uint32_t
154254721Semaste        SetFromMemoryData (const RegisterInfo *reg_info,
155254721Semaste                           const void *src,
156254721Semaste                           uint32_t src_len,
157254721Semaste                           lldb::ByteOrder src_byte_order,
158254721Semaste                           Error &error);
159254721Semaste
160254721Semaste        bool
161254721Semaste        GetScalarValue (Scalar &scalar) const;
162254721Semaste
163254721Semaste        uint8_t
164254721Semaste        GetAsUInt8 (uint8_t fail_value = UINT8_MAX, bool *success_ptr = NULL) const
165254721Semaste        {
166254721Semaste            if (m_type == eTypeUInt8)
167254721Semaste            {
168254721Semaste                if (success_ptr)
169254721Semaste                    *success_ptr = true;
170254721Semaste                return m_data.uint8;
171254721Semaste            }
172254721Semaste            if (success_ptr)
173254721Semaste                *success_ptr = true;
174254721Semaste            return fail_value;
175254721Semaste        }
176254721Semaste
177254721Semaste        uint16_t
178254721Semaste        GetAsUInt16 (uint16_t fail_value = UINT16_MAX, bool *success_ptr = NULL) const;
179254721Semaste
180254721Semaste        uint32_t
181254721Semaste        GetAsUInt32 (uint32_t fail_value = UINT32_MAX, bool *success_ptr = NULL) const;
182254721Semaste
183254721Semaste        uint64_t
184254721Semaste        GetAsUInt64 (uint64_t fail_value = UINT64_MAX, bool *success_ptr = NULL) const;
185254721Semaste
186254721Semaste#if defined (ENABLE_128_BIT_SUPPORT)
187254721Semaste        __uint128_t
188254721Semaste        GetAsUInt128 (__uint128_t fail_value = ~((__uint128_t)0), bool *success_ptr = NULL) const;
189254721Semaste#endif
190254721Semaste
191254721Semaste        float
192254721Semaste        GetAsFloat (float fail_value = 0.0f, bool *success_ptr = NULL) const;
193254721Semaste
194254721Semaste        double
195254721Semaste        GetAsDouble (double fail_value = 0.0, bool *success_ptr = NULL) const;
196254721Semaste
197254721Semaste        long double
198254721Semaste        GetAsLongDouble (long double fail_value = 0.0, bool *success_ptr = NULL) const;
199254721Semaste
200254721Semaste        void
201254721Semaste        SetValueToInvalid ()
202254721Semaste        {
203254721Semaste            m_type = eTypeInvalid;
204254721Semaste        }
205254721Semaste
206254721Semaste        bool
207254721Semaste        ClearBit (uint32_t bit);
208254721Semaste
209254721Semaste        bool
210254721Semaste        SetBit (uint32_t bit);
211254721Semaste
212254721Semaste        bool
213254721Semaste        operator == (const RegisterValue &rhs) const;
214254721Semaste
215254721Semaste        bool
216254721Semaste        operator != (const RegisterValue &rhs) const;
217254721Semaste
218254721Semaste        void
219254721Semaste        operator = (uint8_t uint)
220254721Semaste        {
221254721Semaste            m_type = eTypeUInt8;
222254721Semaste            m_data.uint8 = uint;
223254721Semaste        }
224254721Semaste
225254721Semaste        void
226254721Semaste        operator = (uint16_t uint)
227254721Semaste        {
228254721Semaste            m_type = eTypeUInt16;
229254721Semaste            m_data.uint16 = uint;
230254721Semaste        }
231254721Semaste
232254721Semaste        void
233254721Semaste        operator = (uint32_t uint)
234254721Semaste        {
235254721Semaste            m_type = eTypeUInt32;
236254721Semaste            m_data.uint32 = uint;
237254721Semaste        }
238254721Semaste
239254721Semaste        void
240254721Semaste        operator = (uint64_t uint)
241254721Semaste        {
242254721Semaste            m_type = eTypeUInt64;
243254721Semaste            m_data.uint64 = uint;
244254721Semaste        }
245254721Semaste
246254721Semaste#if defined (ENABLE_128_BIT_SUPPORT)
247254721Semaste        void
248254721Semaste        operator = (__uint128_t uint)
249254721Semaste        {
250254721Semaste            m_type = eTypeUInt128;
251254721Semaste            m_data.uint128 = uint;
252254721Semaste        }
253254721Semaste#endif
254254721Semaste        void
255254721Semaste        operator = (float f)
256254721Semaste        {
257254721Semaste            m_type = eTypeFloat;
258254721Semaste            m_data.ieee_float = f;
259254721Semaste        }
260254721Semaste
261254721Semaste        void
262254721Semaste        operator = (double f)
263254721Semaste        {
264254721Semaste            m_type = eTypeDouble;
265254721Semaste            m_data.ieee_double = f;
266254721Semaste        }
267254721Semaste
268254721Semaste        void
269254721Semaste        operator = (long double f)
270254721Semaste        {
271254721Semaste            m_type = eTypeLongDouble;
272254721Semaste            m_data.ieee_long_double = f;
273254721Semaste        }
274254721Semaste
275254721Semaste        void
276254721Semaste        SetUInt8 (uint8_t uint)
277254721Semaste        {
278254721Semaste            m_type = eTypeUInt8;
279254721Semaste            m_data.uint8 = uint;
280254721Semaste        }
281254721Semaste
282254721Semaste        void
283254721Semaste        SetUInt16 (uint16_t uint)
284254721Semaste        {
285254721Semaste            m_type = eTypeUInt16;
286254721Semaste            m_data.uint16 = uint;
287254721Semaste        }
288254721Semaste
289254721Semaste        void
290254721Semaste        SetUInt32 (uint32_t uint, Type t = eTypeUInt32)
291254721Semaste        {
292254721Semaste            m_type = t;
293254721Semaste            m_data.uint32 = uint;
294254721Semaste        }
295254721Semaste
296254721Semaste        void
297254721Semaste        SetUInt64 (uint64_t uint, Type t = eTypeUInt64)
298254721Semaste        {
299254721Semaste            m_type = t;
300254721Semaste            m_data.uint64 = uint;
301254721Semaste        }
302254721Semaste
303254721Semaste#if defined (ENABLE_128_BIT_SUPPORT)
304254721Semaste        void
305254721Semaste        SetUInt128 (__uint128_t uint)
306254721Semaste        {
307254721Semaste            m_type = eTypeUInt128;
308254721Semaste            m_data.uint128 = uint;
309254721Semaste        }
310254721Semaste#endif
311254721Semaste        bool
312254721Semaste        SetUInt (uint64_t uint, uint32_t byte_size);
313254721Semaste
314254721Semaste        void
315254721Semaste        SetFloat (float f)
316254721Semaste        {
317254721Semaste            m_type = eTypeFloat;
318254721Semaste            m_data.ieee_float = f;
319254721Semaste        }
320254721Semaste
321254721Semaste        void
322254721Semaste        SetDouble (double f)
323254721Semaste        {
324254721Semaste            m_type = eTypeDouble;
325254721Semaste            m_data.ieee_double = f;
326254721Semaste        }
327254721Semaste
328254721Semaste        void
329254721Semaste        SetLongDouble (long double f)
330254721Semaste        {
331254721Semaste            m_type = eTypeLongDouble;
332254721Semaste            m_data.ieee_long_double = f;
333254721Semaste        }
334254721Semaste
335254721Semaste        void
336254721Semaste        SetBytes (const void *bytes, size_t length, lldb::ByteOrder byte_order);
337254721Semaste
338254721Semaste        bool
339254721Semaste        SignExtend (uint32_t sign_bitpos);
340254721Semaste
341254721Semaste        Error
342254721Semaste        SetValueFromCString (const RegisterInfo *reg_info,
343254721Semaste                             const char *value_str);
344254721Semaste
345254721Semaste        Error
346254721Semaste        SetValueFromData (const RegisterInfo *reg_info,
347254721Semaste                          DataExtractor &data,
348254721Semaste                          lldb::offset_t offset,
349254721Semaste                          bool partial_data_ok);
350254721Semaste
351254721Semaste        // The default value of 0 for reg_name_right_align_at means no alignment at all.
352254721Semaste        bool
353254721Semaste        Dump (Stream *s,
354254721Semaste              const RegisterInfo *reg_info,
355254721Semaste              bool prefix_with_name,
356254721Semaste              bool prefix_with_alt_name,
357254721Semaste              lldb::Format format,
358254721Semaste              uint32_t reg_name_right_align_at = 0) const;
359254721Semaste
360254721Semaste        void *
361254721Semaste        GetBytes ();
362254721Semaste
363254721Semaste        const void *
364254721Semaste        GetBytes () const;
365254721Semaste
366254721Semaste        lldb::ByteOrder
367254721Semaste        GetByteOrder () const
368254721Semaste        {
369254721Semaste            if (m_type == eTypeBytes)
370254721Semaste                return m_data.buffer.byte_order;
371254721Semaste            return lldb::endian::InlHostByteOrder();
372254721Semaste        }
373254721Semaste
374254721Semaste        uint32_t
375254721Semaste        GetByteSize () const;
376254721Semaste
377254721Semaste        void
378254721Semaste        Clear();
379254721Semaste
380254721Semaste    protected:
381254721Semaste
382254721Semaste        RegisterValue::Type m_type;
383254721Semaste        union
384254721Semaste        {
385254721Semaste            uint8_t  uint8;
386254721Semaste            uint16_t uint16;
387254721Semaste            uint32_t uint32;
388254721Semaste            uint64_t uint64;
389254721Semaste#if defined (ENABLE_128_BIT_SUPPORT)
390254721Semaste            __uint128_t uint128;
391254721Semaste#endif
392254721Semaste            float ieee_float;
393254721Semaste            double ieee_double;
394254721Semaste            long double ieee_long_double;
395254721Semaste            struct
396254721Semaste            {
397254721Semaste                uint8_t bytes[kMaxRegisterByteSize]; // This must be big enough to hold any register for any supported target.
398254721Semaste                uint8_t length;
399254721Semaste                lldb::ByteOrder byte_order;
400254721Semaste            } buffer;
401254721Semaste        } m_data;
402254721Semaste    };
403254721Semaste
404254721Semaste} // namespace lldb_private
405254721Semaste
406254721Semaste#endif	// lldb_RegisterValue_h
407