168 lines
5.4 KiB
Python
168 lines
5.4 KiB
Python
"""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()))
|