3 # Configuration file for the 'lit' test runner.
13 from lit.llvm import llvm_config
14 from lit.llvm.subst import FindTool
15 from lit.llvm.subst import ToolSubst
17 # name: The name of this test suite.
20 # testFormat: The test format to use to interpret tests.
21 config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell)
23 # suffixes: A list of file extensions to treat as test files. This is overriden
24 # by individual lit.local.cfg files in the test subdirectories.
25 config.suffixes = [".ll", ".c", ".test", ".txt", ".s", ".mir", ".yaml"]
27 # excludes: A list of directories to exclude from the testsuite. The 'Inputs'
28 # subdirectories contain auxiliary inputs for various tests in their parent
30 config.excludes = ["Inputs", "CMakeLists.txt", "README.txt", "LICENSE.txt"]
32 # test_source_root: The root path where tests are located.
33 config.test_source_root = os.path.dirname(__file__)
35 # test_exec_root: The root path where tests should be run.
36 config.test_exec_root = os.path.join(config.llvm_obj_root, "test")
38 # Tweak the PATH to include the tools dir.
39 llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True)
41 # Propagate some variables from the host environment.
42 llvm_config.with_system_environment(["HOME", "INCLUDE", "LIB", "TMP", "TEMP"])
45 # Set up OCAMLPATH to include newly built OCaml libraries.
46 top_ocaml_lib = os.path.join(config.llvm_lib_dir, "ocaml")
47 llvm_ocaml_lib = os.path.join(top_ocaml_lib, "llvm")
49 llvm_config.with_system_environment("OCAMLPATH")
50 llvm_config.with_environment("OCAMLPATH", top_ocaml_lib, append_path=True)
51 llvm_config.with_environment("OCAMLPATH", llvm_ocaml_lib, append_path=True)
53 llvm_config.with_system_environment("CAML_LD_LIBRARY_PATH")
54 llvm_config.with_environment("CAML_LD_LIBRARY_PATH", llvm_ocaml_lib, append_path=True)
56 # Set up OCAMLRUNPARAM to enable backtraces in OCaml tests.
57 llvm_config.with_environment("OCAMLRUNPARAM", "b")
59 # Provide the path to asan runtime lib 'libclang_rt.asan_osx_dynamic.dylib' if
60 # available. This is darwin specific since it's currently only needed on darwin.
65 not "Address" in config.llvm_use_sanitizer
66 or not "Darwin" in config.host_os
67 or not "x86" in config.host_triple
73 print("glob module not found, skipping get_asan_rtlib() lookup")
75 # The libclang_rt.asan_osx_dynamic.dylib path is obtained using the relative
76 # path from the host cc.
77 host_lib_dir = os.path.join(os.path.dirname(config.host_cc), "../lib")
78 asan_dylib_dir_pattern = (
79 host_lib_dir + "/clang/*/lib/darwin/libclang_rt.asan_osx_dynamic.dylib"
81 found_dylibs = glob.glob(asan_dylib_dir_pattern)
82 if len(found_dylibs) != 1:
84 return found_dylibs[0]
87 llvm_config.use_default_substitutions()
89 # Add site-specific substitutions.
90 config.substitutions.append(("%llvmshlibdir", config.llvm_shlib_dir))
91 config.substitutions.append(("%shlibext", config.llvm_shlib_ext))
92 config.substitutions.append(("%pluginext", config.llvm_plugin_ext))
93 config.substitutions.append(("%exeext", config.llvm_exe_ext))
97 # The target triple used by default by lli is the process target triple (some
98 # triple appropriate for generating code for the current process) but because
99 # we don't support COFF in MCJIT well enough for the tests, force ELF format on
100 # Windows. FIXME: the process target triple should be used here, but this is
101 # difficult to obtain on Windows.
102 if re.search(r"cygwin|windows-gnu|windows-msvc", config.host_triple):
103 lli_args = ["-mtriple=" + config.host_triple + "-elf"]
107 # Similarly, have a macro to use llc with DWARF even when the host is Windows
108 if re.search(r"windows-msvc", config.target_triple):
109 llc_args = [" -mtriple=" + config.target_triple.replace("-msvc", "-gnu")]
111 # Provide the path to asan runtime lib if available. On darwin, this lib needs
112 # to be loaded via DYLD_INSERT_LIBRARIES before libLTO.dylib in case the files
113 # to be linked contain instrumented sanitizer code.
114 ld64_cmd = config.ld64_executable
115 asan_rtlib = get_asan_rtlib()
117 ld64_cmd = "DYLD_INSERT_LIBRARIES={} {}".format(asan_rtlib, ld64_cmd)
118 if config.osx_sysroot:
119 ld64_cmd = "{} -syslibroot {}".format(ld64_cmd, config.osx_sysroot)
121 ocamlc_command = "%s ocamlc -cclib -L%s %s" % (
122 config.ocamlfind_executable,
126 ocamlopt_command = "true"
127 if config.have_ocamlopt:
128 ocamlopt_command = "%s ocamlopt -cclib -L%s -cclib -Wl,-rpath,%s %s" % (
129 config.ocamlfind_executable,
135 opt_viewer_cmd = "%s %s/tools/opt-viewer/opt-viewer.py" % (
137 config.llvm_src_root,
140 llvm_original_di_preservation_cmd = os.path.join(
141 config.llvm_src_root, "utils", "llvm-original-di-preservation.py"
143 config.substitutions.append(
145 "%llvm-original-di-preservation",
146 "'%s' %s" % (config.python_executable, llvm_original_di_preservation_cmd),
150 llvm_locstats_tool = os.path.join(config.llvm_tools_dir, "llvm-locstats")
151 config.substitutions.append(
152 ("%llvm-locstats", "'%s' %s" % (config.python_executable, llvm_locstats_tool))
154 config.llvm_locstats_used = os.path.exists(llvm_locstats_tool)
157 ToolSubst("%llvm", FindTool("llvm"), unresolved="ignore"),
158 ToolSubst("%lli", FindTool("lli"), post=".", extra_args=lli_args),
159 ToolSubst("%llc_dwarf", FindTool("llc"), extra_args=llc_args),
160 ToolSubst("%gold", config.gold_executable, unresolved="ignore"),
161 ToolSubst("%ld64", ld64_cmd, unresolved="ignore"),
162 ToolSubst("%ocamlc", ocamlc_command, unresolved="ignore"),
163 ToolSubst("%ocamlopt", ocamlopt_command, unresolved="ignore"),
164 ToolSubst("%opt-viewer", opt_viewer_cmd),
165 ToolSubst("%llvm-objcopy", FindTool("llvm-objcopy")),
166 ToolSubst("%llvm-strip", FindTool("llvm-strip")),
167 ToolSubst("%llvm-install-name-tool", FindTool("llvm-install-name-tool")),
168 ToolSubst("%llvm-bitcode-strip", FindTool("llvm-bitcode-strip")),
169 ToolSubst("%split-file", FindTool("split-file")),
172 # FIXME: Why do we have both `lli` and `%lli` that do slightly different things?
182 "llvm-bitcode-strip",
187 "llvm-debuginfod-find",
188 "llvm-debuginfo-analyzer",
198 "llvm-install-name-tool",
219 "llvm-remark-size-diff",
237 "verify-uselistorder",
248 # The following tools are optional
251 ToolSubst("llvm-mt", unresolved="ignore"),
252 ToolSubst("llvm-debuginfod", unresolved="ignore"),
253 ToolSubst("Kaleidoscope-Ch3", unresolved="ignore"),
254 ToolSubst("Kaleidoscope-Ch4", unresolved="ignore"),
255 ToolSubst("Kaleidoscope-Ch5", unresolved="ignore"),
256 ToolSubst("Kaleidoscope-Ch6", unresolved="ignore"),
257 ToolSubst("Kaleidoscope-Ch7", unresolved="ignore"),
258 ToolSubst("Kaleidoscope-Ch8", unresolved="ignore"),
259 ToolSubst("LLJITWithThinLTOSummaries", unresolved="ignore"),
260 ToolSubst("LLJITWithRemoteDebugging", unresolved="ignore"),
261 ToolSubst("OrcV2CBindingsBasicUsage", unresolved="ignore"),
262 ToolSubst("OrcV2CBindingsAddObjectFile", unresolved="ignore"),
263 ToolSubst("OrcV2CBindingsRemovableCode", unresolved="ignore"),
264 ToolSubst("OrcV2CBindingsLazy", unresolved="ignore"),
265 ToolSubst("OrcV2CBindingsVeryLazy", unresolved="ignore"),
266 ToolSubst("dxil-dis", unresolved="ignore"),
270 # Find (major, minor) version of ptxas
271 def ptxas_version(ptxas):
272 ptxas_cmd = subprocess.Popen([ptxas, "--version"], stdout=subprocess.PIPE)
273 ptxas_out = ptxas_cmd.stdout.read().decode("ascii")
275 match = re.search(r"release (\d+)\.(\d+)", ptxas_out)
277 return (int(match.group(1)), int(match.group(2)))
278 print("couldn't determine ptxas version")
282 # Enable %ptxas and %ptxas-verify tools.
283 # %ptxas-verify defaults to sm_60 architecture. It can be overriden
284 # by specifying required one, for instance: %ptxas-verify -arch=sm_80.
285 def enable_ptxas(ptxas_executable):
286 version = ptxas_version(ptxas_executable)
288 # ptxas is supposed to be backward compatible with previous
289 # versions, so add a feature for every known version prior to
291 ptxas_known_versions = [
311 def version_int(ver):
312 return ver[0] * 100 + ver[1]
314 # ignore ptxas if its version is below the minimum supported
316 min_version = ptxas_known_versions[0]
317 if version_int(version) < version_int(min_version):
319 "Warning: ptxas version {}.{} is not supported".format(
320 version[0], version[1]
325 for known_version in ptxas_known_versions:
326 if version_int(known_version) <= version_int(version):
327 major, minor = known_version
328 config.available_features.add("ptxas-{}.{}".format(major, minor))
330 config.available_features.add("ptxas")
333 ToolSubst("%ptxas", ptxas_executable),
334 ToolSubst("%ptxas-verify", "{} -arch=sm_60 -c -".format(ptxas_executable)),
340 os.environ.get("LLVM_PTXAS_EXECUTABLE", None) or config.ptxas_executable
343 enable_ptxas(ptxas_executable)
345 llvm_config.add_tool_substitutions(tools, config.llvm_tools_dir)
349 config.targets = frozenset(config.targets_to_build.split())
351 for arch in config.targets_to_build.split():
352 config.available_features.add(arch.lower() + "-registered-target")
355 known_arches = ["x86_64", "mips64", "ppc64", "aarch64"]
356 if config.host_ldflags.find("-m32") < 0 and any(
357 config.llvm_host_triple.startswith(x) for x in known_arches
359 config.available_features.add("llvm-64-bits")
361 config.available_features.add("host-byteorder-" + sys.byteorder + "-endian")
363 if sys.platform in ["win32"]:
364 # ExecutionEngine, no weak symbols in COFF.
365 config.available_features.add("uses_COFF")
367 # Others/can-execute.txt
368 config.available_features.add("can-execute")
371 if config.has_plugins:
372 config.available_features.add("plugins")
374 if config.build_examples:
375 config.available_features.add("examples")
377 if config.linked_bye_extension:
378 config.substitutions.append(("%llvmcheckext", "CHECK-EXT"))
379 config.substitutions.append(("%loadbye", ""))
380 config.substitutions.append(("%loadnewpmbye", ""))
382 config.substitutions.append(("%llvmcheckext", "CHECK-NOEXT"))
383 config.substitutions.append(
386 "-load={}/Bye{}".format(config.llvm_shlib_dir, config.llvm_shlib_ext),
389 config.substitutions.append(
392 "-load-pass-plugin={}/Bye{}".format(
393 config.llvm_shlib_dir, config.llvm_shlib_ext
398 if config.linked_exampleirtransforms_extension:
399 config.substitutions.append(("%loadexampleirtransforms", ""))
401 config.substitutions.append(
403 "%loadexampleirtransforms",
404 "-load-pass-plugin={}/ExampleIRTransforms{}".format(
405 config.llvm_shlib_dir, config.llvm_shlib_ext
410 # Static libraries are not built if BUILD_SHARED_LIBS is ON.
411 if not config.build_shared_libs and not config.link_llvm_dylib:
412 config.available_features.add("static-libs")
414 if config.link_llvm_dylib:
415 config.available_features.add("llvm-dylib")
416 config.substitutions.append(
419 "{}/libLLVM-{}{}".format(
420 config.llvm_shlib_dir, config.llvm_dylib_version, config.llvm_shlib_ext
425 if config.have_tf_aot:
426 config.available_features.add("have_tf_aot")
428 if config.have_tflite:
429 config.available_features.add("have_tflite")
431 if config.llvm_inliner_model_autogenerated:
432 config.available_features.add("llvm_inliner_model_autogenerated")
434 if config.llvm_raevict_model_autogenerated:
435 config.available_features.add("llvm_raevict_model_autogenerated")
438 def have_cxx_shared_library():
439 readobj_exe = lit.util.which("llvm-readobj", config.llvm_tools_dir)
441 print("llvm-readobj not found")
445 readobj_cmd = subprocess.Popen(
446 [readobj_exe, "--needed-libs", readobj_exe], stdout=subprocess.PIPE
449 print("could not exec llvm-readobj")
452 readobj_out = readobj_cmd.stdout.read().decode("ascii")
455 regex = re.compile(r"(libc\+\+|libstdc\+\+|msvcp).*\.(so|dylib|dll)")
457 for line in readobj_out.splitlines():
458 if "NeededLibraries [" in line:
462 if needed_libs and regex.search(line.lower()):
467 if have_cxx_shared_library():
468 config.available_features.add("cxx-shared-library")
470 if config.libcxx_used:
471 config.available_features.add("libcxx-used")
473 # LLVM can be configured with an empty default triple
474 # Some tests are "generic" and require a valid default triple
475 if config.target_triple:
476 config.available_features.add("default_triple")
477 # Direct object generation
478 if not config.target_triple.startswith(("nvptx", "xcore")):
479 config.available_features.add("object-emission")
481 # Allow checking for specific details in the host triple
482 if config.host_triple:
483 config.available_features.add('host=%s' % config.host_triple)
485 if config.have_llvm_driver:
486 config.available_features.add("llvm-driver")
491 def have_ld_plugin_support():
492 if not os.path.exists(
493 os.path.join(config.llvm_shlib_dir, "LLVMgold" + config.llvm_shlib_ext)
497 ld_cmd = subprocess.Popen(
498 [config.gold_executable, "--help"], stdout=subprocess.PIPE, env={"LANG": "C"}
500 ld_out = ld_cmd.stdout.read().decode()
503 if not "-plugin" in ld_out:
506 # check that the used emulations are supported.
507 emu_line = [l for l in ld_out.split("\n") if "supported emulations" in l]
508 if len(emu_line) != 1:
510 emu_line = emu_line[0]
511 fields = emu_line.split(":")
514 emulations = fields[2].split()
515 if "elf_x86_64" not in emulations:
517 if "elf32ppc" in emulations:
518 config.available_features.add("ld_emu_elf32ppc")
520 ld_version = subprocess.Popen(
521 [config.gold_executable, "--version"], stdout=subprocess.PIPE, env={"LANG": "C"}
523 if not "GNU gold" in ld_version.stdout.read().decode():
530 if have_ld_plugin_support():
531 config.available_features.add("ld_plugin")
534 def have_ld64_plugin_support():
535 if not os.path.exists(
536 os.path.join(config.llvm_shlib_dir, "libLTO" + config.llvm_shlib_ext)
540 if config.ld64_executable == "":
543 ld_cmd = subprocess.Popen([config.ld64_executable, "-v"], stderr=subprocess.PIPE)
544 ld_out = ld_cmd.stderr.read().decode()
547 if "ld64" not in ld_out or "LTO" not in ld_out:
553 if have_ld64_plugin_support():
554 config.available_features.add("ld64_plugin")
556 # Ask llvm-config about asserts
557 llvm_config.feature_config(
559 ("--assertion-mode", {"ON": "asserts"}),
560 ("--build-mode", {"[Dd][Ee][Bb][Uu][Gg]": "debug"}),
564 if "darwin" == sys.platform:
565 cmd = ["sysctl", "hw.optional.fma"]
566 sysctl_cmd = subprocess.Popen(cmd, stdout=subprocess.PIPE)
568 # Non zero return, probably a permission issue
569 if sysctl_cmd.wait():
571 'Warning: sysctl exists but calling "{}" failed, defaulting to no fma3.'.format(
576 result = sysctl_cmd.stdout.read().decode("ascii")
577 if "hw.optional.fma: 1" in result:
578 config.available_features.add("fma3")
580 # .debug_frame is not emitted for targeting Windows x64, aarch64/arm64, AIX, or Apple Silicon Mac.
582 r"^(x86_64|aarch64|arm64|powerpc|powerpc64).*-(windows-gnu|windows-msvc|aix)",
583 config.target_triple,
584 ) and not re.match(r"^arm64(e)?-apple-(macos|darwin)", config.target_triple):
585 config.available_features.add("debug_frame")
587 if config.have_libxar:
588 config.available_features.add("xar")
590 if config.enable_threads:
591 config.available_features.add("thread_support")
593 if config.have_libxml2:
594 config.available_features.add("libxml2")
597 config.available_features.add("curl")
599 if config.have_httplib:
600 config.available_features.add("httplib")
602 if config.have_opt_viewer_modules:
603 config.available_features.add("have_opt_viewer_modules")
605 if config.expensive_checks:
606 config.available_features.add("expensive_checks")
608 if "MemoryWithOrigins" in config.llvm_use_sanitizer:
609 config.available_features.add("use_msan_with_origins")
612 def exclude_unsupported_files_for_aix(dirname):
613 for filename in os.listdir(dirname):
614 source_path = os.path.join(dirname, filename)
615 if os.path.isdir(source_path):
617 f = open(source_path, "r")
620 # 64-bit object files are not supported on AIX, so exclude the tests.
622 "-emit-obj" in data or "-filetype=obj" in data
623 ) and "64" in config.target_triple:
624 config.excludes += [filename]
629 if "aix" in config.target_triple:
634 "/DebugInfo/Generic",
638 exclude_unsupported_files_for_aix(config.test_source_root + directory)
640 # Some tools support an environment variable "OBJECT_MODE" on AIX OS, which
641 # controls the kind of objects they will support. If there is no "OBJECT_MODE"
642 # environment variable specified, the default behaviour is to support 32-bit
643 # objects only. In order to not affect most test cases, which expect to support
644 # 32-bit and 64-bit objects by default, set the environment variable
645 # "OBJECT_MODE" to 'any' by default on AIX OS.
646 if "system-aix" in config.available_features:
647 config.environment["OBJECT_MODE"] = "any"