## Autogenerated by LLVM/Polly configuration.
# Do not edit!
config.llvm_src_root = "@LLVM_SOURCE_DIR@"
config.llvm_obj_root = "@LLVM_BINARY_DIR@"
config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
config.llvm_libs_dir = "@LLVM_LIBS_DIR@"
config.polly_obj_root = "@POLLY_BINARY_DIR@"
config.polly_lib_dir = "@POLLY_LIB_DIR@"
config.target_triple = "@TARGET_TRIPLE@"
config.enable_gpgpu_codegen = "@GPU_CODEGEN@"
config.link_polly_into_tools = "@LINK_POLLY_INTO_TOOLS@"
config.targets_to_build = "@TARGETS_TO_BUILD@"
config.extra_paths = "@POLLY_TEST_EXTRA_PATHS@".split(";")

## Check the current platform with regex
import re
EAT_ERR_ON_X86 = ' '
if (re.match(r'^x86_64*', '@TARGET_TRIPLE@') == None) :
  EAT_ERR_ON_X86 = '|| echo \"error is eaten\"'

for arch in config.targets_to_build.split():
    config.available_features.add(arch.lower() + '-registered-target')

# Support substitution of the tools and libs dirs with user parameters. This is
# used when we can't determine the tool dir at configuration time.
try:
    config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params
    config.llvm_libs_dir = config.llvm_libs_dir % lit_config.params
except KeyError:
    e = sys.exc_info()[1]
    key, = e.args
    lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key))

# excludes: A list of directories to exclude from the testsuite. The 'Inputs'
# subdirectories contain auxiliary inputs for various tests in their parent
# directories.
config.excludes = ['Inputs']

if config.link_polly_into_tools == '' or \
   config.link_polly_into_tools.lower() == '0' or \
   config.link_polly_into_tools.lower() == 'n' or \
   config.link_polly_into_tools.lower() == 'no' or \
   config.link_polly_into_tools.lower() == 'off' or \
   config.link_polly_into_tools.lower() == 'false' or \
   config.link_polly_into_tools.lower() == 'notfound' or \
   config.link_polly_into_tools.lower() == 'link_polly_into_tools-notfound':
    config.substitutions.append(('%loadPolly', '-load '
                                 + config.polly_lib_dir + '/LLVMPolly@LLVM_SHLIBEXT@'
                                 + ' -load-pass-plugin '
                                 + config.polly_lib_dir + '/LLVMPolly@LLVM_SHLIBEXT@'
                                 + ' -polly-process-unprofitable '
                                 + ' -polly-remarks-minimal '
                                 + ' -polly-use-llvm-names '
                                 + ' -polly-import-jscop-dir=%S '
                                 + ' -polly-codegen-verify '
                                 ))
else:
    config.substitutions.append(('%loadPolly', ''
                                 + ' -polly-process-unprofitable '
                                 + ' -polly-remarks-minimal '
                                 + ' -polly-use-llvm-names '
                                 + ' -polly-import-jscop-dir=%S '
                                 + ' -polly-codegen-verify '
                                 ))

if config.enable_gpgpu_codegen == 'TRUE' :
    config.available_features.add('pollyacc')

# Let the main config do the real work.
lit_config.load_config(config, "@POLLY_SOURCE_DIR@/test/lit.cfg")
