"""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()))