teak-llvm/lldb/packages/Python/lldbsuite/test/expression_command/ir-interpreter/TestIRInterpreter.py
Pavel Labath c7c9d76187 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
2018-06-20 10:45:29 +00:00

96 lines
2.9 KiB
Python

"""
Test the IR interpreter
"""
from __future__ import print_function
import unittest2
import os
import time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
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().
TestBase.setUp(self)
# Find the line number to break for main.c.
self.line = line_number('main.c',
'// Set breakpoint here')
# Disable confirmation prompt to avoid infinite wait
self.runCmd("settings set auto-confirm true")
self.addTearDownHook(
lambda: self.runCmd("settings clear auto-confirm"))
def build_and_run(self):
"""Test the IR interpreter"""
self.build()
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
lldbutil.run_break_set_by_file_and_line(
self, "main.c", self.line, num_expected_locations=1, loc_exact=False)
self.runCmd("run", RUN_SUCCEEDED)
@add_test_categories(['pyapi'])
# getpid() is POSIX, among other problems, see bug
@expectedFailureAll(
oslist=['windows'],
bugnumber="http://llvm.org/pr21765")
@expectedFailureAll(
oslist=['linux'],
archs=['arm'],
bugnumber="llvm.org/pr27868")
def test_ir_interpreter(self):
self.build_and_run()
options = lldb.SBExpressionOptions()
options.SetLanguage(lldb.eLanguageTypeC_plus_plus)
set_up_expressions = ["int $i = 9", "int $j = 3", "int $k = 5"]
expressions = ["$i + $j",
"$i - $j",
"$i * $j",
"$i / $j",
"$i % $k",
"$i << $j",
"$i & $j",
"$i | $j",
"$i ^ $j"]
for expression in set_up_expressions:
self.frame().EvaluateExpression(expression, options)
for expression in expressions:
interp_expression = expression
jit_expression = "(int)getpid(); " + expression
interp_result = self.frame().EvaluateExpression(
interp_expression, options).GetValueAsSigned()
jit_result = self.frame().EvaluateExpression(
jit_expression, options).GetValueAsSigned()
self.assertEqual(
interp_result,
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)