diff options
Diffstat (limited to 'source/Core/Scalar.cpp')
-rw-r--r-- | source/Core/Scalar.cpp | 1152 |
1 files changed, 620 insertions, 532 deletions
diff --git a/source/Core/Scalar.cpp b/source/Core/Scalar.cpp index 586969b2d50a..d3e9a7565046 100644 --- a/source/Core/Scalar.cpp +++ b/source/Core/Scalar.cpp @@ -9,10 +9,16 @@ #include "lldb/Core/Scalar.h" -#include <math.h> -#include <inttypes.h> -#include <stdio.h> +// C Includes +// C++ Includes +#include <cinttypes> +#include <cmath> +#include <cstdio> +// Other libraries and framework includes +#include "llvm/ADT/SmallString.h" + +// Project includes #include "lldb/Interpreter/Args.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" @@ -72,19 +78,12 @@ PromoteToMaxType return Scalar::e_void; } - -//---------------------------------------------------------------------- -// Scalar constructor -//---------------------------------------------------------------------- Scalar::Scalar() : m_type(e_void), m_float((float)0) { } -//---------------------------------------------------------------------- -// Scalar copy constructor -//---------------------------------------------------------------------- Scalar::Scalar(const Scalar& rhs) : m_type(rhs.m_type), m_integer(rhs.m_integer), @@ -137,10 +136,10 @@ bool Scalar::GetData (DataExtractor &data, size_t limit_byte_size) const { size_t byte_size = GetByteSize(); - static float f_val; - static double d_val; if (byte_size > 0) { + const uint8_t *bytes = reinterpret_cast<const uint8_t *>(GetBytes()); + if (limit_byte_size < byte_size) { if (endian::InlHostByteOrder() == eByteOrderLittle) @@ -148,110 +147,33 @@ Scalar::GetData (DataExtractor &data, size_t limit_byte_size) const // On little endian systems if we want fewer bytes from the // current type we just specify fewer bytes since the LSByte // is first... - switch(m_type) - { - case e_void: - break; - case e_sint: - case e_uint: - case e_slong: - case e_ulong: - case e_slonglong: - case e_ulonglong: - case e_sint128: - case e_uint128: - data.SetData((const uint8_t *)m_integer.getRawData(), limit_byte_size, endian::InlHostByteOrder()); - return true; - case e_float: - f_val = m_float.convertToFloat(); - data.SetData((uint8_t *)&f_val, limit_byte_size, endian::InlHostByteOrder()); - return true; - case e_double: - d_val = m_float.convertToDouble(); - data.SetData((uint8_t *)&d_val, limit_byte_size, endian::InlHostByteOrder()); - return true; - case e_long_double: - static llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - data.SetData((const uint8_t *)ldbl_val.getRawData(), limit_byte_size, endian::InlHostByteOrder()); - return true; - } + byte_size = limit_byte_size; } else if (endian::InlHostByteOrder() == eByteOrderBig) { // On big endian systems if we want fewer bytes from the // current type have to advance our initial byte pointer and // trim down the number of bytes since the MSByte is first - switch(m_type) - { - case e_void: - break; - case e_sint: - case e_uint: - case e_slong: - case e_ulong: - case e_slonglong: - case e_ulonglong: - case e_sint128: - case e_uint128: - data.SetData((const uint8_t *)m_integer.getRawData() + byte_size - limit_byte_size, limit_byte_size, endian::InlHostByteOrder()); - return true; - case e_float: - f_val = m_float.convertToFloat(); - data.SetData((uint8_t *)&f_val + byte_size - limit_byte_size, limit_byte_size, endian::InlHostByteOrder()); - return true; - case e_double: - d_val = m_float.convertToDouble(); - data.SetData((uint8_t *)&d_val + byte_size - limit_byte_size, limit_byte_size, endian::InlHostByteOrder()); - return true; - case e_long_double: - static llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - data.SetData((const uint8_t *)ldbl_val.getRawData() + byte_size - limit_byte_size, limit_byte_size, endian::InlHostByteOrder()); - return true; - } - } - } - else - { - // We want all of the data - switch(m_type) - { - case e_void: - break; - case e_sint: - case e_uint: - case e_slong: - case e_ulong: - case e_slonglong: - case e_ulonglong: - case e_sint128: - case e_uint128: - data.SetData((const uint8_t *)m_integer.getRawData(), byte_size, endian::InlHostByteOrder()); - return true; - case e_float: - f_val = m_float.convertToFloat(); - data.SetData((uint8_t *)&f_val, byte_size, endian::InlHostByteOrder()); - return true; - case e_double: - d_val = m_float.convertToDouble(); - data.SetData((uint8_t *)&d_val, byte_size, endian::InlHostByteOrder()); - return true; - case e_long_double: - static llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - data.SetData((const uint8_t *)ldbl_val.getRawData(), byte_size, endian::InlHostByteOrder()); - return true; + bytes += byte_size - limit_byte_size; + byte_size = limit_byte_size; } } + + data.SetData(bytes, byte_size, endian::InlHostByteOrder()); return true; } data.Clear(); return false; } -void * +const void * Scalar::GetBytes() const { + const uint64_t *apint_words; + const uint8_t *bytes; static float_t flt_val; static double_t dbl_val; + static uint64_t swapped_words[4]; switch (m_type) { case e_void: @@ -262,20 +184,65 @@ Scalar::GetBytes() const case e_ulong: case e_slonglong: case e_ulonglong: + bytes = reinterpret_cast<const uint8_t *>(m_integer.getRawData()); + // getRawData always returns a pointer to an uint64_t. If we have a smaller type, + // we need to update the pointer on big-endian systems. + if (endian::InlHostByteOrder() == eByteOrderBig) + { + size_t byte_size = m_integer.getBitWidth() / 8; + if (byte_size < 8) + bytes += 8 - byte_size; + } + return bytes; case e_sint128: case e_uint128: - return const_cast<void *>(reinterpret_cast<const void *>(m_integer.getRawData())); + apint_words = m_integer.getRawData(); + // getRawData always returns a pointer to an array of two uint64_t values, + // where the least-significant word always comes first. On big-endian + // systems we need to swap the two words. + if (endian::InlHostByteOrder() == eByteOrderBig) + { + swapped_words[0] = apint_words[1]; + swapped_words[1] = apint_words[0]; + apint_words = swapped_words; + } + return reinterpret_cast<const void *>(apint_words); + case e_sint256: + case e_uint256: + apint_words = m_integer.getRawData(); + // getRawData always returns a pointer to an array of four uint64_t values, + // where the least-significant word always comes first. On big-endian + // systems we need to swap the four words. + if (endian::InlHostByteOrder() == eByteOrderBig) + { + swapped_words[0] = apint_words[3]; + swapped_words[1] = apint_words[2]; + swapped_words[2] = apint_words[1]; + swapped_words[3] = apint_words[0]; + apint_words = swapped_words; + } + return reinterpret_cast<const void *>(apint_words); case e_float: flt_val = m_float.convertToFloat(); - return (void *)&flt_val; + return reinterpret_cast<const void *>(&flt_val); case e_double: dbl_val = m_float.convertToDouble(); - return (void *)&dbl_val; + return reinterpret_cast<const void *>(&dbl_val); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return const_cast<void *>(reinterpret_cast<const void *>(ldbl_val.getRawData())); + apint_words = ldbl_val.getRawData(); + // getRawData always returns a pointer to an array of two uint64_t values, + // where the least-significant word always comes first. On big-endian + // systems we need to swap the two words. + if (endian::InlHostByteOrder() == eByteOrderBig) + { + swapped_words[0] = apint_words[1]; + swapped_words[1] = apint_words[0]; + apint_words = swapped_words; + } + return reinterpret_cast<const void *>(apint_words); } - return NULL; + return nullptr; } size_t @@ -292,7 +259,10 @@ Scalar::GetByteSize() const case e_slonglong: case e_ulonglong: case e_sint128: - case e_uint128: return (m_integer.getBitWidth() / 8); + case e_uint128: + case e_sint256: + case e_uint256: + return (m_integer.getBitWidth() / 8); case e_float: return sizeof(float_t); case e_double: return sizeof(double_t); case e_long_double: return sizeof(long_double_t); @@ -316,6 +286,8 @@ Scalar::IsZero() const case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: return llvm::APInt::isSameValue(zero_int, m_integer); case e_float: case e_double: @@ -328,7 +300,6 @@ Scalar::IsZero() const void Scalar::GetValue (Stream *s, bool show_type) const { - const uint64_t *src; if (show_type) s->Printf("(%s) ", GetTypeAsCString()); @@ -336,25 +307,26 @@ Scalar::GetValue (Stream *s, bool show_type) const { case e_void: break; - case e_sint: s->Printf("%i", *(const sint_t *) m_integer.getRawData()); break; - case e_uint: s->Printf("0x%8.8x", *(const uint_t *) m_integer.getRawData()); break; - case e_slong: s->Printf("%li", *(const slong_t *) m_integer.getRawData()); break; - case e_ulong: s->Printf("0x%8.8lx", *(const ulong_t *) m_integer.getRawData()); break; - case e_slonglong: s->Printf("%lli", *(const slonglong_t *) m_integer.getRawData()); break; - case e_ulonglong: s->Printf("0x%16.16llx", *(const ulonglong_t *) m_integer.getRawData()); break; + case e_sint: + case e_ulong: + case e_slonglong: case e_sint128: - src = m_integer.getRawData(); - s->Printf("%lli%lli", *(const slonglong_t *)src, *(const slonglong_t *)(src + 1)); + case e_sint256: + s->Printf("%s",m_integer.toString(10,true).c_str()); break; + case e_uint: + case e_slong: + case e_ulonglong: case e_uint128: - src = m_integer.getRawData(); - s->Printf("0x%16.16llx%16.16llx", *(const ulonglong_t *)src, *(const ulonglong_t *)(src + 1)); + case e_uint256: + s->Printf("%s",m_integer.toString(16,false).c_str()); break; - case e_float: s->Printf("%f", m_float.convertToFloat()); break; - case e_double: s->Printf("%g", m_float.convertToDouble()); break; + case e_float: + case e_double: case e_long_double: - llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - s->Printf("%Lg", *(const long_double_t *)ldbl_val.getRawData()); + llvm::SmallString<24> string; + m_float.toString(string); + s->Printf("%s", string.c_str()); break; } } @@ -373,6 +345,8 @@ Scalar::GetTypeAsCString() const case e_ulonglong: return "unsigned long long"; case e_sint128: return "int128_t"; case e_uint128: return "unsigned int128_t"; + case e_sint256: return "int256_t"; + case e_uint256: return "unsigned int256_t"; case e_float: return "float"; case e_double: return "double"; case e_long_double: return "long double"; @@ -380,11 +354,6 @@ Scalar::GetTypeAsCString() const return "<invalid Scalar type>"; } - - -//---------------------------------------------------------------------- -// Scalar copy constructor -//---------------------------------------------------------------------- Scalar& Scalar::operator=(const Scalar& rhs) { @@ -405,7 +374,6 @@ Scalar::operator= (const int v) return *this; } - Scalar& Scalar::operator= (unsigned int v) { @@ -499,16 +467,17 @@ Scalar::operator= (llvm::APInt rhs) else m_type = e_uint128; break; + case 256: + if(m_integer.isSignedIntN(BITWIDTH_INT256)) + m_type = e_sint256; + else + m_type = e_uint256; + break; } return *this; } -//---------------------------------------------------------------------- -// Destructor -//---------------------------------------------------------------------- -Scalar::~Scalar() -{ -} +Scalar::~Scalar() = default; bool Scalar::Promote(Scalar::Type type) @@ -525,63 +494,59 @@ Scalar::Promote(Scalar::Type type) case e_void: break; case e_sint: success = true; break; case e_uint: - { - m_integer = llvm::APInt(sizeof(uint_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.sextOrTrunc(sizeof(uint_t) * 8); success = true; break; - } + case e_slong: - { - m_integer = llvm::APInt(sizeof(slong_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); + m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8); success = true; break; - } + case e_ulong: - { - m_integer = llvm::APInt(sizeof(ulong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8); success = true; break; - } + case e_slonglong: - { - m_integer = llvm::APInt(sizeof(slonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); + m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_ulonglong: - { - m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8); success = true; break; - } + case e_sint128: case e_uint128: - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())); + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128); success = true; break; - } + + case e_sint256: + case e_uint256: + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256); + success = true; + break; + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -592,57 +557,54 @@ Scalar::Promote(Scalar::Type type) case e_sint: break; case e_uint: success = true; break; case e_slong: - { - m_integer = llvm::APInt(sizeof(slong_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); + m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8); success = true; break; - } + case e_ulong: - { - m_integer = llvm::APInt(sizeof(ulong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.zextOrTrunc(sizeof(ulong_t) * 8); success = true; break; - } + case e_slonglong: - { - m_integer = llvm::APInt(sizeof(slonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); + m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_ulonglong: - { - m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8); success = true; break; - } + case e_sint128: case e_uint128: - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())); + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128); success = true; break; - } - case e_float: - { + + case e_sint256: + case e_uint256: + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256); + success = true; + break; + + case e_float: m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -654,51 +616,49 @@ Scalar::Promote(Scalar::Type type) case e_uint: break; case e_slong: success = true; break; case e_ulong: - { - m_integer = llvm::APInt(sizeof(ulong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.sextOrTrunc(sizeof(ulong_t) * 8); success = true; break; - } + case e_slonglong: - { - m_integer = llvm::APInt(sizeof(slonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); + m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_ulonglong: - { - m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8); success = true; break; - } + case e_sint128: case e_uint128: - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())); + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128); + success = true; + break; + + case e_sint256: + case e_uint256: + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256); success = true; break; - } + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -711,45 +671,44 @@ Scalar::Promote(Scalar::Type type) case e_slong: break; case e_ulong: success = true; break; case e_slonglong: - { - m_integer = llvm::APInt(sizeof(slonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); + m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_ulonglong: - { - m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8); success = true; break; - } + case e_sint128: case e_uint128: - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())); + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128); success = true; break; - } + + case e_sint256: + case e_uint256: + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256); + success = true; + break; + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -763,39 +722,39 @@ Scalar::Promote(Scalar::Type type) case e_ulong: break; case e_slonglong: success = true; break; case e_ulonglong: - { - m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); + m_integer = m_integer.sextOrTrunc(sizeof(ulonglong_t) * 8); success = true; break; - } + case e_sint128: case e_uint128: - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())); + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128); + success = true; + break; + + case e_sint256: + case e_uint256: + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256); success = true; break; - } + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -811,32 +770,33 @@ Scalar::Promote(Scalar::Type type) case e_ulonglong: success = true; break; case e_sint128: case e_uint128: - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())); + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128); + success = true; + break; + + case e_sint256: + case e_uint256: + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256); success = true; break; - } + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -852,32 +812,33 @@ Scalar::Promote(Scalar::Type type) case e_ulonglong: break; case e_sint128: success = true; break; case e_uint128: - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())); + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128); success = true; break; - } + + case e_sint256: + case e_uint256: + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256); + success = true; + break; + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -893,30 +854,104 @@ Scalar::Promote(Scalar::Type type) case e_ulonglong: case e_sint128: break; case e_uint128: success = true; break; + case e_sint256: + case e_uint256: + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256); + success = true; + break; + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; + case e_sint256: + switch (type) + { + case e_void: + case e_sint: + case e_uint: + case e_slong: + case e_ulong: + case e_slonglong: + case e_ulonglong: + case e_sint128: + case e_uint128: break; + case e_sint256: success = true; break; + case e_uint256: + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256); + success = true; + break; + + case e_float: + m_float = llvm::APFloat(m_integer.bitsToFloat()); + success = true; + break; + + case e_double: + m_float = llvm::APFloat(m_integer.bitsToDouble()); + success = true; + break; + + case e_long_double: + if(m_ieee_quad) + m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); + else + m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); + success = true; + break; + } + break; + + case e_uint256: + switch (type) + { + case e_void: + case e_sint: + case e_uint: + case e_slong: + case e_ulong: + case e_slonglong: + case e_ulonglong: + case e_sint128: + case e_uint128: + case e_sint256: break; + case e_uint256: success = true; break; + case e_float: + m_float = llvm::APFloat(m_integer.bitsToFloat()); + success = true; + break; + + case e_double: + m_float = llvm::APFloat(m_integer.bitsToDouble()); + success = true; + break; + + case e_long_double: + if(m_ieee_quad) + m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); + else + m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); + success = true; + break; + } + break; + case e_float: switch (type) { @@ -928,23 +963,22 @@ Scalar::Promote(Scalar::Type type) case e_slonglong: case e_ulonglong: case e_sint128: - case e_uint128: break; + case e_uint128: + case e_sint256: + case e_uint256: break; case e_float: success = true; break; case e_double: - { m_float = llvm::APFloat((float_t)m_float.convertToFloat()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_float.bitcastToAPInt()); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_float.bitcastToAPInt()); success = true; break; - } } break; @@ -960,17 +994,17 @@ Scalar::Promote(Scalar::Type type) case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: case e_float: break; case e_double: success = true; break; case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_float.bitcastToAPInt()); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_float.bitcastToAPInt()); success = true; break; - } } break; @@ -986,6 +1020,8 @@ Scalar::Promote(Scalar::Type type) case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: case e_float: case e_double: break; case e_long_double: success = true; break; @@ -1015,11 +1051,12 @@ Scalar::GetValueTypeAsCString (Scalar::Type type) case e_long_double: return "long double"; case e_sint128: return "int128_t"; case e_uint128: return "uint128_t"; + case e_sint256: return "int256_t"; + case e_uint256: return "uint256_t"; } return "???"; } - Scalar::Type Scalar::GetValueTypeForSignedIntegerWithByteSize (size_t byte_size) { @@ -1073,78 +1110,78 @@ Scalar::Cast(Scalar::Type type) case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: switch (type) { case e_void: break; case e_sint: - { m_integer = m_integer.sextOrTrunc(sizeof(sint_t) * 8); success = true; break; - } + case e_uint: - { m_integer = m_integer.zextOrTrunc(sizeof(sint_t) * 8); success = true; break; - } + case e_slong: - { m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8); success = true; break; - } + case e_ulong: - { m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8); success = true; break; - } + case e_slonglong: - { m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_ulonglong: - { m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_sint128: - { m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128); success = true; break; - } + case e_uint128: - { m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128); success = true; break; - } + + case e_sint256: + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256); + success = true; + break; + + case e_uint256: + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256); + success = true; + break; + case e_float: - { m_float = llvm::APFloat(m_integer.bitsToFloat()); success = true; break; - } + case e_double: - { m_float = llvm::APFloat(m_integer.bitsToDouble()); success = true; break; - } + case e_long_double: - { if(m_ieee_quad) m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer); else m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer); success = true; break; - } } break; @@ -1159,7 +1196,9 @@ Scalar::Cast(Scalar::Type type) case e_slonglong: case e_ulonglong: case e_sint128: - case e_uint128: m_integer = m_float.bitcastToAPInt(); success = true; break; + case e_uint128: + case e_sint256: + case e_uint256: m_integer = m_float.bitcastToAPInt(); success = true; break; case e_float: m_float = llvm::APFloat(m_float.convertToFloat()); success = true; break; case e_double: m_float = llvm::APFloat(m_float.convertToFloat()); success = true; break; case e_long_double: @@ -1183,7 +1222,9 @@ Scalar::Cast(Scalar::Type type) case e_slonglong: case e_ulonglong: case e_sint128: - case e_uint128: m_integer = m_float.bitcastToAPInt(); success = true; break; + case e_uint128: + case e_sint256: + case e_uint256: m_integer = m_float.bitcastToAPInt(); success = true; break; case e_float: m_float = llvm::APFloat(m_float.convertToDouble()); success = true; break; case e_double: m_float = llvm::APFloat(m_float.convertToDouble()); success = true; break; case e_long_double: @@ -1201,61 +1242,65 @@ Scalar::Cast(Scalar::Type type) { case e_void: break; case e_sint: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.sextOrTrunc(sizeof(sint_t) * 8); success = true; break; - } + case e_uint: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.zextOrTrunc(sizeof(sint_t) * 8); success = true; break; - } + case e_slong: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8); success = true; break; - } + case e_ulong: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8); success = true; break; - } + case e_slonglong: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_ulonglong: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8); success = true; break; - } + case e_sint128: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128); success = true; break; - } + case e_uint128: - { m_integer = m_float.bitcastToAPInt(); m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128); success = true; break; - } + + case e_sint256: + m_integer = m_float.bitcastToAPInt(); + m_integer = m_integer.sextOrTrunc(BITWIDTH_INT256); + success = true; + break; + + case e_uint256: + m_integer = m_float.bitcastToAPInt(); + m_integer = m_integer.zextOrTrunc(BITWIDTH_INT256); + success = true; + break; + case e_float: m_float = llvm::APFloat(m_float.convertToFloat()); success = true; break; case e_double: m_float = llvm::APFloat(m_float.convertToFloat()); success = true; break; case e_long_double: success = true; break; @@ -1283,7 +1328,9 @@ Scalar::MakeSigned () case e_slonglong: success = true; break; case e_ulonglong: m_type = e_slonglong; success = true; break; case e_sint128: success = true; break; - case e_uint128: m_type = e_sint; success = true; break; + case e_uint128: m_type = e_sint128; success = true; break; + case e_sint256: success = true; break; + case e_uint256: m_type = e_sint256; success = true; break; case e_float: success = true; break; case e_double: success = true; break; case e_long_double: success = true; break; @@ -1292,7 +1339,33 @@ Scalar::MakeSigned () return success; } -char +bool +Scalar::MakeUnsigned () +{ + bool success = false; + + switch (m_type) + { + case e_void: break; + case e_sint: success = true; break; + case e_uint: m_type = e_uint; success = true; break; + case e_slong: success = true; break; + case e_ulong: m_type = e_ulong; success = true; break; + case e_slonglong: success = true; break; + case e_ulonglong: m_type = e_ulonglong; success = true; break; + case e_sint128: success = true; break; + case e_uint128: m_type = e_uint128; success = true; break; + case e_sint256: success = true; break; + case e_uint256: m_type = e_uint256; success = true; break; + case e_float: success = true; break; + case e_double: success = true; break; + case e_long_double: success = true; break; + } + + return success; +} + +signed char Scalar::SChar(char fail_value) const { switch (m_type) @@ -1306,14 +1379,16 @@ Scalar::SChar(char fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const schar_t *)(m_integer.sextOrTrunc(sizeof(schar_t) * 8)).getRawData(); + case e_sint256: + case e_uint256: + return (schar_t)(m_integer.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue(); case e_float: return (schar_t)m_float.convertToFloat(); case e_double: return (schar_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return (schar_t)*ldbl_val.getRawData(); + return (schar_t)(ldbl_val.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue(); } return fail_value; } @@ -1332,14 +1407,16 @@ Scalar::UChar(unsigned char fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const uchar_t *)m_integer.getRawData(); + case e_sint256: + case e_uint256: + return (uchar_t)(m_integer.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue(); case e_float: return (uchar_t)m_float.convertToFloat(); case e_double: return (uchar_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return (uchar_t)*ldbl_val.getRawData(); + return (uchar_t)(ldbl_val.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue(); } return fail_value; } @@ -1358,14 +1435,16 @@ Scalar::SShort(short fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const sshort_t *)(m_integer.sextOrTrunc(sizeof(sshort_t) * 8)).getRawData(); + case e_sint256: + case e_uint256: + return (sshort_t)(m_integer.sextOrTrunc(sizeof(sshort_t) * 8)).getSExtValue(); case e_float: return (sshort_t)m_float.convertToFloat(); case e_double: return (sshort_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const sshort_t *)ldbl_val.getRawData(); + return (sshort_t)(ldbl_val.sextOrTrunc(sizeof(sshort_t) * 8)).getSExtValue(); } return fail_value; } @@ -1384,14 +1463,16 @@ Scalar::UShort(unsigned short fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const ushort_t *)m_integer.getRawData(); + case e_sint256: + case e_uint256: + return (ushort_t)(m_integer.zextOrTrunc(sizeof(ushort_t) * 8)).getZExtValue(); case e_float: return (ushort_t)m_float.convertToFloat(); case e_double: return (ushort_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const ushort_t *)ldbl_val.getRawData();; + return (ushort_t)(ldbl_val.zextOrTrunc(sizeof(ushort_t) * 8)).getZExtValue(); } return fail_value; } @@ -1410,14 +1491,16 @@ Scalar::SInt(int fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const sint_t *)(m_integer.sextOrTrunc(sizeof(sint_t) * 8)).getRawData(); + case e_sint256: + case e_uint256: + return (sint_t)(m_integer.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue(); case e_float: return (sint_t)m_float.convertToFloat(); case e_double: return (sint_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const sint_t *)ldbl_val.getRawData(); + return (sint_t)(ldbl_val.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue(); } return fail_value; } @@ -1436,19 +1519,20 @@ Scalar::UInt(unsigned int fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const uint_t *)m_integer.getRawData(); + case e_sint256: + case e_uint256: + return (uint_t)(m_integer.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue(); case e_float: return (uint_t)m_float.convertToFloat(); case e_double: return (uint_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const uint_t *)ldbl_val.getRawData(); + return (uint_t)(ldbl_val.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue(); } return fail_value; } - long Scalar::SLong(long fail_value) const { @@ -1463,20 +1547,20 @@ Scalar::SLong(long fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const slong_t *)(m_integer.sextOrTrunc(sizeof(slong_t) * 8)).getRawData(); + case e_sint256: + case e_uint256: + return (slong_t)(m_integer.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue(); case e_float: return (slong_t)m_float.convertToFloat(); case e_double: return (slong_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const slong_t *)ldbl_val.getRawData(); + return (slong_t)(ldbl_val.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue(); } return fail_value; } - - unsigned long Scalar::ULong(unsigned long fail_value) const { @@ -1491,48 +1575,20 @@ Scalar::ULong(unsigned long fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const ulong_t *)m_integer.getRawData(); + case e_sint256: + case e_uint256: + return (ulong_t)(m_integer.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue(); case e_float: return (ulong_t)m_float.convertToFloat(); case e_double: return (ulong_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const ulong_t *)ldbl_val.getRawData(); + return (ulong_t)(ldbl_val.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue(); } return fail_value; } -uint64_t -Scalar::GetRawBits64(uint64_t fail_value) const -{ - switch (m_type) - { - case e_void: - break; - - case e_sint: - case e_uint: - case e_slong: - case e_ulong: - case e_slonglong: - case e_ulonglong: - case e_sint128: - case e_uint128: - return *m_integer.getRawData(); - case e_float: - return (uint64_t)m_float.convertToFloat(); - case e_double: - return (uint64_t)m_float.convertToDouble(); - case e_long_double: - llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *ldbl_val.getRawData(); - } - return fail_value; -} - - - long long Scalar::SLongLong(long long fail_value) const { @@ -1547,19 +1603,20 @@ Scalar::SLongLong(long long fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const slonglong_t *)(m_integer.sextOrTrunc(sizeof(slonglong_t) * 8)).getRawData(); + case e_sint256: + case e_uint256: + return (slonglong_t)(m_integer.sextOrTrunc(sizeof(slonglong_t) * 8)).getSExtValue(); case e_float: return (slonglong_t)m_float.convertToFloat(); case e_double: return (slonglong_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const slonglong_t *)ldbl_val.getRawData(); + return (slonglong_t)(ldbl_val.sextOrTrunc(sizeof(slonglong_t) * 8)).getSExtValue(); } return fail_value; } - unsigned long long Scalar::ULongLong(unsigned long long fail_value) const { @@ -1574,14 +1631,41 @@ Scalar::ULongLong(unsigned long long fail_value) const case e_ulonglong: case e_sint128: case e_uint128: - return *(const ulonglong_t *)m_integer.getRawData(); + case e_sint256: + case e_uint256: + return (ulonglong_t)(m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue(); case e_float: return (ulonglong_t)m_float.convertToFloat(); case e_double: return (ulonglong_t)m_float.convertToDouble(); case e_long_double: llvm::APInt ldbl_val = m_float.bitcastToAPInt(); - return *(const ulonglong_t *)ldbl_val.getRawData(); + return (ulonglong_t)(ldbl_val.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue(); + } + return fail_value; +} + +llvm::APInt +Scalar::SInt128(llvm::APInt& fail_value) const +{ + switch (m_type) + { + case e_void: break; + case e_sint: + case e_uint: + case e_slong: + case e_ulong: + case e_slonglong: + case e_ulonglong: + case e_sint128: + case e_uint128: + case e_sint256: + case e_uint256: + return m_integer; + case e_float: + case e_double: + case e_long_double: + return m_float.bitcastToAPInt(); } return fail_value; } @@ -1600,6 +1684,8 @@ Scalar::UInt128(const llvm::APInt& fail_value) const case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: return m_integer; case e_float: case e_double: @@ -1610,7 +1696,7 @@ Scalar::UInt128(const llvm::APInt& fail_value) const } llvm::APInt -Scalar::SInt128(llvm::APInt& fail_value) const +Scalar::SInt256(llvm::APInt& fail_value) const { switch (m_type) { @@ -1623,6 +1709,8 @@ Scalar::SInt128(llvm::APInt& fail_value) const case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: return m_integer; case e_float: case e_double: @@ -1632,6 +1720,31 @@ Scalar::SInt128(llvm::APInt& fail_value) const return fail_value; } +llvm::APInt +Scalar::UInt256(const llvm::APInt& fail_value) const +{ + switch (m_type) + { + case e_void: break; + case e_sint: + case e_uint: + case e_slong: + case e_ulong: + case e_slonglong: + case e_ulonglong: + case e_sint128: + case e_uint128: + case e_sint256: + case e_uint256: + return m_integer; + case e_float: + case e_double: + case e_long_double: + return m_float.bitcastToAPInt(); + } + return fail_value; +} + float Scalar::Float(float fail_value) const { @@ -1646,6 +1759,8 @@ Scalar::Float(float fail_value) const case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: return m_integer.bitsToFloat(); case e_float: return m_float.convertToFloat(); @@ -1658,7 +1773,6 @@ Scalar::Float(float fail_value) const return fail_value; } - double Scalar::Double(double fail_value) const { @@ -1673,6 +1787,8 @@ Scalar::Double(double fail_value) const case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: return m_integer.bitsToDouble(); case e_float: return (double_t)m_float.convertToFloat(); @@ -1685,7 +1801,6 @@ Scalar::Double(double fail_value) const return fail_value; } - long double Scalar::LongDouble(long double fail_value) const { @@ -1700,6 +1815,8 @@ Scalar::LongDouble(long double fail_value) const case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: return (long_double_t)m_integer.bitsToDouble(); case e_float: return (long_double_t)m_float.convertToFloat(); @@ -1712,7 +1829,6 @@ Scalar::LongDouble(long double fail_value) const return fail_value; } - Scalar& Scalar::operator+= (const Scalar& rhs) { @@ -1732,17 +1848,16 @@ Scalar::operator+= (const Scalar& rhs) case e_ulonglong: case e_sint128: case e_uint128: - { + case e_sint256: + case e_uint256: m_integer = a->m_integer + b->m_integer; break; - } + case e_float: case e_double: case e_long_double: - { m_float = a->m_float + b->m_float; break; - } } } return *this; @@ -1768,6 +1883,8 @@ Scalar::operator<<= (const Scalar& rhs) case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: switch (rhs.m_type) { case e_void: @@ -1784,10 +1901,10 @@ Scalar::operator<<= (const Scalar& rhs) case e_ulonglong: case e_sint128: case e_uint128: - { - m_integer <<= *rhs.m_integer.getRawData(); + case e_sint256: + case e_uint256: + m_integer = m_integer << rhs.m_integer; break; - } } break; } @@ -1814,6 +1931,8 @@ Scalar::ShiftRightLogical(const Scalar& rhs) case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: switch (rhs.m_type) { case e_void: @@ -1830,14 +1949,16 @@ Scalar::ShiftRightLogical(const Scalar& rhs) case e_ulonglong: case e_sint128: case e_uint128: - m_integer = m_integer.lshr(*(const uint_t *) rhs.m_integer.getRawData()); break; + case e_sint256: + case e_uint256: + m_integer = m_integer.lshr(rhs.m_integer); + break; } break; } return m_type != e_void; } - Scalar& Scalar::operator>>= (const Scalar& rhs) { @@ -1858,6 +1979,8 @@ Scalar::operator>>= (const Scalar& rhs) case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: switch (rhs.m_type) { case e_void: @@ -1872,19 +1995,18 @@ Scalar::operator>>= (const Scalar& rhs) case e_ulong: case e_slonglong: case e_ulonglong: - case e_sint128: - case e_uint128: - { - m_integer >> *rhs.m_integer.getRawData(); - break; - } + case e_sint128: + case e_uint128: + case e_sint256: + case e_uint256: + m_integer = m_integer.ashr(rhs.m_integer); + break; } break; } return *this; } - Scalar& Scalar::operator&= (const Scalar& rhs) { @@ -1905,6 +2027,8 @@ Scalar::operator&= (const Scalar& rhs) case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: switch (rhs.m_type) { case e_void: @@ -1919,20 +2043,18 @@ Scalar::operator&= (const Scalar& rhs) case e_ulong: case e_slonglong: case e_ulonglong: - case e_sint128: - case e_uint128: - { - m_integer &= rhs.m_integer; - break; - } + case e_sint128: + case e_uint128: + case e_sint256: + case e_uint256: + m_integer &= rhs.m_integer; + break; } break; } return *this; } - - bool Scalar::AbsoluteValue() { @@ -1945,6 +2067,7 @@ Scalar::AbsoluteValue() case e_slong: case e_slonglong: case e_sint128: + case e_sint256: if (m_integer.isNegative()) m_integer = -m_integer; return true; @@ -1953,6 +2076,7 @@ Scalar::AbsoluteValue() case e_ulong: case e_ulonglong: return true; case e_uint128: + case e_uint256: case e_float: case e_double: case e_long_double: @@ -1962,7 +2086,6 @@ Scalar::AbsoluteValue() return false; } - bool Scalar::UnaryNegate() { @@ -1977,6 +2100,8 @@ Scalar::UnaryNegate() case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: m_integer = -m_integer; return true; case e_float: case e_double: @@ -1999,6 +2124,8 @@ Scalar::OnesComplement() case e_ulonglong: case e_sint128: case e_uint128: + case e_sint256: + case e_uint256: m_integer = ~m_integer; return true; case e_void: @@ -2010,7 +2137,6 @@ Scalar::OnesComplement() return false; } - const Scalar lldb_private::operator+ (const Scalar& lhs, const Scalar& rhs) { @@ -2031,6 +2157,8 @@ lldb_private::operator+ (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: result.m_integer = a->m_integer + b->m_integer; break; case Scalar::e_float: case Scalar::e_double: @@ -2041,7 +2169,6 @@ lldb_private::operator+ (const Scalar& lhs, const Scalar& rhs) return result; } - const Scalar lldb_private::operator- (const Scalar& lhs, const Scalar& rhs) { @@ -2062,6 +2189,8 @@ lldb_private::operator- (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: result.m_integer = a->m_integer - b->m_integer; break; case Scalar::e_float: case Scalar::e_double: @@ -2085,21 +2214,27 @@ lldb_private::operator/ (const Scalar& lhs, const Scalar& rhs) { case Scalar::e_void: break; case Scalar::e_sint: - case Scalar::e_uint: case Scalar::e_slong: - case Scalar::e_ulong: case Scalar::e_slonglong: - case Scalar::e_ulonglong: case Scalar::e_sint128: + case Scalar::e_sint256: + if (b->m_integer != 0) + { + result.m_integer = a->m_integer.sdiv(b->m_integer); + return result; + } + break; + case Scalar::e_uint: + case Scalar::e_ulong: + case Scalar::e_ulonglong: case Scalar::e_uint128: - { + case Scalar::e_uint256: if (b->m_integer != 0) { - result.m_integer = *a->m_integer.getRawData() / *b->m_integer.getRawData(); + result.m_integer = a->m_integer.udiv(b->m_integer); return result; } break; - } case Scalar::e_float: case Scalar::e_double: case Scalar::e_long_double: @@ -2137,6 +2272,8 @@ lldb_private::operator* (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: result.m_integer = a->m_integer * b->m_integer; break; case Scalar::e_float: case Scalar::e_double: @@ -2166,6 +2303,8 @@ lldb_private::operator& (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: result.m_integer = a->m_integer & b->m_integer; break; case Scalar::e_void: case Scalar::e_float: @@ -2198,6 +2337,8 @@ lldb_private::operator| (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: result.m_integer = a->m_integer | b->m_integer; break; case Scalar::e_void: @@ -2224,23 +2365,29 @@ lldb_private::operator% (const Scalar& lhs, const Scalar& rhs) switch (result.m_type) { default: break; - case Scalar::e_void: break; - case Scalar::e_sint: - case Scalar::e_uint: - case Scalar::e_slong: - case Scalar::e_ulong: - case Scalar::e_slonglong: - case Scalar::e_ulonglong: - case Scalar::e_sint128: - case Scalar::e_uint128: - { - if (b->m_integer != 0) - { - result.m_integer = *a->m_integer.getRawData() % *b->m_integer.getRawData(); - return result; - } - break; - } + case Scalar::e_void: break; + case Scalar::e_sint: + case Scalar::e_slong: + case Scalar::e_slonglong: + case Scalar::e_sint128: + case Scalar::e_sint256: + if (b->m_integer != 0) + { + result.m_integer = a->m_integer.srem(b->m_integer); + return result; + } + break; + case Scalar::e_uint: + case Scalar::e_ulong: + case Scalar::e_ulonglong: + case Scalar::e_uint128: + case Scalar::e_uint256: + if (b->m_integer != 0) + { + result.m_integer = a->m_integer.urem(b->m_integer); + return result; + } + break; } } result.m_type = Scalar::e_void; @@ -2266,6 +2413,8 @@ lldb_private::operator^ (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: result.m_integer = a->m_integer ^ b->m_integer; break; case Scalar::e_void: @@ -2296,33 +2445,11 @@ lldb_private::operator>> (const Scalar& lhs, const Scalar &rhs) return result; } -// Return the raw unsigned integer without any casting or conversion -unsigned int -Scalar::RawUInt () const -{ - return *(const uint_t *) m_integer.getRawData(); -} - -// Return the raw unsigned long without any casting or conversion -unsigned long -Scalar::RawULong () const -{ - return *(const ulong_t *) m_integer.getRawData(); -} - -// Return the raw unsigned long long without any casting or conversion -unsigned long long -Scalar::RawULongLong () const -{ - return *(const ulonglong_t *) m_integer.getRawData(); -} - - Error Scalar::SetValueFromCString (const char *value_str, Encoding encoding, size_t byte_size) { Error error; - if (value_str == NULL || value_str[0] == '\0') + if (value_str == nullptr || value_str[0] == '\0') { error.SetErrorString ("Invalid c-string value string."); return error; @@ -2449,6 +2576,7 @@ Scalar::SetValueFromData (DataExtractor &data, lldb::Encoding encoding, size_t b Error error; type128 int128; + type256 int256; switch (encoding) { case lldb::eEncodingInvalid: @@ -2468,20 +2596,35 @@ Scalar::SetValueFromData (DataExtractor &data, lldb::Encoding encoding, size_t b case 4: operator=((uint32_t)data.GetU32(&offset)); break; case 8: operator=((uint64_t)data.GetU64(&offset)); break; case 16: - { if (data.GetByteOrder() == eByteOrderBig) { int128.x[1] = (uint64_t)data.GetU64 (&offset); - int128.x[0] = (uint64_t)data.GetU64 (&offset + 1); + int128.x[0] = (uint64_t)data.GetU64 (&offset); } else { int128.x[0] = (uint64_t)data.GetU64 (&offset); - int128.x[1] = (uint64_t)data.GetU64 (&offset + 1); + int128.x[1] = (uint64_t)data.GetU64 (&offset); } operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x)); break; - } + case 32: + if (data.GetByteOrder() == eByteOrderBig) + { + int256.x[3] = (uint64_t)data.GetU64 (&offset); + int256.x[2] = (uint64_t)data.GetU64 (&offset); + int256.x[1] = (uint64_t)data.GetU64 (&offset); + int256.x[0] = (uint64_t)data.GetU64 (&offset); + } + else + { + int256.x[0] = (uint64_t)data.GetU64 (&offset); + int256.x[1] = (uint64_t)data.GetU64 (&offset); + int256.x[2] = (uint64_t)data.GetU64 (&offset); + int256.x[3] = (uint64_t)data.GetU64 (&offset); + } + operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x)); + break; default: error.SetErrorStringWithFormat("unsupported unsigned integer byte size: %" PRIu64 "", (uint64_t)byte_size); break; @@ -2499,20 +2642,35 @@ Scalar::SetValueFromData (DataExtractor &data, lldb::Encoding encoding, size_t b case 4: operator=((int32_t)data.GetU32(&offset)); break; case 8: operator=((int64_t)data.GetU64(&offset)); break; case 16: - { if (data.GetByteOrder() == eByteOrderBig) { int128.x[1] = (uint64_t)data.GetU64 (&offset); - int128.x[0] = (uint64_t)data.GetU64 (&offset + 1); + int128.x[0] = (uint64_t)data.GetU64 (&offset); } else { int128.x[0] = (uint64_t)data.GetU64 (&offset); - int128.x[1] = (uint64_t)data.GetU64 (&offset + 1); + int128.x[1] = (uint64_t)data.GetU64 (&offset); } operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x)); break; - } + case 32: + if (data.GetByteOrder() == eByteOrderBig) + { + int256.x[3] = (uint64_t)data.GetU64 (&offset); + int256.x[2] = (uint64_t)data.GetU64 (&offset); + int256.x[1] = (uint64_t)data.GetU64 (&offset); + int256.x[0] = (uint64_t)data.GetU64 (&offset); + } + else + { + int256.x[0] = (uint64_t)data.GetU64 (&offset); + int256.x[1] = (uint64_t)data.GetU64 (&offset); + int256.x[2] = (uint64_t)data.GetU64 (&offset); + int256.x[3] = (uint64_t)data.GetU64 (&offset); + } + operator=(llvm::APInt(BITWIDTH_INT256, NUM_OF_WORDS_INT256, int256.x)); + break; default: error.SetErrorStringWithFormat("unsupported signed integer byte size: %" PRIu64 "", (uint64_t)byte_size); break; @@ -2561,6 +2719,8 @@ Scalar::SignExtend (uint32_t sign_bit_pos) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: if (max_bit_pos == sign_bit_pos) return true; else if (sign_bit_pos < (max_bit_pos-1)) @@ -2615,51 +2775,33 @@ Scalar::ExtractBitfield (uint32_t bit_size, if (bit_size == 0) return true; - uint32_t msbit = bit_offset + bit_size - 1; - uint32_t lsbit = bit_offset; - uint64_t result; switch (m_type) { case Scalar::e_void: + case Scalar::e_float: + case Scalar::e_double: + case Scalar::e_long_double: break; - case e_float: - result = SignedBits ((uint64_t )m_float.convertToFloat(), msbit, lsbit); - m_float = llvm::APFloat((float_t)result); - return true; - case e_double: - result = SignedBits ((uint64_t )m_float.convertToDouble(), msbit, lsbit); - m_float = llvm::APFloat((double_t)result); - case e_long_double: - m_integer = m_float.bitcastToAPInt(); - result = SignedBits (*m_integer.getRawData(), msbit, lsbit); - if(m_ieee_quad) - m_float = llvm::APFloat(llvm::APFloat::IEEEquad, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&result)->x)); - else - m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&result)->x)); - return true; - case Scalar::e_sint: case Scalar::e_slong: case Scalar::e_slonglong: case Scalar::e_sint128: - m_integer = SignedBits (*m_integer.getRawData(), msbit, lsbit); + case Scalar::e_sint256: + m_integer = m_integer.ashr(bit_offset).sextOrTrunc(bit_size).sextOrSelf(8 * GetByteSize()); return true; case Scalar::e_uint: case Scalar::e_ulong: case Scalar::e_ulonglong: case Scalar::e_uint128: - m_integer = UnsignedBits (*m_integer.getRawData(), msbit, lsbit); + case Scalar::e_uint256: + m_integer = m_integer.lshr(bit_offset).zextOrTrunc(bit_size).zextOrSelf(8 * GetByteSize()); return true; } return false; } - - - - bool lldb_private::operator== (const Scalar& lhs, const Scalar& rhs) { @@ -2682,6 +2824,8 @@ lldb_private::operator== (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: return a->m_integer == b->m_integer; case Scalar::e_float: case Scalar::e_double: @@ -2715,6 +2859,8 @@ lldb_private::operator!= (const Scalar& lhs, const Scalar& rhs) case Scalar::e_ulonglong: case Scalar::e_sint128: case Scalar::e_uint128: + case Scalar::e_sint256: + case Scalar::e_uint256: return a->m_integer != b->m_integer; case Scalar::e_float: case Scalar::e_double: @@ -2743,11 +2889,13 @@ lldb_private::operator< (const Scalar& lhs, const Scalar& rhs) case Scalar::e_slong: case Scalar::e_slonglong: case Scalar::e_sint128: + case Scalar::e_sint256: return a->m_integer.slt(b->m_integer); case Scalar::e_uint: case Scalar::e_ulong: case Scalar::e_ulonglong: case Scalar::e_uint128: + case Scalar::e_uint256: return a->m_integer.ult(b->m_integer); case Scalar::e_float: case Scalar::e_double: @@ -2776,11 +2924,13 @@ lldb_private::operator<= (const Scalar& lhs, const Scalar& rhs) case Scalar::e_slong: case Scalar::e_slonglong: case Scalar::e_sint128: + case Scalar::e_sint256: return a->m_integer.sle(b->m_integer); case Scalar::e_uint: case Scalar::e_ulong: case Scalar::e_ulonglong: case Scalar::e_uint128: + case Scalar::e_uint256: return a->m_integer.ule(b->m_integer); case Scalar::e_float: case Scalar::e_double: @@ -2792,7 +2942,6 @@ lldb_private::operator<= (const Scalar& lhs, const Scalar& rhs) return false; } - bool lldb_private::operator> (const Scalar& lhs, const Scalar& rhs) { @@ -2810,11 +2959,13 @@ lldb_private::operator> (const Scalar& lhs, const Scalar& rhs) case Scalar::e_slong: case Scalar::e_slonglong: case Scalar::e_sint128: + case Scalar::e_sint256: return a->m_integer.sgt(b->m_integer); case Scalar::e_uint: case Scalar::e_ulong: case Scalar::e_ulonglong: case Scalar::e_uint128: + case Scalar::e_uint256: return a->m_integer.ugt(b->m_integer); case Scalar::e_float: case Scalar::e_double: @@ -2843,11 +2994,13 @@ lldb_private::operator>= (const Scalar& lhs, const Scalar& rhs) case Scalar::e_slong: case Scalar::e_slonglong: case Scalar::e_sint128: + case Scalar::e_sint256: return a->m_integer.sge(b->m_integer); case Scalar::e_uint: case Scalar::e_ulong: case Scalar::e_ulonglong: case Scalar::e_uint128: + case Scalar::e_uint256: return a->m_integer.uge(b->m_integer); case Scalar::e_float: case Scalar::e_double: @@ -2873,7 +3026,9 @@ Scalar::ClearBit (uint32_t bit) case e_slonglong: case e_ulonglong: case e_sint128: - case e_uint128: m_integer.clearBit(bit); return true; + case e_uint128: + case e_sint256: + case e_uint256: m_integer.clearBit(bit); return true; case e_float: case e_double: case e_long_double: break; @@ -2895,7 +3050,9 @@ Scalar::SetBit (uint32_t bit) case e_slonglong: case e_ulonglong: case e_sint128: - case e_uint128: m_integer.setBit(bit); return true; + case e_uint128: + case e_sint256: + case e_uint256: m_integer.setBit(bit); return true; case e_float: case e_double: case e_long_double: break; @@ -2903,72 +3060,3 @@ Scalar::SetBit (uint32_t bit) return false; } -void -Scalar::SetType (const RegisterInfo *reg_info) -{ - const uint32_t byte_size = reg_info->byte_size; - switch (reg_info->encoding) - { - case eEncodingInvalid: - break; - case eEncodingUint: - if (byte_size == 1 || byte_size == 2 || byte_size == 4) - { - m_integer = llvm::APInt(sizeof(uint_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); - m_type = e_uint; - } - if (byte_size == 8) - { - m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); - m_type = e_ulonglong; - } - if (byte_size == 16) - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())->x); - m_type = e_uint128; - } - break; - case eEncodingSint: - if (byte_size == 1 || byte_size == 2 || byte_size == 4) - { - m_integer = llvm::APInt(sizeof(sint_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); - m_type = e_sint; - } - if (byte_size == 8) - { - m_integer = llvm::APInt(sizeof(slonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), true); - m_type = e_slonglong; - } - if (byte_size == 16) - { - m_integer = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((const type128 *)m_integer.getRawData())->x); - m_type = e_sint128; - } - break; - case eEncodingIEEE754: - if (byte_size == sizeof(float)) - { - bool losesInfo = false; - m_float.convert(llvm::APFloat::IEEEsingle, llvm::APFloat::rmTowardZero, &losesInfo); - m_type = e_float; - } - else if (byte_size == sizeof(double)) - { - bool losesInfo = false; - m_float.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmTowardZero, &losesInfo); - m_type = e_double; - } - else if (byte_size == sizeof(long double)) - { - if(m_ieee_quad) - m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_float.bitcastToAPInt()); - else - m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_float.bitcastToAPInt()); - m_type = e_long_double; - } - break; - case eEncodingVector: - m_type = e_void; - break; - } -} |