IRInterpreter: fix sign extension of small types (pr37840)

Sign-extension of small types (e.g. short) was not handled correctly.
The reason for that was that when we were assigning the a value to the
Scalar object, we would accidentally promote the type to int (even
though the assignment code in AssignTypeToMatch tried to cast the value
to the appropriate type, it would still invoke the "int" version of
operator=). Instead, I use the APInt version of operator=, where the
bitwidth is specified explicitly. Among other things, this allows us to
fold the individual size cases into one.

llvm-svn: 335114
This commit is contained in:
Pavel Labath 2018-06-20 10:45:29 +00:00
parent 2145b13fc9
commit c7c9d76187
2 changed files with 9 additions and 7 deletions

View File

@ -17,6 +17,7 @@ from lldbsuite.test import lldbutil
class IRInterpreterTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
NO_DEBUG_INFO_TESTCASE = True
def setUp(self):
# Call super's setUp().
@ -85,3 +86,10 @@ class IRInterpreterTestCase(TestBase):
jit_result,
"While evaluating " +
expression)
def test_type_conversions(self):
target = self.dbg.GetDummyTarget()
short_val = target.EvaluateExpression("(short)-1")
self.assertEqual(short_val.GetValueAsSigned(), -1)
long_val = target.EvaluateExpression("(long) "+ short_val.GetName())
self.assertEqual(long_val.GetValueAsSigned(), -1)

View File

@ -154,16 +154,10 @@ public:
switch (type_size) {
case 1:
scalar = (uint8_t)u64value;
break;
case 2:
scalar = (uint16_t)u64value;
break;
case 4:
scalar = (uint32_t)u64value;
break;
case 8:
scalar = (uint64_t)u64value;
scalar = llvm::APInt(type_size*8, u64value);
break;
default:
return false;