import lit.formats
import os

config.name = 'cfi' + config.name_suffix
config.suffixes = ['.c', '.cpp', '.test']
config.test_source_root = os.path.dirname(__file__)

clang = ' '.join([config.compile_wrapper, config.clang, config.target_cflags])
clangxx = ' '.join([config.compile_wrapper, config.clang, config.target_cflags] + config.cxx_mode_flags)

config.substitutions.append((r"%clang ", clang + ' '))
config.substitutions.append((r"%clangxx ", clangxx + ' '))
if config.lto_supported:
  clang_cfi = ' '.join(config.lto_launch + [clang] + config.lto_flags + ['-fsanitize=cfi '])

  if config.cfi_lit_test_mode == "Devirt":
    config.available_features.add('devirt')
    clang_cfi += '-fwhole-program-vtables '
    config.substitutions.append((r"%expect_crash_unless_devirt ", ""))
  else:
    config.substitutions.append((r"%expect_crash_unless_devirt ", config.expect_crash))

  cxx = ' '.join(config.cxx_mode_flags) + ' '
  diag = '-fno-sanitize-trap=cfi -fsanitize-recover=cfi '
  non_dso = '-fvisibility=hidden '
  dso = '-fsanitize-cfi-cross-dso -fvisibility=default '
  if config.android:
    dso += '-include ' + config.test_source_root + '/cross-dso/util/cfi_stubs.h '
  config.substitutions.append((r"%clang_cfi ", clang_cfi + non_dso))
  config.substitutions.append((r"%clangxx_cfi ", clang_cfi + cxx + non_dso))
  config.substitutions.append((r"%clang_cfi_diag ", clang_cfi + non_dso + diag))
  config.substitutions.append((r"%clangxx_cfi_diag ", clang_cfi + cxx + non_dso + diag))
  config.substitutions.append((r"%clangxx_cfi_dso ", clang_cfi + cxx + dso))
  config.substitutions.append((r"%clangxx_cfi_dso_diag ", clang_cfi + cxx + dso + diag))
else:
  config.unsupported = True

if config.default_sanitizer_opts:
  config.environment['UBSAN_OPTIONS'] = ':'.join(config.default_sanitizer_opts)

if lit_config.params.get('check_supported', None) and config.unsupported:
  raise BaseException("Tests unsupported")
