# -*- Python -*-
import json
import os
import platform
import re
import shutil
import site
import subprocess
import sys
import lit.formats
from lit.llvm import llvm_config
from lit.llvm.subst import FindTool
from lit.llvm.subst import ToolSubst
site.addsitedir(os.path.dirname(__file__))
from helper import toolchain
# name: The name of this test suite.
config.name = "lldb-shell"
# testFormat: The test format to use to interpret tests.
config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell)
# suffixes: A list of file extensions to treat as test files. This is overriden
# by individual lit.local.cfg files in the test subdirectories.
config.suffixes = [".test", ".cpp", ".s", ".m"]
# excludes: A list of directories to exclude from the testsuite. The 'Inputs'
# subdirectories contain auxiliary inputs for various tests in their parent
# directories.
config.excludes = ["Inputs", "CMakeLists.txt", "README.txt", "LICENSE.txt"]
# 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.lldb_obj_root, "test", "Shell")
# Propagate environment vars.
llvm_config.with_system_environment(
[
"FREEBSD_LEGACY_PLUGIN",
"HOME",
"TEMP",
"TMP",
"XDG_CACHE_HOME",
]
)
# Enable sanitizer runtime flags.
if "Address" in config.llvm_use_sanitizer:
config.environment["ASAN_OPTIONS"] = "detect_stack_use_after_return=1"
if platform.system() == "Darwin":
config.environment["MallocNanoZone"] = "0"
if "Thread" in config.llvm_use_sanitizer:
config.environment["TSAN_OPTIONS"] = "halt_on_error=1"
# Support running the test suite under the lldb-repro wrapper. This makes it
# possible to capture a test suite run and then rerun all the test from the
# just captured reproducer.
lldb_repro_mode = lit_config.params.get("lldb-run-with-repro", None)
if lldb_repro_mode:
config.available_features.add("lldb-repro")
lit_config.note("Running Shell tests in {} mode.".format(lldb_repro_mode))
toolchain.use_lldb_repro_substitutions(config, lldb_repro_mode)
llvm_config.use_default_substitutions()
toolchain.use_lldb_substitutions(config)
toolchain.use_support_substitutions(config)
if re.match(r"^arm(hf.*-linux)|(.*-linux-gnuabihf)", config.target_triple):
config.available_features.add("armhf-linux")
if re.match(r".*-(windows-msvc)$", config.target_triple):
config.available_features.add("windows-msvc")
if re.match(r".*-(windows-gnu|mingw32)$", config.target_triple):
config.available_features.add("windows-gnu")
def calculate_arch_features(arch_string):
# This will add a feature such as x86, arm, mips, etc for each built
# target
features = []
for arch in arch_string.split():
features.append(arch.lower())
return features
# Run llvm-config and add automatically add features for whether we have
# assertions enabled, whether we are in debug mode, and what targets we
# are built for.
llvm_config.feature_config(
[
("--assertion-mode", {"ON": "asserts"}),
("--build-mode", {"DEBUG": "debug"}),
("--targets-built", calculate_arch_features),
]
)
# Clean the module caches in the test build directory. This is necessary in an
# incremental build whenever clang changes underneath, so doing it once per
# lit.py invocation is close enough.
for cachedir in [config.clang_module_cache, config.lldb_module_cache]:
if os.path.isdir(cachedir):
lit_config.note("Deleting module cache at %s." % cachedir)
shutil.rmtree(cachedir)
# Set a default per-test timeout of 10 minutes. Setting a timeout per test
# requires that killProcessAndChildren() is supported on the platform and
# lit complains if the value is set but it is not supported.
supported, errormsg = lit_config.maxIndividualTestTimeIsSupported
if supported:
lit_config.maxIndividualTestTime = 600
else:
lit_config.warning("Could not set a default per-test timeout. " + errormsg)
# If running tests natively, check for CPU features needed for some tests.
if "native" in config.available_features:
cpuid_exe = lit.util.which("lit-cpuid", config.lldb_tools_dir)
if cpuid_exe is None:
lit_config.warning(
"lit-cpuid not found, tests requiring CPU extensions will be skipped"
)
else:
out, err, exitcode = lit.util.executeCommand([cpuid_exe])
if exitcode == 0:
for x in out.split():
config.available_features.add("native-cpu-%s" % x)
else:
lit_config.warning("lit-cpuid failed: %s" % err)
if config.lldb_enable_python:
config.available_features.add("python")
if config.lldb_enable_lua:
config.available_features.add("lua")
if config.lldb_enable_lzma:
config.available_features.add("lzma")
if shutil.which("xz") is not None:
config.available_features.add("xz")
if config.lldb_system_debugserver:
config.available_features.add("system-debugserver")
if config.have_lldb_server:
config.available_features.add("lldb-server")
if config.objc_gnustep_dir:
config.available_features.add("objc-gnustep")
if platform.system() == "Windows":
# objc.dll must be in PATH since Windows has no rpath
config.environment["PATH"] = os.path.pathsep.join(
(
os.path.join(config.objc_gnustep_dir, "lib"),
config.environment.get("PATH", ""),
)
)
# NetBSD permits setting dbregs either if one is root
# or if user_set_dbregs is enabled
can_set_dbregs = True
if platform.system() == "NetBSD" and os.geteuid() != 0:
try:
output = (
subprocess.check_output(
["/sbin/sysctl", "-n", "security.models.extensions.user_set_dbregs"]
)
.decode()
.strip()
)
if output != "1":
can_set_dbregs = False
except subprocess.CalledProcessError:
can_set_dbregs = False
if can_set_dbregs:
config.available_features.add("dbregs-set")
if "LD_PRELOAD" in os.environ:
config.available_features.add("ld_preload-present")
# Determine if a specific version of Xcode's linker contains a bug. We want to
# skip affected tests if they contain this bug.
if platform.system() == "Darwin":
try:
raw_version_details = subprocess.check_output(
("xcrun", "ld", "-version_details")
)
version_details = json.loads(raw_version_details)
version = version_details.get("version", "0")
version_tuple = tuple(int(x) for x in version.split("."))
if (1000,) <= version_tuple <= (1109,):
config.available_features.add("ld_new-bug")
except:
pass