diff --git a/cross-project-tests/CMakeLists.txt b/cross-project-tests/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/cross-project-tests/CMakeLists.txt @@ -0,0 +1,40 @@ +set(CROSS_PROJECT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(CROSS_PROJECT_TEST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) +set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}/%(build_config)s") + +set(CROSS_TEST_DEPS FileCheck) +list(APPEND CROSS_TEST_DEPS + llvm-readelf +) + +if ("lld" IN_LIST LLVM_ENABLE_PROJECTS) + set(LLD_BINARY_DIR "${CROSS_PROJECT_TEST_BINARY_DIR}/../lld") + list(APPEND CROSS_TEST_DEPS lld) +endif() + +if ("clang" IN_LIST LLVM_ENABLE_PROJECTS) + set(CLANG_BINARY_DIR "${CROSS_PROJECT_TEST_BINARY_DIR}/../clang") + list(APPEND CROSS_TEST_DEPS clang) +endif() + +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in + ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py + MAIN_CONFIG + ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py + ) + + +add_lit_testsuite(check-cross-project "Running cross-project test suite" + ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${CROSS_TEST_DEPS} + ) + +add_custom_target(cross-project-test-depends DEPENDS ${CROSS_TEST_DEPS}) +set_target_properties(cross-project-test-depends PROPERTIES FOLDER "Tests") + +add_lit_testsuites(LLVM ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${CROSS_TEST_DEPS} + ) + +set_target_properties(check-cross-project PROPERTIES FOLDER "Tests") diff --git a/cross-project-tests/lit.cfg.py b/cross-project-tests/lit.cfg.py new file mode 100644 --- /dev/null +++ b/cross-project-tests/lit.cfg.py @@ -0,0 +1,29 @@ +# -*- Python -*- + +import os + +import lit.formats + +from lit.llvm import llvm_config + +config.name = 'cross-project' +config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell) + +config.suffixes = ['.c'] +config.excludes = ['Inputs'] + +config.test_source_root = os.path.dirname(__file__) +config.test_exec_root = config.cross_projects_obj_root + +llvm_config.use_default_substitutions() + +if len(config.lld_obj_root) > 0: + config.available_features.add('lld') + llvm_config.use_lld() + +if len(config.clang_obj_root) > 0: + config.available_features.add('clang') + llvm_config.use_clang() + +tool_patterns = ["llvm-readelf"] +llvm_config.add_tool_substitutions(tool_patterns) diff --git a/cross-project-tests/lit.site.cfg.py.in b/cross-project-tests/lit.site.cfg.py.in new file mode 100644 --- /dev/null +++ b/cross-project-tests/lit.site.cfg.py.in @@ -0,0 +1,24 @@ +@LIT_SITE_CFG_IN_HEADER@ + +import lit.util + +config.cross_projects_obj_root = "@CROSS_PROJECT_TEST_BINARY_DIR@" +config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" +config.lld_obj_root = "@LLD_BINARY_DIR@" +config.clang_obj_root = "@CLANG_BINARY_DIR@" +config.target_triple = "@TARGET_TRIPLE@" +config.host_triple = "@LLVM_HOST_TRIPLE@" + +# Support substitution of the tools and libs dirs with user parameters. This is +# used when we can't determine the tool dir at configuration time. +try: + config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params +except KeyError as e: + key, = e.args + lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key)) + +import lit.llvm +lit.llvm.initialize(lit_config, config) + +# Let the main config do the real work. +lit_config.load_config(config, "@CROSS_PROJECT_TEST_DIR@/lit.cfg.py") diff --git a/cross-project-tests/lld-clang.c b/cross-project-tests/lld-clang.c new file mode 100644 --- /dev/null +++ b/cross-project-tests/lld-clang.c @@ -0,0 +1,10 @@ +// REQUIRES: lld, clang + +//// Demo test. + +// RUN: %clang -c %s -o %t.o +// RUN: ld.lld %t.o -o %t.elf +// RUN: llvm-readelf %t.elf -s | FileCheck %s +// CHECK: _start + +void _start(){} \ No newline at end of file diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -58,7 +58,7 @@ # LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS # This allows an easy way of setting up a build directory for llvm and another # one for llvm+clang+... using the same sources. -set(LLVM_ALL_PROJECTS "clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;mlir;openmp;parallel-libs;polly;pstl") +set(LLVM_ALL_PROJECTS "clang;clang-tools-extra;compiler-rt;cross-project-tests;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;mlir;openmp;parallel-libs;polly;pstl") # The flang project is not yet part of "all" projects (see C++ requirements) set(LLVM_EXTRA_PROJECTS "flang") # List of all known projects in the mono repo diff --git a/llvm/tools/CMakeLists.txt b/llvm/tools/CMakeLists.txt --- a/llvm/tools/CMakeLists.txt +++ b/llvm/tools/CMakeLists.txt @@ -51,4 +51,8 @@ add_llvm_external_project(${p}) endforeach(p) +# The cross-project tests are intended to support all previous projects, so +# should be last. +add_llvm_external_project(cross-project-tests) + set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)