summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/Scalar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Core/Scalar.cpp')
-rw-r--r--lldb/source/Core/Scalar.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/lldb/source/Core/Scalar.cpp b/lldb/source/Core/Scalar.cpp
index 24e427c40d2..c32c33c1547 100644
--- a/lldb/source/Core/Scalar.cpp
+++ b/lldb/source/Core/Scalar.cpp
@@ -1922,6 +1922,74 @@ Scalar::SetValueFromCString (const char *value_str, Encoding encoding, uint32_t
}
bool
+Scalar::SignExtend (uint32_t sign_bit_pos)
+{
+ const uint32_t max_bit_pos = GetByteSize() * 8;
+
+ if (sign_bit_pos < max_bit_pos)
+ {
+ switch (m_type)
+ {
+ default:
+ case Scalar::e_void:
+ case Scalar::e_float:
+ case Scalar::e_double:
+ case Scalar::e_long_double:
+ return false;
+
+ case Scalar::e_sint:
+ case Scalar::e_uint:
+ if (max_bit_pos == sign_bit_pos)
+ return true;
+ else if (sign_bit_pos < (max_bit_pos-1))
+ {
+ unsigned int sign_bit = 1u << sign_bit_pos;
+ if (m_data.uint & sign_bit)
+ {
+ const unsigned int mask = ~(sign_bit) + 1u;
+ m_data.uint |= mask;
+ }
+ return true;
+ }
+ break;
+
+ case Scalar::e_slong:
+ case Scalar::e_ulong:
+ if (max_bit_pos == sign_bit_pos)
+ return true;
+ else if (sign_bit_pos < (max_bit_pos-1))
+ {
+ unsigned long sign_bit = 1ul << sign_bit_pos;
+ if (m_data.uint & sign_bit)
+ {
+ const unsigned long mask = ~(sign_bit) + 1ul;
+ m_data.uint |= mask;
+ }
+ return true;
+ }
+ break;
+
+ case Scalar::e_slonglong:
+ case Scalar::e_ulonglong:
+ if (max_bit_pos == sign_bit_pos)
+ return true;
+ else if (sign_bit_pos < (max_bit_pos-1))
+ {
+ unsigned long long sign_bit = 1ull << sign_bit_pos;
+ if (m_data.uint & sign_bit)
+ {
+ const unsigned long long mask = ~(sign_bit) + 1ull;
+ m_data.uint |= mask;
+ }
+ return true;
+ }
+ break;
+ }
+ }
+ return false;
+}
+
+bool
lldb_private::operator== (const Scalar& lhs, const Scalar& rhs)
{
// If either entry is void then we can just compare the types
OpenPOWER on IntegriCloud