# -*- Python -*-

import os

def get_required_attr(config, attr_name):
  attr_value = getattr(config, attr_name, None)
  if not attr_value:
    lit_config.fatal(
      "No attribute %r in test configuration! You may need to run "
      "tests from your build directory or add this attribute "
      "to lit.site.cfg " % attr_name)
  return attr_value

# Setup config name.
config.name = 'ThreadSanitizer' + config.name_suffix

# Setup source root.
config.test_source_root = os.path.dirname(__file__)

# Setup environment variables for running ThreadSanitizer.
default_tsan_opts = "atexit_sleep_ms=0"

if config.host_os == 'Darwin':
  # On Darwin, we default to `abort_on_error=1`, which would make tests run
  # much slower. Let's override this and run lit tests with 'abort_on_error=0'.
  default_tsan_opts += ':abort_on_error=0'

# Platform-specific default TSAN_OPTIONS for lit tests.
if default_tsan_opts:
  config.environment['TSAN_OPTIONS'] = default_tsan_opts
  default_tsan_opts += ':'
config.substitutions.append(('%env_tsan_opts=',
                             'env TSAN_OPTIONS=' + default_tsan_opts))

# GCC driver doesn't add necessary compile/link flags with -fsanitize=thread.
if config.compiler_id == 'GNU':
  extra_cflags = ["-fPIE", "-pthread", "-ldl", "-lstdc++", "-lrt", "-pie"]
else:
  extra_cflags = []

# Setup default compiler flags used with -fsanitize=thread option.
clang_tsan_cflags = (["-fsanitize=thread",
                      "-Wall"] +
                      [config.target_cflags] +
                      config.debug_info_flags +
                      extra_cflags)
clang_tsan_cxxflags = config.cxx_mode_flags + clang_tsan_cflags
# Add additional flags if we're using instrumented libc++.
# Instrumented libcxx currently not supported on Darwin.
if config.has_libcxx and config.host_os != 'Darwin':
  # FIXME: Dehardcode this path somehow.
  libcxx_path = os.path.join(config.compiler_rt_obj_root, "lib",
                             "tsan", "libcxx_tsan_" + config.target_arch)
  libcxx_incdir = os.path.join(libcxx_path, "include", "c++", "v1")
  libcxx_libdir = os.path.join(libcxx_path, "lib")
  libcxx_so = os.path.join(libcxx_libdir, "libc++.so")
  clang_tsan_cxxflags += ["-std=c++11",
                          "-nostdinc++",
                          "-I%s" % libcxx_incdir,
                          libcxx_so,
                          "-Wl,-rpath=%s" % libcxx_libdir]

def build_invocation(compile_flags):
  return " " + " ".join([config.clang] + compile_flags) + " "

config.substitutions.append( ("%clang_tsan ", build_invocation(clang_tsan_cflags)) )
config.substitutions.append( ("%clangxx_tsan ", build_invocation(clang_tsan_cxxflags)) )

# Define CHECK-%os to check for OS-dependent output.
config.substitutions.append( ('CHECK-%os', ("CHECK-" + config.host_os)))

config.substitutions.append( ("%deflake ", os.path.join(os.path.dirname(__file__), "deflake.bash")) )

# Default test suffixes.
config.suffixes = ['.c', '.cc', '.cpp', '.m', '.mm']

# ThreadSanitizer tests are currently supported on FreeBSD, Linux and Darwin.
if config.host_os not in ['FreeBSD', 'Linux', 'Darwin']:
  config.unsupported = True

# Allow tests to use REQUIRES=stable-runtime.  For use when you cannot use XFAIL
# because the test hangs.
if config.target_arch != 'aarch64':
  config.available_features.add('stable-runtime')
