@LIT_SITE_CFG_IN_HEADER@

import os
import platform
import re
import shlex

# Load common config for all compiler-rt unit tests.
lit_config.load_config(config, "@COMPILER_RT_BINARY_DIR@/unittests/lit.common.unit.configured")

def push_ld_library_path(config, new_path):
  new_ld_library_path = os.path.pathsep.join(
    (new_path, config.environment.get('LD_LIBRARY_PATH', '')))
  config.environment['LD_LIBRARY_PATH'] = new_ld_library_path

  if platform.system() == 'FreeBSD':
    new_ld_32_library_path = os.path.pathsep.join(
      (new_path, config.environment.get('LD_32_LIBRARY_PATH', '')))
    config.environment['LD_32_LIBRARY_PATH'] = new_ld_32_library_path

  if platform.system() == 'SunOS':
    new_ld_library_path_32 = os.path.pathsep.join(
      (new_path, config.environment.get('LD_LIBRARY_PATH_32', '')))
    config.environment['LD_32_LIBRARY_PATH'] = new_ld_library_path_32

    new_ld_library_path_64 = os.path.pathsep.join(
      (new_path, config.environment.get('LD_LIBRARY_PATH_64', '')))
    config.environment['LD_64_LIBRARY_PATH'] = new_ld_library_path_64

# Setup config name.
config.name = 'AddressSanitizer-Unit'

# Load target architecture information. Note config.target_triple can be
# incorrect since it is populated with the default target. This unit test suite
# may run for multiple targets. The dynamic suite needs the correct target for
# library path selection.
config.target_arch = "@arch@"

# Setup test source and exec root. For unit tests, we define
# it as build directory with ASan unit tests.
# FIXME: De-hardcode this path.
if @ASAN_TEST_DYNAMIC@:
  test_dir = "@CONFIG_NAME_DYNAMIC@"
else:
  test_dir = "@CONFIG_NAME@"
config.test_exec_root = os.path.join("@COMPILER_RT_BINARY_DIR@",
                                     "lib", "asan", "tests", test_dir)

config.test_source_root = config.test_exec_root

# When LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=on, the initial value of
# config.compiler_rt_libdir (COMPILER_RT_RESOLVED_LIBRARY_OUTPUT_DIR) has the
# host triple as the trailing path component. The value is incorrect for i386
# tests on x86_64 hosts and vice versa. Adjust config.compiler_rt_libdir
# accordingly.
if config.enable_per_target_runtime_dir and config.target_arch != config.host_arch:
    if config.target_arch == 'i386':
        config.compiler_rt_libdir = re.sub(r'/x86_64(?=-[^/]+$)', '/i386', config.compiler_rt_libdir)
    elif config.target_arch == 'x86_64':
        config.compiler_rt_libdir = re.sub(r'/i386(?=-[^/]+$)', '/x86_64', config.compiler_rt_libdir)

# Set LD_LIBRARY_PATH to pick dynamic runtime up properly.
push_ld_library_path(config, config.compiler_rt_libdir)

if config.host_os == 'Darwin':
  config.parallelism_group = config.darwin_sanitizer_parallelism_group_func
