import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
from lldbsuite.test_event.build_exception import BuildError
class TestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True
def build_and_run(self, test_file):
"""
Tries building the given test source and runs to the first breakpoint.
Returns false if the file fails to build due to an unsupported calling
convention on the current test target. Returns true if building and
running to the breakpoint succeeded.
"""
try:
self.build(
dictionary={
"C_SOURCES": test_file,
"CFLAGS_EXTRAS": "-Werror=ignored-attributes",
}
)
except BuildError as e:
error_msg = str(e)
if "calling convention is not supported for this target" in error_msg:
return False
if "attribute ignored" in error_msg:
return False
if "attribute directive ignored " in error_msg:
return False
raise
lldbutil.run_to_source_breakpoint(
self, "// break here", lldb.SBFileSpec(test_file)
)
return True
@skipIf(compiler="clang", compiler_version=["<", "9.0"])
def test_regcall(self):
if not self.build_and_run("regcall.c"):
return
self.expect_expr("func(1, 2, 3, 4)", result_type="int", result_value="10")
@skipIf(compiler="clang", compiler_version=["<", "9.0"])
def test_ms_abi(self):
if not self.build_and_run("ms_abi.c"):
return
self.expect_expr("func(1, 2, 3, 4)", result_type="int", result_value="10")
@skipIf(compiler="clang", compiler_version=["<", "9.0"])
def test_stdcall(self):
if not self.build_and_run("stdcall.c"):
return
self.expect_expr("func(1, 2, 3, 4)", result_type="int", result_value="10")
@expectedFailureAll(
triple=re.compile("^(x86|i386)"),
oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56084"
)
def test_vectorcall(self):
if not self.build_and_run("vectorcall.c"):
return
self.expect_expr("func(1.0)", result_type="int", result_value="1")
@skipIf(compiler="clang", compiler_version=["<", "9.0"])
def test_fastcall(self):
if not self.build_and_run("fastcall.c"):
return
self.expect_expr("func(1, 2, 3, 4)", result_type="int", result_value="10")
@skipIf(compiler="clang", compiler_version=["<", "9.0"])
def test_pascal(self):
if not self.build_and_run("pascal.c"):
return
self.expect_expr("func(1, 2, 3, 4)", result_type="int", result_value="10")
def test_sysv_abi(self):
if not self.build_and_run("sysv_abi.c"):
return
self.expect_expr("func(1, 2, 3, 4)", result_type="int", result_value="10")