## 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.llvm_polly_link_into_tools = "@LLVM_POLLY_LINK_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.llvm_polly_link_into_tools == '' or \
   config.llvm_polly_link_into_tools.lower() == '0' or \
   config.llvm_polly_link_into_tools.lower() == 'n' or \
   config.llvm_polly_link_into_tools.lower() == 'no' or \
   config.llvm_polly_link_into_tools.lower() == 'off' or \
   config.llvm_polly_link_into_tools.lower() == 'false' or \
   config.llvm_polly_link_into_tools.lower() == 'notfound' or \
   config.llvm_polly_link_into_tools.lower() == 'llvm_polly_link_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")
