import lit.formats
import sys
import os

config.name = "libFuzzer" + config.name_suffix
config.test_format = lit.formats.ShTest(True)
config.suffixes = [".test"]
config.test_source_root = os.path.dirname(__file__)
config.available_features.add(config.target_arch)
lit_config.note(f'arch feature "{config.target_arch}" available')

# Choose between lit's internal shell pipeline runner and a real shell.  If
# LIT_USE_INTERNAL_SHELL is in the environment, we use that as an override.
use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL")
if use_lit_shell:
    # 0 is external, "" is default, and everything else is internal.
    execute_external = use_lit_shell == "0"
else:
    # Otherwise we default to internal on Windows and external elsewhere, as
    # bash on Windows is usually very slow.
    execute_external = not sys.platform in ["win32"]

# 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(execute_external)

# LeakSanitizer is not supported on OSX or Windows right now.
if (
    sys.platform.startswith("darwin")
    or sys.platform.startswith("freebsd")
    or sys.platform.startswith("win")
):
    lit_config.note("lsan feature unavailable")
else:
    lit_config.note("lsan feature available")
    config.available_features.add("lsan")

# MemorySanitizer is not supported on OSX or Windows right now
if (
    sys.platform.startswith("darwin")
    or sys.platform.startswith("win")
    or config.target_arch == "i386"
):
    lit_config.note("msan feature unavailable")
    assert "msan" not in config.available_features
else:
    lit_config.note("msan feature available")
    config.available_features.add("msan")

if sys.platform.startswith("win") or sys.platform.startswith("cygwin"):
    config.available_features.add("windows")

if sys.platform.startswith("darwin"):
    config.available_features.add("darwin")

if sys.platform.startswith("linux"):
    # Note the value of ``sys.platform`` is not consistent
    # between python 2 and 3, hence the use of ``.startswith()``.
    lit_config.note("linux feature available")
    config.available_features.add("linux")
else:
    lit_config.note("linux feature unavailable")

if config.arm_thumb:
    config.available_features.add("thumb")

config.substitutions.append(("%build_dir", config.cmake_binary_dir))
libfuzzer_src_root = os.path.join(config.compiler_rt_src_root, "lib", "fuzzer")
config.substitutions.append(("%libfuzzer_src", libfuzzer_src_root))

config.substitutions.append(("%python", '"%s"' % (sys.executable)))


def generate_compiler_cmd(is_cpp=True, fuzzer_enabled=True, msan_enabled=False):
    compiler_cmd = config.clang
    extra_cmd = config.target_flags

    if is_cpp:
        std_cmd = "--driver-mode=g++"
    else:
        std_cmd = ""

    if msan_enabled:
        sanitizers = ["memory"]
    else:
        sanitizers = ["address"]
    if fuzzer_enabled:
        sanitizers.append("fuzzer")
    sanitizers_cmd = "-fsanitize=%s" % ",".join(sanitizers)
    return " ".join(
        [
            compiler_cmd,
            std_cmd,
            "-O2 -gline-tables-only",
            sanitizers_cmd,
            "-I%s" % libfuzzer_src_root,
            extra_cmd,
        ]
    )


config.substitutions.append(
    ("%cpp_compiler", generate_compiler_cmd(is_cpp=True, fuzzer_enabled=True))
)

config.substitutions.append(
    ("%c_compiler", generate_compiler_cmd(is_cpp=False, fuzzer_enabled=True))
)

config.substitutions.append(
    (
        "%no_fuzzer_cpp_compiler",
        generate_compiler_cmd(is_cpp=True, fuzzer_enabled=False),
    )
)

config.substitutions.append(
    ("%no_fuzzer_c_compiler", generate_compiler_cmd(is_cpp=False, fuzzer_enabled=False))
)

config.substitutions.append(
    (
        "%msan_compiler",
        generate_compiler_cmd(is_cpp=True, fuzzer_enabled=True, msan_enabled=True),
    )
)

default_asan_opts_str = ":".join(config.default_sanitizer_opts)
if default_asan_opts_str:
    config.environment["ASAN_OPTIONS"] = default_asan_opts_str
    default_asan_opts_str += ":"
config.substitutions.append(
    ("%env_asan_opts=", "env ASAN_OPTIONS=" + default_asan_opts_str)
)

if not config.parallelism_group:
    config.parallelism_group = "shadow-memory"

if config.host_os == "NetBSD":
    config.substitutions.insert(0, ("%run", config.netbsd_noaslr_prefix))
