# -*- Python -*-

import os
import platform
import re
import subprocess
import locale

import lit.formats
import lit.util

from lit.llvm import llvm_config

# Configuration file for the 'lit' test runner.

# name: The name of this test suite.
config.name = "lld"

# 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.
config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell)

# suffixes: A list of file extensions to treat as test files.
config.suffixes = [".ll", ".s", ".test", ".yaml", ".objtxt"]

# 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"]

# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)

config.test_exec_root = os.path.join(config.lld_obj_root, "test")

llvm_config.use_default_substitutions()
llvm_config.use_lld()

tool_patterns = [
    "llc",
    "llvm-as",
    "llvm-cgdata",
    "llvm-mc",
    "llvm-nm",
    "llvm-objdump",
    "llvm-otool",
    "llvm-pdbutil",
    "llvm-profdata",
    "llvm-dwarfdump",
    "llvm-readelf",
    "llvm-readobj",
    "obj2yaml",
    "yaml2obj",
    "opt",
    "llvm-dis",
]

llvm_config.add_tool_substitutions(tool_patterns)

# LLD tests tend to be flaky on NetBSD, so add some retries.
# We don't do this on other platforms because it's slower.
if platform.system() in ["NetBSD"]:
    config.test_retry_attempts = 2

# When running under valgrind, we mangle '-vg' onto the end of the triple so we
# can check it with XFAIL and XTARGET.
if lit_config.useValgrind:
    config.target_triple += "-vg"

llvm_config.feature_config(
    [
        (
            "--targets-built",
            {
                "AArch64": "aarch64",
                "AMDGPU": "amdgpu",
                "ARM": "arm",
                "AVR": "avr",
                "Hexagon": "hexagon",
                "LoongArch": "loongarch",
                "Mips": "mips",
                "MSP430": "msp430",
                "PowerPC": "ppc",
                "RISCV": "riscv",
                "Sparc": "sparc",
                "SystemZ": "systemz",
                "WebAssembly": "wasm",
                "X86": "x86",
            },
        ),
        ("--assertion-mode", {"ON": "asserts"}),
    ]
)

# Set a fake constant version so that we get consistent output.
config.environment["LLD_VERSION"] = "LLD 1.0"

# LLD_IN_TEST determines how many times `main` is run inside each process, which
# lets us test that it's cleaning up after itself and resetting global state
# correctly (which is important for usage as a library).
run_lld_main_twice = lit_config.params.get("RUN_LLD_MAIN_TWICE", False)
if not run_lld_main_twice:
    config.environment["LLD_IN_TEST"] = "1"
else:
    config.environment["LLD_IN_TEST"] = "2"
    # Many ELF tests fail in this mode.
    config.excludes.append("ELF")
    # Some old Mach-O backend tests fail, and it's due for removal anyway.
    config.excludes.append("mach-o")
    # Some new Mach-O backend tests fail; give them a way to mark themselves
    # unsupported in this mode.
    config.available_features.add("main-run-twice")

# Indirectly check if the mt.exe Microsoft utility exists by searching for
# cvtres, which always accompanies it.  Alternatively, check if we can use
# libxml2 to merge manifests.
if lit.util.which("cvtres", config.environment["PATH"]) or config.have_libxml2:
    config.available_features.add("manifest_tool")

if config.enable_backtrace:
    config.available_features.add("backtrace")

if config.have_libxml2:
    config.available_features.add("libxml2")

if config.have_dia_sdk:
    config.available_features.add("diasdk")

if config.sizeof_void_p == 8:
    config.available_features.add("llvm-64-bits")

if config.has_plugins:
    config.available_features.add("plugins")

if config.build_examples:
    config.available_features.add("examples")

if config.linked_bye_extension:
    config.substitutions.append(("%loadbye", ""))
    config.substitutions.append(("%loadnewpmbye", ""))
else:
    config.substitutions.append(
        (
            "%loadbye",
            "-load={}/Bye{}".format(config.llvm_shlib_dir, config.llvm_shlib_ext),
        )
    )
    config.substitutions.append(
        (
            "%loadnewpmbye",
            "-load-pass-plugin={}/Bye{}".format(
                config.llvm_shlib_dir, config.llvm_shlib_ext
            ),
        )
    )

tar_executable = lit.util.which("tar", config.environment["PATH"])
if tar_executable:
    env = os.environ
    env["LANG"] = "C"
    tar_version = subprocess.Popen(
        [tar_executable, "--version"],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        env=env,
    )
    sout, _ = tar_version.communicate()
    if "GNU tar" in sout.decode():
        config.available_features.add("gnutar")

# ELF tests expect the default target for ld.lld to be ELF.
if config.ld_lld_default_mingw:
    config.excludes.append("ELF")
