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