"""Tests IR interpreter handling of basic floating point operations (fadd, fsub, etc).""" import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class FPEvalTestCase(TestBase): def setUp(self): # Call super's setUp(). TestBase.setUp(self) self.jit_opts = lldb.SBExpressionOptions() self.jit_opts.SetAllowJIT(True) self.no_jit_opts = lldb.SBExpressionOptions() self.no_jit_opts.SetAllowJIT(False) # Find the line number to break inside main(). self.line = line_number('main.c', '// Set break point at this line.') def test(self): """Test floating point expressions while jitter is disabled.""" self.build() exe = self.getBuildArtifact("a.out") self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) # Break inside the main. lldbutil.run_break_set_by_file_and_line( self, "main.c", self.line, num_expected_locations=1, loc_exact=True) value = self.frame().EvaluateExpression("a + b", self.no_jit_opts) self.runCmd("run", RUN_SUCCEEDED) # test double self.expect("expr --allow-jit false -- a + b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['double', '44']) self.expect("expr --allow-jit false -- a - b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['double', '40']) self.expect("expr --allow-jit false -- a / b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['double', '21']) self.expect("expr --allow-jit false -- a * b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['double', '84']) self.expect("expr --allow-jit false -- a + 2", VARIABLES_DISPLAYED_CORRECTLY, substrs=['double', '44']) self.expect("expr --allow-jit false -- a > b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['true']) self.expect("expr --allow-jit false -- a >= b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['true']) self.expect("expr --allow-jit false -- a < b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['false']) self.expect("expr --allow-jit false -- a <= b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['false']) self.expect("expr --allow-jit false -- a == b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['false']) self.expect("expr --allow-jit false -- a != b", VARIABLES_DISPLAYED_CORRECTLY, substrs=['true']) # test single self.expect("expr --allow-jit false -- f + q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['float', '44']) self.expect("expr --allow-jit false -- f - q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['float', '40']) self.expect("expr --allow-jit false -- f / q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['float', '21']) self.expect("expr --allow-jit false -- f * q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['float', '84']) self.expect("expr --allow-jit false -- f + 2", VARIABLES_DISPLAYED_CORRECTLY, substrs=['float', '44']) self.expect("expr --allow-jit false -- f > q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['true']) self.expect("expr --allow-jit false -- f >= q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['true']) self.expect("expr --allow-jit false -- f < q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['false']) self.expect("expr --allow-jit false -- f <= q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['false']) self.expect("expr --allow-jit false -- f == q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['false']) self.expect("expr --allow-jit false -- f != q", VARIABLES_DISPLAYED_CORRECTLY, substrs=['true']) # compare jit and interpreter output self.assertTrue(self.process().IsValid()) thread = lldbutil.get_stopped_thread(self.process(), lldb.eStopReasonBreakpoint) self.assertTrue(thread.IsValid()) frame = thread.GetSelectedFrame() self.assertTrue(frame.IsValid()) dividents = [42, 79, 666] divisors = [1.618, 2.718281828, 3.1415926535, 6.62607015] for x in dividents: for y in divisors: vardef = "double x = {0}, y = {1};".format(x, y) v1 = frame.EvaluateExpression("{0}; eval(x, y, 2)".format(vardef), self.jit_opts) v2 = frame.EvaluateExpression("{0}; x / y".format(vardef), self.no_jit_opts) self.assertTrue(v1.IsValid() and v2.IsValid()) self.assertEqual(str(v1.GetData()), str(v2.GetData()))