1"""
2Test the IR interpreter
3"""
4
5
6import unittest2
7
8import lldb
9from lldbsuite.test.decorators import *
10from lldbsuite.test.lldbtest import *
11from lldbsuite.test import lldbutil
12
13
14class IRInterpreterTestCase(TestBase):
15    NO_DEBUG_INFO_TESTCASE = True
16
17    def setUp(self):
18        # Call super's setUp().
19        TestBase.setUp(self)
20        # Find the line number to break for main.c.
21        self.line = line_number('main.c',
22                                '// Set breakpoint here')
23
24        # Disable confirmation prompt to avoid infinite wait
25        self.runCmd("settings set auto-confirm true")
26        self.addTearDownHook(
27            lambda: self.runCmd("settings clear auto-confirm"))
28
29    def build_and_run(self):
30        """Test the IR interpreter"""
31        self.build()
32
33        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
34
35        lldbutil.run_break_set_by_file_and_line(
36            self, "main.c", self.line, num_expected_locations=1, loc_exact=False)
37
38        self.runCmd("run", RUN_SUCCEEDED)
39
40    @add_test_categories(['pyapi'])
41    # getpid() is POSIX, among other problems, see bug
42    @expectedFailureAll(
43        oslist=['windows'],
44        bugnumber="http://llvm.org/pr21765")
45    def test_ir_interpreter(self):
46        self.build_and_run()
47
48        options = lldb.SBExpressionOptions()
49        options.SetLanguage(lldb.eLanguageTypeC_plus_plus)
50
51        set_up_expressions = ["int $i = 9", "int $j = 3", "int $k = 5",
52            "unsigned long long $ull = -1", "unsigned $u = -1"]
53
54        expressions = ["$i + $j",
55                       "$i - $j",
56                       "$i * $j",
57                       "$i / $j",
58                       "$i % $k",
59                       "$i << $j",
60                       "$i & $j",
61                       "$i | $j",
62                       "$i ^ $j",
63                       "($ull & -1) == $u"]
64
65        for expression in set_up_expressions:
66            self.frame().EvaluateExpression(expression, options)
67
68        for expression in expressions:
69            interp_expression = expression
70            jit_expression = "(int)getpid(); " + expression
71
72            interp_result = self.frame().EvaluateExpression(
73                interp_expression, options).GetValueAsSigned()
74            jit_result = self.frame().EvaluateExpression(
75                jit_expression, options).GetValueAsSigned()
76
77            self.assertEqual(
78                interp_result,
79                jit_result,
80                "While evaluating " +
81                expression)
82
83    def test_type_conversions(self):
84        target = self.dbg.GetDummyTarget()
85        short_val = target.EvaluateExpression("(short)-1")
86        self.assertEqual(short_val.GetValueAsSigned(), -1)
87        long_val = target.EvaluateExpression("(long) "+ short_val.GetName())
88        self.assertEqual(long_val.GetValueAsSigned(), -1)
89