# -*- Python -*-

# Common configuration for running leak detection tests under LSan/ASan.

import os

import lit.util

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 LSan+ASan modes.
lsan_lit_test_mode = get_required_attr(config, 'lsan_lit_test_mode')
if lsan_lit_test_mode == "Standalone":
  config.name = "LeakSanitizer-Standalone"
  lsan_cflags = ["-fsanitize=leak"]
elif lsan_lit_test_mode == "AddressSanitizer":
  config.name = "LeakSanitizer-AddressSanitizer"
  lsan_cflags = ["-fsanitize=address"]
  config.available_features.add('asan')
else:
  lit_config.fatal("Unknown LSan test mode: %r" % lsan_lit_test_mode)
config.name += config.name_suffix

if lit.util.which('strace'):
  config.available_features.add('strace')

clang_cflags = ["-O0", config.target_cflags] + config.debug_info_flags
clang_cxxflags = config.cxx_mode_flags + clang_cflags
lsan_incdir = config.test_source_root + "/../"
clang_lsan_cflags = clang_cflags + lsan_cflags + ["-I%s" % lsan_incdir]
clang_lsan_cxxflags = clang_cxxflags + lsan_cflags + ["-I%s" % lsan_incdir]

config.clang_cflags = clang_cflags
config.clang_cxxflags = clang_cxxflags

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

config.substitutions.append( ("%clang ", build_invocation(clang_cflags)) )
config.substitutions.append( ("%clangxx ", build_invocation(clang_cxxflags)) )
config.substitutions.append( ("%clang_lsan ", build_invocation(clang_lsan_cflags)) )
config.substitutions.append( ("%clangxx_lsan ", build_invocation(clang_lsan_cxxflags)) )

# LeakSanitizer tests are currently supported on x86-64 Linux and mips64 Linux only.
if config.host_os not in ['Linux'] or config.host_arch not in ['x86_64', 'mips64']:
  config.unsupported = True

config.suffixes = ['.c', '.cc', '.cpp']
