Files
llvm-project/polly/test/lit.cfg
Michael Kruse 458f1aae8d [Polly] Forward VFS from PassBuilder for IO sandboxing (#188657)
#184545 default-enables the IO sandbox in assert-builds. This causes
Clang using Polly to crash (#188568).

The issue is that `PassBuilder` uses `vfs::getRealFileSystem()` by
default which is considered a IO sandbox violation in the Clang process.
With this PR store the VFS from the `PassBuilder` from the original
`registerPollyPasses` call for creating other `PassBuilder` instances.

This PR also adds infrastructure for running Polly in `clang` (in
addition in `opt`). `opt` does not enable the sandbox such that we need
separate tests using Clang.

Closes: #188568
2026-03-28 23:55:05 +01:00

105 lines
3.5 KiB
INI

# -*clang- Python -*-
import os
import platform
import re
import subprocess
import shlex
import lit.formats
import lit.util
from lit.llvm import llvm_config
from lit.llvm.subst import ToolSubst
# Configuration file for the 'lit' test runner.
# name: The name of this test suite.
config.name = 'Polly'
# testFormat: The test format to use to interpret tests.
#
# For now we require '&&' between commands, until they get globally killed and
# the test runner updated.
#
# TODO: Consolidate the logic for turning on the internal shell by default for all LLVM test suites.
# See https://github.com/llvm/llvm-project/issues/106636 for more details.
#
# We prefer the lit internal shell which provides a better user experience on failures
# unless the user explicitly disables it with LIT_USE_INTERNAL_SHELL=0 env var.
use_lit_shell = True
lit_shell_env = os.environ.get("LIT_USE_INTERNAL_SHELL")
if lit_shell_env:
use_lit_shell = lit.util.pythonize_bool(lit_shell_env)
config.test_format = lit.formats.ShTest(execute_external=not use_lit_shell)
# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.ll']
# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)
# test_exec_root: The root path where tests should be run.
config.test_exec_root = os.path.join(config.polly_obj_root, 'test')
# Tweak the PATH to include the tools dir and the scripts dir.
base_paths = [config.llvm_tools_dir, config.environment['PATH']]
path = os.path.pathsep.join(base_paths + config.extra_paths)
config.environment['PATH'] = path
path = os.path.pathsep.join((config.llvm_libs_dir,
config.environment.get('LD_LIBRARY_PATH','')))
config.environment['LD_LIBRARY_PATH'] = path
llvm_config.use_default_substitutions()
tool_patterns = ['opt', 'polly-isl-test']
llvm_config.add_tool_substitutions(tool_patterns)
if config.polly_test_c_compiler:
config.suffixes += ['.c']
llvm_polly_link_into_tools = lit.util.pythonize_bool(config.llvm_polly_link_into_tools)
clang_args = []
if not llvm_polly_link_into_tools:
clang_args += [f'-fpass-plugin={config.polly_lib_dir}/LLVMPolly{config.llvm_shlibext}']
llvm_config.add_tool_substitutions([
ToolSubst("%clang",
command = config.polly_test_c_compiler,
extra_args = clang_args,
unresolved = "fatal"
)
])
lit_config.note(f"Using Clang: {config.polly_test_c_compiler} {shlex.join(clang_args)}")
else:
lit_config.note("Clang tests disabled: No compatible Clang found")
# opt knows whether it is compiled with -DNDEBUG.
import subprocess
try:
opt_cmd = subprocess.Popen([os.path.join(config.llvm_tools_dir, 'opt'), '-version'],
stdout = subprocess.PIPE,
env=config.environment)
except OSError:
print("Could not find opt in " + config.llvm_tools_dir)
exit(42)
if re.search(r'with assertions', opt_cmd.stdout.read().decode('ascii')):
config.available_features.add('asserts')
opt_cmd.wait()
try:
llvm_config_cmd = subprocess.Popen([os.path.join(
config.llvm_tools_dir,
'llvm-config'),
'--targets-built'],
stdout = subprocess.PIPE,
env=config.environment)
except OSError:
print("Could not find llvm-config in " + config.llvm_tools_dir)
exit(42)
llvm_config_cmd.wait()