diff options
Diffstat (limited to 'test/lit.cfg')
-rw-r--r-- | test/lit.cfg | 206 |
1 files changed, 153 insertions, 53 deletions
diff --git a/test/lit.cfg b/test/lit.cfg index 19daa61a64ff..b5c5628a5806 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -44,7 +44,7 @@ else: config.test_format = lit.formats.ShTest(execute_external) # suffixes: A list of file extensions to treat as test files. -config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s'] +config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s', '.S'] # excludes: A list of directories to exclude from the testsuite. The 'Inputs' # subdirectories contain auxiliary inputs for various tests in their parent @@ -94,10 +94,14 @@ for name in possibly_dangerous_env_vars: # Tweak the PATH to include the tools dir and the scripts dir. if clang_obj_root is not None: + clang_tools_dir = getattr(config, 'clang_tools_dir', None) + if not clang_tools_dir: + lit_config.fatal('No Clang tools dir set!') llvm_tools_dir = getattr(config, 'llvm_tools_dir', None) if not llvm_tools_dir: lit_config.fatal('No LLVM tools dir set!') - path = os.path.pathsep.join((llvm_tools_dir, config.environment['PATH'])) + path = os.path.pathsep.join(( + clang_tools_dir, llvm_tools_dir, config.environment['PATH'])) config.environment['PATH'] = path llvm_libs_dir = getattr(config, 'llvm_libs_dir', None) if not llvm_libs_dir: @@ -111,6 +115,11 @@ for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']: if symbolizer in os.environ: config.environment[symbolizer] = os.environ[symbolizer] +# Propagate options for sanitizers. +for options in ['ASAN_OPTIONS']: + if options in os.environ: + config.environment[options] = os.environ[options] + ### # Check that the object root is known. @@ -191,6 +200,22 @@ config.clang = inferClang(config.environment['PATH']).replace('\\', '/') if not lit_config.quiet: lit_config.note('using clang: %r' % config.clang) +# Plugins (loadable modules) +# TODO: This should be supplied by Makefile or autoconf. +if sys.platform in ['win32', 'cygwin']: + has_plugins = (config.enable_shared == 1) +else: + has_plugins = True + +if has_plugins and config.llvm_plugin_ext: + config.available_features.add('plugins') + +config.substitutions.append( ('%llvmshlibdir', config.llvm_shlib_dir) ) +config.substitutions.append( ('%pluginext', config.llvm_plugin_ext) ) + +if config.clang_examples: + config.available_features.add('examples') + # Note that when substituting %clang_cc1 also fill in the include directory of # the builtin headers. Those are part of even a freestanding environment, but # Clang relies on the driver to locate them. @@ -208,6 +233,31 @@ def getClangBuiltinIncludeDir(clang): # Ensure the result is an ascii string, across Python2.5+ - Python3. return str(dir.decode('ascii')) +def makeItaniumABITriple(triple): + m = re.match(r'(\w+)-(\w+)-(\w+)', triple) + if not m: + lit_config.fatal("Could not turn '%s' into Itanium ABI triple" % triple) + if m.group(3).lower() != 'win32': + # All non-win32 triples use the Itanium ABI. + return triple + return m.group(1) + '-' + m.group(2) + '-mingw32' + +def makeMSABITriple(triple): + m = re.match(r'(\w+)-(\w+)-(\w+)', triple) + if not m: + lit_config.fatal("Could not turn '%s' into MS ABI triple" % triple) + isa = m.group(1).lower() + vendor = m.group(2).lower() + os = m.group(3).lower() + if os == 'win32': + # If the OS is win32, we're done. + return triple + if isa.startswith('x86') or isa == 'amd64' or re.match(r'i\d86', isa): + # For x86 ISAs, adjust the OS. + return isa + '-' + vendor + '-win32' + # -win32 is not supported for non-x86 targets; use a default. + return 'i686-pc-win32' + config.substitutions.append( ('%clang_cc1', '%s -cc1 -internal-isystem %s' % (config.clang, getClangBuiltinIncludeDir(config.clang))) ) @@ -219,6 +269,8 @@ config.substitutions.append( ('%clangxx', ' ' + config.clang + ' --driver-mode=g++ ')) config.substitutions.append( ('%clang', ' ' + config.clang + ' ') ) config.substitutions.append( ('%test_debuginfo', ' ' + config.llvm_src_root + '/utils/test_debuginfo.pl ') ) +config.substitutions.append( ('%itanium_abi_triple', makeItaniumABITriple(config.target_triple)) ) +config.substitutions.append( ('%ms_abi_triple', makeMSABITriple(config.target_triple)) ) # FIXME: Find nicer way to prohibit this. config.substitutions.append( @@ -241,10 +293,51 @@ config.substitutions.append( (' %clang-cl ', """*** invalid substitution, use '%clang_cl'. ***""") ) +# For each occurrence of a clang tool name as its own word, replace it +# with the full path to the build directory holding that tool. This +# ensures that we are testing the tools just built and not some random +# tools that might happen to be in the user's PATH. +tool_dirs = os.path.pathsep.join((clang_tools_dir, llvm_tools_dir)) + +# Regex assertions to reject neighbor hyphens/dots (seen in some tests). +# For example, don't match 'clang-check-' or '.clang-format'. +NoPreHyphenDot = r"(?<!(-|\.))" +NoPostHyphenDot = r"(?!(-|\.))" + +for pattern in [r"\bFileCheck\b", + r"\bc-index-test\b", + NoPreHyphenDot + r"\bclang-check\b" + NoPostHyphenDot, + NoPreHyphenDot + r"\bclang-format\b" + NoPostHyphenDot, + NoPreHyphenDot + r"\bclang-interpreter\b" + NoPostHyphenDot, + # FIXME: Some clang test uses opt? + NoPreHyphenDot + r"\bopt\b" + NoPostHyphenDot, + # Handle these specially as they are strings searched + # for during testing. + r"\| \bcount\b", + r"\| \bnot\b"]: + # Extract the tool name from the pattern. This relies on the tool + # name being surrounded by \b word match operators. If the + # pattern starts with "| ", include it in the string to be + # substituted. + tool_match = re.match(r"^(\\)?((\| )?)\W+b([0-9A-Za-z-_]+)\\b\W*$", + pattern) + tool_pipe = tool_match.group(2) + tool_name = tool_match.group(4) + tool_path = lit.util.which(tool_name, tool_dirs) + if not tool_path: + # Warn, but still provide a substitution. + lit_config.note('Did not find ' + tool_name + ' in ' + tool_dirs) + tool_path = clang_tools_dir + '/' + tool_name + config.substitutions.append((pattern, tool_pipe + tool_path)) + ### # Set available features we allow tests to conditionalize on. # +# Enabled/disabled features +if config.clang_staticanalyzer != 0: + config.available_features.add("staticanalyzer") + # As of 2011.08, crash-recovery tests still do not pass on FreeBSD. if platform.system() not in ['FreeBSD']: config.available_features.add('crash-recovery') @@ -257,12 +350,27 @@ if execute_external: if not platform.system() in ['Windows'] or not execute_external: config.available_features.add('shell-preserves-root') +# For tests that require Darwin to run. +# This is used by debuginfo-tests/*block*.m and debuginfo-tests/foreach.m. +if platform.system() in ['Darwin']: + config.available_features.add('system-darwin') +elif platform.system() in ['Windows']: + # For tests that require Windows to run. + config.available_features.add('system-windows') + # ANSI escape sequences in non-dumb terminal if platform.system() not in ['Windows']: config.available_features.add('ansi-escape-sequences') -# Native compilation: host arch == target arch -if config.host_arch in config.target_triple: +# Capability to print utf8 to the terminal. +# Windows expects codepage, unless Wide API. +if platform.system() not in ['Windows']: + config.available_features.add('utf8-capable-terminal') + +# Native compilation: Check if triples match. +# FIXME: Consider cases that target can be executed +# even if host_triple were different from target_triple. +if config.host_triple == config.target_triple: config.available_features.add("native") # Case-insensitive file system @@ -284,6 +392,14 @@ if is_filesystem_case_insensitive(): if os.path.exists("/dev/fd/0") and sys.platform not in ['cygwin']: config.available_features.add('dev-fd-fs') +# DW2 Target +if not re.match(r'.*-win32$', config.target_triple): + config.available_features.add('dw2') + +# Not set on native MS environment. +if not re.match(r'.*-win32$', config.target_triple): + config.available_features.add('non-ms-sdk') + # [PR8833] LLP64-incompatible tests if not re.match(r'^x86_64.*-(win32|mingw32)$', config.target_triple): config.available_features.add('LP64') @@ -292,40 +408,36 @@ if not re.match(r'^x86_64.*-(win32|mingw32)$', config.target_triple): if not re.match(r'.*-(cygwin|mingw32)$', config.target_triple): config.available_features.add('clang-driver') -# Registered Targets -def get_llc_props(tool): - set_of_targets = set() - enable_assertions = False - - cmd = subprocess.Popen([tool, '-version'], stdout=subprocess.PIPE) - - # Parse the stdout to get the list of registered targets. - parse_targets = False - for line in cmd.stdout: - line = line.decode('ascii') - if parse_targets: - m = re.match( r'(.*) - ', line) - if m is not None: - set_of_targets.add(m.group(1).strip() + '-registered-target') - else: - break - elif "Registered Targets:" in line: - parse_targets = True - - if re.search(r'with assertions', line): - enable_assertions = True - - return {"set_of_targets": set_of_targets, - "enable_assertions": enable_assertions} - -llc_props = get_llc_props(os.path.join(llvm_tools_dir, 'llc')) -if len(llc_props['set_of_targets']) > 0: - config.available_features.update(llc_props['set_of_targets']) -else: - lit_config.fatal('No Targets Registered with the LLVM Tools!') - -if llc_props['enable_assertions']: - config.available_features.add('asserts') +# [PR18856] Depends to remove opened file. On win32, a file could be removed +# only if all handles were closed. +if platform.system() not in ['Windows']: + config.available_features.add('can-remove-opened-file') + +# Returns set of available features, registered-target(s) and asserts. +def get_llvm_config_props(): + set_of_features = set() + + cmd = subprocess.Popen( + [ + os.path.join(llvm_tools_dir, 'llvm-config'), + '--assertion-mode', + '--targets-built', + ], + stdout=subprocess.PIPE + ) + # 1st line corresponds to --assertion-mode, "ON" or "OFF". + line = cmd.stdout.readline().strip().decode('ascii') + if line == "ON": + set_of_features.add('asserts') + + # 2nd line corresponds to --targets-built, like; + # AArch64 ARM CppBackend X86 + for arch in cmd.stdout.readline().decode('ascii').split(): + set_of_features.add(arch.lower() + '-registered-target') + + return set_of_features + +config.available_features.update(get_llvm_config_props()) if lit.util.which('xmllint'): config.available_features.add('xmllint') @@ -333,6 +445,8 @@ if lit.util.which('xmllint'): # Sanitizers. if config.llvm_use_sanitizer == "Address": config.available_features.add("asan") +else: + config.available_features.add("not_asan") if (config.llvm_use_sanitizer == "Memory" or config.llvm_use_sanitizer == "MemoryWithOrigins"): config.available_features.add("msan") @@ -361,18 +475,4 @@ gmalloc_path_str = lit_config.params.get('gmalloc_path', if use_gmalloc: config.environment.update({'DYLD_INSERT_LIBRARIES' : gmalloc_path_str}) -# On Darwin, support relocatable SDKs by providing Clang with a -# default system root path. -if 'darwin' in config.target_triple: - try: - cmd = subprocess.Popen(['xcrun', '--show-sdk-path'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = cmd.communicate() - out = out.strip() - res = cmd.wait() - except OSError: - res = -1 - if res == 0 and out: - sdk_path = out - lit_config.note('using SDKROOT: %r' % sdk_path) - config.environment['SDKROOT'] = sdk_path +lit.util.usePlatformSdkOnDarwin(config, lit_config) |