blob: f7eb7319b9e93668b4e0d12756228231a214fc5b [file] [log] [blame]
Daniel Dunbar1db467f2009-07-31 05:54:17 +00001# -*- Python -*-
2
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +00003import os
Daniel Dunbarb850ddd2009-09-22 10:08:03 +00004import platform
Chandler Carruthb40fd3f2011-11-05 20:55:50 +00005import re
6import subprocess
Argyrios Kyrtzidis4182ed62012-10-31 20:59:50 +00007import tempfile
Chandler Carruthb40fd3f2011-11-05 20:55:50 +00008
Daniel Dunbar724827f2009-09-08 16:39:23 +00009
Daniel Dunbar1db467f2009-07-31 05:54:17 +000010# Configuration file for the 'lit' test runner.
11
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000012# name: The name of this test suite.
13config.name = 'Clang'
Daniel Dunbar724827f2009-09-08 16:39:23 +000014
NAKAMURA Takumi98af1ac2011-02-09 04:19:57 +000015# Tweak PATH for Win32
16if platform.system() == 'Windows':
17 # Seek sane tools in directories and set to $PATH.
18 path = getattr(config, 'lit_tools_dir', None)
19 path = lit.getToolsPath(path,
20 config.environment['PATH'],
21 ['cmp.exe', 'grep.exe', 'sed.exe'])
22 if path is not None:
23 path = os.path.pathsep.join((path,
24 config.environment['PATH']))
25 config.environment['PATH'] = path
26
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000027# testFormat: The test format to use to interpret tests.
Daniel Dunbar1db467f2009-07-31 05:54:17 +000028#
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000029# For now we require '&&' between commands, until they get globally killed and
30# the test runner updated.
NAKAMURA Takumi9085e6f2011-03-05 11:16:06 +000031execute_external = (platform.system() != 'Windows'
32 or lit.getBashPath() not in [None, ""])
Daniel Dunbarbc20ef32009-11-08 01:47:35 +000033config.test_format = lit.formats.ShTest(execute_external)
Daniel Dunbar6827f3f2009-09-06 01:31:12 +000034
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000035# suffixes: A list of file extensions to treat as test files.
Jim Grosbachfc308292012-02-10 20:37:10 +000036config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s']
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000037
38# test_source_root: The root path where tests are located.
39config.test_source_root = os.path.dirname(__file__)
40
41# test_exec_root: The root path where tests should be run.
42clang_obj_root = getattr(config, 'clang_obj_root', None)
43if clang_obj_root is not None:
44 config.test_exec_root = os.path.join(clang_obj_root, 'test')
45
46# Set llvm_{src,obj}_root for use by others.
47config.llvm_src_root = getattr(config, 'llvm_src_root', None)
48config.llvm_obj_root = getattr(config, 'llvm_obj_root', None)
49
Jordy Rose40f45ee2012-04-06 18:14:01 +000050# Clear some environment variables that might affect Clang.
51#
52# This first set of vars are read by Clang, but shouldn't affect tests
53# that aren't specifically looking for these features, or are required
54# simply to run the tests at all.
55#
56# FIXME: Should we have a tool that enforces this?
57
58# safe_env_vars = ('TMPDIR', 'TEMP', 'TMP', 'USERPROFILE', 'PWD',
59# 'MACOSX_DEPLOYMENT_TARGET', 'IPHONEOS_DEPLOYMENT_TARGET',
60# 'IOS_SIMULATOR_DEPLOYMENT_TARGET',
61# 'VCINSTALLDIR', 'VC100COMNTOOLS', 'VC90COMNTOOLS',
62# 'VC80COMNTOOLS')
NAKAMURA Takumi79c5f952012-04-07 01:02:53 +000063possibly_dangerous_env_vars = ['COMPILER_PATH', 'RC_DEBUG_OPTIONS',
Jordy Rose40f45ee2012-04-06 18:14:01 +000064 'CINDEXTEST_PREAMBLE_FILE', 'LIBRARY_PATH',
65 'CPATH', 'C_INCLUDE_PATH', 'CPLUS_INCLUDE_PATH',
66 'OBJC_INCLUDE_PATH', 'OBJCPLUS_INCLUDE_PATH',
67 'LIBCLANG_TIMING', 'LIBCLANG_OBJTRACKING',
68 'LIBCLANG_LOGGING', 'LIBCLANG_BGPRIO_INDEX',
69 'LIBCLANG_BGPRIO_EDIT', 'LIBCLANG_NOTHREADS',
70 'LIBCLANG_RESOURCE_USAGE',
NAKAMURA Takumi79c5f952012-04-07 01:02:53 +000071 'LIBCLANG_CODE_COMPLETION_LOGGING']
72# Clang/Win32 may refer to %INCLUDE%. vsvarsall.bat sets it.
73if platform.system() != 'Windows':
74 possibly_dangerous_env_vars.append('INCLUDE')
Jordy Rose40f45ee2012-04-06 18:14:01 +000075for name in possibly_dangerous_env_vars:
76 if name in config.environment:
77 del config.environment[name]
78
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000079# Tweak the PATH to include the tools dir and the scripts dir.
80if clang_obj_root is not None:
81 llvm_tools_dir = getattr(config, 'llvm_tools_dir', None)
82 if not llvm_tools_dir:
83 lit.fatal('No LLVM tools dir set!')
Daniel Dunbaree45d6d2009-09-24 06:31:08 +000084 path = os.path.pathsep.join((llvm_tools_dir, config.environment['PATH']))
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000085 config.environment['PATH'] = path
Alexey Samsonove310b1a2013-03-15 07:29:58 +000086 # Setup paths to llvm-symbolizer for Sanitizer tools.
87 llvm_symbolizer_path = os.path.join(llvm_tools_dir, 'llvm-symbolizer')
88 config.environment['ASAN_SYMBOLIZER_PATH'] = llvm_symbolizer_path
89 config.environment['MSAN_SYMBOLIZER_PATH'] = llvm_symbolizer_path
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000090
Daniel Dunbar9e10cc72009-09-26 07:36:09 +000091 llvm_libs_dir = getattr(config, 'llvm_libs_dir', None)
92 if not llvm_libs_dir:
93 lit.fatal('No LLVM libs dir set!')
94 path = os.path.pathsep.join((llvm_libs_dir,
95 config.environment.get('LD_LIBRARY_PATH','')))
96 config.environment['LD_LIBRARY_PATH'] = path
97
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +000098###
99
100# Check that the object root is known.
101if config.test_exec_root is None:
102 # Otherwise, we haven't loaded the site specific configuration (the user is
103 # probably trying to run on a test file directly, and either the site
104 # configuration hasn't been created by the build system, or we are in an
105 # out-of-tree build situation).
106
Daniel Dunbarb258d8f2009-11-05 16:36:19 +0000107 # Check for 'clang_site_config' user parameter, and use that if available.
108 site_cfg = lit.params.get('clang_site_config', None)
109 if site_cfg and os.path.exists(site_cfg):
110 lit.load_config(config, site_cfg)
111 raise SystemExit
112
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +0000113 # Try to detect the situation where we are using an out-of-tree build by
114 # looking for 'llvm-config'.
115 #
116 # FIXME: I debated (i.e., wrote and threw away) adding logic to
117 # automagically generate the lit.site.cfg if we are in some kind of fresh
Daniel Dunbar23354212009-11-07 23:53:17 +0000118 # build situation. This means knowing how to invoke the build system though,
119 # and I decided it was too much magic. We should solve this by just having
120 # the .cfg files generated during the configuration step.
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +0000121
122 llvm_config = lit.util.which('llvm-config', config.environment['PATH'])
123 if not llvm_config:
124 lit.fatal('No site specific configuration available!')
125
126 # Get the source and object roots.
127 llvm_src_root = lit.util.capture(['llvm-config', '--src-root']).strip()
128 llvm_obj_root = lit.util.capture(['llvm-config', '--obj-root']).strip()
129 clang_src_root = os.path.join(llvm_src_root, "tools", "clang")
130 clang_obj_root = os.path.join(llvm_obj_root, "tools", "clang")
131
132 # Validate that we got a tree which points to here, using the standard
133 # tools/clang layout.
134 this_src_root = os.path.dirname(config.test_source_root)
135 if os.path.realpath(clang_src_root) != os.path.realpath(this_src_root):
136 lit.fatal('No site specific configuration available!')
137
138 # Check that the site specific configuration exists.
139 site_cfg = os.path.join(clang_obj_root, 'test', 'lit.site.cfg')
140 if not os.path.exists(site_cfg):
Nico Weberb4a88ef2010-09-27 20:40:32 +0000141 lit.fatal('No site specific configuration available! You may need to '
142 'run "make test" in your Clang build directory.')
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +0000143
144 # Okay, that worked. Notify the user of the automagic, and reconfigure.
145 lit.note('using out-of-tree build at %r' % clang_obj_root)
146 lit.load_config(config, site_cfg)
147 raise SystemExit
148
149###
150
151# Discover the 'clang' and 'clangcc' to use.
152
153import os
154
155def inferClang(PATH):
156 # Determine which clang to use.
157 clang = os.getenv('CLANG')
158
159 # If the user set clang in the environment, definitely use that and don't
160 # try to validate.
161 if clang:
162 return clang
163
164 # Otherwise look in the path.
165 clang = lit.util.which('clang', PATH)
166
167 if not clang:
168 lit.fatal("couldn't find 'clang' program, try setting "
169 "CLANG in your environment")
170
171 return clang
172
NAKAMURA Takumi9085e6f2011-03-05 11:16:06 +0000173config.clang = inferClang(config.environment['PATH']).replace('\\', '/')
Daniel Dunbar5e01e3c2009-09-22 05:16:02 +0000174if not lit.quiet:
175 lit.note('using clang: %r' % config.clang)
Chandler Carruth044a790c2011-11-05 10:15:27 +0000176
177# Note that when substituting %clang_cc1 also fill in the include directory of
178# the builtin headers. Those are part of even a freestanding environment, but
179# Clang relies on the driver to locate them.
Chandler Carruthdf0a4c32011-11-05 23:29:28 +0000180def getClangBuiltinIncludeDir(clang):
Chandler Carruthb40fd3f2011-11-05 20:55:50 +0000181 # FIXME: Rather than just getting the version, we should have clang print
182 # out its resource dir here in an easy to scrape form.
Chandler Carruthdf0a4c32011-11-05 23:29:28 +0000183 cmd = subprocess.Popen([clang, '-print-file-name=include'],
184 stdout=subprocess.PIPE)
185 if not cmd.stdout:
186 lit.fatal("Couldn't find the include dir for Clang ('%s')" % clang)
187 return cmd.stdout.read().strip()
Chandler Carruthb40fd3f2011-11-05 20:55:50 +0000188
Chandler Carruth07643082011-11-07 09:17:31 +0000189config.substitutions.append( ('%clang_cc1', '%s -cc1 -internal-isystem %s'
Chandler Carruthdf0a4c32011-11-05 23:29:28 +0000190 % (config.clang,
191 getClangBuiltinIncludeDir(config.clang))) )
Chandler Carruth044a790c2011-11-05 10:15:27 +0000192
Daniel Dunbar9fde9c42010-06-29 16:52:24 +0000193config.substitutions.append( ('%clangxx', ' ' + config.clang +
Rafael Espindolad2d4d682012-10-30 00:13:16 +0000194 ' -ccc-cxx '))
Daniel Dunbar80737ad2009-12-15 22:01:24 +0000195config.substitutions.append( ('%clang', ' ' + config.clang + ' ') )
Devang Patel8c6b9132010-09-13 20:46:23 +0000196config.substitutions.append( ('%test_debuginfo', ' ' + config.llvm_src_root + '/utils/test_debuginfo.pl ') )
Daniel Dunbara5728872009-12-15 20:14:24 +0000197
Daniel Dunbar80737ad2009-12-15 22:01:24 +0000198# FIXME: Find nicer way to prohibit this.
199config.substitutions.append(
200 (' clang ', """*** Do not use 'clang' in tests, use '%clang'. ***""") )
201config.substitutions.append(
David Greene431feb52011-01-03 17:28:52 +0000202 (' clang\+\+ ', """*** Do not use 'clang++' in tests, use '%clangxx'. ***"""))
Daniel Dunbar679d6052010-02-17 20:31:01 +0000203config.substitutions.append(
Daniel Dunbar80737ad2009-12-15 22:01:24 +0000204 (' clang-cc ',
205 """*** Do not use 'clang-cc' in tests, use '%clang_cc1'. ***""") )
206config.substitutions.append(
207 (' clang -cc1 ',
208 """*** Do not use 'clang -cc1' in tests, use '%clang_cc1'. ***""") )
Daniel Dunbar9fde9c42010-06-29 16:52:24 +0000209config.substitutions.append(
210 (' %clang-cc1 ',
211 """*** invalid substitution, use '%clang_cc1'. ***""") )
Daniel Dunbardb918642010-08-24 21:39:55 +0000212
213###
214
215# Set available features we allow tests to conditionalize on.
Andrew Trick6da28e22011-08-26 22:46:31 +0000216#
217# As of 2011.08, crash-recovery tests still do not pass on FreeBSD.
218if platform.system() not in ['FreeBSD']:
219 config.available_features.add('crash-recovery')
NAKAMURA Takumief34d772011-02-28 09:41:07 +0000220
221# Shell execution
222if platform.system() not in ['Windows'] or lit.getBashPath() != '':
223 config.available_features.add('shell')
Galina Kistanovaee226972011-06-03 18:36:30 +0000224
NAKAMURA Takumi05a10ff2013-01-16 06:10:16 +0000225# Exclude MSYS due to transforming '/' to 'X:/mingwroot/'.
226if not platform.system() in ['Windows'] or lit.getBashPath() == '':
227 config.available_features.add('shell-preserves-root')
228
Alexander Potapenko087c65f2012-09-20 10:10:01 +0000229# For tests that require Darwin to run.
230if platform.system() in ['Darwin']:
231 config.available_features.add('system-darwin')
232
NAKAMURA Takumi5e3d24c2012-09-12 10:38:03 +0000233# ANSI escape sequences in non-dumb terminal
NAKAMURA Takumi0ca4be32012-07-11 11:44:00 +0000234if platform.system() not in ['Windows']:
235 config.available_features.add('ansi-escape-sequences')
236
Argyrios Kyrtzidis4182ed62012-10-31 20:59:50 +0000237# Case-insensitive file system
238def is_filesystem_case_insensitive():
Argyrios Kyrtzidisb2ed96a2012-11-01 00:59:15 +0000239 handle, path = tempfile.mkstemp(prefix='case-test', dir=config.test_exec_root)
Argyrios Kyrtzidis4182ed62012-10-31 20:59:50 +0000240 isInsensitive = os.path.exists(path.upper())
241 os.close(handle)
242 os.remove(path)
243 return isInsensitive
244
245if is_filesystem_case_insensitive():
246 config.available_features.add('case-insensitive-filesystem')
247
Daniel Dunbar0b95bd02012-11-15 20:06:10 +0000248# Tests that require the /dev/fd filesystem.
NAKAMURA Takumi93308b92012-11-27 05:25:41 +0000249if os.path.exists("/dev/fd/0") and sys.platform not in ['cygwin']:
Daniel Dunbar0b95bd02012-11-15 20:06:10 +0000250 config.available_features.add('dev-fd-fs')
251
NAKAMURA Takumib774d732012-09-12 10:45:40 +0000252# [PR8833] LLP64-incompatible tests
253if not re.match(r'^x86_64.*-(win32|mingw32)$', config.target_triple):
254 config.available_features.add('LP64')
255
NAKAMURA Takumi5e4ccb42012-12-11 07:06:09 +0000256# [PR12920] "clang-driver" -- set if gcc driver is not used.
257if not re.match(r'.*-(cygwin|mingw32)$', config.target_triple):
258 config.available_features.add('clang-driver')
259
Galina Kistanovaee226972011-06-03 18:36:30 +0000260# Registered Targets
NAKAMURA Takumi60796762011-11-28 05:09:42 +0000261def get_llc_props(tool):
Galina Kistanovaee226972011-06-03 18:36:30 +0000262 set_of_targets = set()
NAKAMURA Takumi60796762011-11-28 05:09:42 +0000263 enable_assertions = False
Galina Kistanovaee226972011-06-03 18:36:30 +0000264
265 cmd = subprocess.Popen([tool, '-version'], stdout=subprocess.PIPE)
266
267 # Parse the stdout to get the list of registered targets.
268 parse_targets = False
269 for line in cmd.stdout:
270 if parse_targets:
271 m = re.match( r'(.*) - ', line)
272 if m is not None:
273 set_of_targets.add(m.group(1).strip() + '-registered-target')
274 else:
275 break
276 elif "Registered Targets:" in line:
277 parse_targets = True
278
NAKAMURA Takumi60796762011-11-28 05:09:42 +0000279 if re.search(r'with assertions', line):
280 enable_assertions = True
Galina Kistanovaee226972011-06-03 18:36:30 +0000281
NAKAMURA Takumi60796762011-11-28 05:09:42 +0000282 return {"set_of_targets": set_of_targets,
283 "enable_assertions": enable_assertions}
284
285llc_props = get_llc_props(os.path.join(llvm_tools_dir, 'llc'))
286if len(llc_props['set_of_targets']) > 0:
287 config.available_features.update(llc_props['set_of_targets'])
Galina Kistanovaee226972011-06-03 18:36:30 +0000288else:
289 lit.fatal('No Targets Registered with the LLVM Tools!')
NAKAMURA Takumi60796762011-11-28 05:09:42 +0000290
291if llc_props['enable_assertions']:
292 config.available_features.add('asserts')
Dmitri Gribenkof303d4c2012-08-07 17:54:38 +0000293
294if lit.util.which('xmllint'):
295 config.available_features.add('xmllint')
296