[clang] 8f766e3 - Update compiler extension integration into the build system
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 24 00:40:37 PDT 2020
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
More information about the cfe-commits
mailing list