diff --git a/.github/workflows/llvm.yml b/.github/workflows/llvm.yml new file mode 100644 index 0000000000000..9ab4bfdae9fc8 --- /dev/null +++ b/.github/workflows/llvm.yml @@ -0,0 +1,38 @@ +name: CI + +on: [push] + +jobs: + build_llvm: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - windows-latest + - macOS-latest + steps: + - name: Setup Windows + if: startsWith(matrix.os, 'windows') + uses: tstellar/actions/setup-windows@master + with: + arch: amd64 + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Install Ninja + uses: tstellar/actions/install-ninja@master + with: + os: ${{ runner.os }} + - name: Test LLVM / dynamic + if: startsWith(matrix.os, 'windows') == false + uses: tstellar/actions/build-test-llvm-project@master + with: + cmake_args: -G Ninja -DCMAKE_BUILD_TYPE=Release ${{ matrix.cmake_args }} -DLLVM_ENABLE_PROJECTS='polly;clang' -DPOLLY_ENABLE_GPGPU_CODEGEN=OFF -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_POLLY_LINK_INTO_TOOLS=OFF + os: ${{ runner.os }} + - name: Test LLVM / static + uses: tstellar/actions/build-test-llvm-project@master + with: + cmake_args: -G Ninja -DCMAKE_BUILD_TYPE=Release ${{ matrix.cmake_args }} -DLLVM_ENABLE_PROJECTS='polly;clang' -DPOLLY_ENABLE_GPGPU_CODEGEN=ON -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_POLLY_LINK_INTO_TOOLS=ON + os: ${{ runner.os }} diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 093c2225e5254..dc1413f4b5972 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -864,7 +864,7 @@ add_subdirectory(utils/hmaptool) if(CLANG_BUILT_STANDALONE) llvm_distribution_add_targets() - process_llvm_pass_plugins(NO_GEN) + process_llvm_pass_plugins() endif() configure_file( diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index fa6e418ac06f8..5133139d6ce3c 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -1075,7 +1075,7 @@ endif() # after all targets are created. include(LLVMDistributionSupport) llvm_distribution_add_targets() -process_llvm_pass_plugins() +process_llvm_pass_plugins(GEN_CONFIG) # This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 71ed1b8a3af13..2da74539952c9 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -873,13 +873,13 @@ function(add_llvm_pass_plugin name) if (TARGET intrinsics_gen) add_dependencies(obj.${name} intrinsics_gen) endif() - message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})") - set_property(GLOBAL APPEND PROPERTY LLVM_COMPILE_EXTENSIONS ${name}) + set_property(GLOBAL APPEND PROPERTY LLVM_STATIC_EXTENSIONS ${name}) elseif(NOT ARG_NO_MODULE) add_llvm_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS}) else() add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS}) endif() + message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})") endfunction(add_llvm_pass_plugin) @@ -888,48 +888,47 @@ endfunction(add_llvm_pass_plugin) # Correctly set lib dependencies between plugins and tools, based on tools # registered with the ENABLE_PLUGINS option. # -# Unless NO_GEN option is set, also generate X Macro file for extension +# if GEN_CONFIG option is set, also generate X Macro file for extension # handling. It provides a HANDLE_EXTENSION(extension_namespace, ExtensionProject) # call for each extension allowing client code to define # HANDLE_EXTENSION to have a specific code be run for each extension. # function(process_llvm_pass_plugins) cmake_parse_arguments(ARG - "NO_GEN" "" "" + "GEN_CONFIG" "" "" ${ARGN}) + if(ARG_GEN_CONFIG) + get_property(LLVM_STATIC_EXTENSIONS GLOBAL PROPERTY LLVM_STATIC_EXTENSIONS) + else() + include(LLVMConfigExtensions) + endif() + # Add static plugins to each plugin target. - get_property(LLVM_EXTENSIONS GLOBAL PROPERTY LLVM_COMPILE_EXTENSIONS) - foreach(llvm_extension ${LLVM_EXTENSIONS}) - string(TOUPPER ${llvm_extension} llvm_extension_upper) - string(TOLOWER ${llvm_extension} llvm_extension_lower) - - if(LLVM_${llvm_extension_upper}_LINK_INTO_TOOLS) - get_property(llvm_plugin_targets GLOBAL PROPERTY LLVM_PLUGIN_TARGETS) - foreach(llvm_plugin_target ${llvm_plugin_targets}) - set_property(TARGET ${llvm_plugin_target} APPEND PROPERTY LINK_LIBRARIES ${llvm_extension}) - set_property(TARGET ${llvm_plugin_target} APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension}) - endforeach() - else() - add_llvm_library(${llvm_extension_lower} MODULE obj.${llvm_extension_lower}) - endif() + foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) + get_property(llvm_plugin_targets GLOBAL PROPERTY LLVM_PLUGIN_TARGETS) + foreach(llvm_plugin_target ${llvm_plugin_targets}) + set_property(TARGET ${llvm_plugin_target} APPEND PROPERTY LINK_LIBRARIES ${llvm_extension}) + set_property(TARGET ${llvm_plugin_target} APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension}) + endforeach() endforeach() - # Eventually generate the extension header. - if(NOT ARG_NO_GEN) - file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "//extension handlers\n") - foreach(llvm_extension ${LLVM_EXTENSIONS}) - string(TOLOWER ${llvm_extension} llvm_extension_lower) - - string(TOUPPER ${llvm_extension} llvm_extension_upper) - string(SUBSTRING ${llvm_extension_upper} 0 1 llvm_extension_upper_first) - string(SUBSTRING ${llvm_extension_lower} 1 -1 llvm_extension_lower_tail) - string(CONCAT llvm_extension_project ${llvm_extension_upper_first} ${llvm_extension_lower_tail}) - - if(LLVM_${llvm_extension_upper}_LINK_INTO_TOOLS) - file(APPEND "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "HANDLE_EXTENSION(${llvm_extension_project})\n") - endif() + # Eventually generate the extension header, and store config to a cmake file + # for usage in third-party configuration. + if(ARG_GEN_CONFIG) + set(LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm) + set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") + file(WRITE + "${llvm_cmake_builddir}/LLVMConfigExtensions.cmake" + "set(LLVM_STATIC_EXTENSIONS ${LLVM_STATIC_EXTENSIONS})") + install(FILES + ${llvm_cmake_builddir}/LLVMConfigExtensions.cmake + DESTINATION ${LLVM_INSTALL_PACKAGE_DIR} + COMPONENT cmake-exports) + file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "//extension handlers\n") + foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) + file(APPEND "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "HANDLE_EXTENSION(${llvm_extension})\n") endforeach() file(APPEND "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "#undef HANDLE_EXTENSION\n") diff --git a/llvm/cmake/modules/CMakeLists.txt b/llvm/cmake/modules/CMakeLists.txt index 9cf22b436fa73..af757d6199a8f 100644 --- a/llvm/cmake/modules/CMakeLists.txt +++ b/llvm/cmake/modules/CMakeLists.txt @@ -136,6 +136,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) FILES_MATCHING PATTERN *.cmake PATTERN .svn EXCLUDE PATTERN LLVMConfig.cmake EXCLUDE + PATTERN LLVMConfigExtensions.cmake EXCLUDE PATTERN LLVMConfigVersion.cmake EXCLUDE PATTERN LLVM-Config.cmake EXCLUDE PATTERN GetHostTriple.cmake EXCLUDE) diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in index 87684ecba0f50..f7b59970fbd74 100644 --- a/llvm/cmake/modules/LLVMConfig.cmake.in +++ b/llvm/cmake/modules/LLVMConfig.cmake.in @@ -112,3 +112,5 @@ endif() set_property(GLOBAL PROPERTY LLVM_TARGETS_CONFIGURED On) include(${LLVM_CMAKE_DIR}/LLVM-Config.cmake) + +