Skip to content

Commit

Permalink
Avoid an assertion failure when a bit field is extracted from a value…
Browse files Browse the repository at this point in the history
… 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

llvm-svn: 270062
  • Loading branch information
bryanpkc committed May 19, 2016
1 parent cda1bd5 commit 01319e9
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lldb/source/Core/Scalar.cpp
Expand Up @@ -2788,15 +2788,15 @@ Scalar::ExtractBitfield (uint32_t bit_size,
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:
case Scalar::e_ulong:
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;
Expand Down
24 changes: 24 additions & 0 deletions lldb/unittests/Core/ScalarTest.cpp
Expand Up @@ -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)));
}

0 comments on commit 01319e9

Please sign in to comment.