# -*- Python -*- import os import platform import re import subprocess import locale import lit.formats import lit.util from lit.llvm import llvm_config # Configuration file for the 'lit' test runner. # name: The name of this test suite. config.name = "lld" # testFormat: The test format to use to interpret tests. # # For now we require '&&' between commands, until they get globally killed and the test runner updated. config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell) # suffixes: A list of file extensions to treat as test files. config.suffixes = [".ll", ".s", ".test", ".yaml", ".objtxt"] # excludes: A list of directories to exclude from the testsuite. The 'Inputs' # subdirectories contain auxiliary inputs for various tests in their parent # directories. config.excludes = ["Inputs"] # test_source_root: The root path where tests are located. config.test_source_root = os.path.dirname(__file__) config.test_exec_root = os.path.join(config.lld_obj_root, "test") llvm_config.use_default_substitutions() llvm_config.use_lld() tool_patterns = [ "llc", "llvm-as", "llvm-mc", "llvm-nm", "llvm-objdump", "llvm-otool", "llvm-pdbutil", "llvm-profdata", "llvm-dwarfdump", "llvm-readelf", "llvm-readobj", "obj2yaml", "yaml2obj", "opt", "llvm-dis", ] llvm_config.add_tool_substitutions(tool_patterns) # LLD tests tend to be flaky on NetBSD, so add some retries. # We don't do this on other platforms because it's slower. if platform.system() in ["NetBSD"]: config.test_retry_attempts = 2 # When running under valgrind, we mangle '-vg' onto the end of the triple so we # can check it with XFAIL and XTARGET. if lit_config.useValgrind: config.target_triple += "-vg" llvm_config.feature_config( [ ( "--targets-built", { "AArch64": "aarch64", "AMDGPU": "amdgpu", "ARM": "arm", "AVR": "avr", "Hexagon": "hexagon", "LoongArch": "loongarch", "Mips": "mips", "MSP430": "msp430", "PowerPC": "ppc", "RISCV": "riscv", "Sparc": "sparc", "SystemZ": "systemz", "WebAssembly": "wasm", "X86": "x86", }, ), ("--assertion-mode", {"ON": "asserts"}), ] ) # Set a fake constant version so that we get consistent output. config.environment["LLD_VERSION"] = "LLD 1.0" # LLD_IN_TEST determines how many times `main` is run inside each process, which # lets us test that it's cleaning up after itself and resetting global state # correctly (which is important for usage as a library). run_lld_main_twice = lit_config.params.get("RUN_LLD_MAIN_TWICE", False) if not run_lld_main_twice: config.environment["LLD_IN_TEST"] = "1" else: config.environment["LLD_IN_TEST"] = "2" # Many ELF tests fail in this mode. config.excludes.append("ELF") # Some old Mach-O backend tests fail, and it's due for removal anyway. config.excludes.append("mach-o") # Some new Mach-O backend tests fail; give them a way to mark themselves # unsupported in this mode. config.available_features.add("main-run-twice") # Indirectly check if the mt.exe Microsoft utility exists by searching for # cvtres, which always accompanies it. Alternatively, check if we can use # libxml2 to merge manifests. if lit.util.which("cvtres", config.environment["PATH"]) or config.have_libxml2: config.available_features.add("manifest_tool") if config.enable_backtrace: config.available_features.add("backtrace") if config.have_libxml2: config.available_features.add("libxml2") if config.have_dia_sdk: config.available_features.add("diasdk") if config.sizeof_void_p == 8: config.available_features.add("llvm-64-bits") if config.has_plugins: config.available_features.add("plugins") if config.build_examples: config.available_features.add("examples") if config.linked_bye_extension: config.substitutions.append(("%loadbye", "")) config.substitutions.append(("%loadnewpmbye", "")) else: config.substitutions.append( ( "%loadbye", "-load={}/Bye{}".format(config.llvm_shlib_dir, config.llvm_shlib_ext), ) ) config.substitutions.append( ( "%loadnewpmbye", "-load-pass-plugin={}/Bye{}".format( config.llvm_shlib_dir, config.llvm_shlib_ext ), ) ) tar_executable = lit.util.which("tar", config.environment["PATH"]) if tar_executable: env = os.environ env["LANG"] = "C" tar_version = subprocess.Popen( [tar_executable, "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ) sout, _ = tar_version.communicate() if "GNU tar" in sout.decode(): config.available_features.add("gnutar") # ELF tests expect the default target for ld.lld to be ELF. if config.ld_lld_default_mingw: config.excludes.append("ELF")