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