Kseniya Tikhomirova 94298f3411
[libsycl] Add lit configuration files and basic test (#177407)
This PR brings initial version of lit configs for libsycl tests.
We plan to add more tests for libsycl integration with the compiler in
the future.

---------

Signed-off-by: Tikhomirova, Kseniya <kseniya.tikhomirova@intel.com>
2026-02-11 20:19:33 +01:00

212 lines
6.4 KiB
Python

# -*- Python -*-
# Configuration file for the 'lit' test runner.
import os
import subprocess
from lit.llvm import llvm_config
import lit.formats
from lit.llvm.subst import ToolSubst, FindTool
# name: The name of this test suite.
config.name = "libsycl"
# suffixes: A list of file extensions to treat as test files.
config.suffixes = [".cpp"]
config.excludes = ["Inputs"]
# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)
# allow expanding substitutions that are based on other substitutions
config.recursiveExpansionLimit = 10
# test_exec_root: The root path where tests should be run.
config.test_exec_root = config.libsycl_obj_root
# To be filled by lit.local.cfg files.
config.required_features = []
config.unsupported_features = []
# Cleanup environment variables which may affect tests
possibly_dangerous_env_vars = [
"COMPILER_PATH",
"RC_DEBUG_OPTIONS",
"CINDEXTEST_PREAMBLE_FILE",
"LIBRARY_PATH",
"CPATH",
"C_INCLUDE_PATH",
"CPLUS_INCLUDE_PATH",
"OBJC_INCLUDE_PATH",
"OBJCPLUS_INCLUDE_PATH",
"LIBCLANG_TIMING",
"LIBCLANG_OBJTRACKING",
"LIBCLANG_LOGGING",
"LIBCLANG_BGPRIO_INDEX",
"LIBCLANG_BGPRIO_EDIT",
"LIBCLANG_NOTHREADS",
"LIBCLANG_RESOURCE_USAGE",
"LIBCLANG_CODE_COMPLETION_LOGGING",
"INCLUDE",
]
for name in possibly_dangerous_env_vars:
if name in llvm_config.config.environment:
del llvm_config.config.environment[name]
# Propagate some variables from the host environment.
llvm_config.with_system_environment(
[
"PATH",
]
)
# Take into account extra system environment variables if provided via parameter.
if config.extra_system_environment:
lit_config.note(
"Extra system variables to propagate value from: "
+ config.extra_system_environment
)
extra_env_vars = config.extra_system_environment.split(",")
for var in extra_env_vars:
if var in os.environ:
llvm_config.with_system_environment(var)
llvm_config.with_environment("PATH", config.lit_tools_dir, append_path=True)
# Configure LD_LIBRARY_PATH
llvm_config.with_system_environment(
["LD_LIBRARY_PATH", "LIBRARY_PATH", "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH"]
)
llvm_config.with_environment(
"LD_LIBRARY_PATH", config.libsycl_libs_dir, append_path=True
)
llvm_config.with_environment("PATH", config.libsycl_tools_dir, append_path=True)
if config.extra_environment:
lit_config.note("Extra environment variables")
for env_pair in config.extra_environment.split(","):
[var, val] = env_pair.split("=", 1)
if val:
llvm_config.with_environment(var, val)
lit_config.note("\t" + var + "=" + val)
else:
lit_config.note("\tUnset " + var)
llvm_config.with_environment(var, "")
# Temporarily modify environment to be the same that we use when running tests
class test_env:
def __enter__(self):
self.old_environ = dict(os.environ)
os.environ.clear()
os.environ.update(config.environment)
self.old_dir = os.getcwd()
os.chdir(config.libsycl_obj_root)
def __exit__(self, exc_type, exc_value, exc_traceback):
os.environ.clear()
os.environ.update(self.old_environ)
os.chdir(self.old_dir)
# General substritutions
config.substitutions.append(
(
"%sycl_options",
" -lsycl"
+ " -isystem "
+ config.libsycl_include
+ " -isystem "
+ os.path.join(config.libsycl_include, "sycl")
+ " -L"
+ config.libsycl_libs_dir,
)
)
config.substitutions.append(("%sycl_libs_dir", config.libsycl_libs_dir))
config.substitutions.append(("%sycl_static_libs_dir", config.libsycl_libs_dir))
config.substitutions.append(("%obj_ext", ".o"))
config.substitutions.append(("%sycl_include", "-isystem " + config.libsycl_include))
config.substitutions.append(("%include_option", "-include"))
config.substitutions.append(("%debug_option", "-g"))
config.substitutions.append(("%cxx_std_option", "-std="))
config.substitutions.append(("%fPIC", "-fPIC"))
config.substitutions.append(("%shared_lib", "-shared"))
config.substitutions.append(("%O0", "-O0"))
sycl_ls = FindTool("sycl-ls").resolve(
llvm_config, os.pathsep.join([config.libsycl_bin_dir, config.llvm_tools_dir])
)
if not sycl_ls:
lit_config.fatal("can't find `sycl-ls`")
tools = [
ToolSubst("FileCheck", unresolved="ignore"),
# not is only substituted in certain circumstances; this is lit's default
# behaviour.
ToolSubst(
r"\| \bnot\b", command=FindTool("not"), verbatim=True, unresolved="ignore"
),
ToolSubst("sycl-ls", command=sycl_ls, unresolved="fatal"),
]
# Try and find each of these tools in the libsycl bin directory, in the llvm tools directory
# or the PATH, in that order. If found, they will be added as substitutions with the full path
# to the tool.
llvm_config.add_tool_substitutions(
tools, [config.libsycl_bin_dir, config.llvm_tools_dir, os.environ.get("PATH", "")]
)
lit_config.note("Targeted devices: all")
with test_env():
sycl_ls_output = subprocess.check_output(sycl_ls, text=True, shell=True)
devices = set()
for line in sycl_ls_output.splitlines():
if not line.startswith("["):
continue
backend, device = line[1:].split("]")[0].split(":")
devices.add("{}:{}".format(backend, device))
libsycl_devices = list(devices)
available_devices = {
"level_zero": "gpu",
}
for d in libsycl_devices:
be, dev = d.split(":")
if be not in available_devices:
lit_config.error("Unsupported device {}".format(d))
if dev not in available_devices[be]:
lit_config.error("Unsupported device {}".format(d))
if len(libsycl_devices) > 0:
config.available_features.add("any-device")
for sycl_device in libsycl_devices:
be, dev = sycl_device.split(":")
config.available_features.add("any-device-is-" + dev)
config.available_features.add("any-device-is-" + be)
# Check if user passed verbose-print parameter, if yes, add VERBOSE_PRINT macro
if "verbose-print" in lit_config.params:
verbose_print = "-DVERBOSE_PRINT"
else:
verbose_print = ""
clangxx = " " + config.libsycl_compiler + " -Werror " + config.cxx_flags + verbose_print
config.substitutions.append(("%clangxx", clangxx))
config.test_format = lit.formats.ShTest()
try:
import psutil
# Set timeout for a single test
lit_config.maxIndividualTestTime = 600
except ImportError:
pass