from lit.llvm import llvm_config

if not config.mlir_include_integration_tests:
    config.unsupported = True


def configure_aarch64_lli_and_mcr_cmd():
    lli_cmd = "lli"
    mcr_cmd = "mlir-cpu-runner"

    # NOTE: If the SVE tests are disabled and the SME tests are enabled to run
    # under emulation, the SVE specific RUN lines in the SparseTensor tests
    # will run under emulation.
    if not (config.mlir_run_arm_sve_tests or config.mlir_run_arm_sme_tests):
        return (lli_cmd, mcr_cmd)

    config.substitutions.append(
        (
            "%mlir_native_utils_lib_dir",
            config.arm_emulator_utils_lib_dir or config.mlir_lib_dir,
        )
    )

    if config.arm_emulator_executable:
        if config.arm_emulator_lli_executable:
            lli_cmd = config.arm_emulator_lli_executable
        else:
            # Top-level lit config adds llvm_tools_dir to PATH but this is lost
            # when running under an emulator. If the user didn't specify an lli
            # executable, use absolute path %llvm_tools_dir/lli.
            lli_cmd = llvm_config.use_llvm_tool(
                "lli",
                search_env="LLI",
                required=True,
                search_paths=[config.llvm_tools_dir],
                use_installed=False,
            )

        if config.arm_emulator_mlir_cpu_runner_executable:
            mcr_cmd = config.arm_emulator_mlir_cpu_runner_executable
        else:
            # Top-level LIT config adds llvm_tools_dir to PATH but this is lost
            # when running under an emulator. If the user didn't specify an
            # mlir-cpu-runner executable, use absolute path
            # %llvm_tools_dir/mlir-cpu-runner.
            mcr_cmd = llvm_config.use_llvm_tool(
                "mlir-cpu-runner",
                search_env="MLIR_CPU_RUNNER",
                required=True,
                search_paths=[config.mlir_tools_dir],
                use_installed=False,
            )

        # Run test in emulator (qemu or armie)
        emulation_cmd = (
            f"{config.arm_emulator_executable} {config.arm_emulator_options}"
        )

        lli_cmd = f"{emulation_cmd} {lli_cmd}"
        mcr_cmd = f"{emulation_cmd} {mcr_cmd}"

    return (lli_cmd, mcr_cmd)


aarch64_lli_cmd, aarch64_mcr_cmd = configure_aarch64_lli_and_mcr_cmd()

# Configure the following AArch64 substitutions:
#
# * %lli_aarch64_cmd         - Invokes lli. For tests that _will_ run on AArch64 (ArmSVE, ArmSME).
# * %lli_host_or_aarch64_cmd - Invokes lli. For tests that _may_ run on AArch64 (SparseTensor).
# * %mcr_aarch64_cmd         - Invokes mlir-cpu-runner. For tests that _will_
#                              run on AArch64. May invoke mlir-cpu-runner under
#                              an AArch64 emulator (when
#                              `config.arm_emulator_executable` is set).
#
# AArch64 tests will run under emulation if configured at build time by the
# following CMake options:
#
# * ARM_EMULATOR_EXECUTABLE     - emulator to use.
# * ARM_EMULATOR_OPTIONS        - options for emulator.
# * ARM_EMULATOR_LLI_EXECUTABLE - AArch64 native lli to support cross-compilation.
# * ARM_EMULATOR_UTILS_LIB_DIR  - AArch64 native utilites library to support cross-compilation.
#
# Functionally the two substitutions are equivalent, i.e. %lli_aarch64_cmd
# could be used in the SparseTensor tests where necessary, but the meaning
# conveyed by the substitution name would be a misnomer if the host target
# is not AArch64 and MLIR_RUN_ARM_SVE_TESTS=OFF.
config.substitutions.append(("%lli_aarch64_cmd", aarch64_lli_cmd))
config.substitutions.append(("%lli_host_or_aarch64_cmd", aarch64_lli_cmd))
config.substitutions.append(("%mcr_aarch64_cmd", aarch64_mcr_cmd))
