1 //===-- Scalar.cpp ----------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Core/Scalar.h"
18 // Other libraries and framework includes
19 #include "llvm/ADT/SmallString.h"
22 #include "lldb/Core/DataExtractor.h"
23 #include "lldb/Core/Error.h"
24 #include "lldb/Core/Stream.h"
25 #include "lldb/Host/Endian.h"
26 #include "lldb/Host/StringConvert.h"
27 #include "lldb/Interpreter/Args.h"
29 #include "Plugins/Process/Utility/InstructionUtils.h"
32 using namespace lldb_private;
34 //----------------------------------------------------------------------
35 // Promote to max type currently follows the ANSI C rule for type
36 // promotion in expressions.
37 //----------------------------------------------------------------------
38 static Scalar::Type PromoteToMaxType(
39 const Scalar &lhs, // The const left hand side object
40 const Scalar &rhs, // The const right hand side object
41 Scalar &temp_value, // A modifiable temp value than can be used to hold
42 // either the promoted lhs or rhs object
43 const Scalar *&promoted_lhs_ptr, // Pointer to the resulting possibly
44 // promoted value of lhs (at most one of
45 // lhs/rhs will get promoted)
46 const Scalar *&promoted_rhs_ptr // Pointer to the resulting possibly
47 // promoted value of rhs (at most one of
48 // lhs/rhs will get promoted)
51 // Initialize the promoted values for both the right and left hand side values
52 // to be the objects themselves. If no promotion is needed (both right and
54 // have the same type), then the temp_value will not get used.
55 promoted_lhs_ptr = &lhs;
56 promoted_rhs_ptr = &rhs;
57 // Extract the types of both the right and left hand side values
58 Scalar::Type lhs_type = lhs.GetType();
59 Scalar::Type rhs_type = rhs.GetType();
61 if (lhs_type > rhs_type) {
62 // Right hand side need to be promoted
63 temp_value = rhs; // Copy right hand side into the temp value
64 if (temp_value.Promote(lhs_type)) // Promote it
66 &temp_value; // Update the pointer for the promoted right hand side
67 } else if (lhs_type < rhs_type) {
68 // Left hand side need to be promoted
69 temp_value = lhs; // Copy left hand side value into the temp value
70 if (temp_value.Promote(rhs_type)) // Promote it
72 &temp_value; // Update the pointer for the promoted left hand side
75 // Make sure our type promotion worked as expected
76 if (promoted_lhs_ptr->GetType() == promoted_rhs_ptr->GetType())
77 return promoted_lhs_ptr->GetType(); // Return the resulting max type
79 // Return the void type (zero) if we fail to promote either of the values.
80 return Scalar::e_void;
83 Scalar::Scalar() : m_type(e_void), m_float((float)0) {}
85 Scalar::Scalar(const Scalar &rhs)
86 : m_type(rhs.m_type), m_integer(rhs.m_integer), m_float(rhs.m_float) {}
88 // Scalar::Scalar(const RegisterValue& reg) :
92 // switch (reg.info.encoding)
94 // case eEncodingUint: // unsigned integer
95 // switch (reg.info.byte_size)
97 // case 1: m_type = e_uint; m_data.uint = reg.value.uint8; break;
98 // case 2: m_type = e_uint; m_data.uint = reg.value.uint16; break;
99 // case 4: m_type = e_uint; m_data.uint = reg.value.uint32; break;
100 // case 8: m_type = e_ulonglong; m_data.ulonglong = reg.value.uint64;
106 // case eEncodingSint: // signed integer
107 // switch (reg.info.byte_size)
109 // case 1: m_type = e_sint; m_data.sint = reg.value.sint8; break;
110 // case 2: m_type = e_sint; m_data.sint = reg.value.sint16; break;
111 // case 4: m_type = e_sint; m_data.sint = reg.value.sint32; break;
112 // case 8: m_type = e_slonglong; m_data.slonglong = reg.value.sint64;
118 // case eEncodingIEEE754: // float
119 // switch (reg.info.byte_size)
121 // case 4: m_type = e_float; m_data.flt = reg.value.float32; break;
122 // case 8: m_type = e_double; m_data.dbl = reg.value.float64; break;
126 // case eEncodingVector: // vector registers
131 bool Scalar::GetData(DataExtractor &data, size_t limit_byte_size) const {
132 size_t byte_size = GetByteSize();
134 const uint8_t *bytes = reinterpret_cast<const uint8_t *>(GetBytes());
136 if (limit_byte_size < byte_size) {
137 if (endian::InlHostByteOrder() == eByteOrderLittle) {
138 // On little endian systems if we want fewer bytes from the
139 // current type we just specify fewer bytes since the LSByte
141 byte_size = limit_byte_size;
142 } else if (endian::InlHostByteOrder() == eByteOrderBig) {
143 // On big endian systems if we want fewer bytes from the
144 // current type have to advance our initial byte pointer and
145 // trim down the number of bytes since the MSByte is first
146 bytes += byte_size - limit_byte_size;
147 byte_size = limit_byte_size;
151 data.SetData(bytes, byte_size, endian::InlHostByteOrder());
158 const void *Scalar::GetBytes() const {
159 const uint64_t *apint_words;
160 const uint8_t *bytes;
161 static float_t flt_val;
162 static double_t dbl_val;
163 static uint64_t swapped_words[4];
173 bytes = reinterpret_cast<const uint8_t *>(m_integer.getRawData());
174 // getRawData always returns a pointer to an uint64_t. If we have a smaller
176 // we need to update the pointer on big-endian systems.
177 if (endian::InlHostByteOrder() == eByteOrderBig) {
178 size_t byte_size = m_integer.getBitWidth() / 8;
180 bytes += 8 - byte_size;
185 apint_words = m_integer.getRawData();
186 // getRawData always returns a pointer to an array of two uint64_t values,
187 // where the least-significant word always comes first. On big-endian
188 // systems we need to swap the two words.
189 if (endian::InlHostByteOrder() == eByteOrderBig) {
190 swapped_words[0] = apint_words[1];
191 swapped_words[1] = apint_words[0];
192 apint_words = swapped_words;
194 return reinterpret_cast<const void *>(apint_words);
197 apint_words = m_integer.getRawData();
198 // getRawData always returns a pointer to an array of four uint64_t values,
199 // where the least-significant word always comes first. On big-endian
200 // systems we need to swap the four words.
201 if (endian::InlHostByteOrder() == eByteOrderBig) {
202 swapped_words[0] = apint_words[3];
203 swapped_words[1] = apint_words[2];
204 swapped_words[2] = apint_words[1];
205 swapped_words[3] = apint_words[0];
206 apint_words = swapped_words;
208 return reinterpret_cast<const void *>(apint_words);
210 flt_val = m_float.convertToFloat();
211 return reinterpret_cast<const void *>(&flt_val);
213 dbl_val = m_float.convertToDouble();
214 return reinterpret_cast<const void *>(&dbl_val);
216 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
217 apint_words = ldbl_val.getRawData();
218 // getRawData always returns a pointer to an array of two uint64_t values,
219 // where the least-significant word always comes first. On big-endian
220 // systems we need to swap the two words.
221 if (endian::InlHostByteOrder() == eByteOrderBig) {
222 swapped_words[0] = apint_words[1];
223 swapped_words[1] = apint_words[0];
224 apint_words = swapped_words;
226 return reinterpret_cast<const void *>(apint_words);
231 size_t Scalar::GetByteSize() const {
245 return (m_integer.getBitWidth() / 8);
247 return sizeof(float_t);
249 return sizeof(double_t);
251 return sizeof(long_double_t);
256 bool Scalar::IsZero() const {
257 llvm::APInt zero_int = llvm::APInt::getNullValue(m_integer.getBitWidth() / 8);
271 return llvm::APInt::isSameValue(zero_int, m_integer);
275 return m_float.isZero();
280 void Scalar::GetValue(Stream *s, bool show_type) const {
282 s->Printf("(%s) ", GetTypeAsCString());
292 s->PutCString(m_integer.toString(10, true));
299 s->PutCString(m_integer.toString(10, false));
304 llvm::SmallString<24> string;
305 m_float.toString(string);
306 s->Printf("%s", string.c_str());
311 const char *Scalar::GetTypeAsCString() const {
318 return "unsigned int";
322 return "unsigned long";
326 return "unsigned long long";
330 return "unsigned int128_t";
334 return "unsigned int256_t";
340 return "long double";
342 return "<invalid Scalar type>";
345 Scalar &Scalar::operator=(const Scalar &rhs) {
348 m_integer = llvm::APInt(rhs.m_integer);
349 m_float = rhs.m_float;
354 Scalar &Scalar::operator=(const int v) {
356 m_integer = llvm::APInt(sizeof(int) * 8, v, true);
360 Scalar &Scalar::operator=(unsigned int v) {
362 m_integer = llvm::APInt(sizeof(int) * 8, v);
366 Scalar &Scalar::operator=(long v) {
368 m_integer = llvm::APInt(sizeof(long) * 8, v, true);
372 Scalar &Scalar::operator=(unsigned long v) {
374 m_integer = llvm::APInt(sizeof(long) * 8, v);
378 Scalar &Scalar::operator=(long long v) {
379 m_type = e_slonglong;
380 m_integer = llvm::APInt(sizeof(long) * 8, v, true);
384 Scalar &Scalar::operator=(unsigned long long v) {
385 m_type = e_ulonglong;
386 m_integer = llvm::APInt(sizeof(long long) * 8, v);
390 Scalar &Scalar::operator=(float v) {
392 m_float = llvm::APFloat(v);
396 Scalar &Scalar::operator=(double v) {
398 m_float = llvm::APFloat(v);
402 Scalar &Scalar::operator=(long double v) {
403 m_type = e_long_double;
405 m_float = llvm::APFloat(
406 llvm::APFloat::IEEEquad(),
407 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
409 m_float = llvm::APFloat(
410 llvm::APFloat::x87DoubleExtended(),
411 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
415 Scalar &Scalar::operator=(llvm::APInt rhs) {
416 m_integer = llvm::APInt(rhs);
417 switch (m_integer.getBitWidth()) {
421 if (m_integer.isSignedIntN(sizeof(sint_t) * 8))
427 if (m_integer.isSignedIntN(sizeof(slonglong_t) * 8))
428 m_type = e_slonglong;
430 m_type = e_ulonglong;
433 if (m_integer.isSignedIntN(BITWIDTH_INT128))
439 if (m_integer.isSignedIntN(BITWIDTH_INT256))
448 Scalar::~Scalar() = default;
450 bool Scalar::Promote(Scalar::Type type) {
451 bool success = false;
464 m_integer = m_integer.sextOrTrunc(sizeof(uint_t) * 8);
469 m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8);
474 m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8);
479 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
484 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
490 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
496 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
501 m_float = llvm::APFloat(m_integer.bitsToFloat());
506 m_float = llvm::APFloat(m_integer.bitsToDouble());
512 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
514 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
529 m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8);
534 m_integer = m_integer.zextOrTrunc(sizeof(ulong_t) * 8);
539 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
544 m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8);
550 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
556 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
561 m_float = llvm::APFloat(m_integer.bitsToFloat());
566 m_float = llvm::APFloat(m_integer.bitsToDouble());
572 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
574 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
590 m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8);
595 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
600 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
606 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
612 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
617 m_float = llvm::APFloat(m_integer.bitsToFloat());
622 m_float = llvm::APFloat(m_integer.bitsToDouble());
628 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
630 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
647 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
652 m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8);
658 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
664 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
669 m_float = llvm::APFloat(m_integer.bitsToFloat());
674 m_float = llvm::APFloat(m_integer.bitsToDouble());
680 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
682 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
700 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
706 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
712 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
717 m_float = llvm::APFloat(m_integer.bitsToFloat());
722 m_float = llvm::APFloat(m_integer.bitsToDouble());
728 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
730 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
750 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
756 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
761 m_float = llvm::APFloat(m_integer.bitsToFloat());
766 m_float = llvm::APFloat(m_integer.bitsToDouble());
772 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
774 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
794 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
800 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
805 m_float = llvm::APFloat(m_integer.bitsToFloat());
810 m_float = llvm::APFloat(m_integer.bitsToDouble());
816 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
818 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
840 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
845 m_float = llvm::APFloat(m_integer.bitsToFloat());
850 m_float = llvm::APFloat(m_integer.bitsToDouble());
856 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
858 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
880 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
885 m_float = llvm::APFloat(m_integer.bitsToFloat());
890 m_float = llvm::APFloat(m_integer.bitsToDouble());
896 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
898 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
921 m_float = llvm::APFloat(m_integer.bitsToFloat());
926 m_float = llvm::APFloat(m_integer.bitsToDouble());
932 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
934 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
958 m_float = llvm::APFloat((float_t)m_float.convertToFloat());
965 llvm::APFloat(llvm::APFloat::IEEEquad(), m_float.bitcastToAPInt());
967 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(),
968 m_float.bitcastToAPInt());
995 llvm::APFloat(llvm::APFloat::IEEEquad(), m_float.bitcastToAPInt());
997 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(),
998 m_float.bitcastToAPInt());
1032 const char *Scalar::GetValueTypeAsCString(Scalar::Type type) {
1039 return "unsigned int";
1043 return "unsigned long";
1047 return "unsigned long long";
1053 return "long double";
1067 Scalar::GetValueTypeForSignedIntegerWithByteSize(size_t byte_size) {
1068 if (byte_size <= sizeof(sint_t))
1070 if (byte_size <= sizeof(slong_t))
1072 if (byte_size <= sizeof(slonglong_t))
1078 Scalar::GetValueTypeForUnsignedIntegerWithByteSize(size_t byte_size) {
1079 if (byte_size <= sizeof(uint_t))
1081 if (byte_size <= sizeof(ulong_t))
1083 if (byte_size <= sizeof(ulonglong_t))
1088 Scalar::Type Scalar::GetValueTypeForFloatWithByteSize(size_t byte_size) {
1089 if (byte_size == sizeof(float_t))
1091 if (byte_size == sizeof(double_t))
1093 if (byte_size == sizeof(long_double_t))
1094 return e_long_double;
1098 bool Scalar::Cast(Scalar::Type type) {
1099 bool success = false;
1118 m_integer = m_integer.sextOrTrunc(sizeof(sint_t) * 8);
1123 m_integer = m_integer.zextOrTrunc(sizeof(sint_t) * 8);
1128 m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8);
1133 m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8);
1138 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
1143 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
1148 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
1153 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
1158 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
1163 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
1168 m_float = llvm::APFloat(m_integer.bitsToFloat());
1173 m_float = llvm::APFloat(m_integer.bitsToDouble());
1179 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(), m_integer);
1181 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(), m_integer);
1201 m_integer = m_float.bitcastToAPInt();
1205 m_float = llvm::APFloat(m_float.convertToFloat());
1209 m_float = llvm::APFloat(m_float.convertToFloat());
1215 llvm::APFloat(llvm::APFloat::IEEEquad(), m_float.bitcastToAPInt());
1217 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(),
1218 m_float.bitcastToAPInt());
1238 m_integer = m_float.bitcastToAPInt();
1242 m_float = llvm::APFloat(m_float.convertToDouble());
1246 m_float = llvm::APFloat(m_float.convertToDouble());
1252 llvm::APFloat(llvm::APFloat::IEEEquad(), m_float.bitcastToAPInt());
1254 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(),
1255 m_float.bitcastToAPInt());
1266 m_integer = m_float.bitcastToAPInt();
1267 m_integer = m_integer.sextOrTrunc(sizeof(sint_t) * 8);
1272 m_integer = m_float.bitcastToAPInt();
1273 m_integer = m_integer.zextOrTrunc(sizeof(sint_t) * 8);
1278 m_integer = m_float.bitcastToAPInt();
1279 m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8);
1284 m_integer = m_float.bitcastToAPInt();
1285 m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8);
1290 m_integer = m_float.bitcastToAPInt();
1291 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
1296 m_integer = m_float.bitcastToAPInt();
1297 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
1302 m_integer = m_float.bitcastToAPInt();
1303 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
1308 m_integer = m_float.bitcastToAPInt();
1309 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
1314 m_integer = m_float.bitcastToAPInt();
1315 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
1320 m_integer = m_float.bitcastToAPInt();
1321 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
1326 m_float = llvm::APFloat(m_float.convertToFloat());
1330 m_float = llvm::APFloat(m_float.convertToFloat());
1345 bool Scalar::MakeSigned() {
1346 bool success = false;
1369 m_type = e_slonglong;
1400 bool Scalar::MakeUnsigned() {
1401 bool success = false;
1424 m_type = e_ulonglong;
1455 signed char Scalar::SChar(char fail_value) const {
1469 return (schar_t)(m_integer.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue();
1471 return (schar_t)m_float.convertToFloat();
1473 return (schar_t)m_float.convertToDouble();
1475 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1476 return (schar_t)(ldbl_val.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue();
1481 unsigned char Scalar::UChar(unsigned char fail_value) const {
1495 return (uchar_t)(m_integer.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue();
1497 return (uchar_t)m_float.convertToFloat();
1499 return (uchar_t)m_float.convertToDouble();
1501 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1502 return (uchar_t)(ldbl_val.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue();
1507 short Scalar::SShort(short fail_value) const {
1521 return (sshort_t)(m_integer.sextOrTrunc(sizeof(sshort_t) * 8))
1524 return (sshort_t)m_float.convertToFloat();
1526 return (sshort_t)m_float.convertToDouble();
1528 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1529 return (sshort_t)(ldbl_val.sextOrTrunc(sizeof(sshort_t) * 8))
1535 unsigned short Scalar::UShort(unsigned short fail_value) const {
1549 return (ushort_t)(m_integer.zextOrTrunc(sizeof(ushort_t) * 8))
1552 return (ushort_t)m_float.convertToFloat();
1554 return (ushort_t)m_float.convertToDouble();
1556 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1557 return (ushort_t)(ldbl_val.zextOrTrunc(sizeof(ushort_t) * 8))
1563 int Scalar::SInt(int fail_value) const {
1577 return (sint_t)(m_integer.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue();
1579 return (sint_t)m_float.convertToFloat();
1581 return (sint_t)m_float.convertToDouble();
1583 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1584 return (sint_t)(ldbl_val.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue();
1589 unsigned int Scalar::UInt(unsigned int fail_value) const {
1603 return (uint_t)(m_integer.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue();
1605 return (uint_t)m_float.convertToFloat();
1607 return (uint_t)m_float.convertToDouble();
1609 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1610 return (uint_t)(ldbl_val.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue();
1615 long Scalar::SLong(long fail_value) const {
1629 return (slong_t)(m_integer.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue();
1631 return (slong_t)m_float.convertToFloat();
1633 return (slong_t)m_float.convertToDouble();
1635 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1636 return (slong_t)(ldbl_val.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue();
1641 unsigned long Scalar::ULong(unsigned long fail_value) const {
1655 return (ulong_t)(m_integer.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue();
1657 return (ulong_t)m_float.convertToFloat();
1659 return (ulong_t)m_float.convertToDouble();
1661 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1662 return (ulong_t)(ldbl_val.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue();
1667 long long Scalar::SLongLong(long long fail_value) const {
1681 return (slonglong_t)(m_integer.sextOrTrunc(sizeof(slonglong_t) * 8))
1684 return (slonglong_t)m_float.convertToFloat();
1686 return (slonglong_t)m_float.convertToDouble();
1688 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1689 return (slonglong_t)(ldbl_val.sextOrTrunc(sizeof(slonglong_t) * 8))
1695 unsigned long long Scalar::ULongLong(unsigned long long fail_value) const {
1709 return (ulonglong_t)(m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8))
1712 return (ulonglong_t)m_float.convertToFloat();
1714 return (ulonglong_t)m_float.convertToDouble();
1716 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1717 return (ulonglong_t)(ldbl_val.zextOrTrunc(sizeof(ulonglong_t) * 8))
1723 llvm::APInt Scalar::SInt128(llvm::APInt &fail_value) const {
1741 return m_float.bitcastToAPInt();
1746 llvm::APInt Scalar::UInt128(const llvm::APInt &fail_value) const {
1764 return m_float.bitcastToAPInt();
1769 llvm::APInt Scalar::SInt256(llvm::APInt &fail_value) const {
1787 return m_float.bitcastToAPInt();
1792 llvm::APInt Scalar::UInt256(const llvm::APInt &fail_value) const {
1810 return m_float.bitcastToAPInt();
1815 float Scalar::Float(float fail_value) const {
1829 return m_integer.bitsToFloat();
1831 return m_float.convertToFloat();
1833 return (float_t)m_float.convertToDouble();
1835 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1836 return ldbl_val.bitsToFloat();
1841 double Scalar::Double(double fail_value) const {
1855 return m_integer.bitsToDouble();
1857 return (double_t)m_float.convertToFloat();
1859 return m_float.convertToDouble();
1861 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1862 return ldbl_val.bitsToFloat();
1867 long double Scalar::LongDouble(long double fail_value) const {
1881 return (long_double_t)m_integer.bitsToDouble();
1883 return (long_double_t)m_float.convertToFloat();
1885 return (long_double_t)m_float.convertToDouble();
1887 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1888 return (long_double_t)ldbl_val.bitsToDouble();
1893 Scalar &Scalar::operator+=(const Scalar &rhs) {
1897 if ((m_type = PromoteToMaxType(*this, rhs, temp_value, a, b)) !=
1912 m_integer = a->m_integer + b->m_integer;
1918 m_float = a->m_float + b->m_float;
1925 Scalar &Scalar::operator<<=(const Scalar &rhs) {
1944 switch (rhs.m_type) {
1961 m_integer = m_integer << rhs.m_integer;
1969 bool Scalar::ShiftRightLogical(const Scalar &rhs) {
1988 switch (rhs.m_type) {
2005 m_integer = m_integer.lshr(rhs.m_integer);
2010 return m_type != e_void;
2013 Scalar &Scalar::operator>>=(const Scalar &rhs) {
2032 switch (rhs.m_type) {
2049 m_integer = m_integer.ashr(rhs.m_integer);
2057 Scalar &Scalar::operator&=(const Scalar &rhs) {
2076 switch (rhs.m_type) {
2093 m_integer &= rhs.m_integer;
2101 bool Scalar::AbsoluteValue() {
2111 if (m_integer.isNegative())
2112 m_integer = -m_integer;
2124 m_float.clearSign();
2130 bool Scalar::UnaryNegate() {
2144 m_integer = -m_integer;
2149 m_float.changeSign();
2155 bool Scalar::OnesComplement() {
2167 m_integer = ~m_integer;
2179 const Scalar lldb_private::operator+(const Scalar &lhs, const Scalar &rhs) {
2184 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2186 switch (result.m_type) {
2187 case Scalar::e_void:
2189 case Scalar::e_sint:
2190 case Scalar::e_uint:
2191 case Scalar::e_slong:
2192 case Scalar::e_ulong:
2193 case Scalar::e_slonglong:
2194 case Scalar::e_ulonglong:
2195 case Scalar::e_sint128:
2196 case Scalar::e_uint128:
2197 case Scalar::e_sint256:
2198 case Scalar::e_uint256:
2199 result.m_integer = a->m_integer + b->m_integer;
2201 case Scalar::e_float:
2202 case Scalar::e_double:
2203 case Scalar::e_long_double:
2204 result.m_float = a->m_float + b->m_float;
2211 const Scalar lldb_private::operator-(const Scalar &lhs, const Scalar &rhs) {
2216 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2218 switch (result.m_type) {
2219 case Scalar::e_void:
2221 case Scalar::e_sint:
2222 case Scalar::e_uint:
2223 case Scalar::e_slong:
2224 case Scalar::e_ulong:
2225 case Scalar::e_slonglong:
2226 case Scalar::e_ulonglong:
2227 case Scalar::e_sint128:
2228 case Scalar::e_uint128:
2229 case Scalar::e_sint256:
2230 case Scalar::e_uint256:
2231 result.m_integer = a->m_integer - b->m_integer;
2233 case Scalar::e_float:
2234 case Scalar::e_double:
2235 case Scalar::e_long_double:
2236 result.m_float = a->m_float - b->m_float;
2243 const Scalar lldb_private::operator/(const Scalar &lhs, const Scalar &rhs) {
2248 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2250 switch (result.m_type) {
2251 case Scalar::e_void:
2253 case Scalar::e_sint:
2254 case Scalar::e_slong:
2255 case Scalar::e_slonglong:
2256 case Scalar::e_sint128:
2257 case Scalar::e_sint256:
2258 if (b->m_integer != 0) {
2259 result.m_integer = a->m_integer.sdiv(b->m_integer);
2263 case Scalar::e_uint:
2264 case Scalar::e_ulong:
2265 case Scalar::e_ulonglong:
2266 case Scalar::e_uint128:
2267 case Scalar::e_uint256:
2268 if (b->m_integer != 0) {
2269 result.m_integer = a->m_integer.udiv(b->m_integer);
2273 case Scalar::e_float:
2274 case Scalar::e_double:
2275 case Scalar::e_long_double:
2276 if (b->m_float.isZero()) {
2277 result.m_float = a->m_float / b->m_float;
2283 // For division only, the only way it should make it here is if a promotion
2285 // or if we are trying to do a divide by zero.
2286 result.m_type = Scalar::e_void;
2290 const Scalar lldb_private::operator*(const Scalar &lhs, const Scalar &rhs) {
2295 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2297 switch (result.m_type) {
2298 case Scalar::e_void:
2300 case Scalar::e_sint:
2301 case Scalar::e_uint:
2302 case Scalar::e_slong:
2303 case Scalar::e_ulong:
2304 case Scalar::e_slonglong:
2305 case Scalar::e_ulonglong:
2306 case Scalar::e_sint128:
2307 case Scalar::e_uint128:
2308 case Scalar::e_sint256:
2309 case Scalar::e_uint256:
2310 result.m_integer = a->m_integer * b->m_integer;
2312 case Scalar::e_float:
2313 case Scalar::e_double:
2314 case Scalar::e_long_double:
2315 result.m_float = a->m_float * b->m_float;
2322 const Scalar lldb_private::operator&(const Scalar &lhs, const Scalar &rhs) {
2327 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2329 switch (result.m_type) {
2330 case Scalar::e_sint:
2331 case Scalar::e_uint:
2332 case Scalar::e_slong:
2333 case Scalar::e_ulong:
2334 case Scalar::e_slonglong:
2335 case Scalar::e_ulonglong:
2336 case Scalar::e_sint128:
2337 case Scalar::e_uint128:
2338 case Scalar::e_sint256:
2339 case Scalar::e_uint256:
2340 result.m_integer = a->m_integer & b->m_integer;
2342 case Scalar::e_void:
2343 case Scalar::e_float:
2344 case Scalar::e_double:
2345 case Scalar::e_long_double:
2346 // No bitwise AND on floats, doubles of long doubles
2347 result.m_type = Scalar::e_void;
2354 const Scalar lldb_private::operator|(const Scalar &lhs, const Scalar &rhs) {
2359 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2361 switch (result.m_type) {
2362 case Scalar::e_sint:
2363 case Scalar::e_uint:
2364 case Scalar::e_slong:
2365 case Scalar::e_ulong:
2366 case Scalar::e_slonglong:
2367 case Scalar::e_ulonglong:
2368 case Scalar::e_sint128:
2369 case Scalar::e_uint128:
2370 case Scalar::e_sint256:
2371 case Scalar::e_uint256:
2372 result.m_integer = a->m_integer | b->m_integer;
2375 case Scalar::e_void:
2376 case Scalar::e_float:
2377 case Scalar::e_double:
2378 case Scalar::e_long_double:
2379 // No bitwise AND on floats, doubles of long doubles
2380 result.m_type = Scalar::e_void;
2387 const Scalar lldb_private::operator%(const Scalar &lhs, const Scalar &rhs) {
2392 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2394 switch (result.m_type) {
2397 case Scalar::e_void:
2399 case Scalar::e_sint:
2400 case Scalar::e_slong:
2401 case Scalar::e_slonglong:
2402 case Scalar::e_sint128:
2403 case Scalar::e_sint256:
2404 if (b->m_integer != 0) {
2405 result.m_integer = a->m_integer.srem(b->m_integer);
2409 case Scalar::e_uint:
2410 case Scalar::e_ulong:
2411 case Scalar::e_ulonglong:
2412 case Scalar::e_uint128:
2413 case Scalar::e_uint256:
2414 if (b->m_integer != 0) {
2415 result.m_integer = a->m_integer.urem(b->m_integer);
2421 result.m_type = Scalar::e_void;
2425 const Scalar lldb_private::operator^(const Scalar &lhs, const Scalar &rhs) {
2430 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2432 switch (result.m_type) {
2433 case Scalar::e_sint:
2434 case Scalar::e_uint:
2435 case Scalar::e_slong:
2436 case Scalar::e_ulong:
2437 case Scalar::e_slonglong:
2438 case Scalar::e_ulonglong:
2439 case Scalar::e_sint128:
2440 case Scalar::e_uint128:
2441 case Scalar::e_sint256:
2442 case Scalar::e_uint256:
2443 result.m_integer = a->m_integer ^ b->m_integer;
2446 case Scalar::e_void:
2447 case Scalar::e_float:
2448 case Scalar::e_double:
2449 case Scalar::e_long_double:
2450 // No bitwise AND on floats, doubles of long doubles
2451 result.m_type = Scalar::e_void;
2458 const Scalar lldb_private::operator<<(const Scalar &lhs, const Scalar &rhs) {
2459 Scalar result = lhs;
2464 const Scalar lldb_private::operator>>(const Scalar &lhs, const Scalar &rhs) {
2465 Scalar result = lhs;
2470 Error Scalar::SetValueFromCString(const char *value_str, Encoding encoding,
2473 if (value_str == nullptr || value_str[0] == '\0') {
2474 error.SetErrorString("Invalid c-string value string.");
2477 bool success = false;
2479 case eEncodingInvalid:
2480 error.SetErrorString("Invalid encoding.");
2484 if (byte_size <= sizeof(unsigned long long)) {
2486 StringConvert::ToUInt64(value_str, UINT64_MAX, 0, &success);
2488 error.SetErrorStringWithFormat(
2489 "'%s' is not a valid unsigned integer string value", value_str);
2490 else if (!UIntValueIsValidForSize(uval64, byte_size))
2491 error.SetErrorStringWithFormat("value 0x%" PRIx64
2492 " is too large to fit in a %" PRIu64
2493 " byte unsigned integer value",
2494 uval64, (uint64_t)byte_size);
2496 m_type = Scalar::GetValueTypeForUnsignedIntegerWithByteSize(byte_size);
2499 m_integer = llvm::APInt(sizeof(uint_t) * 8, uval64, false);
2502 m_integer = llvm::APInt(sizeof(ulong_t) * 8, uval64, false);
2505 m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, uval64, false);
2508 error.SetErrorStringWithFormat(
2509 "unsupported unsigned integer byte size: %" PRIu64 "",
2510 (uint64_t)byte_size);
2515 error.SetErrorStringWithFormat(
2516 "unsupported unsigned integer byte size: %" PRIu64 "",
2517 (uint64_t)byte_size);
2523 if (byte_size <= sizeof(long long)) {
2525 StringConvert::ToSInt64(value_str, INT64_MAX, 0, &success);
2527 error.SetErrorStringWithFormat(
2528 "'%s' is not a valid signed integer string value", value_str);
2529 else if (!SIntValueIsValidForSize(sval64, byte_size))
2530 error.SetErrorStringWithFormat("value 0x%" PRIx64
2531 " is too large to fit in a %" PRIu64
2532 " byte signed integer value",
2533 sval64, (uint64_t)byte_size);
2535 m_type = Scalar::GetValueTypeForSignedIntegerWithByteSize(byte_size);
2538 m_integer = llvm::APInt(sizeof(sint_t) * 8, sval64, true);
2541 m_integer = llvm::APInt(sizeof(slong_t) * 8, sval64, true);
2544 m_integer = llvm::APInt(sizeof(slonglong_t) * 8, sval64, true);
2547 error.SetErrorStringWithFormat(
2548 "unsupported signed integer byte size: %" PRIu64 "",
2549 (uint64_t)byte_size);
2554 error.SetErrorStringWithFormat(
2555 "unsupported signed integer byte size: %" PRIu64 "",
2556 (uint64_t)byte_size);
2561 case eEncodingIEEE754:
2563 static double d_val;
2564 static long double l_val;
2565 if (byte_size == sizeof(float)) {
2566 if (::sscanf(value_str, "%f", &f_val) == 1) {
2567 m_float = llvm::APFloat(f_val);
2570 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2572 } else if (byte_size == sizeof(double)) {
2573 if (::sscanf(value_str, "%lf", &d_val) == 1) {
2574 m_float = llvm::APFloat(d_val);
2577 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2579 } else if (byte_size == sizeof(long double)) {
2580 if (::sscanf(value_str, "%Lf", &l_val) == 1) {
2582 llvm::APFloat(llvm::APFloat::x87DoubleExtended(),
2583 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128,
2584 ((type128 *)&l_val)->x));
2585 m_type = e_long_double;
2587 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2590 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "",
2591 (uint64_t)byte_size);
2596 case eEncodingVector:
2597 error.SetErrorString("vector encoding unsupported.");
2606 Error Scalar::SetValueFromData(DataExtractor &data, lldb::Encoding encoding,
2613 case lldb::eEncodingInvalid:
2614 error.SetErrorString("invalid encoding");
2616 case lldb::eEncodingVector:
2617 error.SetErrorString("vector encoding unsupported");
2619 case lldb::eEncodingUint: {
2620 lldb::offset_t offset = 0;
2622 switch (byte_size) {
2624 operator=((uint8_t)data.GetU8(&offset));
2627 operator=((uint16_t)data.GetU16(&offset));
2630 operator=((uint32_t)data.GetU32(&offset));
2633 operator=((uint64_t)data.GetU64(&offset));
2636 if (data.GetByteOrder() == eByteOrderBig) {
2637 int128.x[1] = (uint64_t)data.GetU64(&offset);
2638 int128.x[0] = (uint64_t)data.GetU64(&offset);
2640 int128.x[0] = (uint64_t)data.GetU64(&offset);
2641 int128.x[1] = (uint64_t)data.GetU64(&offset);
2643 operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
2646 if (data.GetByteOrder() == eByteOrderBig) {
2647 int256.x[3] = (uint64_t)data.GetU64(&offset);
2648 int256.x[2] = (uint64_t)data.GetU64(&offset);
2649 int256.x[1] = (uint64_t)data.GetU64(&offset);
2650 int256.x[0] = (uint64_t)data.GetU64(&offset);
2652 int256.x[0] = (uint64_t)data.GetU64(&offset);
2653 int256.x[1] = (uint64_t)data.GetU64(&offset);
2654 int256.x[2] = (uint64_t)data.GetU64(&offset);
2655 int256.x[3] = (uint64_t)data.GetU64(&offset);
2657 operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x));
2660 error.SetErrorStringWithFormat(
2661 "unsupported unsigned integer byte size: %" PRIu64 "",
2662 (uint64_t)byte_size);
2666 case lldb::eEncodingSint: {
2667 lldb::offset_t offset = 0;
2669 switch (byte_size) {
2671 operator=((int8_t)data.GetU8(&offset));
2674 operator=((int16_t)data.GetU16(&offset));
2677 operator=((int32_t)data.GetU32(&offset));
2680 operator=((int64_t)data.GetU64(&offset));
2683 if (data.GetByteOrder() == eByteOrderBig) {
2684 int128.x[1] = (uint64_t)data.GetU64(&offset);
2685 int128.x[0] = (uint64_t)data.GetU64(&offset);
2687 int128.x[0] = (uint64_t)data.GetU64(&offset);
2688 int128.x[1] = (uint64_t)data.GetU64(&offset);
2690 operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
2693 if (data.GetByteOrder() == eByteOrderBig) {
2694 int256.x[3] = (uint64_t)data.GetU64(&offset);
2695 int256.x[2] = (uint64_t)data.GetU64(&offset);
2696 int256.x[1] = (uint64_t)data.GetU64(&offset);
2697 int256.x[0] = (uint64_t)data.GetU64(&offset);
2699 int256.x[0] = (uint64_t)data.GetU64(&offset);
2700 int256.x[1] = (uint64_t)data.GetU64(&offset);
2701 int256.x[2] = (uint64_t)data.GetU64(&offset);
2702 int256.x[3] = (uint64_t)data.GetU64(&offset);
2704 operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x));
2707 error.SetErrorStringWithFormat(
2708 "unsupported signed integer byte size: %" PRIu64 "",
2709 (uint64_t)byte_size);
2713 case lldb::eEncodingIEEE754: {
2714 lldb::offset_t offset = 0;
2716 if (byte_size == sizeof(float))
2717 operator=((float)data.GetFloat(&offset));
2718 else if (byte_size == sizeof(double))
2719 operator=((double)data.GetDouble(&offset));
2720 else if (byte_size == sizeof(long double))
2721 operator=((long double)data.GetLongDouble(&offset));
2723 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "",
2724 (uint64_t)byte_size);
2731 bool Scalar::SignExtend(uint32_t sign_bit_pos) {
2732 const uint32_t max_bit_pos = GetByteSize() * 8;
2734 if (sign_bit_pos < max_bit_pos) {
2736 case Scalar::e_void:
2737 case Scalar::e_float:
2738 case Scalar::e_double:
2739 case Scalar::e_long_double:
2742 case Scalar::e_sint:
2743 case Scalar::e_uint:
2744 case Scalar::e_slong:
2745 case Scalar::e_ulong:
2746 case Scalar::e_slonglong:
2747 case Scalar::e_ulonglong:
2748 case Scalar::e_sint128:
2749 case Scalar::e_uint128:
2750 case Scalar::e_sint256:
2751 case Scalar::e_uint256:
2752 if (max_bit_pos == sign_bit_pos)
2754 else if (sign_bit_pos < (max_bit_pos - 1)) {
2755 llvm::APInt sign_bit = llvm::APInt::getSignBit(sign_bit_pos + 1);
2756 llvm::APInt bitwize_and = m_integer & sign_bit;
2757 if (bitwize_and.getBoolValue()) {
2758 const llvm::APInt mask =
2759 ~(sign_bit) + llvm::APInt(m_integer.getBitWidth(), 1);
2770 size_t Scalar::GetAsMemoryData(void *dst, size_t dst_len,
2771 lldb::ByteOrder dst_byte_order,
2772 Error &error) const {
2773 // Get a data extractor that points to the native scalar data
2775 if (!GetData(data)) {
2776 error.SetErrorString("invalid scalar value");
2780 const size_t src_len = data.GetByteSize();
2782 // Prepare a memory buffer that contains some or all of the register value
2783 const size_t bytes_copied =
2784 data.CopyByteOrderedData(0, // src offset
2785 src_len, // src length
2787 dst_len, // dst length
2788 dst_byte_order); // dst byte order
2789 if (bytes_copied == 0)
2790 error.SetErrorString("failed to copy data");
2792 return bytes_copied;
2795 bool Scalar::ExtractBitfield(uint32_t bit_size, uint32_t bit_offset) {
2800 case Scalar::e_void:
2801 case Scalar::e_float:
2802 case Scalar::e_double:
2803 case Scalar::e_long_double:
2806 case Scalar::e_sint:
2807 case Scalar::e_slong:
2808 case Scalar::e_slonglong:
2809 case Scalar::e_sint128:
2810 case Scalar::e_sint256:
2811 m_integer = m_integer.ashr(bit_offset)
2812 .sextOrTrunc(bit_size)
2813 .sextOrSelf(8 * GetByteSize());
2816 case Scalar::e_uint:
2817 case Scalar::e_ulong:
2818 case Scalar::e_ulonglong:
2819 case Scalar::e_uint128:
2820 case Scalar::e_uint256:
2821 m_integer = m_integer.lshr(bit_offset)
2822 .zextOrTrunc(bit_size)
2823 .zextOrSelf(8 * GetByteSize());
2829 bool lldb_private::operator==(const Scalar &lhs, const Scalar &rhs) {
2830 // If either entry is void then we can just compare the types
2831 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2832 return lhs.m_type == rhs.m_type;
2837 llvm::APFloat::cmpResult result;
2838 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2839 case Scalar::e_void:
2841 case Scalar::e_sint:
2842 case Scalar::e_uint:
2843 case Scalar::e_slong:
2844 case Scalar::e_ulong:
2845 case Scalar::e_slonglong:
2846 case Scalar::e_ulonglong:
2847 case Scalar::e_sint128:
2848 case Scalar::e_uint128:
2849 case Scalar::e_sint256:
2850 case Scalar::e_uint256:
2851 return a->m_integer == b->m_integer;
2852 case Scalar::e_float:
2853 case Scalar::e_double:
2854 case Scalar::e_long_double:
2855 result = a->m_float.compare(b->m_float);
2856 if (result == llvm::APFloat::cmpEqual)
2862 bool lldb_private::operator!=(const Scalar &lhs, const Scalar &rhs) {
2863 // If either entry is void then we can just compare the types
2864 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2865 return lhs.m_type != rhs.m_type;
2868 temp_value; // A temp value that might get a copy of either promoted value
2871 llvm::APFloat::cmpResult result;
2872 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2873 case Scalar::e_void:
2875 case Scalar::e_sint:
2876 case Scalar::e_uint:
2877 case Scalar::e_slong:
2878 case Scalar::e_ulong:
2879 case Scalar::e_slonglong:
2880 case Scalar::e_ulonglong:
2881 case Scalar::e_sint128:
2882 case Scalar::e_uint128:
2883 case Scalar::e_sint256:
2884 case Scalar::e_uint256:
2885 return a->m_integer != b->m_integer;
2886 case Scalar::e_float:
2887 case Scalar::e_double:
2888 case Scalar::e_long_double:
2889 result = a->m_float.compare(b->m_float);
2890 if (result != llvm::APFloat::cmpEqual)
2896 bool lldb_private::operator<(const Scalar &lhs, const Scalar &rhs) {
2897 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2903 llvm::APFloat::cmpResult result;
2904 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2905 case Scalar::e_void:
2907 case Scalar::e_sint:
2908 case Scalar::e_slong:
2909 case Scalar::e_slonglong:
2910 case Scalar::e_sint128:
2911 case Scalar::e_sint256:
2912 return a->m_integer.slt(b->m_integer);
2913 case Scalar::e_uint:
2914 case Scalar::e_ulong:
2915 case Scalar::e_ulonglong:
2916 case Scalar::e_uint128:
2917 case Scalar::e_uint256:
2918 return a->m_integer.ult(b->m_integer);
2919 case Scalar::e_float:
2920 case Scalar::e_double:
2921 case Scalar::e_long_double:
2922 result = a->m_float.compare(b->m_float);
2923 if (result == llvm::APFloat::cmpLessThan)
2929 bool lldb_private::operator<=(const Scalar &lhs, const Scalar &rhs) {
2930 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2936 llvm::APFloat::cmpResult result;
2937 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2938 case Scalar::e_void:
2940 case Scalar::e_sint:
2941 case Scalar::e_slong:
2942 case Scalar::e_slonglong:
2943 case Scalar::e_sint128:
2944 case Scalar::e_sint256:
2945 return a->m_integer.sle(b->m_integer);
2946 case Scalar::e_uint:
2947 case Scalar::e_ulong:
2948 case Scalar::e_ulonglong:
2949 case Scalar::e_uint128:
2950 case Scalar::e_uint256:
2951 return a->m_integer.ule(b->m_integer);
2952 case Scalar::e_float:
2953 case Scalar::e_double:
2954 case Scalar::e_long_double:
2955 result = a->m_float.compare(b->m_float);
2956 if (result == llvm::APFloat::cmpLessThan ||
2957 result == llvm::APFloat::cmpEqual)
2963 bool lldb_private::operator>(const Scalar &lhs, const Scalar &rhs) {
2964 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2970 llvm::APFloat::cmpResult result;
2971 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2972 case Scalar::e_void:
2974 case Scalar::e_sint:
2975 case Scalar::e_slong:
2976 case Scalar::e_slonglong:
2977 case Scalar::e_sint128:
2978 case Scalar::e_sint256:
2979 return a->m_integer.sgt(b->m_integer);
2980 case Scalar::e_uint:
2981 case Scalar::e_ulong:
2982 case Scalar::e_ulonglong:
2983 case Scalar::e_uint128:
2984 case Scalar::e_uint256:
2985 return a->m_integer.ugt(b->m_integer);
2986 case Scalar::e_float:
2987 case Scalar::e_double:
2988 case Scalar::e_long_double:
2989 result = a->m_float.compare(b->m_float);
2990 if (result == llvm::APFloat::cmpGreaterThan)
2996 bool lldb_private::operator>=(const Scalar &lhs, const Scalar &rhs) {
2997 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
3003 llvm::APFloat::cmpResult result;
3004 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
3005 case Scalar::e_void:
3007 case Scalar::e_sint:
3008 case Scalar::e_slong:
3009 case Scalar::e_slonglong:
3010 case Scalar::e_sint128:
3011 case Scalar::e_sint256:
3012 return a->m_integer.sge(b->m_integer);
3013 case Scalar::e_uint:
3014 case Scalar::e_ulong:
3015 case Scalar::e_ulonglong:
3016 case Scalar::e_uint128:
3017 case Scalar::e_uint256:
3018 return a->m_integer.uge(b->m_integer);
3019 case Scalar::e_float:
3020 case Scalar::e_double:
3021 case Scalar::e_long_double:
3022 result = a->m_float.compare(b->m_float);
3023 if (result == llvm::APFloat::cmpGreaterThan ||
3024 result == llvm::APFloat::cmpEqual)
3030 bool Scalar::ClearBit(uint32_t bit) {
3044 m_integer.clearBit(bit);
3054 bool Scalar::SetBit(uint32_t bit) {
3068 m_integer.setBit(bit);