1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

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
This commit is contained in:
serge-sans-paille 2020-04-20 12:39:32 +02:00
parent a96834b9eb
commit 69169b30b2
11 changed files with 112 additions and 22 deletions

View File

@ -409,7 +409,7 @@ endfunction(set_windows_version_resource_properties)
# ) # )
function(llvm_add_library name) function(llvm_add_library name)
cmake_parse_arguments(ARG 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" "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
"ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
${ARGN}) ${ARGN})
@ -423,9 +423,6 @@ function(llvm_add_library name)
else() else()
llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS}) llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS})
endif() endif()
if(ARG_ENABLE_PLUGINS)
set_property(GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name})
endif()
if(ARG_MODULE) if(ARG_MODULE)
if(ARG_SHARED OR ARG_STATIC) if(ARG_SHARED OR ARG_STATIC)
@ -758,7 +755,7 @@ endmacro(add_llvm_library name)
macro(add_llvm_executable name) macro(add_llvm_executable name)
cmake_parse_arguments(ARG 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" "ENTITLEMENTS;BUNDLE_PATH"
"DEPENDS" "DEPENDS"
${ARGN}) ${ARGN})
@ -845,9 +842,6 @@ macro(add_llvm_executable name)
# API for all shared libaries loaded by this executable. # API for all shared libaries loaded by this executable.
target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB}) target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB})
endif() 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}) llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
endmacro(add_llvm_executable name) endmacro(add_llvm_executable name)
@ -920,18 +914,18 @@ function(process_llvm_pass_plugins)
include(LLVMConfigExtensions) include(LLVMConfigExtensions)
endif() endif()
# Add static plugins to each plugin target. # Add static plugins to the Extension component
foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS})
get_property(llvm_plugin_targets GLOBAL PROPERTY LLVM_PLUGIN_TARGETS) set_property(TARGET LLVMExtensions APPEND PROPERTY LINK_LIBRARIES ${llvm_extension})
foreach(llvm_plugin_target ${llvm_plugin_targets}) set_property(TARGET LLVMExtensions APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension})
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() 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. # for usage in third-party configuration.
if(ARG_GEN_CONFIG) 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_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm)
set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}")
file(WRITE file(WRITE
@ -954,6 +948,57 @@ function(process_llvm_pass_plugins)
"${ExtensionDef}.tmp" "${ExtensionDef}.tmp"
"${ExtensionDef}") "${ExtensionDef}")
file(REMOVE "${ExtensionDef}.tmp") 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 differs 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_different
"${ExtensionDeps}.tmp"
"${ExtensionDeps}")
file(REMOVE "${ExtensionDeps}.tmp")
endif() endif()
endfunction() endfunction()

View File

@ -9,6 +9,7 @@ add_subdirectory(BinaryFormat)
add_subdirectory(Bitcode) add_subdirectory(Bitcode)
add_subdirectory(Bitstream) add_subdirectory(Bitstream)
add_subdirectory(DWARFLinker) add_subdirectory(DWARFLinker)
add_subdirectory(Extensions)
add_subdirectory(Frontend) add_subdirectory(Frontend)
add_subdirectory(Transforms) add_subdirectory(Transforms)
add_subdirectory(Linker) add_subdirectory(Linker)

View File

@ -0,0 +1,3 @@
add_llvm_component_library(LLVMExtensions
Extensions.cpp
)

View File

View File

@ -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 =

View File

@ -25,6 +25,7 @@ subdirectories =
Demangle Demangle
DWARFLinker DWARFLinker
ExecutionEngine ExecutionEngine
Extensions
Frontend Frontend
FuzzMutate FuzzMutate
LineEditor LineEditor

View File

@ -10,9 +10,6 @@ add_llvm_component_library(LLVMLTO
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS
${LLVM_MAIN_INCLUDE_DIR}/llvm/LTO ${LLVM_MAIN_INCLUDE_DIR}/llvm/LTO
ENABLE_PLUGINS
DEPENDS DEPENDS
intrinsics_gen intrinsics_gen
llvm_vcsrevision_h llvm_vcsrevision_h

View File

@ -26,6 +26,7 @@ required_libraries =
BitWriter BitWriter
CodeGen CodeGen
Core Core
Extensions
IPO IPO
InstCombine InstCombine
Linker Linker

View File

@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS
Analysis Analysis
BitWriter BitWriter
CodeGen CodeGen
Extensions
Core Core
IPO IPO
IRReader IRReader
@ -32,8 +33,6 @@ add_llvm_tool(bugpoint
ToolRunner.cpp ToolRunner.cpp
bugpoint.cpp bugpoint.cpp
ENABLE_PLUGINS
DEPENDS DEPENDS
intrinsics_gen intrinsics_gen
SUPPORT_PLUGINS SUPPORT_PLUGINS

View File

@ -46,6 +46,10 @@ using namespace llvm;
// create entries for pseudo groups like x86 or all-targets. // create entries for pseudo groups like x86 or all-targets.
#include "LibraryDependencies.inc" #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. // LinkMode determines what libraries and flags are returned by llvm-config.
enum LinkMode { enum LinkMode {
// LinkModeAuto will link with the default link mode for the installation, // 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); 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) { if (GetComponentNames) {
RequiredLibs.push_back(Name); RequiredLibs.push_back(Name);
return; return;

View File

@ -9,6 +9,7 @@ set(LLVM_LINK_COMPONENTS
CodeGen CodeGen
Core Core
Coroutines Coroutines
Extensions
IPO IPO
IRReader IRReader
InstCombine InstCombine
@ -33,8 +34,6 @@ add_llvm_tool(opt
PrintSCC.cpp PrintSCC.cpp
opt.cpp opt.cpp
ENABLE_PLUGINS
DEPENDS DEPENDS
intrinsics_gen intrinsics_gen
SUPPORT_PLUGINS SUPPORT_PLUGINS