aboutsummaryrefslogtreecommitdiff
path: root/test/lit.cfg
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit.cfg')
-rw-r--r--test/lit.cfg206
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)