# -*- Python -*-

import os

def get_required_attr(config, attr_name):
  attr_value = getattr(config, attr_name, None)
  if attr_value == None:
    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 source root.
config.test_source_root = os.path.dirname(__file__)

# Choose between standalone and UBSan+ASan modes.
ubsan_lit_test_mode = get_required_attr(config, 'ubsan_lit_test_mode')
if ubsan_lit_test_mode == "Standalone":
  config.name = 'UBSan-Standalone-' + config.target_arch
  config.available_features.add("ubsan-standalone")
  clang_ubsan_cflags = []
elif ubsan_lit_test_mode == "AddressSanitizer":
  config.name = 'UBSan-ASan-' + config.target_arch
  config.available_features.add("ubsan-asan")
  clang_ubsan_cflags = ["-fsanitize=address"]
  config.environment['ASAN_OPTIONS'] = 'detect_leaks=0'
elif ubsan_lit_test_mode == "MemorySanitizer":
  config.name = 'UBSan-MSan-' + config.target_arch
  config.available_features.add("ubsan-msan")
  clang_ubsan_cflags = ["-fsanitize=memory"]
elif ubsan_lit_test_mode == "ThreadSanitizer":
  config.name = 'UBSan-TSan-' + config.target_arch
  config.available_features.add("ubsan-tsan")
  clang_ubsan_cflags = ["-fsanitize=thread"]
else:
  lit_config.fatal("Unknown UBSan test mode: %r" % ubsan_lit_test_mode)

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

target_cflags = [get_required_attr(config, "target_cflags")]
clang_ubsan_cflags += target_cflags
clang_ubsan_cxxflags = config.cxx_mode_flags + clang_ubsan_cflags

# Define %clang and %clangxx substitutions to use in test RUN lines.
config.substitutions.append( ("%clang ", build_invocation(clang_ubsan_cflags)) )
config.substitutions.append( ("%clangxx ", build_invocation(clang_ubsan_cxxflags)) )

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

# Check that the host supports UndefinedBehaviorSanitizer tests
if config.host_os not in ['Linux', 'Darwin', 'FreeBSD']:
  config.unsupported = True

# Allow tests to use REQUIRES=stable-runtime.  For use when you cannot use XFAIL
# because the test hangs or fails on one configuration and not the other.
if config.target_arch.startswith('arm') == False:
  config.available_features.add('stable-runtime')
