# -*- Python -*-

import os
import platform
import re
import subprocess
import locale

import lit.formats
import lit.util

# Configuration file for the 'lit' test runner.

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

# Tweak PATH for Win32
if sys.platform in ['win32']:
    # Seek sane tools in directories and set to $PATH.
    path = getattr(config, 'lit_tools_dir', None)
    path = lit_config.getToolsPath(path,
                                   config.environment['PATH'],
                                   ['cmp.exe', 'grep.exe', 'sed.exe'])
    if path is not None:
        path = os.path.pathsep.join((path,
                                     config.environment['PATH']))
        config.environment['PATH'] = path

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

# 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__)

# test_exec_root: The root path where tests should be run.
lld_obj_root = getattr(config, 'lld_obj_root', None)
if lld_obj_root is not None:
    config.test_exec_root = os.path.join(lld_obj_root, 'test')

# Set llvm_{src,obj}_root for use by others.
config.llvm_src_root = getattr(config, 'llvm_src_root', None)
config.llvm_obj_root = getattr(config, 'llvm_obj_root', None)

# Tweak the PATH to include the tools dir and the scripts dir.
if lld_obj_root is not None:
    lld_tools_dir = getattr(config, 'lld_tools_dir', None)
    if not lld_tools_dir:
        lit_config.fatal('No LLD tools dir set!')
    llvm_tools_dir = getattr(config, 'llvm_tools_dir', None)
    if not llvm_tools_dir:
        lit_config.fatal('No LLVM tools dir set!')
    path = os.path.pathsep.join((lld_tools_dir, llvm_tools_dir, config.environment['PATH']))
    path = os.path.pathsep.join((os.path.join(getattr(config, 'llvm_src_root', None),'test','Scripts'),path))

    config.environment['PATH'] = path

    lld_libs_dir = getattr(config, 'lld_libs_dir', None)
    if not lld_libs_dir:
        lit_config.fatal('No LLD libs dir set!')
    llvm_libs_dir = getattr(config, 'llvm_libs_dir', None)
    if not llvm_libs_dir:
        lit_config.fatal('No LLVM libs dir set!')
    path = os.path.pathsep.join((lld_libs_dir, llvm_libs_dir,
                                 config.environment.get('LD_LIBRARY_PATH','')))
    config.environment['LD_LIBRARY_PATH'] = path

    # Propagate LLVM_SRC_ROOT into the environment.
    config.environment['LLVM_SRC_ROOT'] = getattr(config, 'llvm_src_root', '')

    # Propagate PYTHON_EXECUTABLE into the environment
    config.environment['PYTHON_EXECUTABLE'] = getattr(config, 'python_executable',
                                                      '')
###

# Check that the object root is known.
if config.test_exec_root is None:
    # Otherwise, we haven't loaded the site specific configuration (the user is
    # probably trying to run on a test file directly, and either the site
    # configuration hasn't been created by the build system, or we are in an
    # out-of-tree build situation).

    # Check for 'lld_site_config' user parameter, and use that if available.
    site_cfg = lit_config.params.get('lld_site_config', None)
    if site_cfg and os.path.exists(site_cfg):
        lit_config.load_config(config, site_cfg)
        raise SystemExit

    # Try to detect the situation where we are using an out-of-tree build by
    # looking for 'llvm-config'.
    #
    # FIXME: I debated (i.e., wrote and threw away) adding logic to
    # automagically generate the lit.site.cfg if we are in some kind of fresh
    # build situation. This means knowing how to invoke the build system though,
    # and I decided it was too much magic. We should solve this by just having
    # the .cfg files generated during the configuration step.

    llvm_config = lit.util.which('llvm-config', config.environment['PATH'])
    if not llvm_config:
        lit_config.fatal('No site specific configuration available!')

    # Get the source and object roots.
    llvm_src_root = subprocess.check_output(['llvm-config', '--src-root']).strip()
    llvm_obj_root = subprocess.check_output(['llvm-config', '--obj-root']).strip()
    lld_src_root = os.path.join(llvm_src_root, "tools", "lld")
    lld_obj_root = os.path.join(llvm_obj_root, "tools", "lld")

    # Validate that we got a tree which points to here, using the standard
    # tools/lld layout.
    this_src_root = os.path.dirname(config.test_source_root)
    if os.path.realpath(lld_src_root) != os.path.realpath(this_src_root):
        lit_config.fatal('No site specific configuration available!')

    # Check that the site specific configuration exists.
    site_cfg = os.path.join(lld_obj_root, 'test', 'lit.site.cfg')
    if not os.path.exists(site_cfg):
        lit_config.fatal(
            'No site specific configuration available! You may need to '
            'run "make test" in your lld build directory.')

    # Okay, that worked. Notify the user of the automagic, and reconfigure.
    lit_config.note('using out-of-tree build at %r' % lld_obj_root)
    lit_config.load_config(config, site_cfg)
    raise SystemExit

# For each occurrence of a lld tool name as its own word, replace it
# with the full path to the build directory holding that tool.  This
# ensures that we are testing the tools just built and not some random
# tools that might happen to be in the user's PATH.

# Regex assertions to reject neighbor hyphens/dots (seen in some tests).
# For example, we want to prefix 'lld' and 'ld.lld' but not the 'lld' inside
# of 'ld.lld'.
NoPreJunk = r"(?<!(-|\.|/))"
NoPostJunk = r"(?!(-|\.))"

config.substitutions.append( (r"\bld.lld\b", 'ld.lld --full-shutdown') )

tool_patterns = [r"\bFileCheck\b",
                 r"\bnot\b",
                 NoPreJunk + r"\blld\b" + NoPostJunk,
                 r"\bld.lld\b",
                 r"\blld-link\b",
                 r"\bllvm-as\b",
                 r"\bllvm-mc\b",
                 r"\bllvm-nm\b",
                 r"\bllvm-objdump\b",
                 r"\bllvm-pdbutil\b",
                 r"\bllvm-readobj\b",
                 r"\bobj2yaml\b",
                 r"\byaml2obj\b"]

for pattern in tool_patterns:
    # Extract the tool name from the pattern.  This relies on the tool
    # name being surrounded by \b word match operators.  If the
    # pattern starts with "| ", include it in the string to be
    # substituted.
    tool_match = re.match(r"^(\\)?((\| )?)\W+b([0-9A-Za-z-_\.]+)\\b\W*$",
                          pattern)
    tool_pipe = tool_match.group(2)
    tool_name = tool_match.group(4)
    tool_path = lit.util.which(tool_name, config.environment['PATH'])
    if not tool_path:
        # Warn, but still provide a substitution.
        lit_config.note('Did not find ' + tool_name + ' in ' + path)
        tool_path = llvm_tools_dir + '/' + tool_name
    config.substitutions.append((pattern, tool_pipe + tool_path))

# Add site-specific substitutions.
config.substitutions.append( ('%python', config.python_executable) )

###

# 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'

# Shell execution
if execute_external:
    config.available_features.add('shell')

# zlib compression library
if config.have_zlib:
    config.available_features.add("zlib")

# Running on Darwin OS
if platform.system() in ['Darwin']:
    config.available_features.add('system-linker-mach-o')

# Running on ELF based *nix
if platform.system() in ['FreeBSD', 'Linux']:
    config.available_features.add('system-linker-elf')

# Running on Windows
if platform.system() in ['Windows']:
    config.available_features.add('system-windows')

# Set if host-cxxabi's demangler can handle target's symbols.
if platform.system() not in ['Windows']:
    config.available_features.add('demangler')

# llvm-config knows whether it is compiled with asserts (and)
# whether we are operating in release/debug mode.
import subprocess
try:
    llvm_config_cmd = \
     subprocess.Popen([os.path.join(llvm_tools_dir, 'llvm-config'),
                     '--build-mode', '--assertion-mode', '--targets-built'],
                      stdout = subprocess.PIPE)
except OSError as why:
    print("Could not find llvm-config in " + llvm_tools_dir)
    exit(42)

llvm_config_output = llvm_config_cmd.stdout.read().decode('utf_8')
llvm_config_output_list = llvm_config_output.split("\n")

if re.search(r'DEBUG', llvm_config_output_list[0]):
    config.available_features.add('debug')
if re.search(r'ON', llvm_config_output_list[1]):
    config.available_features.add('asserts')

archs = llvm_config_output_list[2]
if re.search(r'AArch64', archs):
    config.available_features.add('aarch64')
if re.search(r'AMDGPU', archs):
    config.available_features.add('amdgpu')
if re.search(r'ARM', archs):
    config.available_features.add('arm')
if re.search(r'AVR', archs):
    config.available_features.add('avr')
if re.search(r'Mips', archs):
    config.available_features.add('mips')
if re.search(r'PowerPC', archs):
    config.available_features.add('ppc')
if re.search(r'Sparc', archs):
    config.available_features.add('sparc')
if re.search(r'X86', archs):
    config.available_features.add('x86')
llvm_config_cmd.wait()

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

# Indirectly check if the mt.exe Microsoft utility exists by searching for
# cvtres, which always accompanies it.
if lit.util.which('cvtres', config.environment['PATH']):
    config.available_features.add('win_mt')
