# -*- Python -*-

import os

def get_required_attr(config, attr_name):
  attr_value = getattr(config, attr_name, None)
  if not attr_value:
    lit.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 = 'MemorySanitizer'

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

def DisplayNoConfigMessage():
  lit.fatal("No site specific configuration available! " +
            "Try running your test from the build tree or running " +
            "make check-msan")

# Figure out LLVM source root.
llvm_src_root = getattr(config, 'llvm_src_root', None)
if llvm_src_root is None:
  # We probably haven't loaded the site-specific configuration: the user
  # is likely trying to run a test file directly, and the site configuration
  # wasn't created by the build system.
  msan_site_cfg = lit.params.get('msan_site_config', None)
  if (msan_site_cfg) and (os.path.exists(msan_site_cfg)):
    lit.load_config(config, msan_site_cfg)
    raise SystemExit

  # Try to guess the location of site-specific configuration using llvm-config
  # util that can point where the build tree is.
  llvm_config = lit.util.which("llvm-config", config.environment["PATH"])
  if not llvm_config:
    DisplayNoConfigMessage()

  # Find out the presumed location of generated site config.
  llvm_obj_root = lit.util.capture(["llvm-config", "--obj-root"]).strip()
  msan_site_cfg = os.path.join(llvm_obj_root, "projects", "compiler-rt",
                               "lib", "msan", "lit_tests", "lit.site.cfg")
  if (not msan_site_cfg) or (not os.path.exists(msan_site_cfg)):
    DisplayNoConfigMessage()

  lit.load_config(config, msan_site_cfg)
  raise SystemExit

# Setup attributes common for all compiler-rt projects.
compiler_rt_src_root = get_required_attr(config, "compiler_rt_src_root")
compiler_rt_lit_cfg = os.path.join(compiler_rt_src_root, "lib",
                                   "lit.common.cfg")
if (not compiler_rt_lit_cfg) or (not os.path.exists(compiler_rt_lit_cfg)):
  lit.fatal("Can't find common compiler-rt lit config at: %r"
            % compiler_rt_lit_cfg)
lit.load_config(config, compiler_rt_lit_cfg)

# Setup default compiler flags used with -fsanitize=memory option.
clang_msan_cflags = ["-fsanitize=memory",
                     "-mno-omit-leaf-frame-pointer",
                     "-fno-omit-frame-pointer",
                     "-fno-optimize-sibling-calls",
                     "-g"]
clang_msan_cxxflags = ["-ccc-cxx "] + clang_msan_cflags
config.substitutions.append( ("%clang_msan ",
                              " ".join([config.clang] + clang_msan_cflags) + 
                              " ") )
config.substitutions.append( ("%clangxx_msan ",
                              " ".join([config.clang] + clang_msan_cxxflags) + 
                              " ") )

# Setup path to external LLVM symbolizer to run MemorySanitizer output tests.
llvm_tools_dir = getattr(config, 'llvm_tools_dir', None)
if llvm_tools_dir:
  llvm_symbolizer_path = os.path.join(llvm_tools_dir, "llvm-symbolizer")
  config.environment['MSAN_SYMBOLIZER_PATH'] = llvm_symbolizer_path

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

# MemorySanitizer tests are currently supported on Linux only.
if config.host_os not in ['Linux']:
  config.unsupported = True
