1 //===-- RegisterValue.cpp ----------------------------------------*- 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 #include "lldb/Core/RegisterValue.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Core/DataExtractor.h" 17 #include "lldb/Core/Error.h" 18 #include "lldb/Core/Scalar.h" 19 #include "lldb/Core/Stream.h" 20 #include "lldb/Core/StreamString.h" 21 #include "lldb/Interpreter/Args.h" 22 23 using namespace lldb; 24 using namespace lldb_private; 25 26 27 bool 28 RegisterValue::Dump (Stream *s, 29 const RegisterInfo *reg_info, 30 bool prefix_with_name, 31 bool prefix_with_alt_name, 32 Format format, 33 uint32_t reg_name_right_align_at) const 34 { 35 DataExtractor data; 36 if (GetData (data)) 37 { 38 bool name_printed = false; 39 // For simplicity, alignment of the register name printing applies only 40 // in the most common case where: 41 // 42 // prefix_with_name^prefix_with_alt_name is true 43 // 44 StreamString format_string; 45 if (reg_name_right_align_at && (prefix_with_name^prefix_with_alt_name)) 46 format_string.Printf("%%%us", reg_name_right_align_at); 47 else 48 format_string.Printf("%%s"); 49 const char *fmt = format_string.GetData(); 50 if (prefix_with_name) 51 { 52 if (reg_info->name) 53 { 54 s->Printf (fmt, reg_info->name); 55 name_printed = true; 56 } 57 else if (reg_info->alt_name) 58 { 59 s->Printf (fmt, reg_info->alt_name); 60 prefix_with_alt_name = false; 61 name_printed = true; 62 } 63 } 64 if (prefix_with_alt_name) 65 { 66 if (name_printed) 67 s->PutChar ('/'); 68 if (reg_info->alt_name) 69 { 70 s->Printf (fmt, reg_info->alt_name); 71 name_printed = true; 72 } 73 else if (!name_printed) 74 { 75 // No alternate name but we were asked to display a name, so show the main name 76 s->Printf (fmt, reg_info->name); 77 name_printed = true; 78 } 79 } 80 if (name_printed) 81 s->PutCString (" = "); 82 83 if (format == eFormatDefault) 84 format = reg_info->format; 85 86 data.Dump (s, 87 0, // Offset in "data" 88 format, // Format to use when dumping 89 reg_info->byte_size, // item_byte_size 90 1, // item_count 91 UINT32_MAX, // num_per_line 92 LLDB_INVALID_ADDRESS, // base_addr 93 0, // item_bit_size 94 0); // item_bit_offset 95 return true; 96 } 97 return false; 98 } 99 100 101 bool 102 RegisterValue::GetData (DataExtractor &data) const 103 { 104 return data.SetData(GetBytes(), GetByteSize(), GetByteOrder()) > 0; 105 } 106 107 108 uint32_t 109 RegisterValue::GetAsMemoryData (const RegisterInfo *reg_info, 110 void *dst, 111 uint32_t dst_len, 112 lldb::ByteOrder dst_byte_order, 113 Error &error) const 114 { 115 if (reg_info == NULL) 116 { 117 error.SetErrorString ("invalid register info argument."); 118 return 0; 119 } 120 121 // ReadRegister should have already been called on tgus object prior to 122 // calling this. 123 if (GetType() == eTypeInvalid) 124 { 125 // No value has been read into this object... 126 error.SetErrorStringWithFormat("invalid register value type for register %s", reg_info->name); 127 return 0; 128 } 129 130 if (dst_len > kMaxRegisterByteSize) 131 { 132 error.SetErrorString ("destination is too big"); 133 return 0; 134 } 135 136 const uint32_t src_len = reg_info->byte_size; 137 138 // Extract the register data into a data extractor 139 DataExtractor reg_data; 140 if (!GetData(reg_data)) 141 { 142 error.SetErrorString ("invalid register value to copy into"); 143 return 0; 144 } 145 146 // Prepare a memory buffer that contains some or all of the register value 147 const uint32_t bytes_copied = reg_data.CopyByteOrderedData (0, // src offset 148 src_len, // src length 149 dst, // dst buffer 150 dst_len, // dst length 151 dst_byte_order); // dst byte order 152 if (bytes_copied == 0) 153 error.SetErrorStringWithFormat("failed to copy data for register write of %s", reg_info->name); 154 155 return bytes_copied; 156 } 157 158 uint32_t 159 RegisterValue::SetFromMemoryData (const RegisterInfo *reg_info, 160 const void *src, 161 uint32_t src_len, 162 lldb::ByteOrder src_byte_order, 163 Error &error) 164 { 165 if (reg_info == NULL) 166 { 167 error.SetErrorString ("invalid register info argument."); 168 return 0; 169 } 170 171 // Moving from addr into a register 172 // 173 // Case 1: src_len == dst_len 174 // 175 // |AABBCCDD| Address contents 176 // |AABBCCDD| Register contents 177 // 178 // Case 2: src_len > dst_len 179 // 180 // Error! (The register should always be big enough to hold the data) 181 // 182 // Case 3: src_len < dst_len 183 // 184 // |AABB| Address contents 185 // |AABB0000| Register contents [on little-endian hardware] 186 // |0000AABB| Register contents [on big-endian hardware] 187 if (src_len > kMaxRegisterByteSize) 188 { 189 error.SetErrorStringWithFormat ("register buffer is too small to receive %u bytes of data.", src_len); 190 return 0; 191 } 192 193 const uint32_t dst_len = reg_info->byte_size; 194 195 if (src_len > dst_len) 196 { 197 error.SetErrorStringWithFormat("%u bytes is too big to store in register %s (%u bytes)", src_len, reg_info->name, dst_len); 198 return 0; 199 } 200 201 // Use a data extractor to correctly copy and pad the bytes read into the 202 // register value 203 DataExtractor src_data (src, src_len, src_byte_order, 4); 204 205 // Given the register info, set the value type of this RegisterValue object 206 SetType (reg_info); 207 // And make sure we were able to figure out what that register value was 208 RegisterValue::Type value_type = GetType(); 209 if (value_type == eTypeInvalid) 210 { 211 // No value has been read into this object... 212 error.SetErrorStringWithFormat("invalid register value type for register %s", reg_info->name); 213 return 0; 214 } 215 else if (value_type == eTypeBytes) 216 { 217 m_data.buffer.byte_order = src_byte_order; 218 // Make sure to set the buffer length of the destination buffer to avoid 219 // problems due to uninitalized variables. 220 m_data.buffer.length = src_len; 221 } 222 223 const uint32_t bytes_copied = src_data.CopyByteOrderedData (0, // src offset 224 src_len, // src length 225 GetBytes(), // dst buffer 226 GetByteSize(), // dst length 227 GetByteOrder()); // dst byte order 228 if (bytes_copied == 0) 229 error.SetErrorStringWithFormat("failed to copy data for register write of %s", reg_info->name); 230 231 return bytes_copied; 232 } 233 234 bool 235 RegisterValue::GetScalarValue (Scalar &scalar) const 236 { 237 switch (m_type) 238 { 239 case eTypeInvalid: break; 240 case eTypeBytes: 241 { 242 switch (m_data.buffer.length) 243 { 244 default: break; 245 case 1: scalar = m_data.uint8; return true; 246 case 2: scalar = m_data.uint16; return true; 247 case 4: scalar = m_data.uint32; return true; 248 case 8: scalar = m_data.uint64; return true; 249 } 250 } 251 case eTypeUInt8: scalar = m_data.uint8; return true; 252 case eTypeUInt16: scalar = m_data.uint16; return true; 253 case eTypeUInt32: scalar = m_data.uint32; return true; 254 case eTypeUInt64: scalar = m_data.uint64; return true; 255 #if defined (ENABLE_128_BIT_SUPPORT) 256 case eTypeUInt128: break; 257 #endif 258 case eTypeFloat: scalar = m_data.ieee_float; return true; 259 case eTypeDouble: scalar = m_data.ieee_double; return true; 260 case eTypeLongDouble: scalar = m_data.ieee_long_double; return true; 261 } 262 return false; 263 } 264 265 void 266 RegisterValue::Clear() 267 { 268 m_type = eTypeInvalid; 269 } 270 271 RegisterValue::Type 272 RegisterValue::SetType (const RegisterInfo *reg_info) 273 { 274 m_type = eTypeInvalid; 275 const uint32_t byte_size = reg_info->byte_size; 276 switch (reg_info->encoding) 277 { 278 case eEncodingInvalid: 279 break; 280 281 case eEncodingUint: 282 case eEncodingSint: 283 if (byte_size == 1) 284 m_type = eTypeUInt8; 285 else if (byte_size <= 2) 286 m_type = eTypeUInt16; 287 else if (byte_size <= 4) 288 m_type = eTypeUInt32; 289 else if (byte_size <= 8) 290 m_type = eTypeUInt64; 291 #if defined (ENABLE_128_BIT_SUPPORT) 292 else if (byte_size <= 16) 293 m_type = eTypeUInt128; 294 #endif 295 break; 296 297 case eEncodingIEEE754: 298 if (byte_size == sizeof(float)) 299 m_type = eTypeFloat; 300 else if (byte_size == sizeof(double)) 301 m_type = eTypeDouble; 302 else if (byte_size == sizeof(long double)) 303 m_type = eTypeLongDouble; 304 break; 305 306 case eEncodingVector: 307 m_type = eTypeBytes; 308 break; 309 } 310 return m_type; 311 } 312 313 Error 314 RegisterValue::SetValueFromData (const RegisterInfo *reg_info, DataExtractor &src, lldb::offset_t src_offset, bool partial_data_ok) 315 { 316 Error error; 317 318 if (src.GetByteSize() == 0) 319 { 320 error.SetErrorString ("empty data."); 321 return error; 322 } 323 324 if (reg_info->byte_size == 0) 325 { 326 error.SetErrorString ("invalid register info."); 327 return error; 328 } 329 330 uint32_t src_len = src.GetByteSize() - src_offset; 331 332 if (!partial_data_ok && (src_len < reg_info->byte_size)) 333 { 334 error.SetErrorString ("not enough data."); 335 return error; 336 } 337 338 // Cap the data length if there is more than enough bytes for this register 339 // value 340 if (src_len > reg_info->byte_size) 341 src_len = reg_info->byte_size; 342 343 // Zero out the value in case we get partial data... 344 memset (m_data.buffer.bytes, 0, sizeof (m_data.buffer.bytes)); 345 346 switch (SetType (reg_info)) 347 { 348 case eTypeInvalid: 349 error.SetErrorString(""); 350 break; 351 case eTypeUInt8: SetUInt8 (src.GetMaxU32 (&src_offset, src_len)); break; 352 case eTypeUInt16: SetUInt16 (src.GetMaxU32 (&src_offset, src_len)); break; 353 case eTypeUInt32: SetUInt32 (src.GetMaxU32 (&src_offset, src_len)); break; 354 case eTypeUInt64: SetUInt64 (src.GetMaxU64 (&src_offset, src_len)); break; 355 #if defined (ENABLE_128_BIT_SUPPORT) 356 case eTypeUInt128: 357 { 358 __uint128_t data1 = src.GetU64 (&src_offset); 359 __uint128_t data2 = src.GetU64 (&src_offset); 360 if (src.GetByteSize() == eByteOrderBig) 361 SetUInt128 (data1 << 64 + data2); 362 else 363 SetUInt128 (data2 << 64 + data1); 364 } 365 break; 366 #endif 367 case eTypeFloat: SetFloat (src.GetFloat (&src_offset)); break; 368 case eTypeDouble: SetDouble(src.GetDouble (&src_offset)); break; 369 case eTypeLongDouble: SetFloat (src.GetLongDouble (&src_offset)); break; 370 case eTypeBytes: 371 { 372 m_data.buffer.length = reg_info->byte_size; 373 m_data.buffer.byte_order = src.GetByteOrder(); 374 assert (m_data.buffer.length <= kMaxRegisterByteSize); 375 if (m_data.buffer.length > kMaxRegisterByteSize) 376 m_data.buffer.length = kMaxRegisterByteSize; 377 if (src.CopyByteOrderedData (src_offset, // offset within "src" to start extracting data 378 src_len, // src length 379 m_data.buffer.bytes, // dst buffer 380 m_data.buffer.length, // dst length 381 m_data.buffer.byte_order) == 0)// dst byte order 382 { 383 error.SetErrorString ("data copy failed data."); 384 return error; 385 } 386 } 387 } 388 389 return error; 390 } 391 392 #include "llvm/ADT/StringRef.h" 393 #include <vector> 394 static inline void StripSpaces(llvm::StringRef &Str) 395 { 396 while (!Str.empty() && isspace(Str[0])) 397 Str = Str.substr(1); 398 while (!Str.empty() && isspace(Str.back())) 399 Str = Str.substr(0, Str.size()-1); 400 } 401 static inline void LStrip(llvm::StringRef &Str, char c) 402 { 403 if (!Str.empty() && Str.front() == c) 404 Str = Str.substr(1); 405 } 406 static inline void RStrip(llvm::StringRef &Str, char c) 407 { 408 if (!Str.empty() && Str.back() == c) 409 Str = Str.substr(0, Str.size()-1); 410 } 411 // Helper function for RegisterValue::SetValueFromCString() 412 static bool 413 ParseVectorEncoding(const RegisterInfo *reg_info, const char *vector_str, const uint32_t byte_size, RegisterValue *reg_value) 414 { 415 // Example: vector_str = "{0x2c 0x4b 0x2a 0x3e 0xd0 0x4f 0x2a 0x3e 0xac 0x4a 0x2a 0x3e 0x84 0x4f 0x2a 0x3e}". 416 llvm::StringRef Str(vector_str); 417 StripSpaces(Str); 418 LStrip(Str, '{'); 419 RStrip(Str, '}'); 420 StripSpaces(Str); 421 422 char Sep = ' '; 423 424 // The first split should give us: 425 // ('0x2c', '0x4b 0x2a 0x3e 0xd0 0x4f 0x2a 0x3e 0xac 0x4a 0x2a 0x3e 0x84 0x4f 0x2a 0x3e'). 426 std::pair<llvm::StringRef, llvm::StringRef> Pair = Str.split(Sep); 427 std::vector<uint8_t> bytes; 428 unsigned byte = 0; 429 430 // Using radix auto-sensing by passing 0 as the radix. 431 // Keep on processing the vector elements as long as the parsing succeeds and the vector size is < byte_size. 432 while (!Pair.first.getAsInteger(0, byte) && bytes.size() < byte_size) { 433 bytes.push_back(byte); 434 Pair = Pair.second.split(Sep); 435 } 436 437 // Check for vector of exact byte_size elements. 438 if (bytes.size() != byte_size) 439 return false; 440 441 reg_value->SetBytes(&(bytes.front()), byte_size, eByteOrderLittle); 442 return true; 443 } 444 Error 445 RegisterValue::SetValueFromCString (const RegisterInfo *reg_info, const char *value_str) 446 { 447 Error error; 448 if (reg_info == NULL) 449 { 450 error.SetErrorString ("Invalid register info argument."); 451 return error; 452 } 453 454 if (value_str == NULL || value_str[0] == '\0') 455 { 456 error.SetErrorString ("Invalid c-string value string."); 457 return error; 458 } 459 bool success = false; 460 const uint32_t byte_size = reg_info->byte_size; 461 switch (reg_info->encoding) 462 { 463 case eEncodingInvalid: 464 error.SetErrorString ("Invalid encoding."); 465 break; 466 467 case eEncodingUint: 468 if (byte_size <= sizeof (uint64_t)) 469 { 470 uint64_t uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 0, &success); 471 if (!success) 472 error.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string value", value_str); 473 else if (!Args::UInt64ValueIsValidForByteSize (uval64, byte_size)) 474 error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %u byte unsigned integer value", uval64, byte_size); 475 else 476 { 477 if (!SetUInt (uval64, reg_info->byte_size)) 478 error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %u", byte_size); 479 } 480 } 481 else 482 { 483 error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %u", byte_size); 484 return error; 485 } 486 break; 487 488 case eEncodingSint: 489 if (byte_size <= sizeof (long long)) 490 { 491 uint64_t sval64 = Args::StringToSInt64(value_str, INT64_MAX, 0, &success); 492 if (!success) 493 error.SetErrorStringWithFormat ("'%s' is not a valid signed integer string value", value_str); 494 else if (!Args::SInt64ValueIsValidForByteSize (sval64, byte_size)) 495 error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %u byte signed integer value", sval64, byte_size); 496 else 497 { 498 if (!SetUInt (sval64, reg_info->byte_size)) 499 error.SetErrorStringWithFormat ("unsupported signed integer byte size: %u", byte_size); 500 } 501 } 502 else 503 { 504 error.SetErrorStringWithFormat ("unsupported signed integer byte size: %u", byte_size); 505 return error; 506 } 507 break; 508 509 case eEncodingIEEE754: 510 if (byte_size == sizeof (float)) 511 { 512 if (::sscanf (value_str, "%f", &m_data.ieee_float) == 1) 513 m_type = eTypeFloat; 514 else 515 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str); 516 } 517 else if (byte_size == sizeof (double)) 518 { 519 if (::sscanf (value_str, "%lf", &m_data.ieee_double) == 1) 520 m_type = eTypeDouble; 521 else 522 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str); 523 } 524 else if (byte_size == sizeof (long double)) 525 { 526 if (::sscanf (value_str, "%Lf", &m_data.ieee_long_double) == 1) 527 m_type = eTypeLongDouble; 528 else 529 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str); 530 } 531 else 532 { 533 error.SetErrorStringWithFormat ("unsupported float byte size: %u", byte_size); 534 return error; 535 } 536 break; 537 538 case eEncodingVector: 539 if (!ParseVectorEncoding(reg_info, value_str, byte_size, this)) 540 error.SetErrorString ("unrecognized vector encoding string value."); 541 break; 542 } 543 if (error.Fail()) 544 m_type = eTypeInvalid; 545 546 return error; 547 } 548 549 550 bool 551 RegisterValue::SignExtend (uint32_t sign_bitpos) 552 { 553 switch (m_type) 554 { 555 case eTypeInvalid: 556 break; 557 558 case eTypeUInt8: 559 if (sign_bitpos == (8-1)) 560 return true; 561 else if (sign_bitpos < (8-1)) 562 { 563 uint8_t sign_bit = 1u << sign_bitpos; 564 if (m_data.uint8 & sign_bit) 565 { 566 const uint8_t mask = ~(sign_bit) + 1u; 567 m_data.uint8 |= mask; 568 } 569 return true; 570 } 571 break; 572 573 case eTypeUInt16: 574 if (sign_bitpos == (16-1)) 575 return true; 576 else if (sign_bitpos < (16-1)) 577 { 578 uint16_t sign_bit = 1u << sign_bitpos; 579 if (m_data.uint16 & sign_bit) 580 { 581 const uint16_t mask = ~(sign_bit) + 1u; 582 m_data.uint16 |= mask; 583 } 584 return true; 585 } 586 break; 587 588 case eTypeUInt32: 589 if (sign_bitpos == (32-1)) 590 return true; 591 else if (sign_bitpos < (32-1)) 592 { 593 uint32_t sign_bit = 1u << sign_bitpos; 594 if (m_data.uint32 & sign_bit) 595 { 596 const uint32_t mask = ~(sign_bit) + 1u; 597 m_data.uint32 |= mask; 598 } 599 return true; 600 } 601 break; 602 603 case eTypeUInt64: 604 if (sign_bitpos == (64-1)) 605 return true; 606 else if (sign_bitpos < (64-1)) 607 { 608 uint64_t sign_bit = 1ull << sign_bitpos; 609 if (m_data.uint64 & sign_bit) 610 { 611 const uint64_t mask = ~(sign_bit) + 1ull; 612 m_data.uint64 |= mask; 613 } 614 return true; 615 } 616 break; 617 618 #if defined (ENABLE_128_BIT_SUPPORT) 619 case eTypeUInt128: 620 if (sign_bitpos == (128-1)) 621 return true; 622 else if (sign_bitpos < (128-1)) 623 { 624 __uint128_t sign_bit = (__uint128_t)1u << sign_bitpos; 625 if (m_data.uint128 & sign_bit) 626 { 627 const uint128_t mask = ~(sign_bit) + 1u; 628 m_data.uint128 |= mask; 629 } 630 return true; 631 } 632 break; 633 #endif 634 case eTypeFloat: 635 case eTypeDouble: 636 case eTypeLongDouble: 637 case eTypeBytes: 638 break; 639 } 640 return false; 641 } 642 643 bool 644 RegisterValue::CopyValue (const RegisterValue &rhs) 645 { 646 m_type = rhs.m_type; 647 switch (m_type) 648 { 649 case eTypeInvalid: 650 return false; 651 case eTypeUInt8: m_data.uint8 = rhs.m_data.uint8; break; 652 case eTypeUInt16: m_data.uint16 = rhs.m_data.uint16; break; 653 case eTypeUInt32: m_data.uint32 = rhs.m_data.uint32; break; 654 case eTypeUInt64: m_data.uint64 = rhs.m_data.uint64; break; 655 #if defined (ENABLE_128_BIT_SUPPORT) 656 case eTypeUInt128: m_data.uint128 = rhs.m_data.uint128; break; 657 #endif 658 case eTypeFloat: m_data.ieee_float = rhs.m_data.ieee_float; break; 659 case eTypeDouble: m_data.ieee_double = rhs.m_data.ieee_double; break; 660 case eTypeLongDouble: m_data.ieee_long_double = rhs.m_data.ieee_long_double; break; 661 case eTypeBytes: 662 assert (rhs.m_data.buffer.length <= kMaxRegisterByteSize); 663 ::memcpy (m_data.buffer.bytes, rhs.m_data.buffer.bytes, kMaxRegisterByteSize); 664 m_data.buffer.length = rhs.m_data.buffer.length; 665 m_data.buffer.byte_order = rhs.m_data.buffer.byte_order; 666 break; 667 } 668 return true; 669 } 670 671 uint16_t 672 RegisterValue::GetAsUInt16 (uint16_t fail_value, bool *success_ptr) const 673 { 674 if (success_ptr) 675 *success_ptr = true; 676 677 switch (m_type) 678 { 679 default: break; 680 case eTypeUInt8: return m_data.uint8; 681 case eTypeUInt16: return m_data.uint16; 682 case eTypeBytes: 683 { 684 switch (m_data.buffer.length) 685 { 686 default: break; 687 case 1: return m_data.uint8; 688 case 2: return m_data.uint16; 689 } 690 } 691 break; 692 } 693 if (success_ptr) 694 *success_ptr = false; 695 return fail_value; 696 } 697 698 uint32_t 699 RegisterValue::GetAsUInt32 (uint32_t fail_value, bool *success_ptr) const 700 { 701 if (success_ptr) 702 *success_ptr = true; 703 switch (m_type) 704 { 705 default: break; 706 case eTypeUInt8: return m_data.uint8; 707 case eTypeUInt16: return m_data.uint16; 708 case eTypeUInt32: return m_data.uint32; 709 case eTypeFloat: 710 if (sizeof(float) == sizeof(uint32_t)) 711 return m_data.uint32; 712 break; 713 case eTypeDouble: 714 if (sizeof(double) == sizeof(uint32_t)) 715 return m_data.uint32; 716 break; 717 case eTypeLongDouble: 718 if (sizeof(long double) == sizeof(uint32_t)) 719 return m_data.uint32; 720 break; 721 case eTypeBytes: 722 { 723 switch (m_data.buffer.length) 724 { 725 default: break; 726 case 1: return m_data.uint8; 727 case 2: return m_data.uint16; 728 case 4: return m_data.uint32; 729 } 730 } 731 break; 732 } 733 if (success_ptr) 734 *success_ptr = false; 735 return fail_value; 736 } 737 738 uint64_t 739 RegisterValue::GetAsUInt64 (uint64_t fail_value, bool *success_ptr) const 740 { 741 if (success_ptr) 742 *success_ptr = true; 743 switch (m_type) 744 { 745 default: break; 746 case eTypeUInt8: return m_data.uint8; 747 case eTypeUInt16: return m_data.uint16; 748 case eTypeUInt32: return m_data.uint32; 749 case eTypeUInt64: return m_data.uint64; 750 case eTypeFloat: 751 if (sizeof(float) == sizeof(uint64_t)) 752 return m_data.uint64; 753 break; 754 case eTypeDouble: 755 if (sizeof(double) == sizeof(uint64_t)) 756 return m_data.uint64; 757 break; 758 case eTypeLongDouble: 759 if (sizeof(long double) == sizeof(uint64_t)) 760 return m_data.uint64; 761 break; 762 case eTypeBytes: 763 { 764 switch (m_data.buffer.length) 765 { 766 default: break; 767 case 1: return m_data.uint8; 768 case 2: return m_data.uint16; 769 case 4: return m_data.uint32; 770 case 8: return m_data.uint64; 771 } 772 } 773 break; 774 } 775 if (success_ptr) 776 *success_ptr = false; 777 return fail_value; 778 } 779 780 #if defined (ENABLE_128_BIT_SUPPORT) 781 __uint128_t 782 RegisterValue::GetAsUInt128 (__uint128_t fail_value, bool *success_ptr) const 783 { 784 if (success_ptr) 785 *success_ptr = true; 786 switch (m_type) 787 { 788 default: break; 789 case eTypeUInt8: return m_data.uint8; 790 case eTypeUInt16: return m_data.uint16; 791 case eTypeUInt32: return m_data.uint32; 792 case eTypeUInt64: return m_data.uint64; 793 case eTypeUInt128: return m_data.uint128; 794 case eTypeFloat: 795 if (sizeof(float) == sizeof(__uint128_t)) 796 return m_data.uint128; 797 break; 798 case eTypeDouble: 799 if (sizeof(double) == sizeof(__uint128_t)) 800 return m_data.uint128; 801 break; 802 case eTypeLongDouble: 803 if (sizeof(long double) == sizeof(__uint128_t)) 804 return m_data.uint128; 805 break; 806 case eTypeBytes: 807 { 808 switch (m_data.buffer.length) 809 { 810 default: 811 break; 812 case 1: return m_data.uint8; 813 case 2: return m_data.uint16; 814 case 4: return m_data.uint32; 815 case 8: return m_data.uint64; 816 case 16: return m_data.uint128; 817 } 818 } 819 break; 820 } 821 if (success_ptr) 822 *success_ptr = false; 823 return fail_value; 824 } 825 #endif 826 float 827 RegisterValue::GetAsFloat (float fail_value, bool *success_ptr) const 828 { 829 if (success_ptr) 830 *success_ptr = true; 831 switch (m_type) 832 { 833 default: break; 834 case eTypeUInt32: 835 if (sizeof(float) == sizeof(m_data.uint32)) 836 return m_data.ieee_float; 837 break; 838 case eTypeUInt64: 839 if (sizeof(float) == sizeof(m_data.uint64)) 840 return m_data.ieee_float; 841 break; 842 #if defined (ENABLE_128_BIT_SUPPORT) 843 case eTypeUInt128: 844 if (sizeof(float) == sizeof(m_data.uint128)) 845 return m_data.ieee_float; 846 break; 847 #endif 848 case eTypeFloat: return m_data.ieee_float; 849 case eTypeDouble: 850 if (sizeof(float) == sizeof(double)) 851 return m_data.ieee_float; 852 break; 853 case eTypeLongDouble: 854 if (sizeof(float) == sizeof(long double)) 855 return m_data.ieee_float; 856 break; 857 } 858 if (success_ptr) 859 *success_ptr = false; 860 return fail_value; 861 } 862 863 double 864 RegisterValue::GetAsDouble (double fail_value, bool *success_ptr) const 865 { 866 if (success_ptr) 867 *success_ptr = true; 868 switch (m_type) 869 { 870 default: 871 break; 872 873 case eTypeUInt32: 874 if (sizeof(double) == sizeof(m_data.uint32)) 875 return m_data.ieee_double; 876 break; 877 878 case eTypeUInt64: 879 if (sizeof(double) == sizeof(m_data.uint64)) 880 return m_data.ieee_double; 881 break; 882 883 #if defined (ENABLE_128_BIT_SUPPORT) 884 case eTypeUInt128: 885 if (sizeof(double) == sizeof(m_data.uint128)) 886 return m_data.ieee_double; 887 #endif 888 case eTypeFloat: return m_data.ieee_float; 889 case eTypeDouble: return m_data.ieee_double; 890 891 case eTypeLongDouble: 892 if (sizeof(double) == sizeof(long double)) 893 return m_data.ieee_double; 894 break; 895 } 896 if (success_ptr) 897 *success_ptr = false; 898 return fail_value; 899 } 900 901 long double 902 RegisterValue::GetAsLongDouble (long double fail_value, bool *success_ptr) const 903 { 904 if (success_ptr) 905 *success_ptr = true; 906 switch (m_type) 907 { 908 default: 909 break; 910 911 case eTypeUInt32: 912 if (sizeof(long double) == sizeof(m_data.uint32)) 913 return m_data.ieee_long_double; 914 break; 915 916 case eTypeUInt64: 917 if (sizeof(long double) == sizeof(m_data.uint64)) 918 return m_data.ieee_long_double; 919 break; 920 921 #if defined (ENABLE_128_BIT_SUPPORT) 922 case eTypeUInt128: 923 if (sizeof(long double) == sizeof(m_data.uint128)) 924 return m_data.ieee_long_double; 925 #endif 926 case eTypeFloat: return m_data.ieee_float; 927 case eTypeDouble: return m_data.ieee_double; 928 case eTypeLongDouble: return m_data.ieee_long_double; 929 break; 930 } 931 if (success_ptr) 932 *success_ptr = false; 933 return fail_value; 934 } 935 936 const void * 937 RegisterValue::GetBytes () const 938 { 939 switch (m_type) 940 { 941 case eTypeInvalid: break; 942 case eTypeUInt8: return &m_data.uint8; 943 case eTypeUInt16: return &m_data.uint16; 944 case eTypeUInt32: return &m_data.uint32; 945 case eTypeUInt64: return &m_data.uint64; 946 #if defined (ENABLE_128_BIT_SUPPORT) 947 case eTypeUInt128: return &m_data.uint128; 948 #endif 949 case eTypeFloat: return &m_data.ieee_float; 950 case eTypeDouble: return &m_data.ieee_double; 951 case eTypeLongDouble: return &m_data.ieee_long_double; 952 case eTypeBytes: return m_data.buffer.bytes; 953 } 954 return NULL; 955 } 956 957 void * 958 RegisterValue::GetBytes () 959 { 960 switch (m_type) 961 { 962 case eTypeInvalid: break; 963 case eTypeUInt8: return &m_data.uint8; 964 case eTypeUInt16: return &m_data.uint16; 965 case eTypeUInt32: return &m_data.uint32; 966 case eTypeUInt64: return &m_data.uint64; 967 #if defined (ENABLE_128_BIT_SUPPORT) 968 case eTypeUInt128: return &m_data.uint128; 969 #endif 970 case eTypeFloat: return &m_data.ieee_float; 971 case eTypeDouble: return &m_data.ieee_double; 972 case eTypeLongDouble: return &m_data.ieee_long_double; 973 case eTypeBytes: return m_data.buffer.bytes; 974 } 975 return NULL; 976 } 977 978 uint32_t 979 RegisterValue::GetByteSize () const 980 { 981 switch (m_type) 982 { 983 case eTypeInvalid: break; 984 case eTypeUInt8: return sizeof(m_data.uint8); 985 case eTypeUInt16: return sizeof(m_data.uint16); 986 case eTypeUInt32: return sizeof(m_data.uint32); 987 case eTypeUInt64: return sizeof(m_data.uint64); 988 #if defined (ENABLE_128_BIT_SUPPORT) 989 case eTypeUInt128: return sizeof(m_data.uint128); 990 #endif 991 case eTypeFloat: return sizeof(m_data.ieee_float); 992 case eTypeDouble: return sizeof(m_data.ieee_double); 993 case eTypeLongDouble: return sizeof(m_data.ieee_long_double); 994 case eTypeBytes: return m_data.buffer.length; 995 } 996 return 0; 997 } 998 999 1000 bool 1001 RegisterValue::SetUInt (uint64_t uint, uint32_t byte_size) 1002 { 1003 if (byte_size == 0) 1004 { 1005 SetUInt64 (uint); 1006 } 1007 else if (byte_size == 1) 1008 { 1009 SetUInt8 (uint); 1010 } 1011 else if (byte_size <= 2) 1012 { 1013 SetUInt16 (uint); 1014 } 1015 else if (byte_size <= 4) 1016 { 1017 SetUInt32 (uint); 1018 } 1019 else if (byte_size <= 8) 1020 { 1021 SetUInt64 (uint); 1022 } 1023 #if defined (ENABLE_128_BIT_SUPPORT) 1024 else if (byte_size <= 16) 1025 { 1026 SetUInt128 (uint); 1027 } 1028 #endif 1029 else 1030 return false; 1031 return true; 1032 } 1033 1034 void 1035 RegisterValue::SetBytes (const void *bytes, size_t length, lldb::ByteOrder byte_order) 1036 { 1037 // If this assertion fires off we need to increase the size of 1038 // m_data.buffer.bytes, or make it something that is allocated on 1039 // the heap. Since the data buffer is in a union, we can't make it 1040 // a collection class like SmallVector... 1041 if (bytes && length > 0) 1042 { 1043 assert (length <= sizeof (m_data.buffer.bytes) && "Storing too many bytes in a RegisterValue."); 1044 m_type = eTypeBytes; 1045 m_data.buffer.length = length; 1046 memcpy (m_data.buffer.bytes, bytes, length); 1047 m_data.buffer.byte_order = byte_order; 1048 } 1049 else 1050 { 1051 m_type = eTypeInvalid; 1052 m_data.buffer.length = 0; 1053 } 1054 } 1055 1056 1057 bool 1058 RegisterValue::operator == (const RegisterValue &rhs) const 1059 { 1060 if (m_type == rhs.m_type) 1061 { 1062 switch (m_type) 1063 { 1064 case eTypeInvalid: return true; 1065 case eTypeUInt8: return m_data.uint8 == rhs.m_data.uint8; 1066 case eTypeUInt16: return m_data.uint16 == rhs.m_data.uint16; 1067 case eTypeUInt32: return m_data.uint32 == rhs.m_data.uint32; 1068 case eTypeUInt64: return m_data.uint64 == rhs.m_data.uint64; 1069 #if defined (ENABLE_128_BIT_SUPPORT) 1070 case eTypeUInt128: return m_data.uint128 == rhs.m_data.uint128; 1071 #endif 1072 case eTypeFloat: return m_data.ieee_float == rhs.m_data.ieee_float; 1073 case eTypeDouble: return m_data.ieee_double == rhs.m_data.ieee_double; 1074 case eTypeLongDouble: return m_data.ieee_long_double == rhs.m_data.ieee_long_double; 1075 case eTypeBytes: 1076 if (m_data.buffer.length != rhs.m_data.buffer.length) 1077 return false; 1078 else 1079 { 1080 uint8_t length = m_data.buffer.length; 1081 if (length > kMaxRegisterByteSize) 1082 length = kMaxRegisterByteSize; 1083 return memcmp (m_data.buffer.bytes, rhs.m_data.buffer.bytes, length) == 0; 1084 } 1085 break; 1086 } 1087 } 1088 return false; 1089 } 1090 1091 bool 1092 RegisterValue::operator != (const RegisterValue &rhs) const 1093 { 1094 if (m_type != rhs.m_type) 1095 return true; 1096 switch (m_type) 1097 { 1098 case eTypeInvalid: return false; 1099 case eTypeUInt8: return m_data.uint8 != rhs.m_data.uint8; 1100 case eTypeUInt16: return m_data.uint16 != rhs.m_data.uint16; 1101 case eTypeUInt32: return m_data.uint32 != rhs.m_data.uint32; 1102 case eTypeUInt64: return m_data.uint64 != rhs.m_data.uint64; 1103 #if defined (ENABLE_128_BIT_SUPPORT) 1104 case eTypeUInt128: return m_data.uint128 != rhs.m_data.uint128; 1105 #endif 1106 case eTypeFloat: return m_data.ieee_float != rhs.m_data.ieee_float; 1107 case eTypeDouble: return m_data.ieee_double != rhs.m_data.ieee_double; 1108 case eTypeLongDouble: return m_data.ieee_long_double != rhs.m_data.ieee_long_double; 1109 case eTypeBytes: 1110 if (m_data.buffer.length != rhs.m_data.buffer.length) 1111 { 1112 return true; 1113 } 1114 else 1115 { 1116 uint8_t length = m_data.buffer.length; 1117 if (length > kMaxRegisterByteSize) 1118 length = kMaxRegisterByteSize; 1119 return memcmp (m_data.buffer.bytes, rhs.m_data.buffer.bytes, length) != 0; 1120 } 1121 break; 1122 } 1123 return true; 1124 } 1125 1126 bool 1127 RegisterValue::ClearBit (uint32_t bit) 1128 { 1129 switch (m_type) 1130 { 1131 case eTypeInvalid: 1132 break; 1133 1134 case eTypeUInt8: 1135 if (bit < 8) 1136 { 1137 m_data.uint8 &= ~(1u << bit); 1138 return true; 1139 } 1140 break; 1141 1142 case eTypeUInt16: 1143 if (bit < 16) 1144 { 1145 m_data.uint16 &= ~(1u << bit); 1146 return true; 1147 } 1148 break; 1149 1150 case eTypeUInt32: 1151 if (bit < 32) 1152 { 1153 m_data.uint32 &= ~(1u << bit); 1154 return true; 1155 } 1156 break; 1157 1158 case eTypeUInt64: 1159 if (bit < 64) 1160 { 1161 m_data.uint64 &= ~(1ull << (uint64_t)bit); 1162 return true; 1163 } 1164 break; 1165 #if defined (ENABLE_128_BIT_SUPPORT) 1166 case eTypeUInt128: 1167 if (bit < 64) 1168 { 1169 m_data.uint128 &= ~((__uint128_t)1ull << (__uint128_t)bit); 1170 return true; 1171 } 1172 #endif 1173 case eTypeFloat: 1174 case eTypeDouble: 1175 case eTypeLongDouble: 1176 break; 1177 1178 case eTypeBytes: 1179 if (m_data.buffer.byte_order == eByteOrderBig || m_data.buffer.byte_order == eByteOrderLittle) 1180 { 1181 uint32_t byte_idx; 1182 if (m_data.buffer.byte_order == eByteOrderBig) 1183 byte_idx = m_data.buffer.length - (bit / 8) - 1; 1184 else 1185 byte_idx = bit / 8; 1186 1187 const uint32_t byte_bit = bit % 8; 1188 if (byte_idx < m_data.buffer.length) 1189 { 1190 m_data.buffer.bytes[byte_idx] &= ~(1u << byte_bit); 1191 return true; 1192 } 1193 } 1194 break; 1195 } 1196 return false; 1197 } 1198 1199 1200 bool 1201 RegisterValue::SetBit (uint32_t bit) 1202 { 1203 switch (m_type) 1204 { 1205 case eTypeInvalid: 1206 break; 1207 1208 case eTypeUInt8: 1209 if (bit < 8) 1210 { 1211 m_data.uint8 |= (1u << bit); 1212 return true; 1213 } 1214 break; 1215 1216 case eTypeUInt16: 1217 if (bit < 16) 1218 { 1219 m_data.uint16 |= (1u << bit); 1220 return true; 1221 } 1222 break; 1223 1224 case eTypeUInt32: 1225 if (bit < 32) 1226 { 1227 m_data.uint32 |= (1u << bit); 1228 return true; 1229 } 1230 break; 1231 1232 case eTypeUInt64: 1233 if (bit < 64) 1234 { 1235 m_data.uint64 |= (1ull << (uint64_t)bit); 1236 return true; 1237 } 1238 break; 1239 #if defined (ENABLE_128_BIT_SUPPORT) 1240 case eTypeUInt128: 1241 if (bit < 64) 1242 { 1243 m_data.uint128 |= ((__uint128_t)1ull << (__uint128_t)bit); 1244 return true; 1245 } 1246 #endif 1247 case eTypeFloat: 1248 case eTypeDouble: 1249 case eTypeLongDouble: 1250 break; 1251 1252 case eTypeBytes: 1253 if (m_data.buffer.byte_order == eByteOrderBig || m_data.buffer.byte_order == eByteOrderLittle) 1254 { 1255 uint32_t byte_idx; 1256 if (m_data.buffer.byte_order == eByteOrderBig) 1257 byte_idx = m_data.buffer.length - (bit / 8) - 1; 1258 else 1259 byte_idx = bit / 8; 1260 1261 const uint32_t byte_bit = bit % 8; 1262 if (byte_idx < m_data.buffer.length) 1263 { 1264 m_data.buffer.bytes[byte_idx] |= (1u << byte_bit); 1265 return true; 1266 } 1267 } 1268 break; 1269 } 1270 return false; 1271 } 1272 1273