Author: serge-sans-paille Date: 2020-04-24T09:40:14+02:00 New Revision: 8f766e382b77eef3102798b49e087d1e4804b984
URL: https://github.com/llvm/llvm-project/commit/8f766e382b77eef3102798b49e087d1e4804b984 DIFF: https://github.com/llvm/llvm-project/commit/8f766e382b77eef3102798b49e087d1e4804b984.diff LOG: Update compiler extension integration into the build system The approach here is to create a new (empty) component, `Extensions', where all statically compiled extensions dynamically register their dependencies. That way we're more natively compatible with LLVMBuild and llvm-config. Fixes: https://bugs.llvm.org/show_bug.cgi?id=44870 Differential Revision: https://reviews.llvm.org/D78192 Added: llvm/lib/Extensions/CMakeLists.txt llvm/lib/Extensions/Extensions.cpp llvm/lib/Extensions/LLVMBuild.txt Modified: clang/lib/CodeGen/CMakeLists.txt llvm/cmake/modules/AddLLVM.cmake llvm/lib/CMakeLists.txt llvm/lib/LLVMBuild.txt llvm/lib/LTO/CMakeLists.txt llvm/lib/LTO/LLVMBuild.txt llvm/tools/bugpoint/CMakeLists.txt llvm/tools/llvm-config/llvm-config.cpp llvm/tools/opt/CMakeLists.txt Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CMakeLists.txt b/clang/lib/CodeGen/CMakeLists.txt index d8b3c234a1ef..c300c1b021f3 100644 --- a/clang/lib/CodeGen/CMakeLists.txt +++ b/clang/lib/CodeGen/CMakeLists.txt @@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS Core Coroutines Coverage + Extensions FrontendOpenMP IPO IRReader @@ -96,8 +97,6 @@ add_clang_library(clangCodeGen TargetInfo.cpp VarBypassDetector.cpp - ENABLE_PLUGINS - DEPENDS ${codegen_deps} diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 7d5094eac00c..ba720d49acb9 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -409,7 +409,7 @@ endfunction(set_windows_version_resource_properties) # ) function(llvm_add_library name) cmake_parse_arguments(ARG - "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB;ENABLE_PLUGINS" + "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB" "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH" "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" ${ARGN}) @@ -423,9 +423,6 @@ function(llvm_add_library name) else() llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS}) endif() - if(ARG_ENABLE_PLUGINS) - set_property(GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name}) - endif() if(ARG_MODULE) if(ARG_SHARED OR ARG_STATIC) @@ -758,7 +755,7 @@ endmacro(add_llvm_library name) macro(add_llvm_executable name) cmake_parse_arguments(ARG - "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS;ENABLE_PLUGINS" + "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS" "ENTITLEMENTS;BUNDLE_PATH" "DEPENDS" ${ARGN}) @@ -845,9 +842,6 @@ macro(add_llvm_executable name) # API for all shared libaries loaded by this executable. target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB}) endif() - if(ARG_ENABLE_PLUGINS) - set_property(GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name}) - endif() llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH}) endmacro(add_llvm_executable name) @@ -920,18 +914,18 @@ function(process_llvm_pass_plugins) include(LLVMConfigExtensions) endif() - # Add static plugins to each plugin target. + # Add static plugins to the Extension component 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() + set_property(TARGET LLVMExtensions APPEND PROPERTY LINK_LIBRARIES ${llvm_extension}) + set_property(TARGET LLVMExtensions APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension}) endforeach() - # Eventually generate the extension header, and store config to a cmake file + # Eventually generate the extension headers, and store config to a cmake file # for usage in third-party configuration. if(ARG_GEN_CONFIG) + + ## Part 1: Extension header to be included whenever we need extension + # processing. set(LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm) set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") file(WRITE @@ -954,6 +948,57 @@ function(process_llvm_pass_plugins) "${ExtensionDef}.tmp" "${ExtensionDef}") file(REMOVE "${ExtensionDef}.tmp") + + ## Part 2: Extension header that captures each extension dependency, to be + # used by llvm-config. + set(ExtensionDeps "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc") + + # Max needed to correctly size the required library array. + set(llvm_plugin_max_deps_length 0) + foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) + get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES) + list(LENGTH llvm_plugin_deps llvm_plugin_deps_length) + if(llvm_plugin_deps_length GREATER llvm_plugin_max_deps_length) + set(llvm_plugin_max_deps_length ${llvm_plugin_deps_length}) + endif() + endforeach() + + list(LENGTH LLVM_STATIC_EXTENSIONS llvm_static_extension_count) + file(WRITE + "${ExtensionDeps}.tmp" + "#include <array>\n\ + struct ExtensionDescriptor {\n\ + const char* Name;\n\ + const char* const RequiredLibraries[1 + 1 + ${llvm_plugin_max_deps_length}];\n\ + };\n\ + std::array<ExtensionDescriptor, ${llvm_static_extension_count}> AvailableExtensions{\n") + + foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) + get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES) + + file(APPEND "${ExtensionDeps}.tmp" "{\"${llvm_extension}\", {") + foreach(llvm_plugin_dep ${llvm_plugin_deps}) + # Turn library dependency back to component name, if possible. + # That way llvm-config can avoid redundant dependencies. + STRING(REGEX REPLACE "^-l" "" plugin_dep_name ${llvm_plugin_dep}) + STRING(REGEX MATCH "^LLVM" is_llvm_library ${plugin_dep_name}) + if(is_llvm_library) + STRING(REGEX REPLACE "^LLVM" "" plugin_dep_name ${plugin_dep_name}) + STRING(TOLOWER ${plugin_dep_name} plugin_dep_name) + endif() + file(APPEND "${ExtensionDeps}.tmp" "\"${plugin_dep_name}\", ") + endforeach() + + # Self + mandatory trailing null, because the number of RequiredLibraries diff ers between extensions. + file(APPEND "${ExtensionDeps}.tmp" \"${llvm_extension}\", "nullptr}},\n") + endforeach() + file(APPEND "${ExtensionDeps}.tmp" "};\n") + + # only replace if there's an actual change + execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_ diff erent + "${ExtensionDeps}.tmp" + "${ExtensionDeps}") + file(REMOVE "${ExtensionDeps}.tmp") endif() endfunction() diff --git a/llvm/lib/CMakeLists.txt b/llvm/lib/CMakeLists.txt index 8f8d417124c8..abe3ec59aec1 100644 --- a/llvm/lib/CMakeLists.txt +++ b/llvm/lib/CMakeLists.txt @@ -9,6 +9,7 @@ add_subdirectory(BinaryFormat) add_subdirectory(Bitcode) add_subdirectory(Bitstream) add_subdirectory(DWARFLinker) +add_subdirectory(Extensions) add_subdirectory(Frontend) add_subdirectory(Transforms) add_subdirectory(Linker) diff --git a/llvm/lib/Extensions/CMakeLists.txt b/llvm/lib/Extensions/CMakeLists.txt new file mode 100644 index 000000000000..701e9c4c0baf --- /dev/null +++ b/llvm/lib/Extensions/CMakeLists.txt @@ -0,0 +1,3 @@ +add_llvm_component_library(LLVMExtensions + Extensions.cpp +) diff --git a/llvm/lib/Extensions/Extensions.cpp b/llvm/lib/Extensions/Extensions.cpp new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/llvm/lib/Extensions/LLVMBuild.txt b/llvm/lib/Extensions/LLVMBuild.txt new file mode 100644 index 000000000000..2005830a4dd7 --- /dev/null +++ b/llvm/lib/Extensions/LLVMBuild.txt @@ -0,0 +1,21 @@ +;===- ./lib/Extensions/LLVMBuild.txt -------------------------------*- Conf -*--===; +; +; Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +; See https://llvm.org/LICENSE.txt for license information. +; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +; +;===------------------------------------------------------------------------===; +; +; This is an LLVMBuild description file for the components in this subdirectory. +; +; For more information on the LLVMBuild system, please see: +; +; http://llvm.org/docs/LLVMBuild.html +; +;===------------------------------------------------------------------------===; + +[component_0] +type = Library +name = Extensions +parent = Libraries +required_libraries = diff --git a/llvm/lib/LLVMBuild.txt b/llvm/lib/LLVMBuild.txt index 1ae59791cd6c..824abd36fc99 100644 --- a/llvm/lib/LLVMBuild.txt +++ b/llvm/lib/LLVMBuild.txt @@ -25,6 +25,7 @@ subdirectories = Demangle DWARFLinker ExecutionEngine + Extensions Frontend FuzzMutate LineEditor diff --git a/llvm/lib/LTO/CMakeLists.txt b/llvm/lib/LTO/CMakeLists.txt index e8f44adaadc1..55f1a5a85fa5 100644 --- a/llvm/lib/LTO/CMakeLists.txt +++ b/llvm/lib/LTO/CMakeLists.txt @@ -10,9 +10,6 @@ add_llvm_component_library(LLVMLTO ADDITIONAL_HEADER_DIRS ${LLVM_MAIN_INCLUDE_DIR}/llvm/LTO - - ENABLE_PLUGINS - DEPENDS intrinsics_gen llvm_vcsrevision_h diff --git a/llvm/lib/LTO/LLVMBuild.txt b/llvm/lib/LTO/LLVMBuild.txt index 84331b2f4e6a..7c9cf16ddd0e 100644 --- a/llvm/lib/LTO/LLVMBuild.txt +++ b/llvm/lib/LTO/LLVMBuild.txt @@ -26,6 +26,7 @@ required_libraries = BitWriter CodeGen Core + Extensions IPO InstCombine Linker diff --git a/llvm/tools/bugpoint/CMakeLists.txt b/llvm/tools/bugpoint/CMakeLists.txt index 8d2d5a06e664..d64481df1c1c 100644 --- a/llvm/tools/bugpoint/CMakeLists.txt +++ b/llvm/tools/bugpoint/CMakeLists.txt @@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS Analysis BitWriter CodeGen + Extensions Core IPO IRReader @@ -32,8 +33,6 @@ add_llvm_tool(bugpoint ToolRunner.cpp bugpoint.cpp - ENABLE_PLUGINS - DEPENDS intrinsics_gen SUPPORT_PLUGINS diff --git a/llvm/tools/llvm-config/llvm-config.cpp b/llvm/tools/llvm-config/llvm-config.cpp index df45c389d0a8..7e74b7c90816 100644 --- a/llvm/tools/llvm-config/llvm-config.cpp +++ b/llvm/tools/llvm-config/llvm-config.cpp @@ -46,6 +46,10 @@ using namespace llvm; // create entries for pseudo groups like x86 or all-targets. #include "LibraryDependencies.inc" +// Built-in extensions also register their dependencies, but in a separate file, +// later in the process. +#include "ExtensionDependencies.inc" + // LinkMode determines what libraries and flags are returned by llvm-config. enum LinkMode { // LinkModeAuto will link with the default link mode for the installation, @@ -110,6 +114,25 @@ static void VisitComponent(const std::string &Name, GetComponentLibraryPath, Missing, DirSep); } + // Special handling for the special 'extensions' component. Its content is + // not populated by llvm-build, but later in the process and loaded from + // ExtensionDependencies.inc. + if (Name == "extensions") { + for (auto const &AvailableExtension : AvailableExtensions) { + for (const char *const *Iter = &AvailableExtension.RequiredLibraries[0]; + *Iter; ++Iter) { + AvailableComponent *AC = ComponentMap.lookup(*Iter); + if (!AC) { + RequiredLibs.push_back(*Iter); + } else { + VisitComponent(*Iter, ComponentMap, VisitedComponents, RequiredLibs, + IncludeNonInstalled, GetComponentNames, + GetComponentLibraryPath, Missing, DirSep); + } + } + } + } + if (GetComponentNames) { RequiredLibs.push_back(Name); return; diff --git a/llvm/tools/opt/CMakeLists.txt b/llvm/tools/opt/CMakeLists.txt index 8caa1b78b729..367d129eaf50 100644 --- a/llvm/tools/opt/CMakeLists.txt +++ b/llvm/tools/opt/CMakeLists.txt @@ -9,6 +9,7 @@ set(LLVM_LINK_COMPONENTS CodeGen Core Coroutines + Extensions IPO IRReader InstCombine @@ -33,8 +34,6 @@ add_llvm_tool(opt PrintSCC.cpp opt.cpp - ENABLE_PLUGINS - DEPENDS intrinsics_gen SUPPORT_PLUGINS _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits