| # -*- 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") |