1 //===-- Scalar.cpp ----------------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "lldb/Utility/Scalar.h"
11 #include "lldb/Utility/DataExtractor.h"
12 #include "lldb/Utility/Endian.h"
13 #include "lldb/Utility/Status.h"
14 #include "lldb/Utility/Stream.h"
15 #include "lldb/Utility/StreamString.h"
16 #include "lldb/lldb-types.h"
18 #include "llvm/ADT/SmallString.h"
24 using namespace lldb_private;
26 // Promote to max type currently follows the ANSI C rule for type promotion in
28 static Scalar::Type PromoteToMaxType(
29 const Scalar &lhs, // The const left hand side object
30 const Scalar &rhs, // The const right hand side object
31 Scalar &temp_value, // A modifiable temp value than can be used to hold
32 // either the promoted lhs or rhs object
33 const Scalar *&promoted_lhs_ptr, // Pointer to the resulting possibly
34 // promoted value of lhs (at most one of
35 // lhs/rhs will get promoted)
36 const Scalar *&promoted_rhs_ptr // Pointer to the resulting possibly
37 // promoted value of rhs (at most one of
38 // lhs/rhs will get promoted)
41 // Initialize the promoted values for both the right and left hand side
42 // values to be the objects themselves. If no promotion is needed (both right
43 // and left have the same type), then the temp_value will not get used.
44 promoted_lhs_ptr = &lhs;
45 promoted_rhs_ptr = &rhs;
46 // Extract the types of both the right and left hand side values
47 Scalar::Type lhs_type = lhs.GetType();
48 Scalar::Type rhs_type = rhs.GetType();
50 if (lhs_type > rhs_type) {
51 // Right hand side need to be promoted
52 temp_value = rhs; // Copy right hand side into the temp value
53 if (temp_value.Promote(lhs_type)) // Promote it
55 &temp_value; // Update the pointer for the promoted right hand side
56 } else if (lhs_type < rhs_type) {
57 // Left hand side need to be promoted
58 temp_value = lhs; // Copy left hand side value into the temp value
59 if (temp_value.Promote(rhs_type)) // Promote it
61 &temp_value; // Update the pointer for the promoted left hand side
64 // Make sure our type promotion worked as expected
65 if (promoted_lhs_ptr->GetType() == promoted_rhs_ptr->GetType())
66 return promoted_lhs_ptr->GetType(); // Return the resulting max type
68 // Return the void type (zero) if we fail to promote either of the values.
69 return Scalar::e_void;
72 Scalar::Scalar() : m_type(e_void), m_float(static_cast<float>(0)) {}
74 bool Scalar::GetData(DataExtractor &data, size_t limit_byte_size) const {
75 size_t byte_size = GetByteSize();
77 const uint8_t *bytes = reinterpret_cast<const uint8_t *>(GetBytes());
79 if (limit_byte_size < byte_size) {
80 if (endian::InlHostByteOrder() == eByteOrderLittle) {
81 // On little endian systems if we want fewer bytes from the current
82 // type we just specify fewer bytes since the LSByte is first...
83 byte_size = limit_byte_size;
84 } else if (endian::InlHostByteOrder() == eByteOrderBig) {
85 // On big endian systems if we want fewer bytes from the current type
86 // have to advance our initial byte pointer and trim down the number of
87 // bytes since the MSByte is first
88 bytes += byte_size - limit_byte_size;
89 byte_size = limit_byte_size;
93 data.SetData(bytes, byte_size, endian::InlHostByteOrder());
100 const void *Scalar::GetBytes() const {
101 const uint64_t *apint_words;
102 const uint8_t *bytes;
103 static float_t flt_val;
104 static double_t dbl_val;
105 static uint64_t swapped_words[8];
115 bytes = reinterpret_cast<const uint8_t *>(m_integer.getRawData());
116 // getRawData always returns a pointer to an uint64_t. If we have a
117 // smaller type, we need to update the pointer on big-endian systems.
118 if (endian::InlHostByteOrder() == eByteOrderBig) {
119 size_t byte_size = m_integer.getBitWidth() / 8;
121 bytes += 8 - byte_size;
124 // getRawData always returns a pointer to an array of uint64_t values,
125 // where the least-significant word always comes first. On big-endian
126 // systems we need to swap the words.
129 apint_words = m_integer.getRawData();
130 if (endian::InlHostByteOrder() == eByteOrderBig) {
131 swapped_words[0] = apint_words[1];
132 swapped_words[1] = apint_words[0];
133 apint_words = swapped_words;
135 return reinterpret_cast<const void *>(apint_words);
138 apint_words = m_integer.getRawData();
139 if (endian::InlHostByteOrder() == eByteOrderBig) {
140 swapped_words[0] = apint_words[3];
141 swapped_words[1] = apint_words[2];
142 swapped_words[2] = apint_words[1];
143 swapped_words[3] = apint_words[0];
144 apint_words = swapped_words;
146 return reinterpret_cast<const void *>(apint_words);
149 apint_words = m_integer.getRawData();
150 if (endian::InlHostByteOrder() == eByteOrderBig) {
151 swapped_words[0] = apint_words[7];
152 swapped_words[1] = apint_words[6];
153 swapped_words[2] = apint_words[5];
154 swapped_words[3] = apint_words[4];
155 swapped_words[4] = apint_words[3];
156 swapped_words[5] = apint_words[2];
157 swapped_words[6] = apint_words[1];
158 swapped_words[7] = apint_words[0];
159 apint_words = swapped_words;
161 return reinterpret_cast<const void *>(apint_words);
163 flt_val = m_float.convertToFloat();
164 return reinterpret_cast<const void *>(&flt_val);
166 dbl_val = m_float.convertToDouble();
167 return reinterpret_cast<const void *>(&dbl_val);
169 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
170 apint_words = ldbl_val.getRawData();
171 // getRawData always returns a pointer to an array of two uint64_t values,
172 // where the least-significant word always comes first. On big-endian
173 // systems we need to swap the two words.
174 if (endian::InlHostByteOrder() == eByteOrderBig) {
175 swapped_words[0] = apint_words[1];
176 swapped_words[1] = apint_words[0];
177 apint_words = swapped_words;
179 return reinterpret_cast<const void *>(apint_words);
184 size_t Scalar::GetByteSize() const {
200 return (m_integer.getBitWidth() / 8);
202 return sizeof(float_t);
204 return sizeof(double_t);
206 return sizeof(long_double_t);
211 bool Scalar::IsZero() const {
212 llvm::APInt zero_int = llvm::APInt::getNullValue(m_integer.getBitWidth() / 8);
228 return llvm::APInt::isSameValue(zero_int, m_integer);
232 return m_float.isZero();
237 void Scalar::GetValue(Stream *s, bool show_type) const {
239 s->Printf("(%s) ", GetTypeAsCString());
250 s->PutCString(m_integer.toString(10, true));
258 s->PutCString(m_integer.toString(10, false));
263 llvm::SmallString<24> string;
264 m_float.toString(string);
265 s->Printf("%s", string.c_str());
270 const char *Scalar::GetTypeAsCString() const {
277 return "unsigned int";
281 return "unsigned long";
285 return "unsigned long long";
289 return "unsigned int128_t";
293 return "unsigned int256_t";
297 return "unsigned int512_t";
303 return "long double";
305 return "<invalid Scalar type>";
308 Scalar &Scalar::operator=(const Scalar &rhs) {
311 m_integer = llvm::APInt(rhs.m_integer);
312 m_float = rhs.m_float;
317 Scalar &Scalar::operator=(const int v) {
319 m_integer = llvm::APInt(sizeof(int) * 8, v, true);
323 Scalar &Scalar::operator=(unsigned int v) {
325 m_integer = llvm::APInt(sizeof(int) * 8, v);
329 Scalar &Scalar::operator=(long v) {
331 m_integer = llvm::APInt(sizeof(long) * 8, v, true);
335 Scalar &Scalar::operator=(unsigned long v) {
337 m_integer = llvm::APInt(sizeof(long) * 8, v);
341 Scalar &Scalar::operator=(long long v) {
342 m_type = e_slonglong;
343 m_integer = llvm::APInt(sizeof(long) * 8, v, true);
347 Scalar &Scalar::operator=(unsigned long long v) {
348 m_type = e_ulonglong;
349 m_integer = llvm::APInt(sizeof(long long) * 8, v);
353 Scalar &Scalar::operator=(float v) {
355 m_float = llvm::APFloat(v);
359 Scalar &Scalar::operator=(double v) {
361 m_float = llvm::APFloat(v);
365 Scalar &Scalar::operator=(long double v) {
366 m_type = e_long_double;
368 m_float = llvm::APFloat(llvm::APFloat::IEEEquad(),
369 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128,
370 (reinterpret_cast<type128 *>(&v))->x));
372 m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended(),
373 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128,
374 (reinterpret_cast<type128 *>(&v))->x));
378 Scalar &Scalar::operator=(llvm::APInt rhs) {
379 m_integer = llvm::APInt(rhs);
380 switch (m_integer.getBitWidth()) {
384 if (m_integer.isSignedIntN(sizeof(sint_t) * 8))
390 if (m_integer.isSignedIntN(sizeof(slonglong_t) * 8))
391 m_type = e_slonglong;
393 m_type = e_ulonglong;
396 if (m_integer.isSignedIntN(BITWIDTH_INT128))
402 if (m_integer.isSignedIntN(BITWIDTH_INT256))
408 if (m_integer.isSignedIntN(BITWIDTH_INT512))
417 Scalar::~Scalar() = default;
419 bool Scalar::Promote(Scalar::Type type) {
420 bool success = false;
433 m_integer = m_integer.sextOrTrunc(sizeof(uint_t) * 8);
438 m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8);
443 m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8);
448 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
453 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
459 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
465 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
471 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
476 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
477 m_float.convertFromAPInt(m_integer, true,
478 llvm::APFloat::rmNearestTiesToEven);
483 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
484 m_float.convertFromAPInt(m_integer, true,
485 llvm::APFloat::rmNearestTiesToEven);
490 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
491 : llvm::APFloat::x87DoubleExtended());
492 m_float.convertFromAPInt(m_integer, true,
493 llvm::APFloat::rmNearestTiesToEven);
508 m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8);
513 m_integer = m_integer.zextOrTrunc(sizeof(ulong_t) * 8);
518 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
523 m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8);
529 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
535 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
541 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
546 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
547 m_float.convertFromAPInt(m_integer, false,
548 llvm::APFloat::rmNearestTiesToEven);
553 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
554 m_float.convertFromAPInt(m_integer, false,
555 llvm::APFloat::rmNearestTiesToEven);
560 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
561 : llvm::APFloat::x87DoubleExtended());
562 m_float.convertFromAPInt(m_integer, false,
563 llvm::APFloat::rmNearestTiesToEven);
579 m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8);
584 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
589 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
595 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
601 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
607 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
612 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
613 m_float.convertFromAPInt(m_integer, true,
614 llvm::APFloat::rmNearestTiesToEven);
619 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
620 m_float.convertFromAPInt(m_integer, true,
621 llvm::APFloat::rmNearestTiesToEven);
626 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
627 : llvm::APFloat::x87DoubleExtended());
628 m_float.convertFromAPInt(m_integer, true,
629 llvm::APFloat::rmNearestTiesToEven);
646 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
651 m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8);
657 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
663 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
669 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
674 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
675 m_float.convertFromAPInt(m_integer, false,
676 llvm::APFloat::rmNearestTiesToEven);
681 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
682 m_float.convertFromAPInt(m_integer, false,
683 llvm::APFloat::rmNearestTiesToEven);
688 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
689 : llvm::APFloat::x87DoubleExtended());
690 m_float.convertFromAPInt(m_integer, false,
691 llvm::APFloat::rmNearestTiesToEven);
709 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
715 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
721 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
727 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
732 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
733 m_float.convertFromAPInt(m_integer, true,
734 llvm::APFloat::rmNearestTiesToEven);
739 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
740 m_float.convertFromAPInt(m_integer, true,
741 llvm::APFloat::rmNearestTiesToEven);
746 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
747 : llvm::APFloat::x87DoubleExtended());
748 m_float.convertFromAPInt(m_integer, true,
749 llvm::APFloat::rmNearestTiesToEven);
769 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
775 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
781 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
786 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
787 m_float.convertFromAPInt(m_integer, false,
788 llvm::APFloat::rmNearestTiesToEven);
793 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
794 m_float.convertFromAPInt(m_integer, false,
795 llvm::APFloat::rmNearestTiesToEven);
800 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
801 : llvm::APFloat::x87DoubleExtended());
802 m_float.convertFromAPInt(m_integer, false,
803 llvm::APFloat::rmNearestTiesToEven);
823 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
829 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
835 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
840 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
841 m_float.convertFromAPInt(m_integer, true,
842 llvm::APFloat::rmNearestTiesToEven);
847 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
848 m_float.convertFromAPInt(m_integer, true,
849 llvm::APFloat::rmNearestTiesToEven);
854 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
855 : llvm::APFloat::x87DoubleExtended());
856 m_float.convertFromAPInt(m_integer, true,
857 llvm::APFloat::rmNearestTiesToEven);
879 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
885 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
890 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
891 m_float.convertFromAPInt(m_integer, false,
892 llvm::APFloat::rmNearestTiesToEven);
897 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
898 m_float.convertFromAPInt(m_integer, false,
899 llvm::APFloat::rmNearestTiesToEven);
904 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
905 : llvm::APFloat::x87DoubleExtended());
906 m_float.convertFromAPInt(m_integer, false,
907 llvm::APFloat::rmNearestTiesToEven);
929 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
935 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
940 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
941 m_float.convertFromAPInt(m_integer, true,
942 llvm::APFloat::rmNearestTiesToEven);
947 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
948 m_float.convertFromAPInt(m_integer, true,
949 llvm::APFloat::rmNearestTiesToEven);
954 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
955 : llvm::APFloat::x87DoubleExtended());
956 m_float.convertFromAPInt(m_integer, true,
957 llvm::APFloat::rmNearestTiesToEven);
982 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
987 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
988 m_float.convertFromAPInt(m_integer, false,
989 llvm::APFloat::rmNearestTiesToEven);
994 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
995 m_float.convertFromAPInt(m_integer, false,
996 llvm::APFloat::rmNearestTiesToEven);
1001 m_float = llvm::APFloat(m_ieee_quad ? llvm::APFloat::IEEEquad()
1002 : llvm::APFloat::x87DoubleExtended());
1003 m_float.convertFromAPInt(m_integer, false,
1004 llvm::APFloat::rmNearestTiesToEven);
1012 lldbassert(false && "unimplemented");
1035 m_float = llvm::APFloat(static_cast<double_t>(m_float.convertToFloat()));
1039 case e_long_double: {
1041 m_float.convert(m_ieee_quad ? llvm::APFloat::IEEEquad()
1042 : llvm::APFloat::x87DoubleExtended(),
1043 llvm::APFloat::rmNearestTiesToEven, &ignore);
1070 case e_long_double: {
1072 m_float.convert(m_ieee_quad ? llvm::APFloat::IEEEquad()
1073 : llvm::APFloat::x87DoubleExtended(),
1074 llvm::APFloat::rmNearestTiesToEven, &ignore);
1111 const char *Scalar::GetValueTypeAsCString(Scalar::Type type) {
1118 return "unsigned int";
1122 return "unsigned long";
1126 return "unsigned long long";
1132 return "long double";
1150 Scalar::GetValueTypeForSignedIntegerWithByteSize(size_t byte_size) {
1151 if (byte_size <= sizeof(sint_t))
1153 if (byte_size <= sizeof(slong_t))
1155 if (byte_size <= sizeof(slonglong_t))
1161 Scalar::GetValueTypeForUnsignedIntegerWithByteSize(size_t byte_size) {
1162 if (byte_size <= sizeof(uint_t))
1164 if (byte_size <= sizeof(ulong_t))
1166 if (byte_size <= sizeof(ulonglong_t))
1171 Scalar::Type Scalar::GetValueTypeForFloatWithByteSize(size_t byte_size) {
1172 if (byte_size == sizeof(float_t))
1174 if (byte_size == sizeof(double_t))
1176 if (byte_size == sizeof(long_double_t))
1177 return e_long_double;
1181 bool Scalar::MakeSigned() {
1182 bool success = false;
1205 m_type = e_slonglong;
1243 bool Scalar::MakeUnsigned() {
1244 bool success = false;
1264 m_type = e_ulonglong;
1305 signed char Scalar::SChar(char fail_value) const {
1321 return static_cast<schar_t>(
1322 (m_integer.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue());
1324 return static_cast<schar_t>(m_float.convertToFloat());
1326 return static_cast<schar_t>(m_float.convertToDouble());
1328 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1329 return static_cast<schar_t>(
1330 (ldbl_val.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue());
1335 unsigned char Scalar::UChar(unsigned char fail_value) const {
1351 return static_cast<uchar_t>(
1352 (m_integer.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue());
1354 return static_cast<uchar_t>(m_float.convertToFloat());
1356 return static_cast<uchar_t>(m_float.convertToDouble());
1358 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1359 return static_cast<uchar_t>(
1360 (ldbl_val.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue());
1365 short Scalar::SShort(short fail_value) const {
1381 return static_cast<sshort_t>(
1382 (m_integer.sextOrTrunc(sizeof(sshort_t) * 8)).getSExtValue());
1384 return static_cast<sshort_t>(m_float.convertToFloat());
1386 return static_cast<sshort_t>(m_float.convertToDouble());
1388 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1389 return static_cast<sshort_t>(
1390 (ldbl_val.sextOrTrunc(sizeof(sshort_t) * 8)).getSExtValue());
1395 unsigned short Scalar::UShort(unsigned short fail_value) const {
1411 return static_cast<ushort_t>(
1412 (m_integer.zextOrTrunc(sizeof(ushort_t) * 8)).getZExtValue());
1414 return static_cast<ushort_t>(m_float.convertToFloat());
1416 return static_cast<ushort_t>(m_float.convertToDouble());
1418 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1419 return static_cast<ushort_t>(
1420 (ldbl_val.zextOrTrunc(sizeof(ushort_t) * 8)).getZExtValue());
1425 int Scalar::SInt(int fail_value) const {
1441 return static_cast<sint_t>(
1442 (m_integer.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue());
1444 return static_cast<sint_t>(m_float.convertToFloat());
1446 return static_cast<sint_t>(m_float.convertToDouble());
1448 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1449 return static_cast<sint_t>(
1450 (ldbl_val.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue());
1455 unsigned int Scalar::UInt(unsigned int fail_value) const {
1471 return static_cast<uint_t>(
1472 (m_integer.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue());
1474 return static_cast<uint_t>(m_float.convertToFloat());
1476 return static_cast<uint_t>(m_float.convertToDouble());
1478 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1479 return static_cast<uint_t>(
1480 (ldbl_val.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue());
1485 long Scalar::SLong(long fail_value) const {
1501 return static_cast<slong_t>(
1502 (m_integer.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue());
1504 return static_cast<slong_t>(m_float.convertToFloat());
1506 return static_cast<slong_t>(m_float.convertToDouble());
1508 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1509 return static_cast<slong_t>(
1510 (ldbl_val.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue());
1515 unsigned long Scalar::ULong(unsigned long fail_value) const {
1531 return static_cast<ulong_t>(
1532 (m_integer.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue());
1534 return static_cast<ulong_t>(m_float.convertToFloat());
1536 return static_cast<ulong_t>(m_float.convertToDouble());
1538 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1539 return static_cast<ulong_t>(
1540 (ldbl_val.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue());
1545 long long Scalar::SLongLong(long long fail_value) const {
1561 return static_cast<slonglong_t>(
1562 (m_integer.sextOrTrunc(sizeof(slonglong_t) * 8)).getSExtValue());
1564 return static_cast<slonglong_t>(m_float.convertToFloat());
1566 return static_cast<slonglong_t>(m_float.convertToDouble());
1568 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1569 return static_cast<slonglong_t>(
1570 (ldbl_val.sextOrTrunc(sizeof(slonglong_t) * 8)).getSExtValue());
1575 unsigned long long Scalar::ULongLong(unsigned long long fail_value) const {
1591 return static_cast<ulonglong_t>(
1592 (m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue());
1594 return static_cast<ulonglong_t>(m_float.convertToFloat());
1596 double d_val = m_float.convertToDouble();
1597 llvm::APInt rounded_double =
1598 llvm::APIntOps::RoundDoubleToAPInt(d_val, sizeof(ulonglong_t) * 8);
1599 return static_cast<ulonglong_t>(
1600 (rounded_double.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue());
1603 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1604 return static_cast<ulonglong_t>(
1605 (ldbl_val.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue());
1610 llvm::APInt Scalar::SInt128(llvm::APInt &fail_value) const {
1630 return m_float.bitcastToAPInt();
1635 llvm::APInt Scalar::UInt128(const llvm::APInt &fail_value) const {
1655 return m_float.bitcastToAPInt();
1660 float Scalar::Float(float fail_value) const {
1676 return llvm::APIntOps::RoundAPIntToFloat(m_integer);
1678 return m_float.convertToFloat();
1680 return static_cast<float_t>(m_float.convertToDouble());
1682 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1683 return ldbl_val.bitsToFloat();
1688 double Scalar::Double(double fail_value) const {
1704 return llvm::APIntOps::RoundAPIntToDouble(m_integer);
1706 return static_cast<double_t>(m_float.convertToFloat());
1708 return m_float.convertToDouble();
1710 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1711 return ldbl_val.bitsToFloat();
1716 long double Scalar::LongDouble(long double fail_value) const {
1732 return static_cast<long_double_t>(
1733 llvm::APIntOps::RoundAPIntToDouble(m_integer));
1735 return static_cast<long_double_t>(m_float.convertToFloat());
1737 return static_cast<long_double_t>(m_float.convertToDouble());
1739 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1740 return static_cast<long_double_t>(ldbl_val.bitsToDouble());
1745 Scalar &Scalar::operator+=(const Scalar &rhs) {
1749 if ((m_type = PromoteToMaxType(*this, rhs, temp_value, a, b)) !=
1766 m_integer = a->m_integer + b->m_integer;
1772 m_float = a->m_float + b->m_float;
1779 Scalar &Scalar::operator<<=(const Scalar &rhs) {
1800 switch (rhs.m_type) {
1819 m_integer = m_integer << rhs.m_integer;
1827 bool Scalar::ShiftRightLogical(const Scalar &rhs) {
1848 switch (rhs.m_type) {
1867 m_integer = m_integer.lshr(rhs.m_integer);
1872 return m_type != e_void;
1875 Scalar &Scalar::operator>>=(const Scalar &rhs) {
1896 switch (rhs.m_type) {
1915 m_integer = m_integer.ashr(rhs.m_integer);
1923 Scalar &Scalar::operator&=(const Scalar &rhs) {
1944 switch (rhs.m_type) {
1963 m_integer &= rhs.m_integer;
1971 bool Scalar::AbsoluteValue() {
1982 if (m_integer.isNegative())
1983 m_integer = -m_integer;
1996 m_float.clearSign();
2002 bool Scalar::UnaryNegate() {
2018 m_integer = -m_integer;
2023 m_float.changeSign();
2029 bool Scalar::OnesComplement() {
2043 m_integer = ~m_integer;
2055 const Scalar lldb_private::operator+(const Scalar &lhs, const Scalar &rhs) {
2060 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2062 switch (result.m_type) {
2063 case Scalar::e_void:
2065 case Scalar::e_sint:
2066 case Scalar::e_uint:
2067 case Scalar::e_slong:
2068 case Scalar::e_ulong:
2069 case Scalar::e_slonglong:
2070 case Scalar::e_ulonglong:
2071 case Scalar::e_sint128:
2072 case Scalar::e_uint128:
2073 case Scalar::e_sint256:
2074 case Scalar::e_uint256:
2075 case Scalar::e_sint512:
2076 case Scalar::e_uint512:
2077 result.m_integer = a->m_integer + b->m_integer;
2079 case Scalar::e_float:
2080 case Scalar::e_double:
2081 case Scalar::e_long_double:
2082 result.m_float = a->m_float + b->m_float;
2089 const Scalar lldb_private::operator-(const Scalar &lhs, const Scalar &rhs) {
2094 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2096 switch (result.m_type) {
2097 case Scalar::e_void:
2099 case Scalar::e_sint:
2100 case Scalar::e_uint:
2101 case Scalar::e_slong:
2102 case Scalar::e_ulong:
2103 case Scalar::e_slonglong:
2104 case Scalar::e_ulonglong:
2105 case Scalar::e_sint128:
2106 case Scalar::e_uint128:
2107 case Scalar::e_sint256:
2108 case Scalar::e_uint256:
2109 case Scalar::e_sint512:
2110 case Scalar::e_uint512:
2111 result.m_integer = a->m_integer - b->m_integer;
2113 case Scalar::e_float:
2114 case Scalar::e_double:
2115 case Scalar::e_long_double:
2116 result.m_float = a->m_float - b->m_float;
2123 const Scalar lldb_private::operator/(const Scalar &lhs, const Scalar &rhs) {
2128 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2130 switch (result.m_type) {
2131 case Scalar::e_void:
2133 case Scalar::e_sint:
2134 case Scalar::e_slong:
2135 case Scalar::e_slonglong:
2136 case Scalar::e_sint128:
2137 case Scalar::e_sint256:
2138 case Scalar::e_sint512:
2139 if (b->m_integer != 0) {
2140 result.m_integer = a->m_integer.sdiv(b->m_integer);
2144 case Scalar::e_uint:
2145 case Scalar::e_ulong:
2146 case Scalar::e_ulonglong:
2147 case Scalar::e_uint128:
2148 case Scalar::e_uint256:
2149 case Scalar::e_uint512:
2150 if (b->m_integer != 0) {
2151 result.m_integer = a->m_integer.udiv(b->m_integer);
2155 case Scalar::e_float:
2156 case Scalar::e_double:
2157 case Scalar::e_long_double:
2158 if (!b->m_float.isZero()) {
2159 result.m_float = a->m_float / b->m_float;
2165 // For division only, the only way it should make it here is if a promotion
2166 // failed, or if we are trying to do a divide by zero.
2167 result.m_type = Scalar::e_void;
2171 const Scalar lldb_private::operator*(const Scalar &lhs, const Scalar &rhs) {
2176 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2178 switch (result.m_type) {
2179 case Scalar::e_void:
2181 case Scalar::e_sint:
2182 case Scalar::e_uint:
2183 case Scalar::e_slong:
2184 case Scalar::e_ulong:
2185 case Scalar::e_slonglong:
2186 case Scalar::e_ulonglong:
2187 case Scalar::e_sint128:
2188 case Scalar::e_uint128:
2189 case Scalar::e_sint256:
2190 case Scalar::e_uint256:
2191 case Scalar::e_sint512:
2192 case Scalar::e_uint512:
2193 result.m_integer = a->m_integer * b->m_integer;
2195 case Scalar::e_float:
2196 case Scalar::e_double:
2197 case Scalar::e_long_double:
2198 result.m_float = a->m_float * b->m_float;
2205 const Scalar lldb_private::operator&(const Scalar &lhs, const Scalar &rhs) {
2210 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2212 switch (result.m_type) {
2213 case Scalar::e_sint:
2214 case Scalar::e_uint:
2215 case Scalar::e_slong:
2216 case Scalar::e_ulong:
2217 case Scalar::e_slonglong:
2218 case Scalar::e_ulonglong:
2219 case Scalar::e_sint128:
2220 case Scalar::e_uint128:
2221 case Scalar::e_sint256:
2222 case Scalar::e_uint256:
2223 case Scalar::e_sint512:
2224 case Scalar::e_uint512:
2225 result.m_integer = a->m_integer & b->m_integer;
2227 case Scalar::e_void:
2228 case Scalar::e_float:
2229 case Scalar::e_double:
2230 case Scalar::e_long_double:
2231 // No bitwise AND on floats, doubles of long doubles
2232 result.m_type = Scalar::e_void;
2239 const Scalar lldb_private::operator|(const Scalar &lhs, const Scalar &rhs) {
2244 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2246 switch (result.m_type) {
2247 case Scalar::e_sint:
2248 case Scalar::e_uint:
2249 case Scalar::e_slong:
2250 case Scalar::e_ulong:
2251 case Scalar::e_slonglong:
2252 case Scalar::e_ulonglong:
2253 case Scalar::e_sint128:
2254 case Scalar::e_uint128:
2255 case Scalar::e_sint256:
2256 case Scalar::e_uint256:
2257 case Scalar::e_sint512:
2258 case Scalar::e_uint512:
2259 result.m_integer = a->m_integer | b->m_integer;
2262 case Scalar::e_void:
2263 case Scalar::e_float:
2264 case Scalar::e_double:
2265 case Scalar::e_long_double:
2266 // No bitwise AND on floats, doubles of long doubles
2267 result.m_type = Scalar::e_void;
2274 const Scalar lldb_private::operator%(const Scalar &lhs, const Scalar &rhs) {
2279 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2281 switch (result.m_type) {
2284 case Scalar::e_void:
2286 case Scalar::e_sint:
2287 case Scalar::e_slong:
2288 case Scalar::e_slonglong:
2289 case Scalar::e_sint128:
2290 case Scalar::e_sint256:
2291 case Scalar::e_sint512:
2292 if (b->m_integer != 0) {
2293 result.m_integer = a->m_integer.srem(b->m_integer);
2297 case Scalar::e_uint:
2298 case Scalar::e_ulong:
2299 case Scalar::e_ulonglong:
2300 case Scalar::e_uint128:
2301 case Scalar::e_uint256:
2302 case Scalar::e_uint512:
2303 if (b->m_integer != 0) {
2304 result.m_integer = a->m_integer.urem(b->m_integer);
2310 result.m_type = Scalar::e_void;
2314 const Scalar lldb_private::operator^(const Scalar &lhs, const Scalar &rhs) {
2319 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2321 switch (result.m_type) {
2322 case Scalar::e_sint:
2323 case Scalar::e_uint:
2324 case Scalar::e_slong:
2325 case Scalar::e_ulong:
2326 case Scalar::e_slonglong:
2327 case Scalar::e_ulonglong:
2328 case Scalar::e_sint128:
2329 case Scalar::e_uint128:
2330 case Scalar::e_sint256:
2331 case Scalar::e_uint256:
2332 case Scalar::e_sint512:
2333 case Scalar::e_uint512:
2334 result.m_integer = a->m_integer ^ b->m_integer;
2337 case Scalar::e_void:
2338 case Scalar::e_float:
2339 case Scalar::e_double:
2340 case Scalar::e_long_double:
2341 // No bitwise AND on floats, doubles of long doubles
2342 result.m_type = Scalar::e_void;
2349 const Scalar lldb_private::operator<<(const Scalar &lhs, const Scalar &rhs) {
2350 Scalar result = lhs;
2355 const Scalar lldb_private::operator>>(const Scalar &lhs, const Scalar &rhs) {
2356 Scalar result = lhs;
2361 Status Scalar::SetValueFromCString(const char *value_str, Encoding encoding,
2364 if (value_str == nullptr || value_str[0] == '\0') {
2365 error.SetErrorString("Invalid c-string value string.");
2369 case eEncodingInvalid:
2370 error.SetErrorString("Invalid encoding.");
2374 if (byte_size <= sizeof(uint64_t)) {
2376 if (!llvm::to_integer(value_str, uval64))
2377 error.SetErrorStringWithFormat(
2378 "'%s' is not a valid unsigned integer string value", value_str);
2379 else if (!UIntValueIsValidForSize(uval64, byte_size))
2380 error.SetErrorStringWithFormat(
2381 "value 0x%" PRIx64 " is too large to fit in a %" PRIu64
2382 " byte unsigned integer value",
2383 uval64, static_cast<uint64_t>(byte_size));
2385 m_type = Scalar::GetValueTypeForUnsignedIntegerWithByteSize(byte_size);
2388 m_integer = llvm::APInt(sizeof(uint_t) * 8, uval64, false);
2391 m_integer = llvm::APInt(sizeof(ulong_t) * 8, uval64, false);
2394 m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, uval64, false);
2397 error.SetErrorStringWithFormat(
2398 "unsupported unsigned integer byte size: %" PRIu64 "",
2399 static_cast<uint64_t>(byte_size));
2404 error.SetErrorStringWithFormat(
2405 "unsupported unsigned integer byte size: %" PRIu64 "",
2406 static_cast<uint64_t>(byte_size));
2412 if (byte_size <= sizeof(int64_t)) {
2414 if (!llvm::to_integer(value_str, sval64))
2415 error.SetErrorStringWithFormat(
2416 "'%s' is not a valid signed integer string value", value_str);
2417 else if (!SIntValueIsValidForSize(sval64, byte_size))
2418 error.SetErrorStringWithFormat(
2419 "value 0x%" PRIx64 " is too large to fit in a %" PRIu64
2420 " byte signed integer value",
2421 sval64, static_cast<uint64_t>(byte_size));
2423 m_type = Scalar::GetValueTypeForSignedIntegerWithByteSize(byte_size);
2426 m_integer = llvm::APInt(sizeof(sint_t) * 8, sval64, true);
2429 m_integer = llvm::APInt(sizeof(slong_t) * 8, sval64, true);
2432 m_integer = llvm::APInt(sizeof(slonglong_t) * 8, sval64, true);
2435 error.SetErrorStringWithFormat(
2436 "unsupported signed integer byte size: %" PRIu64 "",
2437 static_cast<uint64_t>(byte_size));
2442 error.SetErrorStringWithFormat(
2443 "unsupported signed integer byte size: %" PRIu64 "",
2444 static_cast<uint64_t>(byte_size));
2449 case eEncodingIEEE754:
2451 static double d_val;
2452 static long double l_val;
2453 if (byte_size == sizeof(float)) {
2454 if (::sscanf(value_str, "%f", &f_val) == 1) {
2455 m_float = llvm::APFloat(f_val);
2458 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2460 } else if (byte_size == sizeof(double)) {
2461 if (::sscanf(value_str, "%lf", &d_val) == 1) {
2462 m_float = llvm::APFloat(d_val);
2465 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2467 } else if (byte_size == sizeof(long double)) {
2468 if (::sscanf(value_str, "%Lf", &l_val) == 1) {
2469 m_float = llvm::APFloat(
2470 llvm::APFloat::x87DoubleExtended(),
2471 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128,
2472 (reinterpret_cast<type128 *>(&l_val))->x));
2473 m_type = e_long_double;
2475 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2478 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "",
2479 static_cast<uint64_t>(byte_size));
2484 case eEncodingVector:
2485 error.SetErrorString("vector encoding unsupported.");
2494 Status Scalar::SetValueFromData(DataExtractor &data, lldb::Encoding encoding,
2501 case lldb::eEncodingInvalid:
2502 error.SetErrorString("invalid encoding");
2504 case lldb::eEncodingVector:
2505 error.SetErrorString("vector encoding unsupported");
2507 case lldb::eEncodingUint: {
2508 lldb::offset_t offset = 0;
2510 switch (byte_size) {
2512 operator=(data.GetU8(&offset));
2515 operator=(data.GetU16(&offset));
2518 operator=(data.GetU32(&offset));
2521 operator=(data.GetU64(&offset));
2524 if (data.GetByteOrder() == eByteOrderBig) {
2525 int128.x[1] = data.GetU64(&offset);
2526 int128.x[0] = data.GetU64(&offset);
2528 int128.x[0] = data.GetU64(&offset);
2529 int128.x[1] = data.GetU64(&offset);
2531 operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
2534 if (data.GetByteOrder() == eByteOrderBig) {
2535 int256.x[3] = data.GetU64(&offset);
2536 int256.x[2] = data.GetU64(&offset);
2537 int256.x[1] = data.GetU64(&offset);
2538 int256.x[0] = data.GetU64(&offset);
2540 int256.x[0] = data.GetU64(&offset);
2541 int256.x[1] = data.GetU64(&offset);
2542 int256.x[2] = data.GetU64(&offset);
2543 int256.x[3] = data.GetU64(&offset);
2545 operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x));
2548 error.SetErrorStringWithFormat(
2549 "unsupported unsigned integer byte size: %" PRIu64 "",
2550 static_cast<uint64_t>(byte_size));
2554 case lldb::eEncodingSint: {
2555 lldb::offset_t offset = 0;
2557 switch (byte_size) {
2559 operator=(static_cast<int8_t>(data.GetU8(&offset)));
2562 operator=(static_cast<int16_t>(data.GetU16(&offset)));
2565 operator=(static_cast<int32_t>(data.GetU32(&offset)));
2568 operator=(static_cast<int64_t>(data.GetU64(&offset)));
2571 if (data.GetByteOrder() == eByteOrderBig) {
2572 int128.x[1] = data.GetU64(&offset);
2573 int128.x[0] = data.GetU64(&offset);
2575 int128.x[0] = data.GetU64(&offset);
2576 int128.x[1] = data.GetU64(&offset);
2578 operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
2581 if (data.GetByteOrder() == eByteOrderBig) {
2582 int256.x[3] = data.GetU64(&offset);
2583 int256.x[2] = data.GetU64(&offset);
2584 int256.x[1] = data.GetU64(&offset);
2585 int256.x[0] = data.GetU64(&offset);
2587 int256.x[0] = data.GetU64(&offset);
2588 int256.x[1] = data.GetU64(&offset);
2589 int256.x[2] = data.GetU64(&offset);
2590 int256.x[3] = data.GetU64(&offset);
2592 operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x));
2595 error.SetErrorStringWithFormat(
2596 "unsupported signed integer byte size: %" PRIu64 "",
2597 static_cast<uint64_t>(byte_size));
2601 case lldb::eEncodingIEEE754: {
2602 lldb::offset_t offset = 0;
2604 if (byte_size == sizeof(float))
2605 operator=(data.GetFloat(&offset));
2606 else if (byte_size == sizeof(double))
2607 operator=(data.GetDouble(&offset));
2608 else if (byte_size == sizeof(long double))
2609 operator=(data.GetLongDouble(&offset));
2611 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "",
2612 static_cast<uint64_t>(byte_size));
2619 bool Scalar::SignExtend(uint32_t sign_bit_pos) {
2620 const uint32_t max_bit_pos = GetByteSize() * 8;
2622 if (sign_bit_pos < max_bit_pos) {
2624 case Scalar::e_void:
2625 case Scalar::e_float:
2626 case Scalar::e_double:
2627 case Scalar::e_long_double:
2630 case Scalar::e_sint:
2631 case Scalar::e_uint:
2632 case Scalar::e_slong:
2633 case Scalar::e_ulong:
2634 case Scalar::e_slonglong:
2635 case Scalar::e_ulonglong:
2636 case Scalar::e_sint128:
2637 case Scalar::e_uint128:
2638 case Scalar::e_sint256:
2639 case Scalar::e_uint256:
2640 case Scalar::e_sint512:
2641 case Scalar::e_uint512:
2642 if (max_bit_pos == sign_bit_pos)
2644 else if (sign_bit_pos < (max_bit_pos - 1)) {
2645 llvm::APInt sign_bit = llvm::APInt::getSignMask(sign_bit_pos + 1);
2646 llvm::APInt bitwize_and = m_integer & sign_bit;
2647 if (bitwize_and.getBoolValue()) {
2648 const llvm::APInt mask =
2649 ~(sign_bit) + llvm::APInt(m_integer.getBitWidth(), 1);
2660 size_t Scalar::GetAsMemoryData(void *dst, size_t dst_len,
2661 lldb::ByteOrder dst_byte_order,
2662 Status &error) const {
2663 // Get a data extractor that points to the native scalar data
2665 if (!GetData(data)) {
2666 error.SetErrorString("invalid scalar value");
2670 const size_t src_len = data.GetByteSize();
2672 // Prepare a memory buffer that contains some or all of the register value
2673 const size_t bytes_copied =
2674 data.CopyByteOrderedData(0, // src offset
2675 src_len, // src length
2677 dst_len, // dst length
2678 dst_byte_order); // dst byte order
2679 if (bytes_copied == 0)
2680 error.SetErrorString("failed to copy data");
2682 return bytes_copied;
2685 bool Scalar::ExtractBitfield(uint32_t bit_size, uint32_t bit_offset) {
2690 case Scalar::e_void:
2691 case Scalar::e_float:
2692 case Scalar::e_double:
2693 case Scalar::e_long_double:
2696 case Scalar::e_sint:
2697 case Scalar::e_slong:
2698 case Scalar::e_slonglong:
2699 case Scalar::e_sint128:
2700 case Scalar::e_sint256:
2701 case Scalar::e_sint512:
2702 m_integer = m_integer.ashr(bit_offset)
2703 .sextOrTrunc(bit_size)
2704 .sextOrSelf(8 * GetByteSize());
2707 case Scalar::e_uint:
2708 case Scalar::e_ulong:
2709 case Scalar::e_ulonglong:
2710 case Scalar::e_uint128:
2711 case Scalar::e_uint256:
2712 case Scalar::e_uint512:
2713 m_integer = m_integer.lshr(bit_offset)
2714 .zextOrTrunc(bit_size)
2715 .zextOrSelf(8 * GetByteSize());
2721 bool lldb_private::operator==(const Scalar &lhs, const Scalar &rhs) {
2722 // If either entry is void then we can just compare the types
2723 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2724 return lhs.m_type == rhs.m_type;
2729 llvm::APFloat::cmpResult result;
2730 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2731 case Scalar::e_void:
2733 case Scalar::e_sint:
2734 case Scalar::e_uint:
2735 case Scalar::e_slong:
2736 case Scalar::e_ulong:
2737 case Scalar::e_slonglong:
2738 case Scalar::e_ulonglong:
2739 case Scalar::e_sint128:
2740 case Scalar::e_uint128:
2741 case Scalar::e_sint256:
2742 case Scalar::e_uint256:
2743 case Scalar::e_sint512:
2744 case Scalar::e_uint512:
2745 return a->m_integer == b->m_integer;
2746 case Scalar::e_float:
2747 case Scalar::e_double:
2748 case Scalar::e_long_double:
2749 result = a->m_float.compare(b->m_float);
2750 if (result == llvm::APFloat::cmpEqual)
2756 bool lldb_private::operator!=(const Scalar &lhs, const Scalar &rhs) {
2757 return !(lhs == rhs);
2760 bool lldb_private::operator<(const Scalar &lhs, const Scalar &rhs) {
2761 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2767 llvm::APFloat::cmpResult result;
2768 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2769 case Scalar::e_void:
2771 case Scalar::e_sint:
2772 case Scalar::e_slong:
2773 case Scalar::e_slonglong:
2774 case Scalar::e_sint128:
2775 case Scalar::e_sint256:
2776 case Scalar::e_sint512:
2777 case Scalar::e_uint512:
2778 return a->m_integer.slt(b->m_integer);
2779 case Scalar::e_uint:
2780 case Scalar::e_ulong:
2781 case Scalar::e_ulonglong:
2782 case Scalar::e_uint128:
2783 case Scalar::e_uint256:
2784 return a->m_integer.ult(b->m_integer);
2785 case Scalar::e_float:
2786 case Scalar::e_double:
2787 case Scalar::e_long_double:
2788 result = a->m_float.compare(b->m_float);
2789 if (result == llvm::APFloat::cmpLessThan)
2795 bool lldb_private::operator<=(const Scalar &lhs, const Scalar &rhs) {
2796 return !(rhs < lhs);
2799 bool lldb_private::operator>(const Scalar &lhs, const Scalar &rhs) {
2803 bool lldb_private::operator>=(const Scalar &lhs, const Scalar &rhs) {
2804 return !(lhs < rhs);
2807 bool Scalar::ClearBit(uint32_t bit) {
2823 m_integer.clearBit(bit);
2833 bool Scalar::SetBit(uint32_t bit) {
2849 m_integer.setBit(bit);
2859 llvm::raw_ostream &lldb_private::operator<<(llvm::raw_ostream &os, const Scalar &scalar) {
2861 scalar.GetValue(&s, /*show_type*/ true);
2862 return os << s.GetString();