import os
import itertools
import platform
import subprocess
import sys
import lit.util
from lit.llvm import llvm_config
from lit.llvm.subst import FindTool
from lit.llvm.subst import ToolSubst
def _get_lldb_init_path(config):
return os.path.join(config.test_exec_root, "lit-lldb-init-quiet")
def _disallow(config, execName):
warning = """
echo '*** Do not use \'{0}\' in tests; use \'%''{0}\'. ***' &&
exit 1 && echo
"""
config.substitutions.append((" {0} ".format(execName), warning.format(execName)))
def use_lldb_substitutions(config):
# Set up substitutions for primary tools. These tools must come from config.lldb_tools_dir
# which is basically the build output directory. We do not want to find these in path or
# anywhere else, since they are specifically the programs which are actually being tested.
dsname = "debugserver" if platform.system() in ["Darwin"] else "lldb-server"
dsargs = [] if platform.system() in ["Darwin"] else ["gdbserver"]
build_script = os.path.dirname(__file__)
build_script = os.path.join(build_script, "build.py")
build_script_args = [
build_script,
"--compiler=any", # Default to best compiler
"--arch=" + str(config.lldb_bitness),
]
if config.lldb_lit_tools_dir:
build_script_args.append("--tools-dir={0}".format(config.lldb_lit_tools_dir))
if config.lldb_tools_dir:
build_script_args.append("--tools-dir={0}".format(config.lldb_tools_dir))
if config.llvm_libs_dir:
build_script_args.append("--libs-dir={0}".format(config.llvm_libs_dir))
if config.objc_gnustep_dir:
build_script_args.append(
'--objc-gnustep-dir="{0}"'.format(config.objc_gnustep_dir)
)
if config.cmake_sysroot:
build_script_args.append("--sysroot={0}".format(config.cmake_sysroot))
lldb_init = _get_lldb_init_path(config)
primary_tools = [
ToolSubst(
"%lldb",
command=FindTool("lldb"),
extra_args=["--no-lldbinit", "-S", lldb_init],
unresolved="fatal",
),
ToolSubst(
"%lldb-init",
command=FindTool("lldb"),
extra_args=["-S", lldb_init],
unresolved="fatal",
),
ToolSubst(
"%lldb-noinit",
command=FindTool("lldb"),
extra_args=["--no-lldbinit"],
unresolved="fatal",
),
ToolSubst(
"%lldb-server",
command=FindTool("lldb-server"),
extra_args=[],
unresolved="ignore",
),
ToolSubst(
"%debugserver",
command=FindTool(dsname),
extra_args=dsargs,
unresolved="ignore",
),
ToolSubst(
"%platformserver",
command=FindTool("lldb-server"),
extra_args=["platform"],
unresolved="ignore",
),
"lldb-test",
"lldb-dap",
ToolSubst(
"%build", command="'" + sys.executable + "'", extra_args=build_script_args
),
]
_disallow(config, "lldb")
_disallow(config, "lldb-server")
_disallow(config, "debugserver")
_disallow(config, "platformserver")
llvm_config.add_tool_substitutions(primary_tools, [config.lldb_tools_dir])
def _use_msvc_substitutions(config):
# If running from a Visual Studio Command prompt (e.g. vcvars), this will
# detect the include and lib paths, and find cl.exe and link.exe and create
# substitutions for each of them that explicitly specify /I and /L paths
cl = lit.util.which("cl")
if not cl:
return
# Don't use lit.util.which() for link.exe: In `git bash`, it will pick
# up /usr/bin/link (another name for ln).
link = os.path.join(os.path.dirname(cl), "link.exe")
cl = '"' + cl + '"'
link = '"' + link + '"'
includes = os.getenv("INCLUDE", "").split(";")
libs = os.getenv("LIB", "").split(";")
config.available_features.add("msvc")
compiler_flags = ['"/I{}"'.format(x) for x in includes if os.path.exists(x)]
linker_flags = ['"/LIBPATH:{}"'.format(x) for x in libs if os.path.exists(x)]
tools = [
ToolSubst("%msvc_cl", command=cl, extra_args=compiler_flags),
ToolSubst("%msvc_link", command=link, extra_args=linker_flags),
]
llvm_config.add_tool_substitutions(tools)
return
def use_support_substitutions(config):
# Set up substitutions for support tools. These tools can be overridden at the CMake
# level (by specifying -DLLDB_LIT_TOOLS_DIR), installed, or as a last resort, we can use
# the just-built version.
host_flags = ["--target=" + config.host_triple]
if platform.system() in ["Darwin"]:
try:
out = subprocess.check_output(["xcrun", "--show-sdk-path"]).strip()
res = 0
except OSError:
res = -1
if res == 0 and out:
sdk_path = lit.util.to_string(out)
llvm_config.lit_config.note("using SDKROOT: %r" % sdk_path)
host_flags += ["-isysroot", sdk_path]
elif sys.platform != "win32":
host_flags += ["-pthread"]
if sys.platform.startswith("netbsd"):
# needed e.g. to use freshly built libc++
host_flags += [
"-L" + config.llvm_libs_dir,
"-Wl,-rpath," + config.llvm_libs_dir,
]
# The clang module cache is used for building inferiors.
host_flags += ["-fmodules-cache-path={}".format(config.clang_module_cache)]
if config.cmake_sysroot:
host_flags += ["--sysroot={}".format(config.cmake_sysroot)]
host_flags = " ".join(host_flags)
config.substitutions.append(("%clang_host", "%clang " + host_flags))
config.substitutions.append(("%clangxx_host", "%clangxx " + host_flags))
config.substitutions.append(
("%clang_cl_host", "%clang_cl --target=" + config.host_triple)
)
additional_tool_dirs = []
if config.lldb_lit_tools_dir:
additional_tool_dirs.append(config.lldb_lit_tools_dir)
llvm_config.use_clang(
additional_flags=["--target=specify-a-target-or-use-a-_host-substitution"],
additional_tool_dirs=additional_tool_dirs,
required=True,
use_installed=True,
)
if sys.platform == "win32":
_use_msvc_substitutions(config)
have_lld = llvm_config.use_lld(
additional_tool_dirs=additional_tool_dirs, required=False, use_installed=True
)
if have_lld:
config.available_features.add("lld")
support_tools = [
"yaml2obj",
"obj2yaml",
"llvm-dwp",
"llvm-pdbutil",
"llvm-mc",
"llvm-readobj",
"llvm-objdump",
"llvm-objcopy",
"lli",
]
additional_tool_dirs += [config.lldb_tools_dir, config.llvm_tools_dir]
llvm_config.add_tool_substitutions(support_tools, additional_tool_dirs)
_disallow(config, "clang")
def use_lldb_repro_substitutions(config, mode):
lldb_init = _get_lldb_init_path(config)
substitutions = [
ToolSubst(
"%lldb",
command=FindTool("lldb-repro"),
extra_args=[mode, "--no-lldbinit", "-S", lldb_init],
),
ToolSubst(
"%lldb-init",
command=FindTool("lldb-repro"),
extra_args=[mode, "-S", lldb_init],
),
]
llvm_config.add_tool_substitutions(substitutions, [config.lldb_tools_dir])