]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | # -*- Python -*- |
2 | ||
3 | # Configuration file for 'lit' test runner. | |
4 | # This file contains common rules for various compiler-rt testsuites. | |
5 | # It is mostly copied from lit.cfg used by Clang. | |
6 | import os | |
7 | import platform | |
92a42be0 SL |
8 | import re |
9 | import subprocess | |
1a4d82fc JJ |
10 | |
11 | import lit.formats | |
92a42be0 | 12 | import lit.util |
1a4d82fc | 13 | |
92a42be0 SL |
14 | # Setup test format. Use bash on Unix and the lit shell on Windows. |
15 | execute_external = (not sys.platform in ['win32']) | |
1a4d82fc | 16 | config.test_format = lit.formats.ShTest(execute_external) |
92a42be0 SL |
17 | if execute_external: |
18 | config.available_features.add('shell') | |
1a4d82fc JJ |
19 | |
20 | # Setup clang binary. | |
21 | compiler_path = getattr(config, 'clang', None) | |
22 | if (not compiler_path) or (not os.path.exists(compiler_path)): | |
23 | lit_config.fatal("Can't find compiler on path %r" % compiler_path) | |
24 | ||
25 | compiler_id = getattr(config, 'compiler_id', None) | |
26 | if compiler_id == "Clang": | |
92a42be0 SL |
27 | if platform.system() != 'Windows': |
28 | config.cxx_mode_flags = ["--driver-mode=g++"] | |
29 | else: | |
30 | config.cxx_mode_flags = [] | |
31 | # We assume that sanitizers should provide good enough error | |
32 | # reports and stack traces even with minimal debug info. | |
33 | config.debug_info_flags = ["-gline-tables-only"] | |
34 | if platform.system() == 'Windows': | |
35 | config.debug_info_flags.append("-gcodeview") | |
1a4d82fc JJ |
36 | elif compiler_id == 'GNU': |
37 | config.cxx_mode_flags = ["-x c++"] | |
92a42be0 | 38 | config.debug_info_flags = ["-g"] |
1a4d82fc JJ |
39 | else: |
40 | lit_config.fatal("Unsupported compiler id: %r" % compiler_id) | |
92a42be0 SL |
41 | # Add compiler ID to the list of available features. |
42 | config.available_features.add(compiler_id) | |
1a4d82fc JJ |
43 | |
44 | # Clear some environment variables that might affect Clang. | |
92a42be0 SL |
45 | possibly_dangerous_env_vars = ['ASAN_OPTIONS', 'DFSAN_OPTIONS', 'LSAN_OPTIONS', |
46 | 'MSAN_OPTIONS', 'UBSAN_OPTIONS', | |
47 | 'COMPILER_PATH', 'RC_DEBUG_OPTIONS', | |
1a4d82fc JJ |
48 | 'CINDEXTEST_PREAMBLE_FILE', 'LIBRARY_PATH', |
49 | 'CPATH', 'C_INCLUDE_PATH', 'CPLUS_INCLUDE_PATH', | |
50 | 'OBJC_INCLUDE_PATH', 'OBJCPLUS_INCLUDE_PATH', | |
51 | 'LIBCLANG_TIMING', 'LIBCLANG_OBJTRACKING', | |
52 | 'LIBCLANG_LOGGING', 'LIBCLANG_BGPRIO_INDEX', | |
53 | 'LIBCLANG_BGPRIO_EDIT', 'LIBCLANG_NOTHREADS', | |
54 | 'LIBCLANG_RESOURCE_USAGE', | |
55 | 'LIBCLANG_CODE_COMPLETION_LOGGING'] | |
56 | # Clang/Win32 may refer to %INCLUDE%. vsvarsall.bat sets it. | |
57 | if platform.system() != 'Windows': | |
58 | possibly_dangerous_env_vars.append('INCLUDE') | |
59 | for name in possibly_dangerous_env_vars: | |
60 | if name in config.environment: | |
61 | del config.environment[name] | |
62 | ||
63 | # Tweak PATH to include llvm tools dir. | |
64 | llvm_tools_dir = getattr(config, 'llvm_tools_dir', None) | |
65 | if (not llvm_tools_dir) or (not os.path.exists(llvm_tools_dir)): | |
66 | lit_config.fatal("Invalid llvm_tools_dir config attribute: %r" % llvm_tools_dir) | |
67 | path = os.path.pathsep.join((llvm_tools_dir, config.environment['PATH'])) | |
68 | config.environment['PATH'] = path | |
69 | ||
92a42be0 SL |
70 | # Help MSVS link.exe find the standard libraries. |
71 | # Make sure we only try to use it when targetting Windows. | |
72 | if platform.system() == 'Windows' and '-win' in config.target_triple: | |
73 | config.environment['LIB'] = os.environ['LIB'] | |
74 | ||
1a4d82fc JJ |
75 | # Use ugly construction to explicitly prohibit "clang", "clang++" etc. |
76 | # in RUN lines. | |
77 | config.substitutions.append( | |
78 | (' clang', """\n\n*** Do not use 'clangXXX' in tests, | |
79 | instead define '%clangXXX' substitution in lit config. ***\n\n""") ) | |
80 | ||
81 | # Allow tests to be executed on a simulator or remotely. | |
82 | config.substitutions.append( ('%run', config.emulator) ) | |
83 | ||
92a42be0 SL |
84 | # Define CHECK-%os to check for OS-dependent output. |
85 | config.substitutions.append( ('CHECK-%os', ("CHECK-" + config.host_os))) | |
86 | ||
87 | if config.host_os == 'Windows': | |
88 | # FIXME: This isn't quite right. Specifically, it will succeed if the program | |
89 | # does not crash but exits with a non-zero exit code. We ought to merge | |
90 | # KillTheDoctor and not --crash to make the latter more useful and remove the | |
91 | # need for this substitution. | |
92 | config.substitutions.append( ("%expect_crash ", "not KillTheDoctor ") ) | |
93 | else: | |
94 | config.substitutions.append( ("%expect_crash ", "not --crash ") ) | |
95 | ||
1a4d82fc JJ |
96 | # Add supported compiler_rt architectures to a list of available features. |
97 | compiler_rt_arch = getattr(config, 'compiler_rt_arch', None) | |
98 | if compiler_rt_arch: | |
99 | for arch in compiler_rt_arch.split(";"): | |
100 | config.available_features.add(arch + "-supported-target") | |
101 | ||
102 | compiler_rt_debug = getattr(config, 'compiler_rt_debug', False) | |
103 | if not compiler_rt_debug: | |
104 | config.available_features.add('compiler-rt-optimized') | |
92a42be0 SL |
105 | |
106 | sanitizer_can_use_cxxabi = getattr(config, 'sanitizer_can_use_cxxabi', True) | |
107 | if sanitizer_can_use_cxxabi: | |
108 | config.available_features.add('cxxabi') | |
109 | ||
110 | # Test lld if it is available. | |
111 | if config.has_lld: | |
112 | config.available_features.add('lld') | |
113 | ||
114 | lit.util.usePlatformSdkOnDarwin(config, lit_config) | |
115 | ||
116 | def is_darwin_lto_supported(): | |
117 | return os.path.exists(os.path.join(config.llvm_shlib_dir, 'libLTO.dylib')) | |
118 | ||
119 | def is_linux_lto_supported(): | |
120 | if not os.path.exists(os.path.join(config.llvm_shlib_dir, 'LLVMgold.so')): | |
121 | return False | |
122 | ||
123 | ld_cmd = subprocess.Popen([config.gold_executable, '--help'], stdout = subprocess.PIPE) | |
124 | ld_out = ld_cmd.stdout.read().decode() | |
125 | ld_cmd.wait() | |
126 | ||
127 | if not '-plugin' in ld_out: | |
128 | return False | |
129 | ||
130 | return True | |
131 | ||
132 | def is_windows_lto_supported(): | |
133 | return os.path.exists(os.path.join(config.llvm_tools_dir, 'lld-link.exe')) | |
134 | ||
135 | if config.host_os == 'Darwin' and is_darwin_lto_supported(): | |
136 | config.lto_supported = True | |
137 | config.lto_launch = ["env", "DYLD_LIBRARY_PATH=" + config.llvm_shlib_dir] | |
138 | config.lto_flags = [] | |
139 | elif config.host_os == 'Linux' and is_linux_lto_supported(): | |
140 | config.lto_supported = True | |
141 | config.lto_launch = [] | |
142 | config.lto_flags = ["-fuse-ld=gold"] | |
143 | elif config.host_os == 'Windows' and is_windows_lto_supported(): | |
144 | config.lto_supported = True | |
145 | config.lto_launch = [] | |
146 | config.lto_flags = ["-fuse-ld=lld"] | |
147 | else: | |
148 | config.lto_supported = False | |
149 | ||
150 | # Ask llvm-config about assertion mode. | |
151 | try: | |
152 | llvm_config_cmd = subprocess.Popen( | |
153 | [os.path.join(config.llvm_tools_dir, 'llvm-config'), '--assertion-mode'], | |
154 | stdout = subprocess.PIPE, | |
155 | env=config.environment) | |
156 | except OSError: | |
157 | print("Could not find llvm-config in " + llvm_tools_dir) | |
158 | exit(42) | |
159 | ||
160 | if re.search(r'ON', llvm_config_cmd.stdout.read().decode('ascii')): | |
161 | config.available_features.add('asserts') | |
162 | llvm_config_cmd.wait() | |
163 | ||
164 | # Sanitizer tests tend to be flaky on Windows due to PR24554, so add some | |
165 | # retries. We don't do this on otther platforms because it's slower. | |
166 | if platform.system() == 'Windows': | |
167 | config.test_retry_attempts = 2 |