[Lldb-commits] [lldb] r270062 - Avoid an assertion failure when a bit field is extracted from a value of the same size.
Bryan Chan via lldb-commits
lldb-commits at lists.llvm.org
Thu May 19 06:51:20 PDT 2016
Author: bryanpkc
Date: Thu May 19 08:51:20 2016
New Revision: 270062
URL: http://llvm.org/viewvc/llvm-project?rev=270062&view=rev
Log:
Avoid an assertion failure when a bit field is extracted from a value of the same size.
Summary: One of the cases handled by ValueObjectChild::UpdateValue() uses the entire width of the parent's scalar value as the size of the child, and extracts the child by calling Scalar::ExtractBitfield(). This seems valid but APInt::trunc(), APInt::sext() and APInt::zext() assert that the bit field must not have the same size as the parent scalar. Replacing those calls with sextOrTrunc(), zextOrTrunc(), sextOrSelf() and zextOrSelf() fixes the assertion failures.
Reviewers: uweigand, labath
Subscribers: labath, lldb-commits
Differential Revision: http://reviews.llvm.org/D20355
Modified:
lldb/trunk/source/Core/Scalar.cpp
lldb/trunk/unittests/Core/ScalarTest.cpp
Modified: lldb/trunk/source/Core/Scalar.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Scalar.cpp?rev=270062&r1=270061&r2=270062&view=diff
==============================================================================
--- lldb/trunk/source/Core/Scalar.cpp (original)
+++ lldb/trunk/source/Core/Scalar.cpp Thu May 19 08:51:20 2016
@@ -2788,7 +2788,7 @@ Scalar::ExtractBitfield (uint32_t bit_si
case Scalar::e_slonglong:
case Scalar::e_sint128:
case Scalar::e_sint256:
- m_integer = m_integer.ashr(bit_offset).trunc(bit_size).sext(8 * GetByteSize());
+ m_integer = m_integer.ashr(bit_offset).sextOrTrunc(bit_size).sextOrSelf(8 * GetByteSize());
return true;
case Scalar::e_uint:
@@ -2796,7 +2796,7 @@ Scalar::ExtractBitfield (uint32_t bit_si
case Scalar::e_ulonglong:
case Scalar::e_uint128:
case Scalar::e_uint256:
- m_integer = m_integer.lshr(bit_offset).trunc(bit_size).zext(8 * GetByteSize());
+ m_integer = m_integer.lshr(bit_offset).zextOrTrunc(bit_size).zextOrSelf(8 * GetByteSize());
return true;
}
return false;
Modified: lldb/trunk/unittests/Core/ScalarTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Core/ScalarTest.cpp?rev=270062&r1=270061&r2=270062&view=diff
==============================================================================
--- lldb/trunk/unittests/Core/ScalarTest.cpp (original)
+++ lldb/trunk/unittests/Core/ScalarTest.cpp Thu May 19 08:51:20 2016
@@ -79,3 +79,27 @@ TEST(ScalarTest, CastOperations)
ASSERT_EQ((unsigned long long)a, a_scalar.ULongLong());
}
+TEST(ScalarTest, ExtractBitfield)
+{
+ uint32_t len = sizeof(long long) * 8;
+
+ long long a1 = 0xf1f2f3f4f5f6f7f8LL;
+ long long b1 = 0xff1f2f3f4f5f6f7fLL;
+ Scalar s_scalar(a1);
+ ASSERT_TRUE(s_scalar.ExtractBitfield(0, 0));
+ ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
+ ASSERT_TRUE(s_scalar.ExtractBitfield(len, 0));
+ ASSERT_EQ(0, memcmp(&a1, s_scalar.GetBytes(), sizeof(a1)));
+ ASSERT_TRUE(s_scalar.ExtractBitfield(len - 4, 4));
+ ASSERT_EQ(0, memcmp(&b1, s_scalar.GetBytes(), sizeof(b1)));
+
+ unsigned long long a2 = 0xf1f2f3f4f5f6f7f8ULL;
+ unsigned long long b2 = 0x0f1f2f3f4f5f6f7fULL;
+ Scalar u_scalar(a2);
+ ASSERT_TRUE(u_scalar.ExtractBitfield(0, 0));
+ ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
+ ASSERT_TRUE(u_scalar.ExtractBitfield(len, 0));
+ ASSERT_EQ(0, memcmp(&a2, u_scalar.GetBytes(), sizeof(a2)));
+ ASSERT_TRUE(u_scalar.ExtractBitfield(len - 4, 4));
+ ASSERT_EQ(0, memcmp(&b2, u_scalar.GetBytes(), sizeof(b2)));
+}
More information about the lldb-commits
mailing list