blob: bda5aa8ad9687443632b8b60b358a5863f911e4d [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Scalar.cpp ----------------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
Pavel Labathd821c992018-08-07 11:07:21 +00009#include "lldb/Utility/Scalar.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000010
Zachary Turner666cc0b2017-03-04 01:30:05 +000011#include "lldb/Utility/DataExtractor.h"
Zachary Turner01c32432017-02-14 19:06:07 +000012#include "lldb/Utility/Endian.h"
Zachary Turner97206d52017-05-12 04:51:55 +000013#include "lldb/Utility/Status.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000014#include "lldb/Utility/Stream.h"
Pavel Labathb07a7992019-04-29 10:55:22 +000015#include "lldb/Utility/StreamString.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000016#include "lldb/lldb-types.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000017
18#include "llvm/ADT/SmallString.h"
19
20#include <cinttypes>
21#include <cstdio>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022
23using namespace lldb;
24using namespace lldb_private;
25
Adrian Prantl05097242018-04-30 16:49:04 +000026// Promote to max type currently follows the ANSI C rule for type promotion in
27// expressions.
Kate Stoneb9c1b512016-09-06 20:57:50 +000028static 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)
Pavel Labathd821c992018-08-07 11:07:21 +000039) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000040 Scalar result;
Adrian Prantl05097242018-04-30 16:49:04 +000041 // 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.
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 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();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 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
54 promoted_rhs_ptr =
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
60 promoted_lhs_ptr =
61 &temp_value; // Update the pointer for the promoted left hand side
62 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 // 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
Chris Lattner30fdc8d2010-06-08 16:52:24 +000067
Kate Stoneb9c1b512016-09-06 20:57:50 +000068 // Return the void type (zero) if we fail to promote either of the values.
69 return Scalar::e_void;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000070}
71
Kate Stoneb9c1b512016-09-06 20:57:50 +000072Scalar::Scalar() : m_type(e_void), m_float((float)0) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073
Kate Stoneb9c1b512016-09-06 20:57:50 +000074bool Scalar::GetData(DataExtractor &data, size_t limit_byte_size) const {
75 size_t byte_size = GetByteSize();
76 if (byte_size > 0) {
77 const uint8_t *bytes = reinterpret_cast<const uint8_t *>(GetBytes());
Ulrich Weigand9521ad22016-04-15 09:55:52 +000078
Kate Stoneb9c1b512016-09-06 20:57:50 +000079 if (limit_byte_size < byte_size) {
80 if (endian::InlHostByteOrder() == eByteOrderLittle) {
Adrian Prantl05097242018-04-30 16:49:04 +000081 // On little endian systems if we want fewer bytes from the current
82 // type we just specify fewer bytes since the LSByte is first...
Kate Stoneb9c1b512016-09-06 20:57:50 +000083 byte_size = limit_byte_size;
84 } else if (endian::InlHostByteOrder() == eByteOrderBig) {
Adrian Prantl05097242018-04-30 16:49:04 +000085 // 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
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 bytes += byte_size - limit_byte_size;
89 byte_size = limit_byte_size;
90 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000091 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000092
93 data.SetData(bytes, byte_size, endian::InlHostByteOrder());
94 return true;
95 }
96 data.Clear();
97 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098}
99
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100const 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;
Davide Italiano51d46bd2019-01-30 18:05:36 +0000105 static uint64_t swapped_words[8];
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 switch (m_type) {
107 case e_void:
108 break;
109 case e_sint:
110 case e_uint:
111 case e_slong:
112 case e_ulong:
113 case e_slonglong:
114 case e_ulonglong:
115 bytes = reinterpret_cast<const uint8_t *>(m_integer.getRawData());
Adrian Prantl05097242018-04-30 16:49:04 +0000116 // 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.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 if (endian::InlHostByteOrder() == eByteOrderBig) {
119 size_t byte_size = m_integer.getBitWidth() / 8;
120 if (byte_size < 8)
121 bytes += 8 - byte_size;
Sagar Thakur8536fd12015-08-20 09:12:46 +0000122 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 return bytes;
Davide Italiano92a470e2019-01-30 18:24:16 +0000124 // 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.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 case e_sint128:
128 case e_uint128:
129 apint_words = m_integer.getRawData();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 if (endian::InlHostByteOrder() == eByteOrderBig) {
131 swapped_words[0] = apint_words[1];
132 swapped_words[1] = apint_words[0];
133 apint_words = swapped_words;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000134 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 return reinterpret_cast<const void *>(apint_words);
136 case e_sint256:
137 case e_uint256:
138 apint_words = m_integer.getRawData();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 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;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000145 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 return reinterpret_cast<const void *>(apint_words);
Davide Italiano51d46bd2019-01-30 18:05:36 +0000147 case e_sint512:
148 case e_uint512:
149 apint_words = m_integer.getRawData();
Davide Italiano51d46bd2019-01-30 18:05:36 +0000150 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;
160 }
161 return reinterpret_cast<const void *>(apint_words);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162 case e_float:
163 flt_val = m_float.convertToFloat();
164 return reinterpret_cast<const void *>(&flt_val);
165 case e_double:
166 dbl_val = m_float.convertToDouble();
167 return reinterpret_cast<const void *>(&dbl_val);
168 case e_long_double:
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;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179 return reinterpret_cast<const void *>(apint_words);
180 }
181 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000182}
183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184size_t Scalar::GetByteSize() const {
185 switch (m_type) {
186 case e_void:
187 break;
188 case e_sint:
189 case e_uint:
190 case e_slong:
191 case e_ulong:
192 case e_slonglong:
193 case e_ulonglong:
194 case e_sint128:
195 case e_uint128:
196 case e_sint256:
197 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +0000198 case e_sint512:
199 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200 return (m_integer.getBitWidth() / 8);
201 case e_float:
202 return sizeof(float_t);
203 case e_double:
204 return sizeof(double_t);
205 case e_long_double:
206 return sizeof(long_double_t);
207 }
208 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000209}
210
Kate Stoneb9c1b512016-09-06 20:57:50 +0000211bool Scalar::IsZero() const {
212 llvm::APInt zero_int = llvm::APInt::getNullValue(m_integer.getBitWidth() / 8);
213 switch (m_type) {
214 case e_void:
215 break;
216 case e_sint:
217 case e_uint:
218 case e_slong:
219 case e_ulong:
220 case e_slonglong:
221 case e_ulonglong:
222 case e_sint128:
223 case e_uint128:
224 case e_sint256:
225 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +0000226 case e_uint512:
227 case e_sint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228 return llvm::APInt::isSameValue(zero_int, m_integer);
229 case e_float:
230 case e_double:
231 case e_long_double:
232 return m_float.isZero();
233 }
234 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000235}
236
Kate Stoneb9c1b512016-09-06 20:57:50 +0000237void Scalar::GetValue(Stream *s, bool show_type) const {
238 if (show_type)
239 s->Printf("(%s) ", GetTypeAsCString());
240
241 switch (m_type) {
242 case e_void:
243 break;
244 case e_sint:
245 case e_slong:
246 case e_slonglong:
247 case e_sint128:
248 case e_sint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +0000249 case e_sint512:
Malcolm Parsons771ef6d2016-11-02 20:34:10 +0000250 s->PutCString(m_integer.toString(10, true));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251 break;
252 case e_uint:
253 case e_ulong:
254 case e_ulonglong:
255 case e_uint128:
256 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +0000257 case e_uint512:
Malcolm Parsons771ef6d2016-11-02 20:34:10 +0000258 s->PutCString(m_integer.toString(10, false));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000259 break;
260 case e_float:
261 case e_double:
262 case e_long_double:
263 llvm::SmallString<24> string;
264 m_float.toString(string);
265 s->Printf("%s", string.c_str());
266 break;
267 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000268}
269
Kate Stoneb9c1b512016-09-06 20:57:50 +0000270const char *Scalar::GetTypeAsCString() const {
271 switch (m_type) {
272 case e_void:
273 return "void";
274 case e_sint:
275 return "int";
276 case e_uint:
277 return "unsigned int";
278 case e_slong:
279 return "long";
280 case e_ulong:
281 return "unsigned long";
282 case e_slonglong:
283 return "long long";
284 case e_ulonglong:
285 return "unsigned long long";
286 case e_sint128:
287 return "int128_t";
288 case e_uint128:
289 return "unsigned int128_t";
290 case e_sint256:
291 return "int256_t";
292 case e_uint256:
293 return "unsigned int256_t";
Davide Italiano51d46bd2019-01-30 18:05:36 +0000294 case e_sint512:
295 return "int512_t";
296 case e_uint512:
297 return "unsigned int512_t";
Kate Stoneb9c1b512016-09-06 20:57:50 +0000298 case e_float:
299 return "float";
300 case e_double:
301 return "double";
302 case e_long_double:
303 return "long double";
304 }
305 return "<invalid Scalar type>";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000306}
307
Kate Stoneb9c1b512016-09-06 20:57:50 +0000308Scalar &Scalar::operator=(const Scalar &rhs) {
309 if (this != &rhs) {
310 m_type = rhs.m_type;
311 m_integer = llvm::APInt(rhs.m_integer);
312 m_float = rhs.m_float;
313 }
314 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000315}
316
Kate Stoneb9c1b512016-09-06 20:57:50 +0000317Scalar &Scalar::operator=(const int v) {
318 m_type = e_sint;
319 m_integer = llvm::APInt(sizeof(int) * 8, v, true);
320 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000321}
322
Kate Stoneb9c1b512016-09-06 20:57:50 +0000323Scalar &Scalar::operator=(unsigned int v) {
324 m_type = e_uint;
325 m_integer = llvm::APInt(sizeof(int) * 8, v);
326 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000327}
328
Kate Stoneb9c1b512016-09-06 20:57:50 +0000329Scalar &Scalar::operator=(long v) {
330 m_type = e_slong;
331 m_integer = llvm::APInt(sizeof(long) * 8, v, true);
332 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000333}
334
Kate Stoneb9c1b512016-09-06 20:57:50 +0000335Scalar &Scalar::operator=(unsigned long v) {
336 m_type = e_ulong;
337 m_integer = llvm::APInt(sizeof(long) * 8, v);
338 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000339}
340
Kate Stoneb9c1b512016-09-06 20:57:50 +0000341Scalar &Scalar::operator=(long long v) {
342 m_type = e_slonglong;
343 m_integer = llvm::APInt(sizeof(long) * 8, v, true);
344 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000345}
346
Kate Stoneb9c1b512016-09-06 20:57:50 +0000347Scalar &Scalar::operator=(unsigned long long v) {
348 m_type = e_ulonglong;
349 m_integer = llvm::APInt(sizeof(long long) * 8, v);
350 return *this;
351}
352
353Scalar &Scalar::operator=(float v) {
354 m_type = e_float;
355 m_float = llvm::APFloat(v);
356 return *this;
357}
358
359Scalar &Scalar::operator=(double v) {
360 m_type = e_double;
361 m_float = llvm::APFloat(v);
362 return *this;
363}
364
365Scalar &Scalar::operator=(long double v) {
366 m_type = e_long_double;
367 if (m_ieee_quad)
368 m_float = llvm::APFloat(
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000369 llvm::APFloat::IEEEquad(),
Kate Stoneb9c1b512016-09-06 20:57:50 +0000370 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
371 else
372 m_float = llvm::APFloat(
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000373 llvm::APFloat::x87DoubleExtended(),
Kate Stoneb9c1b512016-09-06 20:57:50 +0000374 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
375 return *this;
376}
377
378Scalar &Scalar::operator=(llvm::APInt rhs) {
379 m_integer = llvm::APInt(rhs);
380 switch (m_integer.getBitWidth()) {
381 case 8:
382 case 16:
383 case 32:
384 if (m_integer.isSignedIntN(sizeof(sint_t) * 8))
385 m_type = e_sint;
Sagar Thakur8536fd12015-08-20 09:12:46 +0000386 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000387 m_type = e_uint;
388 break;
389 case 64:
390 if (m_integer.isSignedIntN(sizeof(slonglong_t) * 8))
391 m_type = e_slonglong;
392 else
393 m_type = e_ulonglong;
394 break;
395 case 128:
396 if (m_integer.isSignedIntN(BITWIDTH_INT128))
397 m_type = e_sint128;
398 else
399 m_type = e_uint128;
400 break;
401 case 256:
402 if (m_integer.isSignedIntN(BITWIDTH_INT256))
403 m_type = e_sint256;
404 else
405 m_type = e_uint256;
406 break;
Davide Italiano51d46bd2019-01-30 18:05:36 +0000407 case 512:
408 if (m_integer.isSignedIntN(BITWIDTH_INT512))
409 m_type = e_sint512;
410 else
411 m_type = e_uint512;
412 break;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000413 }
414 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000415}
416
Eugene Zelenko0e28a192016-03-12 00:31:13 +0000417Scalar::~Scalar() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000418
Kate Stoneb9c1b512016-09-06 20:57:50 +0000419bool Scalar::Promote(Scalar::Type type) {
420 bool success = false;
421 switch (m_type) {
422 case e_void:
423 break;
424
425 case e_sint:
426 switch (type) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000427 case e_void:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000428 break;
Oleksiy Vyalov9dcdd2e2015-08-10 21:49:50 +0000429 case e_sint:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000430 success = true;
431 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000432 case e_uint:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000433 m_integer = m_integer.sextOrTrunc(sizeof(uint_t) * 8);
434 success = true;
435 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000436
437 case e_slong:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000438 m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8);
439 success = true;
440 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000441
442 case e_ulong:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000443 m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8);
444 success = true;
445 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000446
447 case e_slonglong:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000448 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
449 success = true;
450 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000451
452 case e_ulonglong:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000453 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
454 success = true;
455 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +0000456
457 case e_sint128:
Sagar Thakur8536fd12015-08-20 09:12:46 +0000458 case e_uint128:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000459 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
460 success = true;
461 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462
Enrico Granata391075c2016-03-10 00:14:29 +0000463 case e_sint256:
Enrico Granata391075c2016-03-10 00:14:29 +0000464 case e_uint256:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000465 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
466 success = true;
467 break;
Eugene Zelenko0e28a192016-03-12 00:31:13 +0000468
Davide Italiano51d46bd2019-01-30 18:05:36 +0000469 case e_sint512:
470 case e_uint512:
471 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
472 success = true;
473 break;
474
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000476 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
477 m_float.convertFromAPInt(m_integer, true,
478 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000479 success = true;
480 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000481
482 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000483 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
484 m_float.convertFromAPInt(m_integer, true,
485 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000486 success = true;
487 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000488
489 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000490 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000494 success = true;
495 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000496 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000497 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498
Kate Stoneb9c1b512016-09-06 20:57:50 +0000499 case e_uint:
500 switch (type) {
501 case e_void:
502 case e_sint:
503 break;
504 case e_uint:
505 success = true;
506 break;
507 case e_slong:
508 m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8);
509 success = true;
510 break;
511
512 case e_ulong:
513 m_integer = m_integer.zextOrTrunc(sizeof(ulong_t) * 8);
514 success = true;
515 break;
516
517 case e_slonglong:
518 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
519 success = true;
520 break;
521
522 case e_ulonglong:
523 m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8);
524 success = true;
525 break;
526
527 case e_sint128:
528 case e_uint128:
529 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
530 success = true;
531 break;
532
533 case e_sint256:
534 case e_uint256:
535 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
536 success = true;
537 break;
538
Davide Italiano51d46bd2019-01-30 18:05:36 +0000539 case e_sint512:
540 case e_uint512:
541 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
542 success = true;
543 break;
544
Kate Stoneb9c1b512016-09-06 20:57:50 +0000545 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000546 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
547 m_float.convertFromAPInt(m_integer, false,
548 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000549 success = true;
550 break;
551
552 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000553 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
554 m_float.convertFromAPInt(m_integer, false,
555 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000556 success = true;
557 break;
558
559 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000560 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000564 success = true;
565 break;
566 }
567 break;
568
569 case e_slong:
570 switch (type) {
571 case e_void:
572 case e_sint:
573 case e_uint:
574 break;
575 case e_slong:
576 success = true;
577 break;
578 case e_ulong:
579 m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8);
580 success = true;
581 break;
582
583 case e_slonglong:
584 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
585 success = true;
586 break;
587
588 case e_ulonglong:
589 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
590 success = true;
591 break;
592
593 case e_sint128:
594 case e_uint128:
595 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
596 success = true;
597 break;
598
599 case e_sint256:
600 case e_uint256:
601 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
602 success = true;
603 break;
604
Davide Italiano51d46bd2019-01-30 18:05:36 +0000605 case e_sint512:
606 case e_uint512:
607 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
608 success = true;
609 break;
610
Kate Stoneb9c1b512016-09-06 20:57:50 +0000611 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000612 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
613 m_float.convertFromAPInt(m_integer, true,
614 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000615 success = true;
616 break;
617
618 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000619 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
620 m_float.convertFromAPInt(m_integer, true,
621 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000622 success = true;
623 break;
624
625 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000626 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000630 success = true;
631 break;
632 }
633 break;
634
635 case e_ulong:
636 switch (type) {
637 case e_void:
638 case e_sint:
639 case e_uint:
640 case e_slong:
641 break;
642 case e_ulong:
643 success = true;
644 break;
645 case e_slonglong:
646 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
647 success = true;
648 break;
649
650 case e_ulonglong:
651 m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8);
652 success = true;
653 break;
654
655 case e_sint128:
656 case e_uint128:
657 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
658 success = true;
659 break;
660
661 case e_sint256:
662 case e_uint256:
663 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
664 success = true;
665 break;
666
Davide Italiano51d46bd2019-01-30 18:05:36 +0000667 case e_sint512:
668 case e_uint512:
669 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
670 success = true;
671 break;
672
Kate Stoneb9c1b512016-09-06 20:57:50 +0000673 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000674 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
675 m_float.convertFromAPInt(m_integer, false,
676 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000677 success = true;
678 break;
679
680 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000681 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
682 m_float.convertFromAPInt(m_integer, false,
683 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000684 success = true;
685 break;
686
687 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000688 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000692 success = true;
693 break;
694 }
695 break;
696
697 case e_slonglong:
698 switch (type) {
699 case e_void:
700 case e_sint:
701 case e_uint:
702 case e_slong:
703 case e_ulong:
704 break;
705 case e_slonglong:
706 success = true;
707 break;
708 case e_ulonglong:
709 m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8);
710 success = true;
711 break;
712
713 case e_sint128:
714 case e_uint128:
715 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
716 success = true;
717 break;
718
719 case e_sint256:
720 case e_uint256:
721 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
722 success = true;
723 break;
724
Davide Italiano51d46bd2019-01-30 18:05:36 +0000725 case e_sint512:
726 case e_uint512:
727 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
728 success = true;
729 break;
730
Kate Stoneb9c1b512016-09-06 20:57:50 +0000731 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000732 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
733 m_float.convertFromAPInt(m_integer, true,
734 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000735 success = true;
736 break;
737
738 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000739 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
740 m_float.convertFromAPInt(m_integer, true,
741 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000742 success = true;
743 break;
744
745 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000746 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000750 success = true;
751 break;
752 }
753 break;
754
755 case e_ulonglong:
756 switch (type) {
757 case e_void:
758 case e_sint:
759 case e_uint:
760 case e_slong:
761 case e_ulong:
762 case e_slonglong:
763 break;
764 case e_ulonglong:
765 success = true;
766 break;
767 case e_sint128:
768 case e_uint128:
769 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
770 success = true;
771 break;
772
773 case e_sint256:
774 case e_uint256:
775 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
776 success = true;
777 break;
778
Davide Italiano51d46bd2019-01-30 18:05:36 +0000779 case e_sint512:
780 case e_uint512:
781 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
782 success = true;
783 break;
784
Kate Stoneb9c1b512016-09-06 20:57:50 +0000785 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000786 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
787 m_float.convertFromAPInt(m_integer, false,
788 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000789 success = true;
790 break;
791
792 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000793 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
794 m_float.convertFromAPInt(m_integer, false,
795 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000796 success = true;
797 break;
798
799 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000800 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000804 success = true;
805 break;
806 }
807 break;
808
809 case e_sint128:
810 switch (type) {
811 case e_void:
812 case e_sint:
813 case e_uint:
814 case e_slong:
815 case e_ulong:
816 case e_slonglong:
817 case e_ulonglong:
818 break;
819 case e_sint128:
820 success = true;
821 break;
822 case e_uint128:
823 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
824 success = true;
825 break;
826
827 case e_sint256:
828 case e_uint256:
829 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
830 success = true;
831 break;
832
Davide Italiano51d46bd2019-01-30 18:05:36 +0000833 case e_sint512:
834 case e_uint512:
835 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT512);
836 success = true;
837 break;
838
Kate Stoneb9c1b512016-09-06 20:57:50 +0000839 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000840 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
841 m_float.convertFromAPInt(m_integer, true,
842 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000843 success = true;
844 break;
845
846 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000847 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
848 m_float.convertFromAPInt(m_integer, true,
849 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000850 success = true;
851 break;
852
853 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000854 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000858 success = true;
859 break;
860 }
861 break;
862
863 case e_uint128:
864 switch (type) {
865 case e_void:
866 case e_sint:
867 case e_uint:
868 case e_slong:
869 case e_ulong:
870 case e_slonglong:
871 case e_ulonglong:
872 case e_sint128:
873 break;
874 case e_uint128:
875 success = true;
876 break;
877 case e_sint256:
878 case e_uint256:
879 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256);
880 success = true;
881 break;
882
Davide Italiano51d46bd2019-01-30 18:05:36 +0000883 case e_sint512:
884 case e_uint512:
885 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
886 success = true;
887 break;
888
Kate Stoneb9c1b512016-09-06 20:57:50 +0000889 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000890 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
891 m_float.convertFromAPInt(m_integer, false,
892 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000893 success = true;
894 break;
895
896 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000897 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
898 m_float.convertFromAPInt(m_integer, false,
899 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000900 success = true;
901 break;
902
903 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000904 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000908 success = true;
909 break;
910 }
911 break;
912
913 case e_sint256:
914 switch (type) {
915 case e_void:
916 case e_sint:
917 case e_uint:
918 case e_slong:
919 case e_ulong:
920 case e_slonglong:
921 case e_ulonglong:
922 case e_sint128:
923 case e_uint128:
924 break;
925 case e_sint256:
926 success = true;
927 break;
928 case e_uint256:
929 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256);
930 success = true;
931 break;
932
Davide Italiano51d46bd2019-01-30 18:05:36 +0000933 case e_sint512:
934 case e_uint512:
935 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
936 success = true;
937 break;
938
Kate Stoneb9c1b512016-09-06 20:57:50 +0000939 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000940 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
941 m_float.convertFromAPInt(m_integer, true,
942 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000943 success = true;
944 break;
945
946 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000947 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
948 m_float.convertFromAPInt(m_integer, true,
949 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000950 success = true;
951 break;
952
953 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000954 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000958 success = true;
959 break;
960 }
961 break;
962
963 case e_uint256:
964 switch (type) {
965 case e_void:
966 case e_sint:
967 case e_uint:
968 case e_slong:
969 case e_ulong:
970 case e_slonglong:
971 case e_ulonglong:
972 case e_sint128:
973 case e_uint128:
974 case e_sint256:
975 break;
976 case e_uint256:
977 success = true;
978 break;
Davide Italiano51d46bd2019-01-30 18:05:36 +0000979
980 case e_sint512:
981 case e_uint512:
982 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT512);
983 success = true;
984 break;
985
Kate Stoneb9c1b512016-09-06 20:57:50 +0000986 case e_float:
Davide Italiano49d80282018-04-02 16:50:54 +0000987 m_float = llvm::APFloat(llvm::APFloat::IEEEsingle());
988 m_float.convertFromAPInt(m_integer, false,
989 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000990 success = true;
991 break;
992
993 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +0000994 m_float = llvm::APFloat(llvm::APFloat::IEEEdouble());
995 m_float.convertFromAPInt(m_integer, false,
996 llvm::APFloat::rmNearestTiesToEven);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000997 success = true;
998 break;
999
1000 case e_long_double:
Davide Italiano49d80282018-04-02 16:50:54 +00001001 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);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001005 success = true;
1006 break;
1007 }
1008 break;
1009
Davide Italiano51d46bd2019-01-30 18:05:36 +00001010 case e_sint512:
1011 case e_uint512:
1012 lldbassert(false && "unimplemented");
1013 break;
1014
Kate Stoneb9c1b512016-09-06 20:57:50 +00001015 case e_float:
1016 switch (type) {
1017 case e_void:
1018 case e_sint:
1019 case e_uint:
1020 case e_slong:
1021 case e_ulong:
1022 case e_slonglong:
1023 case e_ulonglong:
1024 case e_sint128:
1025 case e_uint128:
1026 case e_sint256:
1027 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001028 case e_uint512:
1029 case e_sint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001030 break;
1031 case e_float:
1032 success = true;
1033 break;
1034 case e_double:
Davide Italiano49d80282018-04-02 16:50:54 +00001035 m_float = llvm::APFloat((double_t)m_float.convertToFloat());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001036 success = true;
1037 break;
1038
Davide Italiano49d80282018-04-02 16:50:54 +00001039 case e_long_double: {
1040 bool ignore;
1041 m_float.convert(m_ieee_quad ? llvm::APFloat::IEEEquad()
1042 : llvm::APFloat::x87DoubleExtended(),
1043 llvm::APFloat::rmNearestTiesToEven, &ignore);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001044 success = true;
1045 break;
1046 }
Davide Italiano49d80282018-04-02 16:50:54 +00001047 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001048 break;
1049
1050 case e_double:
1051 switch (type) {
1052 case e_void:
1053 case e_sint:
1054 case e_uint:
1055 case e_slong:
1056 case e_ulong:
1057 case e_slonglong:
1058 case e_ulonglong:
1059 case e_sint128:
1060 case e_uint128:
1061 case e_sint256:
1062 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001063 case e_sint512:
1064 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001065 case e_float:
1066 break;
1067 case e_double:
1068 success = true;
1069 break;
Davide Italiano49d80282018-04-02 16:50:54 +00001070 case e_long_double: {
1071 bool ignore;
1072 m_float.convert(m_ieee_quad ? llvm::APFloat::IEEEquad()
1073 : llvm::APFloat::x87DoubleExtended(),
1074 llvm::APFloat::rmNearestTiesToEven, &ignore);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001075 success = true;
1076 break;
1077 }
Davide Italiano49d80282018-04-02 16:50:54 +00001078 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001079 break;
1080
1081 case e_long_double:
1082 switch (type) {
1083 case e_void:
1084 case e_sint:
1085 case e_uint:
1086 case e_slong:
1087 case e_ulong:
1088 case e_slonglong:
1089 case e_ulonglong:
1090 case e_sint128:
1091 case e_uint128:
1092 case e_sint256:
1093 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001094 case e_sint512:
1095 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001096 case e_float:
1097 case e_double:
1098 break;
1099 case e_long_double:
1100 success = true;
1101 break;
1102 }
1103 break;
1104 }
1105
1106 if (success)
1107 m_type = type;
1108 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001109}
1110
Kate Stoneb9c1b512016-09-06 20:57:50 +00001111const char *Scalar::GetValueTypeAsCString(Scalar::Type type) {
1112 switch (type) {
1113 case e_void:
1114 return "void";
1115 case e_sint:
1116 return "int";
1117 case e_uint:
1118 return "unsigned int";
1119 case e_slong:
1120 return "long";
1121 case e_ulong:
1122 return "unsigned long";
1123 case e_slonglong:
1124 return "long long";
1125 case e_ulonglong:
1126 return "unsigned long long";
1127 case e_float:
1128 return "float";
1129 case e_double:
1130 return "double";
1131 case e_long_double:
1132 return "long double";
1133 case e_sint128:
1134 return "int128_t";
1135 case e_uint128:
1136 return "uint128_t";
1137 case e_sint256:
1138 return "int256_t";
1139 case e_uint256:
1140 return "uint256_t";
Davide Italiano51d46bd2019-01-30 18:05:36 +00001141 case e_sint512:
1142 return "int512_t";
1143 case e_uint512:
1144 return "uint512_t";
Kate Stoneb9c1b512016-09-06 20:57:50 +00001145 }
1146 return "???";
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001147}
1148
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001149Scalar::Type
Kate Stoneb9c1b512016-09-06 20:57:50 +00001150Scalar::GetValueTypeForSignedIntegerWithByteSize(size_t byte_size) {
1151 if (byte_size <= sizeof(sint_t))
1152 return e_sint;
1153 if (byte_size <= sizeof(slong_t))
1154 return e_slong;
1155 if (byte_size <= sizeof(slonglong_t))
1156 return e_slonglong;
1157 return e_void;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001158}
1159
1160Scalar::Type
Kate Stoneb9c1b512016-09-06 20:57:50 +00001161Scalar::GetValueTypeForUnsignedIntegerWithByteSize(size_t byte_size) {
1162 if (byte_size <= sizeof(uint_t))
1163 return e_uint;
1164 if (byte_size <= sizeof(ulong_t))
1165 return e_ulong;
1166 if (byte_size <= sizeof(ulonglong_t))
1167 return e_ulonglong;
1168 return e_void;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001169}
1170
Kate Stoneb9c1b512016-09-06 20:57:50 +00001171Scalar::Type Scalar::GetValueTypeForFloatWithByteSize(size_t byte_size) {
1172 if (byte_size == sizeof(float_t))
1173 return e_float;
1174 if (byte_size == sizeof(double_t))
1175 return e_double;
1176 if (byte_size == sizeof(long_double_t))
1177 return e_long_double;
1178 return e_void;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001179}
1180
Kate Stoneb9c1b512016-09-06 20:57:50 +00001181bool Scalar::MakeSigned() {
1182 bool success = false;
1183
1184 switch (m_type) {
1185 case e_void:
1186 break;
1187 case e_sint:
1188 success = true;
1189 break;
1190 case e_uint:
1191 m_type = e_sint;
1192 success = true;
1193 break;
1194 case e_slong:
1195 success = true;
1196 break;
1197 case e_ulong:
1198 m_type = e_slong;
1199 success = true;
1200 break;
1201 case e_slonglong:
1202 success = true;
1203 break;
1204 case e_ulonglong:
1205 m_type = e_slonglong;
1206 success = true;
1207 break;
1208 case e_sint128:
1209 success = true;
1210 break;
1211 case e_uint128:
1212 m_type = e_sint128;
1213 success = true;
1214 break;
1215 case e_sint256:
1216 success = true;
1217 break;
1218 case e_uint256:
1219 m_type = e_sint256;
1220 success = true;
1221 break;
Davide Italiano51d46bd2019-01-30 18:05:36 +00001222 case e_sint512:
1223 success = true;
1224 break;
1225 case e_uint512:
1226 m_type = e_sint512;
1227 success = true;
1228 break;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001229 case e_float:
1230 success = true;
1231 break;
1232 case e_double:
1233 success = true;
1234 break;
1235 case e_long_double:
1236 success = true;
1237 break;
1238 }
1239
1240 return success;
1241}
1242
1243bool Scalar::MakeUnsigned() {
1244 bool success = false;
1245
1246 switch (m_type) {
1247 case e_void:
1248 break;
1249 case e_sint:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001250 m_type = e_uint;
1251 success = true;
1252 break;
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001253 case e_uint:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001254 success = true;
1255 break;
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001256 case e_slong:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001257 m_type = e_ulong;
1258 success = true;
1259 break;
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001260 case e_ulong:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001261 success = true;
1262 break;
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001263 case e_slonglong:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001264 m_type = e_ulonglong;
1265 success = true;
1266 break;
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001267 case e_ulonglong:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001268 success = true;
1269 break;
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001270 case e_sint128:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001271 m_type = e_uint128;
1272 success = true;
1273 break;
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001274 case e_uint128:
1275 success = true;
1276 break;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001277 case e_sint256:
Davide Italianoa9d84cb2018-07-12 00:31:04 +00001278 m_type = e_uint256;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001279 success = true;
1280 break;
1281 case e_uint256:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001282 success = true;
1283 break;
Davide Italiano51d46bd2019-01-30 18:05:36 +00001284 case e_sint512:
1285 m_type = e_uint512;
1286 success = true;
1287 break;
1288 case e_uint512:
1289 success = true;
1290 break;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001291 case e_float:
1292 success = true;
1293 break;
1294 case e_double:
1295 success = true;
1296 break;
1297 case e_long_double:
1298 success = true;
1299 break;
1300 }
1301
1302 return success;
1303}
1304
1305signed char Scalar::SChar(char fail_value) const {
1306 switch (m_type) {
1307 case e_void:
1308 break;
1309 case e_sint:
1310 case e_uint:
1311 case e_slong:
1312 case e_ulong:
1313 case e_slonglong:
1314 case e_ulonglong:
1315 case e_sint128:
1316 case e_uint128:
1317 case e_sint256:
1318 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001319 case e_sint512:
1320 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001321 return (schar_t)(m_integer.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue();
1322 case e_float:
1323 return (schar_t)m_float.convertToFloat();
1324 case e_double:
1325 return (schar_t)m_float.convertToDouble();
1326 case e_long_double:
1327 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1328 return (schar_t)(ldbl_val.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue();
1329 }
1330 return fail_value;
1331}
1332
1333unsigned char Scalar::UChar(unsigned char fail_value) const {
1334 switch (m_type) {
1335 case e_void:
1336 break;
1337 case e_sint:
1338 case e_uint:
1339 case e_slong:
1340 case e_ulong:
1341 case e_slonglong:
1342 case e_ulonglong:
1343 case e_sint128:
1344 case e_uint128:
1345 case e_sint256:
1346 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001347 case e_sint512:
1348 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001349 return (uchar_t)(m_integer.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue();
1350 case e_float:
1351 return (uchar_t)m_float.convertToFloat();
1352 case e_double:
1353 return (uchar_t)m_float.convertToDouble();
1354 case e_long_double:
1355 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1356 return (uchar_t)(ldbl_val.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue();
1357 }
1358 return fail_value;
1359}
1360
1361short Scalar::SShort(short fail_value) const {
1362 switch (m_type) {
1363 case e_void:
1364 break;
1365 case e_sint:
1366 case e_uint:
1367 case e_slong:
1368 case e_ulong:
1369 case e_slonglong:
1370 case e_ulonglong:
1371 case e_sint128:
1372 case e_uint128:
1373 case e_sint256:
1374 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001375 case e_sint512:
1376 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001377 return (sshort_t)(m_integer.sextOrTrunc(sizeof(sshort_t) * 8))
1378 .getSExtValue();
1379 case e_float:
1380 return (sshort_t)m_float.convertToFloat();
1381 case e_double:
1382 return (sshort_t)m_float.convertToDouble();
1383 case e_long_double:
1384 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1385 return (sshort_t)(ldbl_val.sextOrTrunc(sizeof(sshort_t) * 8))
1386 .getSExtValue();
1387 }
1388 return fail_value;
1389}
1390
1391unsigned short Scalar::UShort(unsigned short fail_value) const {
1392 switch (m_type) {
1393 case e_void:
1394 break;
1395 case e_sint:
1396 case e_uint:
1397 case e_slong:
1398 case e_ulong:
1399 case e_slonglong:
1400 case e_ulonglong:
1401 case e_sint128:
1402 case e_uint128:
1403 case e_sint256:
1404 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001405 case e_sint512:
1406 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001407 return (ushort_t)(m_integer.zextOrTrunc(sizeof(ushort_t) * 8))
1408 .getZExtValue();
1409 case e_float:
1410 return (ushort_t)m_float.convertToFloat();
1411 case e_double:
1412 return (ushort_t)m_float.convertToDouble();
1413 case e_long_double:
1414 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1415 return (ushort_t)(ldbl_val.zextOrTrunc(sizeof(ushort_t) * 8))
1416 .getZExtValue();
1417 }
1418 return fail_value;
1419}
1420
1421int Scalar::SInt(int fail_value) const {
1422 switch (m_type) {
1423 case e_void:
1424 break;
1425 case e_sint:
1426 case e_uint:
1427 case e_slong:
1428 case e_ulong:
1429 case e_slonglong:
1430 case e_ulonglong:
1431 case e_sint128:
1432 case e_uint128:
1433 case e_sint256:
1434 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001435 case e_sint512:
1436 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001437 return (sint_t)(m_integer.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue();
1438 case e_float:
1439 return (sint_t)m_float.convertToFloat();
1440 case e_double:
1441 return (sint_t)m_float.convertToDouble();
1442 case e_long_double:
1443 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1444 return (sint_t)(ldbl_val.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue();
1445 }
1446 return fail_value;
1447}
1448
1449unsigned int Scalar::UInt(unsigned int fail_value) const {
1450 switch (m_type) {
1451 case e_void:
1452 break;
1453 case e_sint:
1454 case e_uint:
1455 case e_slong:
1456 case e_ulong:
1457 case e_slonglong:
1458 case e_ulonglong:
1459 case e_sint128:
1460 case e_uint128:
1461 case e_sint256:
1462 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001463 case e_sint512:
1464 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001465 return (uint_t)(m_integer.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue();
1466 case e_float:
1467 return (uint_t)m_float.convertToFloat();
1468 case e_double:
1469 return (uint_t)m_float.convertToDouble();
1470 case e_long_double:
1471 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1472 return (uint_t)(ldbl_val.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue();
1473 }
1474 return fail_value;
1475}
1476
1477long Scalar::SLong(long fail_value) const {
1478 switch (m_type) {
1479 case e_void:
1480 break;
1481 case e_sint:
1482 case e_uint:
1483 case e_slong:
1484 case e_ulong:
1485 case e_slonglong:
1486 case e_ulonglong:
1487 case e_sint128:
1488 case e_uint128:
1489 case e_sint256:
1490 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001491 case e_sint512:
1492 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001493 return (slong_t)(m_integer.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue();
1494 case e_float:
1495 return (slong_t)m_float.convertToFloat();
1496 case e_double:
1497 return (slong_t)m_float.convertToDouble();
1498 case e_long_double:
1499 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1500 return (slong_t)(ldbl_val.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue();
1501 }
1502 return fail_value;
1503}
1504
1505unsigned long Scalar::ULong(unsigned long fail_value) const {
1506 switch (m_type) {
1507 case e_void:
1508 break;
1509 case e_sint:
1510 case e_uint:
1511 case e_slong:
1512 case e_ulong:
1513 case e_slonglong:
1514 case e_ulonglong:
1515 case e_sint128:
1516 case e_uint128:
1517 case e_sint256:
1518 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001519 case e_sint512:
1520 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001521 return (ulong_t)(m_integer.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue();
1522 case e_float:
1523 return (ulong_t)m_float.convertToFloat();
1524 case e_double:
1525 return (ulong_t)m_float.convertToDouble();
1526 case e_long_double:
1527 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1528 return (ulong_t)(ldbl_val.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue();
1529 }
1530 return fail_value;
1531}
1532
1533long long Scalar::SLongLong(long long fail_value) const {
1534 switch (m_type) {
1535 case e_void:
1536 break;
1537 case e_sint:
1538 case e_uint:
1539 case e_slong:
1540 case e_ulong:
1541 case e_slonglong:
1542 case e_ulonglong:
1543 case e_sint128:
1544 case e_uint128:
1545 case e_sint256:
1546 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001547 case e_sint512:
1548 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001549 return (slonglong_t)(m_integer.sextOrTrunc(sizeof(slonglong_t) * 8))
1550 .getSExtValue();
1551 case e_float:
1552 return (slonglong_t)m_float.convertToFloat();
1553 case e_double:
1554 return (slonglong_t)m_float.convertToDouble();
1555 case e_long_double:
1556 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1557 return (slonglong_t)(ldbl_val.sextOrTrunc(sizeof(slonglong_t) * 8))
1558 .getSExtValue();
1559 }
1560 return fail_value;
1561}
1562
1563unsigned long long Scalar::ULongLong(unsigned long long fail_value) const {
1564 switch (m_type) {
1565 case e_void:
1566 break;
1567 case e_sint:
1568 case e_uint:
1569 case e_slong:
1570 case e_ulong:
1571 case e_slonglong:
1572 case e_ulonglong:
1573 case e_sint128:
1574 case e_uint128:
1575 case e_sint256:
1576 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001577 case e_sint512:
1578 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001579 return (ulonglong_t)(m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8))
1580 .getZExtValue();
1581 case e_float:
1582 return (ulonglong_t)m_float.convertToFloat();
Davide Italianof06ffee2018-09-07 18:22:27 +00001583 case e_double: {
1584 double d_val = m_float.convertToDouble();
1585 llvm::APInt rounded_double =
1586 llvm::APIntOps::RoundDoubleToAPInt(d_val, sizeof(ulonglong_t) * 8);
1587 return (ulonglong_t)(rounded_double.zextOrTrunc(sizeof(ulonglong_t) * 8))
1588 .getZExtValue();
1589 }
1590 case e_long_double:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001591 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1592 return (ulonglong_t)(ldbl_val.zextOrTrunc(sizeof(ulonglong_t) * 8))
1593 .getZExtValue();
1594 }
1595 return fail_value;
1596}
1597
1598llvm::APInt Scalar::SInt128(llvm::APInt &fail_value) const {
1599 switch (m_type) {
1600 case e_void:
1601 break;
1602 case e_sint:
1603 case e_uint:
1604 case e_slong:
1605 case e_ulong:
1606 case e_slonglong:
1607 case e_ulonglong:
1608 case e_sint128:
1609 case e_uint128:
1610 case e_sint256:
1611 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001612 case e_sint512:
1613 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001614 return m_integer;
1615 case e_float:
1616 case e_double:
1617 case e_long_double:
1618 return m_float.bitcastToAPInt();
1619 }
1620 return fail_value;
1621}
1622
1623llvm::APInt Scalar::UInt128(const llvm::APInt &fail_value) const {
1624 switch (m_type) {
1625 case e_void:
1626 break;
1627 case e_sint:
1628 case e_uint:
1629 case e_slong:
1630 case e_ulong:
1631 case e_slonglong:
1632 case e_ulonglong:
1633 case e_sint128:
1634 case e_uint128:
1635 case e_sint256:
1636 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001637 case e_sint512:
1638 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001639 return m_integer;
1640 case e_float:
1641 case e_double:
1642 case e_long_double:
1643 return m_float.bitcastToAPInt();
1644 }
1645 return fail_value;
1646}
1647
Kate Stoneb9c1b512016-09-06 20:57:50 +00001648float Scalar::Float(float fail_value) const {
1649 switch (m_type) {
1650 case e_void:
1651 break;
1652 case e_sint:
1653 case e_uint:
1654 case e_slong:
1655 case e_ulong:
1656 case e_slonglong:
1657 case e_ulonglong:
1658 case e_sint128:
1659 case e_uint128:
1660 case e_sint256:
1661 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001662 case e_sint512:
1663 case e_uint512:
Davide Italiano49d80282018-04-02 16:50:54 +00001664 return llvm::APIntOps::RoundAPIntToFloat(m_integer);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001665 case e_float:
1666 return m_float.convertToFloat();
1667 case e_double:
1668 return (float_t)m_float.convertToDouble();
1669 case e_long_double:
1670 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1671 return ldbl_val.bitsToFloat();
1672 }
1673 return fail_value;
1674}
1675
1676double Scalar::Double(double fail_value) const {
1677 switch (m_type) {
1678 case e_void:
1679 break;
1680 case e_sint:
1681 case e_uint:
1682 case e_slong:
1683 case e_ulong:
1684 case e_slonglong:
1685 case e_ulonglong:
1686 case e_sint128:
1687 case e_uint128:
1688 case e_sint256:
1689 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001690 case e_sint512:
1691 case e_uint512:
Davide Italiano49d80282018-04-02 16:50:54 +00001692 return llvm::APIntOps::RoundAPIntToDouble(m_integer);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001693 case e_float:
1694 return (double_t)m_float.convertToFloat();
1695 case e_double:
1696 return m_float.convertToDouble();
1697 case e_long_double:
1698 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1699 return ldbl_val.bitsToFloat();
1700 }
1701 return fail_value;
1702}
1703
1704long double Scalar::LongDouble(long double fail_value) const {
1705 switch (m_type) {
1706 case e_void:
1707 break;
1708 case e_sint:
1709 case e_uint:
1710 case e_slong:
1711 case e_ulong:
1712 case e_slonglong:
1713 case e_ulonglong:
1714 case e_sint128:
1715 case e_uint128:
1716 case e_sint256:
1717 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001718 case e_sint512:
1719 case e_uint512:
Davide Italiano49d80282018-04-02 16:50:54 +00001720 return (long_double_t)llvm::APIntOps::RoundAPIntToDouble(m_integer);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001721 case e_float:
1722 return (long_double_t)m_float.convertToFloat();
1723 case e_double:
1724 return (long_double_t)m_float.convertToDouble();
1725 case e_long_double:
1726 llvm::APInt ldbl_val = m_float.bitcastToAPInt();
1727 return (long_double_t)ldbl_val.bitsToDouble();
1728 }
1729 return fail_value;
1730}
1731
1732Scalar &Scalar::operator+=(const Scalar &rhs) {
1733 Scalar temp_value;
1734 const Scalar *a;
1735 const Scalar *b;
1736 if ((m_type = PromoteToMaxType(*this, rhs, temp_value, a, b)) !=
1737 Scalar::e_void) {
1738 switch (m_type) {
1739 case e_void:
1740 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00001741 case e_sint:
1742 case e_uint:
1743 case e_slong:
1744 case e_ulong:
1745 case e_slonglong:
1746 case e_ulonglong:
1747 case e_sint128:
1748 case e_uint128:
Enrico Granata391075c2016-03-10 00:14:29 +00001749 case e_sint256:
1750 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001751 case e_sint512:
1752 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001753 m_integer = a->m_integer + b->m_integer;
1754 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00001755
Sagar Thakur8536fd12015-08-20 09:12:46 +00001756 case e_float:
1757 case e_double:
1758 case e_long_double:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001759 m_float = a->m_float + b->m_float;
1760 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00001761 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001762 }
1763 return *this;
Sagar Thakur8536fd12015-08-20 09:12:46 +00001764}
1765
Kate Stoneb9c1b512016-09-06 20:57:50 +00001766Scalar &Scalar::operator<<=(const Scalar &rhs) {
1767 switch (m_type) {
1768 case e_void:
1769 case e_float:
1770 case e_double:
1771 case e_long_double:
1772 m_type = e_void;
1773 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001774
Kate Stoneb9c1b512016-09-06 20:57:50 +00001775 case e_sint:
1776 case e_uint:
1777 case e_slong:
1778 case e_ulong:
1779 case e_slonglong:
1780 case e_ulonglong:
1781 case e_sint128:
1782 case e_uint128:
1783 case e_sint256:
1784 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001785 case e_sint512:
1786 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001787 switch (rhs.m_type) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001788 case e_void:
1789 case e_float:
1790 case e_double:
1791 case e_long_double:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001792 m_type = e_void;
1793 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001794 case e_sint:
Pavel Labathbb467f62015-08-17 15:28:05 +00001795 case e_uint:
Pavel Labathbb467f62015-08-17 15:28:05 +00001796 case e_slong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001797 case e_ulong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001798 case e_slonglong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001799 case e_ulonglong:
Sagar Thakur8536fd12015-08-20 09:12:46 +00001800 case e_sint128:
1801 case e_uint128:
Enrico Granata391075c2016-03-10 00:14:29 +00001802 case e_sint256:
1803 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001804 case e_sint512:
1805 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001806 m_integer = m_integer << rhs.m_integer;
1807 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001808 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001809 break;
1810 }
1811 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001812}
1813
Kate Stoneb9c1b512016-09-06 20:57:50 +00001814bool Scalar::ShiftRightLogical(const Scalar &rhs) {
1815 switch (m_type) {
1816 case e_void:
1817 case e_float:
1818 case e_double:
1819 case e_long_double:
1820 m_type = e_void;
1821 break;
1822
1823 case e_sint:
1824 case e_uint:
1825 case e_slong:
1826 case e_ulong:
1827 case e_slonglong:
1828 case e_ulonglong:
1829 case e_sint128:
1830 case e_uint128:
1831 case e_sint256:
1832 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001833 case e_sint512:
1834 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001835 switch (rhs.m_type) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001836 case e_void:
1837 case e_float:
1838 case e_double:
1839 case e_long_double:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001840 m_type = e_void;
1841 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001842 case e_sint:
1843 case e_uint:
Pavel Labathbb467f62015-08-17 15:28:05 +00001844 case e_slong:
1845 case e_ulong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001846 case e_slonglong:
1847 case e_ulonglong:
Sagar Thakur8536fd12015-08-20 09:12:46 +00001848 case e_sint128:
1849 case e_uint128:
Enrico Granata391075c2016-03-10 00:14:29 +00001850 case e_sint256:
1851 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001852 case e_sint512:
1853 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001854 m_integer = m_integer.lshr(rhs.m_integer);
1855 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001856 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001857 break;
1858 }
1859 return m_type != e_void;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001860}
1861
Kate Stoneb9c1b512016-09-06 20:57:50 +00001862Scalar &Scalar::operator>>=(const Scalar &rhs) {
1863 switch (m_type) {
1864 case e_void:
1865 case e_float:
1866 case e_double:
1867 case e_long_double:
1868 m_type = e_void;
1869 break;
1870
1871 case e_sint:
1872 case e_uint:
1873 case e_slong:
1874 case e_ulong:
1875 case e_slonglong:
1876 case e_ulonglong:
1877 case e_sint128:
1878 case e_uint128:
1879 case e_sint256:
1880 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001881 case e_sint512:
1882 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001883 switch (rhs.m_type) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001884 case e_void:
1885 case e_float:
1886 case e_double:
1887 case e_long_double:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001888 m_type = e_void;
1889 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001890 case e_sint:
Pavel Labathbb467f62015-08-17 15:28:05 +00001891 case e_uint:
Pavel Labathbb467f62015-08-17 15:28:05 +00001892 case e_slong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001893 case e_ulong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001894 case e_slonglong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001895 case e_ulonglong:
Sagar Thakur8536fd12015-08-20 09:12:46 +00001896 case e_sint128:
1897 case e_uint128:
Enrico Granata391075c2016-03-10 00:14:29 +00001898 case e_sint256:
1899 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001900 case e_sint512:
1901 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001902 m_integer = m_integer.ashr(rhs.m_integer);
1903 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001904 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001905 break;
1906 }
1907 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001908}
1909
Kate Stoneb9c1b512016-09-06 20:57:50 +00001910Scalar &Scalar::operator&=(const Scalar &rhs) {
1911 switch (m_type) {
1912 case e_void:
1913 case e_float:
1914 case e_double:
1915 case e_long_double:
1916 m_type = e_void;
1917 break;
1918
1919 case e_sint:
1920 case e_uint:
1921 case e_slong:
1922 case e_ulong:
1923 case e_slonglong:
1924 case e_ulonglong:
1925 case e_sint128:
1926 case e_uint128:
1927 case e_sint256:
1928 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001929 case e_sint512:
1930 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001931 switch (rhs.m_type) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001932 case e_void:
1933 case e_float:
1934 case e_double:
1935 case e_long_double:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001936 m_type = e_void;
1937 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001938 case e_sint:
Pavel Labathbb467f62015-08-17 15:28:05 +00001939 case e_uint:
Pavel Labathbb467f62015-08-17 15:28:05 +00001940 case e_slong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001941 case e_ulong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001942 case e_slonglong:
Pavel Labathbb467f62015-08-17 15:28:05 +00001943 case e_ulonglong:
Sagar Thakur8536fd12015-08-20 09:12:46 +00001944 case e_sint128:
1945 case e_uint128:
Enrico Granata391075c2016-03-10 00:14:29 +00001946 case e_sint256:
1947 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001948 case e_sint512:
1949 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001950 m_integer &= rhs.m_integer;
1951 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001952 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001953 break;
1954 }
1955 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001956}
1957
Kate Stoneb9c1b512016-09-06 20:57:50 +00001958bool Scalar::AbsoluteValue() {
1959 switch (m_type) {
1960 case e_void:
1961 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001962
Kate Stoneb9c1b512016-09-06 20:57:50 +00001963 case e_sint:
1964 case e_slong:
1965 case e_slonglong:
1966 case e_sint128:
1967 case e_sint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001968 case e_sint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001969 if (m_integer.isNegative())
1970 m_integer = -m_integer;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001971 return true;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001972
1973 case e_uint:
1974 case e_ulong:
1975 case e_ulonglong:
1976 return true;
1977 case e_uint128:
1978 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00001979 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001980 case e_float:
1981 case e_double:
1982 case e_long_double:
1983 m_float.clearSign();
1984 return true;
1985 }
1986 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001987}
1988
Kate Stoneb9c1b512016-09-06 20:57:50 +00001989bool Scalar::UnaryNegate() {
1990 switch (m_type) {
1991 case e_void:
1992 break;
1993 case e_sint:
1994 case e_uint:
1995 case e_slong:
1996 case e_ulong:
1997 case e_slonglong:
1998 case e_ulonglong:
1999 case e_sint128:
2000 case e_uint128:
2001 case e_sint256:
2002 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002003 case e_sint512:
2004 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002005 m_integer = -m_integer;
2006 return true;
2007 case e_float:
2008 case e_double:
2009 case e_long_double:
2010 m_float.changeSign();
2011 return true;
2012 }
2013 return false;
2014}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002015
Kate Stoneb9c1b512016-09-06 20:57:50 +00002016bool Scalar::OnesComplement() {
2017 switch (m_type) {
2018 case e_sint:
2019 case e_uint:
2020 case e_slong:
2021 case e_ulong:
2022 case e_slonglong:
2023 case e_ulonglong:
2024 case e_sint128:
2025 case e_uint128:
2026 case e_sint256:
2027 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002028 case e_sint512:
2029 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002030 m_integer = ~m_integer;
2031 return true;
2032
2033 case e_void:
2034 case e_float:
2035 case e_double:
2036 case e_long_double:
2037 break;
2038 }
2039 return false;
2040}
2041
2042const Scalar lldb_private::operator+(const Scalar &lhs, const Scalar &rhs) {
2043 Scalar result;
2044 Scalar temp_value;
2045 const Scalar *a;
2046 const Scalar *b;
2047 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2048 Scalar::e_void) {
2049 switch (result.m_type) {
2050 case Scalar::e_void:
2051 break;
2052 case Scalar::e_sint:
2053 case Scalar::e_uint:
2054 case Scalar::e_slong:
2055 case Scalar::e_ulong:
2056 case Scalar::e_slonglong:
2057 case Scalar::e_ulonglong:
2058 case Scalar::e_sint128:
2059 case Scalar::e_uint128:
2060 case Scalar::e_sint256:
2061 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002062 case Scalar::e_sint512:
2063 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002064 result.m_integer = a->m_integer + b->m_integer;
2065 break;
2066 case Scalar::e_float:
2067 case Scalar::e_double:
2068 case Scalar::e_long_double:
2069 result.m_float = a->m_float + b->m_float;
2070 break;
2071 }
2072 }
2073 return result;
2074}
2075
2076const Scalar lldb_private::operator-(const Scalar &lhs, const Scalar &rhs) {
2077 Scalar result;
2078 Scalar temp_value;
2079 const Scalar *a;
2080 const Scalar *b;
2081 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2082 Scalar::e_void) {
2083 switch (result.m_type) {
2084 case Scalar::e_void:
2085 break;
2086 case Scalar::e_sint:
2087 case Scalar::e_uint:
2088 case Scalar::e_slong:
2089 case Scalar::e_ulong:
2090 case Scalar::e_slonglong:
2091 case Scalar::e_ulonglong:
2092 case Scalar::e_sint128:
2093 case Scalar::e_uint128:
2094 case Scalar::e_sint256:
2095 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002096 case Scalar::e_sint512:
2097 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002098 result.m_integer = a->m_integer - b->m_integer;
2099 break;
2100 case Scalar::e_float:
2101 case Scalar::e_double:
2102 case Scalar::e_long_double:
2103 result.m_float = a->m_float - b->m_float;
2104 break;
2105 }
2106 }
2107 return result;
2108}
2109
2110const Scalar lldb_private::operator/(const Scalar &lhs, const Scalar &rhs) {
2111 Scalar result;
2112 Scalar temp_value;
2113 const Scalar *a;
2114 const Scalar *b;
2115 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2116 Scalar::e_void) {
2117 switch (result.m_type) {
2118 case Scalar::e_void:
2119 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002120 case Scalar::e_sint:
2121 case Scalar::e_slong:
2122 case Scalar::e_slonglong:
2123 case Scalar::e_sint128:
Enrico Granata391075c2016-03-10 00:14:29 +00002124 case Scalar::e_sint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002125 case Scalar::e_sint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002126 if (b->m_integer != 0) {
2127 result.m_integer = a->m_integer.sdiv(b->m_integer);
2128 return result;
2129 }
2130 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002131 case Scalar::e_uint:
2132 case Scalar::e_ulong:
2133 case Scalar::e_ulonglong:
2134 case Scalar::e_uint128:
Enrico Granata391075c2016-03-10 00:14:29 +00002135 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002136 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002137 if (b->m_integer != 0) {
2138 result.m_integer = a->m_integer.udiv(b->m_integer);
2139 return result;
2140 }
2141 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002142 case Scalar::e_float:
2143 case Scalar::e_double:
2144 case Scalar::e_long_double:
Davide Italiano01c33b82018-03-27 18:37:54 +00002145 if (!b->m_float.isZero()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002146 result.m_float = a->m_float / b->m_float;
2147 return result;
2148 }
2149 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002150 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002151 }
2152 // For division only, the only way it should make it here is if a promotion
Adrian Prantl05097242018-04-30 16:49:04 +00002153 // failed, or if we are trying to do a divide by zero.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002154 result.m_type = Scalar::e_void;
2155 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002156}
2157
Kate Stoneb9c1b512016-09-06 20:57:50 +00002158const Scalar lldb_private::operator*(const Scalar &lhs, const Scalar &rhs) {
2159 Scalar result;
2160 Scalar temp_value;
2161 const Scalar *a;
2162 const Scalar *b;
2163 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2164 Scalar::e_void) {
2165 switch (result.m_type) {
2166 case Scalar::e_void:
2167 break;
2168 case Scalar::e_sint:
2169 case Scalar::e_uint:
2170 case Scalar::e_slong:
2171 case Scalar::e_ulong:
2172 case Scalar::e_slonglong:
2173 case Scalar::e_ulonglong:
2174 case Scalar::e_sint128:
2175 case Scalar::e_uint128:
2176 case Scalar::e_sint256:
2177 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002178 case Scalar::e_sint512:
2179 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002180 result.m_integer = a->m_integer * b->m_integer;
2181 break;
2182 case Scalar::e_float:
2183 case Scalar::e_double:
2184 case Scalar::e_long_double:
2185 result.m_float = a->m_float * b->m_float;
2186 break;
2187 }
2188 }
2189 return result;
2190}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002191
Kate Stoneb9c1b512016-09-06 20:57:50 +00002192const Scalar lldb_private::operator&(const Scalar &lhs, const Scalar &rhs) {
2193 Scalar result;
2194 Scalar temp_value;
2195 const Scalar *a;
2196 const Scalar *b;
2197 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2198 Scalar::e_void) {
2199 switch (result.m_type) {
2200 case Scalar::e_sint:
2201 case Scalar::e_uint:
2202 case Scalar::e_slong:
2203 case Scalar::e_ulong:
2204 case Scalar::e_slonglong:
2205 case Scalar::e_ulonglong:
2206 case Scalar::e_sint128:
2207 case Scalar::e_uint128:
2208 case Scalar::e_sint256:
2209 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002210 case Scalar::e_sint512:
2211 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002212 result.m_integer = a->m_integer & b->m_integer;
2213 break;
2214 case Scalar::e_void:
2215 case Scalar::e_float:
2216 case Scalar::e_double:
2217 case Scalar::e_long_double:
2218 // No bitwise AND on floats, doubles of long doubles
2219 result.m_type = Scalar::e_void;
2220 break;
2221 }
2222 }
2223 return result;
2224}
2225
2226const Scalar lldb_private::operator|(const Scalar &lhs, const Scalar &rhs) {
2227 Scalar result;
2228 Scalar temp_value;
2229 const Scalar *a;
2230 const Scalar *b;
2231 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2232 Scalar::e_void) {
2233 switch (result.m_type) {
2234 case Scalar::e_sint:
2235 case Scalar::e_uint:
2236 case Scalar::e_slong:
2237 case Scalar::e_ulong:
2238 case Scalar::e_slonglong:
2239 case Scalar::e_ulonglong:
2240 case Scalar::e_sint128:
2241 case Scalar::e_uint128:
2242 case Scalar::e_sint256:
2243 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002244 case Scalar::e_sint512:
2245 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002246 result.m_integer = a->m_integer | b->m_integer;
2247 break;
2248
2249 case Scalar::e_void:
2250 case Scalar::e_float:
2251 case Scalar::e_double:
2252 case Scalar::e_long_double:
2253 // No bitwise AND on floats, doubles of long doubles
2254 result.m_type = Scalar::e_void;
2255 break;
2256 }
2257 }
2258 return result;
2259}
2260
2261const Scalar lldb_private::operator%(const Scalar &lhs, const Scalar &rhs) {
2262 Scalar result;
2263 Scalar temp_value;
2264 const Scalar *a;
2265 const Scalar *b;
2266 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2267 Scalar::e_void) {
2268 switch (result.m_type) {
2269 default:
2270 break;
2271 case Scalar::e_void:
2272 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002273 case Scalar::e_sint:
2274 case Scalar::e_slong:
2275 case Scalar::e_slonglong:
2276 case Scalar::e_sint128:
Enrico Granata391075c2016-03-10 00:14:29 +00002277 case Scalar::e_sint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002278 case Scalar::e_sint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002279 if (b->m_integer != 0) {
2280 result.m_integer = a->m_integer.srem(b->m_integer);
2281 return result;
2282 }
2283 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002284 case Scalar::e_uint:
2285 case Scalar::e_ulong:
2286 case Scalar::e_ulonglong:
2287 case Scalar::e_uint128:
Enrico Granata391075c2016-03-10 00:14:29 +00002288 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002289 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002290 if (b->m_integer != 0) {
2291 result.m_integer = a->m_integer.urem(b->m_integer);
2292 return result;
2293 }
2294 break;
2295 }
2296 }
2297 result.m_type = Scalar::e_void;
2298 return result;
2299}
2300
2301const Scalar lldb_private::operator^(const Scalar &lhs, const Scalar &rhs) {
2302 Scalar result;
2303 Scalar temp_value;
2304 const Scalar *a;
2305 const Scalar *b;
2306 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) !=
2307 Scalar::e_void) {
2308 switch (result.m_type) {
2309 case Scalar::e_sint:
2310 case Scalar::e_uint:
2311 case Scalar::e_slong:
2312 case Scalar::e_ulong:
2313 case Scalar::e_slonglong:
2314 case Scalar::e_ulonglong:
2315 case Scalar::e_sint128:
2316 case Scalar::e_uint128:
2317 case Scalar::e_sint256:
2318 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002319 case Scalar::e_sint512:
2320 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002321 result.m_integer = a->m_integer ^ b->m_integer;
2322 break;
2323
2324 case Scalar::e_void:
Sagar Thakur8536fd12015-08-20 09:12:46 +00002325 case Scalar::e_float:
2326 case Scalar::e_double:
2327 case Scalar::e_long_double:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002328 // No bitwise AND on floats, doubles of long doubles
2329 result.m_type = Scalar::e_void;
2330 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002331 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002332 }
2333 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002334}
2335
Kate Stoneb9c1b512016-09-06 20:57:50 +00002336const Scalar lldb_private::operator<<(const Scalar &lhs, const Scalar &rhs) {
2337 Scalar result = lhs;
2338 result <<= rhs;
2339 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002340}
2341
Kate Stoneb9c1b512016-09-06 20:57:50 +00002342const Scalar lldb_private::operator>>(const Scalar &lhs, const Scalar &rhs) {
2343 Scalar result = lhs;
2344 result >>= rhs;
2345 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002346}
2347
Zachary Turner97206d52017-05-12 04:51:55 +00002348Status Scalar::SetValueFromCString(const char *value_str, Encoding encoding,
2349 size_t byte_size) {
2350 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002351 if (value_str == nullptr || value_str[0] == '\0') {
2352 error.SetErrorString("Invalid c-string value string.");
2353 return error;
2354 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002355 switch (encoding) {
2356 case eEncodingInvalid:
2357 error.SetErrorString("Invalid encoding.");
2358 break;
2359
2360 case eEncodingUint:
Pavel Labath61547252018-06-19 17:24:03 +00002361 if (byte_size <= sizeof(uint64_t)) {
2362 uint64_t uval64;
2363 if (!llvm::to_integer(value_str, uval64))
Kate Stoneb9c1b512016-09-06 20:57:50 +00002364 error.SetErrorStringWithFormat(
2365 "'%s' is not a valid unsigned integer string value", value_str);
2366 else if (!UIntValueIsValidForSize(uval64, byte_size))
2367 error.SetErrorStringWithFormat("value 0x%" PRIx64
2368 " is too large to fit in a %" PRIu64
2369 " byte unsigned integer value",
2370 uval64, (uint64_t)byte_size);
2371 else {
2372 m_type = Scalar::GetValueTypeForUnsignedIntegerWithByteSize(byte_size);
2373 switch (m_type) {
2374 case e_uint:
2375 m_integer = llvm::APInt(sizeof(uint_t) * 8, uval64, false);
2376 break;
2377 case e_ulong:
2378 m_integer = llvm::APInt(sizeof(ulong_t) * 8, uval64, false);
2379 break;
2380 case e_ulonglong:
2381 m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, uval64, false);
2382 break;
2383 default:
2384 error.SetErrorStringWithFormat(
2385 "unsupported unsigned integer byte size: %" PRIu64 "",
2386 (uint64_t)byte_size);
2387 break;
2388 }
2389 }
2390 } else {
2391 error.SetErrorStringWithFormat(
2392 "unsupported unsigned integer byte size: %" PRIu64 "",
2393 (uint64_t)byte_size);
2394 return error;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002395 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002396 break;
2397
2398 case eEncodingSint:
Pavel Labath61547252018-06-19 17:24:03 +00002399 if (byte_size <= sizeof(int64_t)) {
2400 int64_t sval64;
2401 if (!llvm::to_integer(value_str, sval64))
Kate Stoneb9c1b512016-09-06 20:57:50 +00002402 error.SetErrorStringWithFormat(
2403 "'%s' is not a valid signed integer string value", value_str);
2404 else if (!SIntValueIsValidForSize(sval64, byte_size))
2405 error.SetErrorStringWithFormat("value 0x%" PRIx64
2406 " is too large to fit in a %" PRIu64
2407 " byte signed integer value",
2408 sval64, (uint64_t)byte_size);
2409 else {
2410 m_type = Scalar::GetValueTypeForSignedIntegerWithByteSize(byte_size);
2411 switch (m_type) {
2412 case e_sint:
2413 m_integer = llvm::APInt(sizeof(sint_t) * 8, sval64, true);
2414 break;
2415 case e_slong:
2416 m_integer = llvm::APInt(sizeof(slong_t) * 8, sval64, true);
2417 break;
2418 case e_slonglong:
2419 m_integer = llvm::APInt(sizeof(slonglong_t) * 8, sval64, true);
2420 break;
2421 default:
2422 error.SetErrorStringWithFormat(
2423 "unsupported signed integer byte size: %" PRIu64 "",
2424 (uint64_t)byte_size);
2425 break;
2426 }
2427 }
2428 } else {
2429 error.SetErrorStringWithFormat(
2430 "unsupported signed integer byte size: %" PRIu64 "",
2431 (uint64_t)byte_size);
2432 return error;
2433 }
2434 break;
2435
2436 case eEncodingIEEE754:
2437 static float f_val;
2438 static double d_val;
2439 static long double l_val;
2440 if (byte_size == sizeof(float)) {
2441 if (::sscanf(value_str, "%f", &f_val) == 1) {
2442 m_float = llvm::APFloat(f_val);
2443 m_type = e_float;
2444 } else
2445 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2446 value_str);
2447 } else if (byte_size == sizeof(double)) {
2448 if (::sscanf(value_str, "%lf", &d_val) == 1) {
2449 m_float = llvm::APFloat(d_val);
2450 m_type = e_double;
2451 } else
2452 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2453 value_str);
2454 } else if (byte_size == sizeof(long double)) {
2455 if (::sscanf(value_str, "%Lf", &l_val) == 1) {
2456 m_float =
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002457 llvm::APFloat(llvm::APFloat::x87DoubleExtended(),
Kate Stoneb9c1b512016-09-06 20:57:50 +00002458 llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128,
2459 ((type128 *)&l_val)->x));
2460 m_type = e_long_double;
2461 } else
2462 error.SetErrorStringWithFormat("'%s' is not a valid float string value",
2463 value_str);
2464 } else {
2465 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "",
2466 (uint64_t)byte_size);
2467 return error;
2468 }
2469 break;
2470
2471 case eEncodingVector:
2472 error.SetErrorString("vector encoding unsupported.");
2473 break;
2474 }
2475 if (error.Fail())
2476 m_type = e_void;
2477
2478 return error;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002479}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002480
Zachary Turner97206d52017-05-12 04:51:55 +00002481Status Scalar::SetValueFromData(DataExtractor &data, lldb::Encoding encoding,
2482 size_t byte_size) {
2483 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002484
2485 type128 int128;
2486 type256 int256;
2487 switch (encoding) {
2488 case lldb::eEncodingInvalid:
2489 error.SetErrorString("invalid encoding");
2490 break;
2491 case lldb::eEncodingVector:
2492 error.SetErrorString("vector encoding unsupported");
2493 break;
2494 case lldb::eEncodingUint: {
2495 lldb::offset_t offset = 0;
2496
2497 switch (byte_size) {
2498 case 1:
2499 operator=((uint8_t)data.GetU8(&offset));
2500 break;
2501 case 2:
2502 operator=((uint16_t)data.GetU16(&offset));
2503 break;
2504 case 4:
2505 operator=((uint32_t)data.GetU32(&offset));
2506 break;
2507 case 8:
2508 operator=((uint64_t)data.GetU64(&offset));
2509 break;
2510 case 16:
2511 if (data.GetByteOrder() == eByteOrderBig) {
2512 int128.x[1] = (uint64_t)data.GetU64(&offset);
2513 int128.x[0] = (uint64_t)data.GetU64(&offset);
2514 } else {
2515 int128.x[0] = (uint64_t)data.GetU64(&offset);
2516 int128.x[1] = (uint64_t)data.GetU64(&offset);
2517 }
2518 operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
2519 break;
2520 case 32:
2521 if (data.GetByteOrder() == eByteOrderBig) {
2522 int256.x[3] = (uint64_t)data.GetU64(&offset);
2523 int256.x[2] = (uint64_t)data.GetU64(&offset);
2524 int256.x[1] = (uint64_t)data.GetU64(&offset);
2525 int256.x[0] = (uint64_t)data.GetU64(&offset);
2526 } else {
2527 int256.x[0] = (uint64_t)data.GetU64(&offset);
2528 int256.x[1] = (uint64_t)data.GetU64(&offset);
2529 int256.x[2] = (uint64_t)data.GetU64(&offset);
2530 int256.x[3] = (uint64_t)data.GetU64(&offset);
2531 }
2532 operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x));
2533 break;
2534 default:
2535 error.SetErrorStringWithFormat(
2536 "unsupported unsigned integer byte size: %" PRIu64 "",
2537 (uint64_t)byte_size);
2538 break;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002539 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002540 } break;
2541 case lldb::eEncodingSint: {
2542 lldb::offset_t offset = 0;
2543
2544 switch (byte_size) {
2545 case 1:
2546 operator=((int8_t)data.GetU8(&offset));
2547 break;
2548 case 2:
2549 operator=((int16_t)data.GetU16(&offset));
2550 break;
2551 case 4:
2552 operator=((int32_t)data.GetU32(&offset));
2553 break;
2554 case 8:
2555 operator=((int64_t)data.GetU64(&offset));
2556 break;
2557 case 16:
2558 if (data.GetByteOrder() == eByteOrderBig) {
2559 int128.x[1] = (uint64_t)data.GetU64(&offset);
2560 int128.x[0] = (uint64_t)data.GetU64(&offset);
2561 } else {
2562 int128.x[0] = (uint64_t)data.GetU64(&offset);
2563 int128.x[1] = (uint64_t)data.GetU64(&offset);
2564 }
2565 operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
2566 break;
2567 case 32:
2568 if (data.GetByteOrder() == eByteOrderBig) {
2569 int256.x[3] = (uint64_t)data.GetU64(&offset);
2570 int256.x[2] = (uint64_t)data.GetU64(&offset);
2571 int256.x[1] = (uint64_t)data.GetU64(&offset);
2572 int256.x[0] = (uint64_t)data.GetU64(&offset);
2573 } else {
2574 int256.x[0] = (uint64_t)data.GetU64(&offset);
2575 int256.x[1] = (uint64_t)data.GetU64(&offset);
2576 int256.x[2] = (uint64_t)data.GetU64(&offset);
2577 int256.x[3] = (uint64_t)data.GetU64(&offset);
2578 }
2579 operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x));
2580 break;
2581 default:
2582 error.SetErrorStringWithFormat(
2583 "unsupported signed integer byte size: %" PRIu64 "",
2584 (uint64_t)byte_size);
2585 break;
2586 }
2587 } break;
2588 case lldb::eEncodingIEEE754: {
2589 lldb::offset_t offset = 0;
2590
2591 if (byte_size == sizeof(float))
2592 operator=((float)data.GetFloat(&offset));
2593 else if (byte_size == sizeof(double))
2594 operator=((double)data.GetDouble(&offset));
2595 else if (byte_size == sizeof(long double))
2596 operator=((long double)data.GetLongDouble(&offset));
2597 else
2598 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "",
2599 (uint64_t)byte_size);
2600 } break;
2601 }
2602
2603 return error;
Sagar Thakur8536fd12015-08-20 09:12:46 +00002604}
Oleksiy Vyalov9dcdd2e2015-08-10 21:49:50 +00002605
Kate Stoneb9c1b512016-09-06 20:57:50 +00002606bool Scalar::SignExtend(uint32_t sign_bit_pos) {
2607 const uint32_t max_bit_pos = GetByteSize() * 8;
2608
2609 if (sign_bit_pos < max_bit_pos) {
2610 switch (m_type) {
2611 case Scalar::e_void:
2612 case Scalar::e_float:
2613 case Scalar::e_double:
2614 case Scalar::e_long_double:
2615 return false;
2616
2617 case Scalar::e_sint:
2618 case Scalar::e_uint:
2619 case Scalar::e_slong:
2620 case Scalar::e_ulong:
2621 case Scalar::e_slonglong:
2622 case Scalar::e_ulonglong:
2623 case Scalar::e_sint128:
2624 case Scalar::e_uint128:
2625 case Scalar::e_sint256:
2626 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002627 case Scalar::e_sint512:
2628 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002629 if (max_bit_pos == sign_bit_pos)
2630 return true;
2631 else if (sign_bit_pos < (max_bit_pos - 1)) {
Sean Callananac3254a2017-04-20 18:07:51 +00002632 llvm::APInt sign_bit = llvm::APInt::getSignMask(sign_bit_pos + 1);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002633 llvm::APInt bitwize_and = m_integer & sign_bit;
2634 if (bitwize_and.getBoolValue()) {
2635 const llvm::APInt mask =
2636 ~(sign_bit) + llvm::APInt(m_integer.getBitWidth(), 1);
2637 m_integer |= mask;
2638 }
2639 return true;
2640 }
2641 break;
2642 }
2643 }
2644 return false;
2645}
2646
2647size_t Scalar::GetAsMemoryData(void *dst, size_t dst_len,
2648 lldb::ByteOrder dst_byte_order,
Zachary Turner97206d52017-05-12 04:51:55 +00002649 Status &error) const {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002650 // Get a data extractor that points to the native scalar data
2651 DataExtractor data;
2652 if (!GetData(data)) {
2653 error.SetErrorString("invalid scalar value");
2654 return 0;
2655 }
2656
2657 const size_t src_len = data.GetByteSize();
2658
2659 // Prepare a memory buffer that contains some or all of the register value
2660 const size_t bytes_copied =
2661 data.CopyByteOrderedData(0, // src offset
2662 src_len, // src length
2663 dst, // dst buffer
2664 dst_len, // dst length
2665 dst_byte_order); // dst byte order
2666 if (bytes_copied == 0)
2667 error.SetErrorString("failed to copy data");
2668
2669 return bytes_copied;
2670}
2671
2672bool Scalar::ExtractBitfield(uint32_t bit_size, uint32_t bit_offset) {
2673 if (bit_size == 0)
2674 return true;
2675
2676 switch (m_type) {
2677 case Scalar::e_void:
2678 case Scalar::e_float:
2679 case Scalar::e_double:
2680 case Scalar::e_long_double:
2681 break;
2682
2683 case Scalar::e_sint:
2684 case Scalar::e_slong:
2685 case Scalar::e_slonglong:
2686 case Scalar::e_sint128:
2687 case Scalar::e_sint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002688 case Scalar::e_sint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002689 m_integer = m_integer.ashr(bit_offset)
2690 .sextOrTrunc(bit_size)
2691 .sextOrSelf(8 * GetByteSize());
2692 return true;
2693
2694 case Scalar::e_uint:
2695 case Scalar::e_ulong:
2696 case Scalar::e_ulonglong:
2697 case Scalar::e_uint128:
2698 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002699 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002700 m_integer = m_integer.lshr(bit_offset)
2701 .zextOrTrunc(bit_size)
2702 .zextOrSelf(8 * GetByteSize());
2703 return true;
2704 }
2705 return false;
2706}
2707
2708bool lldb_private::operator==(const Scalar &lhs, const Scalar &rhs) {
2709 // If either entry is void then we can just compare the types
2710 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2711 return lhs.m_type == rhs.m_type;
2712
2713 Scalar temp_value;
2714 const Scalar *a;
2715 const Scalar *b;
2716 llvm::APFloat::cmpResult result;
2717 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2718 case Scalar::e_void:
2719 break;
2720 case Scalar::e_sint:
2721 case Scalar::e_uint:
2722 case Scalar::e_slong:
2723 case Scalar::e_ulong:
2724 case Scalar::e_slonglong:
2725 case Scalar::e_ulonglong:
2726 case Scalar::e_sint128:
2727 case Scalar::e_uint128:
2728 case Scalar::e_sint256:
2729 case Scalar::e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002730 case Scalar::e_sint512:
2731 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002732 return a->m_integer == b->m_integer;
2733 case Scalar::e_float:
2734 case Scalar::e_double:
2735 case Scalar::e_long_double:
2736 result = a->m_float.compare(b->m_float);
2737 if (result == llvm::APFloat::cmpEqual)
2738 return true;
2739 }
2740 return false;
2741}
2742
2743bool lldb_private::operator!=(const Scalar &lhs, const Scalar &rhs) {
Davide Italiano18a0ce92018-12-21 22:42:00 +00002744 return !(lhs == rhs);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002745}
2746
2747bool lldb_private::operator<(const Scalar &lhs, const Scalar &rhs) {
2748 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2749 return false;
2750
2751 Scalar temp_value;
2752 const Scalar *a;
2753 const Scalar *b;
2754 llvm::APFloat::cmpResult result;
2755 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b)) {
2756 case Scalar::e_void:
2757 break;
2758 case Scalar::e_sint:
2759 case Scalar::e_slong:
2760 case Scalar::e_slonglong:
2761 case Scalar::e_sint128:
2762 case Scalar::e_sint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002763 case Scalar::e_sint512:
2764 case Scalar::e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002765 return a->m_integer.slt(b->m_integer);
2766 case Scalar::e_uint:
2767 case Scalar::e_ulong:
2768 case Scalar::e_ulonglong:
2769 case Scalar::e_uint128:
2770 case Scalar::e_uint256:
2771 return a->m_integer.ult(b->m_integer);
2772 case Scalar::e_float:
2773 case Scalar::e_double:
2774 case Scalar::e_long_double:
2775 result = a->m_float.compare(b->m_float);
2776 if (result == llvm::APFloat::cmpLessThan)
2777 return true;
2778 }
2779 return false;
2780}
2781
2782bool lldb_private::operator<=(const Scalar &lhs, const Scalar &rhs) {
Davide Italianoff92a1a2019-01-04 19:23:52 +00002783 return !(rhs < lhs);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002784}
2785
2786bool lldb_private::operator>(const Scalar &lhs, const Scalar &rhs) {
Davide Italianoff92a1a2019-01-04 19:23:52 +00002787 return rhs < lhs;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002788}
2789
2790bool lldb_private::operator>=(const Scalar &lhs, const Scalar &rhs) {
Davide Italianoff92a1a2019-01-04 19:23:52 +00002791 return !(lhs < rhs);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002792}
2793
2794bool Scalar::ClearBit(uint32_t bit) {
2795 switch (m_type) {
2796 case e_void:
2797 break;
2798 case e_sint:
2799 case e_uint:
2800 case e_slong:
2801 case e_ulong:
2802 case e_slonglong:
2803 case e_ulonglong:
2804 case e_sint128:
2805 case e_uint128:
2806 case e_sint256:
2807 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002808 case e_sint512:
2809 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002810 m_integer.clearBit(bit);
2811 return true;
2812 case e_float:
2813 case e_double:
2814 case e_long_double:
2815 break;
2816 }
2817 return false;
2818}
2819
2820bool Scalar::SetBit(uint32_t bit) {
2821 switch (m_type) {
2822 case e_void:
2823 break;
2824 case e_sint:
2825 case e_uint:
2826 case e_slong:
2827 case e_ulong:
2828 case e_slonglong:
2829 case e_ulonglong:
2830 case e_sint128:
2831 case e_uint128:
2832 case e_sint256:
2833 case e_uint256:
Davide Italiano51d46bd2019-01-30 18:05:36 +00002834 case e_sint512:
2835 case e_uint512:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002836 m_integer.setBit(bit);
2837 return true;
2838 case e_float:
2839 case e_double:
2840 case e_long_double:
2841 break;
2842 }
2843 return false;
2844}
Pavel Labathb07a7992019-04-29 10:55:22 +00002845
2846llvm::raw_ostream &lldb_private::operator<<(llvm::raw_ostream &os, const Scalar &scalar) {
2847 StreamString s;
2848 scalar.GetValue(&s, /*show_type*/ true);
2849 return os << s.GetString();
2850}