+# Sanitizers.
+if config.llvm_use_sanitizer == "Address":
+ config.available_features.add("asan")
+if (config.llvm_use_sanitizer == "Memory" or
+ config.llvm_use_sanitizer == "MemoryWithOrigins"):
+ config.available_features.add("msan")
+if config.llvm_use_sanitizer == "Undefined":
+ config.available_features.add("ubsan")
+else:
+ config.available_features.add("not_ubsan")
+
+# Check if we should run long running tests.
+if lit_config.params.get("run_long_tests", None) == "true":
+ config.available_features.add("long_tests")
+
+# Direct object generation
+# Suppress x86_64-mingw32 while investigating since r219108.
+if not 'hexagon' in config.target_triple and not re.match(r'^x86_64.*-(mingw32|windows-gnu|win32)', config.target_triple):
+ config.available_features.add("object-emission")
+
+if config.have_zlib == "1":
+ config.available_features.add("zlib")
+else:
+ config.available_features.add("nozlib")
+
+# LLVM can be configured with an empty default triple
+# Some tests are "generic" and require a valid default triple
+if config.target_triple:
+ config.available_features.add("default_triple")
+
+# Native compilation: host arch == default triple arch
+# 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")
+
+import subprocess
+
+def have_ld_plugin_support():
+ if not os.path.exists(os.path.join(config.llvm_shlib_dir, 'LLVMgold.so')):
+ return False
+
+ ld_cmd = subprocess.Popen([config.gold_executable, '--help'], stdout = subprocess.PIPE, env={'LANG': 'C'})
+ ld_out = ld_cmd.stdout.read().decode()
+ ld_cmd.wait()
+
+ if not '-plugin' in ld_out:
+ return False
+
+ # check that the used emulations are supported.
+ emu_line = [l for l in ld_out.split('\n') if 'supported emulations' in l]
+ if len(emu_line) != 1:
+ return False
+ emu_line = emu_line[0]
+ fields = emu_line.split(':')
+ if len(fields) != 3:
+ return False
+ emulations = fields[2].split()
+ if 'elf_x86_64' not in emulations:
+ return False
+ if 'elf32ppc' in emulations:
+ config.available_features.add('ld_emu_elf32ppc')
+
+ ld_version = subprocess.Popen([config.gold_executable, '--version'], stdout = subprocess.PIPE, env={'LANG': 'C'})
+ if not 'GNU gold' in ld_version.stdout.read().decode():
+ return False
+ ld_version.wait()
+
+ return True
+
+if have_ld_plugin_support():
+ config.available_features.add('ld_plugin')
+
+def have_ld64_plugin_support():
+ if config.ld64_executable == '':
+ return False
+
+ ld_cmd = subprocess.Popen([config.ld64_executable, '-v'], stderr = subprocess.PIPE)
+ ld_out = ld_cmd.stderr.read().decode()
+ ld_cmd.wait()
+
+ if 'ld64' not in ld_out or 'LTO' not in ld_out:
+ return False
+
+ return True
+
+if have_ld64_plugin_support():
+ config.available_features.add('ld64_plugin')
+
+# Ask llvm-config about assertion mode.
+try:
+ llvm_config_cmd = subprocess.Popen(
+ [os.path.join(llvm_tools_dir, 'llvm-config'), '--assertion-mode'],
+ stdout = subprocess.PIPE,
+ env=config.environment)
+except OSError:
+ print("Could not find llvm-config in " + llvm_tools_dir)
+ exit(42)
+
+if re.search(r'ON', llvm_config_cmd.stdout.read().decode('ascii')):