blob: 34875b0fecd6b8a4718837241bb4dbc0857800c0 [file] [log] [blame]
Daniel Dunbar62b94392013-02-12 19:28:51 +00001# -*- Python -*- vim: set syntax=python tabstop=4 expandtab cc=80:
Daniel Dunbar42ea4632010-09-15 03:57:04 +00002
3# Configuration file for the 'lit' test runner.
4
Daniel Dunbarb6b3e502013-08-30 19:52:12 +00005import errno
Dan Alberta85b27f2014-08-04 18:44:48 +00006import locale
Daniel Dunbar42ea4632010-09-15 03:57:04 +00007import os
8import platform
Daniel Dunbarb6b3e502013-08-30 19:52:12 +00009import re
10import shlex
Daniel Dunbar42ea4632010-09-15 03:57:04 +000011import signal
12import subprocess
Daniel Dunbarb6b3e502013-08-30 19:52:12 +000013import sys
14import tempfile
Howard Hinnant3778f272013-01-14 17:12:54 +000015import time
Daniel Dunbar42ea4632010-09-15 03:57:04 +000016
Daniel Dunbar4a381292013-08-09 14:44:11 +000017import lit.Test
18import lit.formats
19import lit.util
20
Daniel Dunbar42ea4632010-09-15 03:57:04 +000021class LibcxxTestFormat(lit.formats.FileBasedTest):
22 """
23 Custom test format handler for use with the test format use by libc++.
24
25 Tests fall into two categories:
26 FOO.pass.cpp - Executable test which should compile, run, and exit with
27 code 0.
28 FOO.fail.cpp - Negative test case which is expected to fail compilation.
29 """
30
Justin Bogner33a2a2e2014-09-03 04:32:08 +000031 def __init__(self, cxx_under_test, use_verify_for_fail,
32 cpp_flags, ld_flags, exec_env):
Daniel Dunbarbc9a8482010-09-15 04:11:29 +000033 self.cxx_under_test = cxx_under_test
Justin Bogner33a2a2e2014-09-03 04:32:08 +000034 self.use_verify_for_fail = use_verify_for_fail
Daniel Dunbar5f09d9e02010-09-15 04:31:58 +000035 self.cpp_flags = list(cpp_flags)
36 self.ld_flags = list(ld_flags)
Daniel Dunbar84958712013-02-05 18:03:49 +000037 self.exec_env = dict(exec_env)
Daniel Dunbar42ea4632010-09-15 03:57:04 +000038
Howard Hinnant3778f272013-01-14 17:12:54 +000039 def execute_command(self, command, in_dir=None):
40 kwargs = {
41 'stdin' :subprocess.PIPE,
42 'stdout':subprocess.PIPE,
43 'stderr':subprocess.PIPE,
44 }
45 if in_dir:
46 kwargs['cwd'] = in_dir
47 p = subprocess.Popen(command, **kwargs)
Daniel Dunbar42ea4632010-09-15 03:57:04 +000048 out,err = p.communicate()
49 exitCode = p.wait()
50
51 # Detect Ctrl-C in subprocess.
52 if exitCode == -signal.SIGINT:
53 raise KeyboardInterrupt
54
55 return out, err, exitCode
56
57 def execute(self, test, lit_config):
Howard Hinnant3778f272013-01-14 17:12:54 +000058 while True:
59 try:
60 return self._execute(test, lit_config)
61 except OSError, oe:
62 if oe.errno != errno.ETXTBSY:
63 raise
64 time.sleep(0.1)
65
66 def _execute(self, test, lit_config):
Daniel Dunbarf51f0312013-02-05 21:03:25 +000067 # Extract test metadata from the test file.
Daniel Dunbarf51f0312013-02-05 21:03:25 +000068 requires = []
Eric Fiselier339bdc32014-08-18 06:43:06 +000069 unsupported = []
Justin Bogner2cfd1fe2014-09-03 06:01:52 +000070 use_verify = False
Daniel Dunbarf51f0312013-02-05 21:03:25 +000071 with open(test.getSourcePath()) as f:
72 for ln in f:
73 if 'XFAIL:' in ln:
74 items = ln[ln.index('XFAIL:') + 6:].split(',')
Daniel Dunbar019c5902013-08-21 23:06:32 +000075 test.xfails.extend([s.strip() for s in items])
Daniel Dunbarf51f0312013-02-05 21:03:25 +000076 elif 'REQUIRES:' in ln:
77 items = ln[ln.index('REQUIRES:') + 9:].split(',')
78 requires.extend([s.strip() for s in items])
Eric Fiselier339bdc32014-08-18 06:43:06 +000079 elif 'UNSUPPORTED:' in ln:
80 items = ln[ln.index('UNSUPPORTED:') + 12:].split(',')
81 unsupported.extend([s.strip() for s in items])
Justin Bogner2cfd1fe2014-09-03 06:01:52 +000082 elif 'USE_VERIFY' in ln and self.use_verify_for_fail:
83 use_verify = True
Eric Fiselier993dfb12014-07-31 22:56:52 +000084 elif not ln.strip().startswith("//") and ln.strip():
Daniel Dunbarf51f0312013-02-05 21:03:25 +000085 # Stop at the first non-empty line that is not a C++
86 # comment.
87 break
88
89 # Check that we have the required features.
90 #
91 # FIXME: For now, this is cribbed from lit.TestRunner, to avoid
92 # introducing a dependency there. What we more ideally would like to do
Daniel Dunbar019c5902013-08-21 23:06:32 +000093 # is lift the "requires" handling to be a core lit framework feature.
Daniel Dunbarf51f0312013-02-05 21:03:25 +000094 missing_required_features = [f for f in requires
95 if f not in test.config.available_features]
96 if missing_required_features:
97 return (lit.Test.UNSUPPORTED,
98 "Test requires the following features: %s" % (
99 ', '.join(missing_required_features),))
100
Eric Fiselier339bdc32014-08-18 06:43:06 +0000101 unsupported_features = [f for f in unsupported
102 if f in test.config.available_features]
103 if unsupported_features:
104 return (lit.Test.UNSUPPORTED,
105 "Test is unsupported with the following features: %s" % (
106 ', '.join(unsupported_features),))
107
Daniel Dunbarf51f0312013-02-05 21:03:25 +0000108 # Evaluate the test.
Justin Bogner2cfd1fe2014-09-03 06:01:52 +0000109 return self._evaluate_test(test, use_verify, lit_config)
Daniel Dunbarf51f0312013-02-05 21:03:25 +0000110
Justin Bogner2cfd1fe2014-09-03 06:01:52 +0000111 def _evaluate_test(self, test, use_verify, lit_config):
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000112 name = test.path_in_suite[-1]
113 source_path = test.getSourcePath()
Howard Hinnant3778f272013-01-14 17:12:54 +0000114 source_dir = os.path.dirname(source_path)
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000115
116 # Check what kind of test this is.
117 assert name.endswith('.pass.cpp') or name.endswith('.fail.cpp')
118 expected_compile_fail = name.endswith('.fail.cpp')
119
120 # If this is a compile (failure) test, build it and check for failure.
121 if expected_compile_fail:
122 cmd = [self.cxx_under_test, '-c',
Daniel Dunbar5f09d9e02010-09-15 04:31:58 +0000123 '-o', '/dev/null', source_path] + self.cpp_flags
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000124 expected_rc = 1
Justin Bogner2cfd1fe2014-09-03 06:01:52 +0000125 if use_verify:
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000126 cmd += ['-Xclang', '-verify']
127 expected_rc = 0
128 out, err, rc = self.execute_command(cmd)
129 if rc == expected_rc:
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000130 return lit.Test.PASS, ""
131 else:
132 report = """Command: %s\n""" % ' '.join(["'%s'" % a
133 for a in cmd])
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000134 report += """Exit Code: %d\n""" % rc
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000135 if out:
136 report += """Standard Output:\n--\n%s--""" % out
137 if err:
138 report += """Standard Error:\n--\n%s--""" % err
139 report += "\n\nExpected compilation to fail!"
Daniel Dunbar5f09d9e02010-09-15 04:31:58 +0000140 return lit.Test.FAIL, report
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000141 else:
142 exec_file = tempfile.NamedTemporaryFile(suffix="exe", delete=False)
143 exec_path = exec_file.name
144 exec_file.close()
145
146 try:
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000147 compile_cmd = [self.cxx_under_test, '-o', exec_path,
Daniel Dunbar5f09d9e02010-09-15 04:31:58 +0000148 source_path] + self.cpp_flags + self.ld_flags
Michael J. Spencerf5799be2010-12-10 19:47:54 +0000149 cmd = compile_cmd
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000150 out, err, exitCode = self.execute_command(cmd)
151 if exitCode != 0:
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000152 report = """Command: %s\n""" % ' '.join(["'%s'" % a
153 for a in cmd])
154 report += """Exit Code: %d\n""" % exitCode
155 if out:
156 report += """Standard Output:\n--\n%s--""" % out
157 if err:
158 report += """Standard Error:\n--\n%s--""" % err
159 report += "\n\nCompilation failed unexpectedly!"
160 return lit.Test.FAIL, report
161
Daniel Dunbar84958712013-02-05 18:03:49 +0000162 cmd = []
163 if self.exec_env:
164 cmd.append('env')
165 cmd.extend('%s=%s' % (name, value)
166 for name,value in self.exec_env.items())
167 cmd.append(exec_path)
Howard Hinnantc1a45fb2012-08-02 18:36:47 +0000168 if lit_config.useValgrind:
169 cmd = lit_config.valgrindArgs + cmd
Howard Hinnant3778f272013-01-14 17:12:54 +0000170 out, err, exitCode = self.execute_command(cmd, source_dir)
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000171 if exitCode != 0:
Daniel Dunbar62b94392013-02-12 19:28:51 +0000172 report = """Compiled With: %s\n""" % \
173 ' '.join(["'%s'" % a for a in compile_cmd])
174 report += """Command: %s\n""" % \
175 ' '.join(["'%s'" % a for a in cmd])
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000176 report += """Exit Code: %d\n""" % exitCode
177 if out:
178 report += """Standard Output:\n--\n%s--""" % out
179 if err:
180 report += """Standard Error:\n--\n%s--""" % err
181 report += "\n\nCompiled test failed unexpectedly!"
182 return lit.Test.FAIL, report
183 finally:
184 try:
185 os.remove(exec_path)
186 except:
187 pass
188 return lit.Test.PASS, ""
189
Dan Albertae2526b2014-08-21 17:30:44 +0000190
191class Configuration(object):
192 def __init__(self, lit_config, config):
193 self.lit_config = lit_config
194 self.config = config
195 self.cxx = None
196 self.src_root = None
197 self.obj_root = None
198 self.env = {}
199 self.compile_flags = []
Eric Fiselier6f9da552014-10-18 01:15:17 +0000200 self.library_paths = []
Dan Albertae2526b2014-08-21 17:30:44 +0000201 self.link_flags = []
202 self.use_system_lib = False
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000203 self.use_clang_verify = False
Dan Albertae2526b2014-08-21 17:30:44 +0000204
205 if platform.system() not in ('Darwin', 'FreeBSD', 'Linux'):
206 self.lit_config.fatal("unrecognized system")
207
208 def get_lit_conf(self, name, default=None):
209 val = self.lit_config.params.get(name, None)
210 if val is None:
211 val = getattr(self.config, name, None)
212 if val is None:
213 val = default
214 return val
215
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000216 def get_lit_bool(self, name):
217 conf = self.get_lit_conf(name)
218 if conf is None:
219 return None
220 if conf.lower() in ('1', 'true'):
221 return True
222 if conf.lower() in ('', '0', 'false'):
223 return False
224 self.lit_config.fatal(
225 "parameter '{}' should be true or false".format(name))
226
Dan Albertae2526b2014-08-21 17:30:44 +0000227 def configure(self):
228 self.configure_cxx()
229 self.configure_triple()
230 self.configure_src_root()
231 self.configure_obj_root()
232 self.configure_use_system_lib()
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000233 self.configure_use_clang_verify()
Dan Albertae2526b2014-08-21 17:30:44 +0000234 self.configure_env()
235 self.configure_std_flag()
236 self.configure_compile_flags()
237 self.configure_link_flags()
238 self.configure_sanitizer()
239 self.configure_features()
240
241 def get_test_format(self):
242 return LibcxxTestFormat(
243 self.cxx,
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000244 self.use_clang_verify,
Dan Albertae2526b2014-08-21 17:30:44 +0000245 cpp_flags=['-nostdinc++'] + self.compile_flags,
246 ld_flags=['-nodefaultlibs'] + self.link_flags,
247 exec_env=self.env)
248
249 def configure_cxx(self):
250 # Gather various compiler parameters.
251 self.cxx = self.get_lit_conf('cxx_under_test')
252
253 # If no specific cxx_under_test was given, attempt to infer it as
254 # clang++.
255 if self.cxx is None:
256 clangxx = lit.util.which('clang++',
257 self.config.environment['PATH'])
258 if clangxx:
259 self.cxx = clangxx
260 self.lit_config.note(
261 "inferred cxx_under_test as: %r" % self.cxx)
262 if not self.cxx:
263 self.lit_config.fatal('must specify user parameter cxx_under_test '
264 '(e.g., --param=cxx_under_test=clang++)')
265
266 def configure_src_root(self):
267 self.src_root = self.get_lit_conf(
268 'libcxx_src_root', os.path.dirname(self.config.test_source_root))
269
270 def configure_obj_root(self):
271 self.obj_root = self.get_lit_conf('libcxx_obj_root', self.src_root)
272
273 def configure_use_system_lib(self):
274 # This test suite supports testing against either the system library or
275 # the locally built one; the former mode is useful for testing ABI
276 # compatibility between the current headers and a shipping dynamic
277 # library.
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000278 self.use_system_lib = self.get_lit_bool('use_system_lib')
279 if self.use_system_lib is None:
Dan Albertae2526b2014-08-21 17:30:44 +0000280 # Default to testing against the locally built libc++ library.
281 self.use_system_lib = False
282 self.lit_config.note(
283 "inferred use_system_lib as: %r" % self.use_system_lib)
284
Justin Bogner33a2a2e2014-09-03 04:32:08 +0000285 def configure_use_clang_verify(self):
286 '''If set, run clang with -verify on failing tests.'''
287 self.use_clang_verify = self.get_lit_bool('use_clang_verify')
288 if self.use_clang_verify is None:
289 # TODO: Default this to True when using clang.
290 self.use_clang_verify = False
291 self.lit_config.note(
292 "inferred use_clang_verify as: %r" % self.use_clang_verify)
293
Dan Albertae2526b2014-08-21 17:30:44 +0000294 def configure_features(self):
Jonathan Roelofsb352db72014-09-05 19:03:46 +0000295 additional_features = self.get_lit_conf('additional_features')
296 if additional_features:
297 for f in additional_features.split(','):
298 self.config.available_features.add(f.strip())
Jonathan Roelofs3547c542014-09-05 17:21:57 +0000299
Dan Albertae2526b2014-08-21 17:30:44 +0000300 # Figure out which of the required locales we support
301 locales = {
302 'Darwin': {
303 'en_US.UTF-8': 'en_US.UTF-8',
304 'cs_CZ.ISO8859-2': 'cs_CZ.ISO8859-2',
305 'fr_FR.UTF-8': 'fr_FR.UTF-8',
306 'fr_CA.ISO8859-1': 'cs_CZ.ISO8859-1',
307 'ru_RU.UTF-8': 'ru_RU.UTF-8',
308 'zh_CN.UTF-8': 'zh_CN.UTF-8',
309 },
310 'FreeBSD': {
311 'en_US.UTF-8': 'en_US.UTF-8',
312 'cs_CZ.ISO8859-2': 'cs_CZ.ISO8859-2',
313 'fr_FR.UTF-8': 'fr_FR.UTF-8',
314 'fr_CA.ISO8859-1': 'fr_CA.ISO8859-1',
315 'ru_RU.UTF-8': 'ru_RU.UTF-8',
316 'zh_CN.UTF-8': 'zh_CN.UTF-8',
317 },
318 'Linux': {
319 'en_US.UTF-8': 'en_US.UTF-8',
320 'cs_CZ.ISO8859-2': 'cs_CZ.ISO-8859-2',
321 'fr_FR.UTF-8': 'fr_FR.UTF-8',
322 'fr_CA.ISO8859-1': 'fr_CA.ISO-8859-1',
323 'ru_RU.UTF-8': 'ru_RU.UTF-8',
324 'zh_CN.UTF-8': 'zh_CN.UTF-8',
325 },
326 'Windows': {
327 'en_US.UTF-8': 'English_United States.1252',
328 'cs_CZ.ISO8859-2': 'Czech_Czech Republic.1250',
329 'fr_FR.UTF-8': 'French_France.1252',
330 'fr_CA.ISO8859-1': 'French_Canada.1252',
331 'ru_RU.UTF-8': 'Russian_Russia.1251',
332 'zh_CN.UTF-8': 'Chinese_China.936',
333 },
334 }
335
336 default_locale = locale.setlocale(locale.LC_ALL)
337 for feature, loc in locales[platform.system()].items():
338 try:
339 locale.setlocale(locale.LC_ALL, loc)
Eric Fiselier561dfb52014-08-23 04:02:21 +0000340 self.config.available_features.add('locale.{0}'.format(feature))
Dan Albertae2526b2014-08-21 17:30:44 +0000341 except:
Eric Fiselier561dfb52014-08-23 04:02:21 +0000342 self.lit_config.warning('The locale {0} is not supported by '
Dan Albertae2526b2014-08-21 17:30:44 +0000343 'your platform. Some tests will be '
344 'unsupported.'.format(loc))
345 locale.setlocale(locale.LC_ALL, default_locale)
346
347 # Write an "available feature" that combines the triple when
348 # use_system_lib is enabled. This is so that we can easily write XFAIL
349 # markers for tests that are known to fail with versions of libc++ as
350 # were shipped with a particular triple.
351 if self.use_system_lib:
Dan Albertae2526b2014-08-21 17:30:44 +0000352 self.config.available_features.add(
Eric Fiselierbb191412014-10-27 22:14:25 +0000353 'with_system_lib=%s' % self.config.target_triple)
Dan Albertae2526b2014-08-21 17:30:44 +0000354
Jonathan Roelofs3547c542014-09-05 17:21:57 +0000355 if 'libcpp-has-no-threads' in self.config.available_features:
356 self.compile_flags += ['-D_LIBCPP_HAS_NO_THREADS']
357
358 if 'libcpp-has-no-monotonic-clock' in self.config.available_features:
359 self.compile_flags += ['-D_LIBCPP_HAS_NO_MONOTONIC_CLOCK']
360
Dan Albertae2526b2014-08-21 17:30:44 +0000361 def configure_compile_flags(self):
362 # Configure extra compiler flags.
363 self.compile_flags += ['-I' + self.src_root + '/include',
364 '-I' + self.src_root + '/test/support']
Eric Fiselier460b2242014-10-23 22:57:56 +0000365 if sys.platform.startswith('linux'):
Eric Fiselier6f9da552014-10-18 01:15:17 +0000366 self.compile_flags += ['-D__STDC_FORMAT_MACROS',
367 '-D__STDC_LIMIT_MACROS',
368 '-D__STDC_CONSTANT_MACROS']
Dan Albertae2526b2014-08-21 17:30:44 +0000369
370 def configure_link_flags(self):
Eric Fiselier6f9da552014-10-18 01:15:17 +0000371 # Configure library search paths
Eric Fiseliera63c1492014-10-19 00:42:41 +0000372 abi_library_path = self.get_lit_conf('abi_library_path', '')
Eric Fiselier6f9da552014-10-18 01:15:17 +0000373 self.link_flags += ['-L' + self.obj_root + '/lib']
Eric Fiseliera63c1492014-10-19 00:42:41 +0000374 if not self.use_system_lib:
375 self.link_flags += ['-Wl,-rpath', '-Wl,' + self.obj_root + '/lib']
376 if abi_library_path:
377 self.link_flags += ['-L' + abi_library_path,
378 '-Wl,-rpath', '-Wl,' + abi_library_path]
Eric Fiselier6f9da552014-10-18 01:15:17 +0000379 # Configure libraries
380 self.link_flags += ['-lc++']
Dan Albertae2526b2014-08-21 17:30:44 +0000381 link_flags_str = self.get_lit_conf('link_flags')
382 if link_flags_str is None:
383 cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
384 if cxx_abi == 'libstdc++':
385 self.link_flags += ['-lstdc++']
386 elif cxx_abi == 'libsupc++':
387 self.link_flags += ['-lsupc++']
388 elif cxx_abi == 'libcxxabi':
389 self.link_flags += ['-lc++abi']
390 elif cxx_abi == 'libcxxrt':
391 self.link_flags += ['-lcxxrt']
392 elif cxx_abi == 'none':
393 pass
394 else:
395 self.lit_config.fatal(
396 'C++ ABI setting %s unsupported for tests' % cxx_abi)
397
398 if sys.platform == 'darwin':
399 self.link_flags += ['-lSystem']
Eric Fiselier460b2242014-10-23 22:57:56 +0000400 elif sys.platform.startswith('linux'):
Dan Albertae2526b2014-08-21 17:30:44 +0000401 self.link_flags += ['-lgcc_eh', '-lc', '-lm', '-lpthread',
402 '-lrt', '-lgcc_s']
403 elif sys.platform.startswith('freebsd'):
404 self.link_flags += ['-lc', '-lm', '-pthread', '-lgcc_s']
405 else:
Eric Fiselier6f9da552014-10-18 01:15:17 +0000406 self.lit_config.fatal("unrecognized system: %r" % sys.platform)
Dan Albertae2526b2014-08-21 17:30:44 +0000407
408 self.lit_config.note(
409 "inferred link_flags as: %r" % self.link_flags)
410 if link_flags_str:
411 self.link_flags += shlex.split(link_flags_str)
412
Dan Albertae2526b2014-08-21 17:30:44 +0000413
414 def configure_std_flag(self):
415 # Try and get the std version from the command line. Fall back to
416 # default given in lit.site.cfg is not present. If default is not
417 # present then force c++11.
418 std = self.get_lit_conf('std')
419 if std is None:
420 std = 'c++11'
421 self.lit_config.note('using default std: \'-std=c++11\'')
Eric Fiselier561dfb52014-08-23 04:02:21 +0000422 self.compile_flags += ['-std={0}'.format(std)]
Dan Albertae2526b2014-08-21 17:30:44 +0000423 self.config.available_features.add(std)
424
425 def configure_sanitizer(self):
426 san = self.get_lit_conf('llvm_use_sanitizer', '').strip()
427 if san:
Eric Fiselierb941b502014-11-14 02:47:08 +0000428 # Search for llvm-symbolizer along the compiler path first
429 # and then along the PATH env variable.
430 symbolizer_search_paths = os.environ.get('PATH', '')
431 cxx_path = lit.util.which(self.cxx)
432 if cxx_path is not None:
433 symbolizer_search_paths = os.path.dirname(cxx_path) + \
434 os.pathsep + symbolizer_search_paths
435 llvm_symbolizer = lit.util.which('llvm-symbolizer',
436 symbolizer_search_paths)
437 # Setup the sanitizer compile flags
Eric Fiselier0425c7c2014-11-14 22:18:03 +0000438 self.compile_flags += ['-g', '-fno-omit-frame-pointer']
Eric Fiselier460b2242014-10-23 22:57:56 +0000439 if sys.platform.startswith('linux'):
Eric Fiselier062e6ee2014-10-23 02:54:15 +0000440 self.link_flags += ['-ldl']
Dan Albertae2526b2014-08-21 17:30:44 +0000441 if san == 'Address':
442 self.compile_flags += ['-fsanitize=address']
Eric Fiselierb941b502014-11-14 02:47:08 +0000443 if llvm_symbolizer is not None:
444 self.env['ASAN_SYMBOLIZER_PATH'] = llvm_symbolizer
Dan Albertae2526b2014-08-21 17:30:44 +0000445 self.config.available_features.add('asan')
446 elif san == 'Memory' or san == 'MemoryWithOrigins':
447 self.compile_flags += ['-fsanitize=memory']
448 if san == 'MemoryWithOrigins':
449 self.compile_flags += ['-fsanitize-memory-track-origins']
Eric Fiselierb941b502014-11-14 02:47:08 +0000450 if llvm_symbolizer is not None:
451 self.env['MSAN_SYMBOLIZER_PATH'] = llvm_symbolizer
Dan Albertae2526b2014-08-21 17:30:44 +0000452 self.config.available_features.add('msan')
Eric Fiselier04c1b742014-10-16 23:21:59 +0000453 elif san == 'Undefined':
454 self.compile_flags += ['-fsanitize=undefined',
455 '-fno-sanitize=vptr,function',
Eric Fiselierbc2d6322014-11-14 02:07:52 +0000456 '-fno-sanitize-recover', '-O3']
Eric Fiselier04c1b742014-10-16 23:21:59 +0000457 self.config.available_features.add('ubsan')
Eric Fiselier9b681f62014-11-18 21:26:45 +0000458 elif san == 'Thread':
459 self.compile_flags += ['-fsanitize=thread']
460 self.config.available_features.add('tsan')
Dan Albertae2526b2014-08-21 17:30:44 +0000461 else:
462 self.lit_config.fatal('unsupported value for '
Eric Fiselier561dfb52014-08-23 04:02:21 +0000463 'libcxx_use_san: {0}'.format(san))
Dan Albertae2526b2014-08-21 17:30:44 +0000464
465 def configure_triple(self):
466 # Get or infer the target triple.
467 self.config.target_triple = self.get_lit_conf('target_triple')
468 # If no target triple was given, try to infer it from the compiler
469 # under test.
470 if not self.config.target_triple:
Eric Fiselierbb191412014-10-27 22:14:25 +0000471 target_triple = lit.util.capture(
Dan Albertae2526b2014-08-21 17:30:44 +0000472 [self.cxx, '-dumpmachine']).strip()
Eric Fiselierbb191412014-10-27 22:14:25 +0000473 # Drop sub-major version components from the triple, because the
474 # current XFAIL handling expects exact matches for feature checks.
Eric Fiselierd6b46b42014-10-28 18:03:38 +0000475 # Example: x86_64-apple-darwin14.0.0 -> x86_64-apple-darwin14
Eric Fiselierbb191412014-10-27 22:14:25 +0000476 # The 5th group handles triples greater than 3 parts
477 # (ex x86_64-pc-linux-gnu).
478 target_triple = re.sub(r'([^-]+)-([^-]+)-([^.]+)([^-]*)(.*)',
479 r'\1-\2-\3\5', target_triple)
480 # linux-gnu is needed in the triple to properly identify linuxes
481 # that use GLIBC. Handle redhat and opensuse triples as special
482 # cases and append the missing `-gnu` portion.
483 if target_triple.endswith('redhat-linux') or \
484 target_triple.endswith('suse-linux'):
485 target_triple += '-gnu'
486 self.config.target_triple = target_triple
Dan Albertae2526b2014-08-21 17:30:44 +0000487 self.lit_config.note(
488 "inferred target_triple as: %r" % self.config.target_triple)
489
490 def configure_env(self):
491 # Configure extra linker parameters.
492 if sys.platform == 'darwin':
493 if not self.use_system_lib:
494 self.env['DYLD_LIBRARY_PATH'] = os.path.join(self.obj_root,
495 'lib')
496
497
Daniel Dunbar42ea4632010-09-15 03:57:04 +0000498# name: The name of this test suite.
499config.name = 'libc++'
500
501# suffixes: A list of file extensions to treat as test files.
502config.suffixes = ['.cpp']
503
504# test_source_root: The root path where tests are located.
505config.test_source_root = os.path.dirname(__file__)
506
Dan Albertae2526b2014-08-21 17:30:44 +0000507configuration = Configuration(lit_config, config)
508configuration.configure()
509config.test_format = configuration.get_test_format()