mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 13:05:52 -04:00

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
96 lines
2.9 KiB
Python
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)
|