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:
parent
a96834b9eb
commit
69169b30b2
@ -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()
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
3
lib/Extensions/CMakeLists.txt
Normal file
3
lib/Extensions/CMakeLists.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
add_llvm_component_library(LLVMExtensions
|
||||||
|
Extensions.cpp
|
||||||
|
)
|
0
lib/Extensions/Extensions.cpp
Normal file
0
lib/Extensions/Extensions.cpp
Normal file
21
lib/Extensions/LLVMBuild.txt
Normal file
21
lib/Extensions/LLVMBuild.txt
Normal 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 =
|
@ -25,6 +25,7 @@ subdirectories =
|
|||||||
Demangle
|
Demangle
|
||||||
DWARFLinker
|
DWARFLinker
|
||||||
ExecutionEngine
|
ExecutionEngine
|
||||||
|
Extensions
|
||||||
Frontend
|
Frontend
|
||||||
FuzzMutate
|
FuzzMutate
|
||||||
LineEditor
|
LineEditor
|
||||||
|
@ -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
|
||||||
|
@ -26,6 +26,7 @@ required_libraries =
|
|||||||
BitWriter
|
BitWriter
|
||||||
CodeGen
|
CodeGen
|
||||||
Core
|
Core
|
||||||
|
Extensions
|
||||||
IPO
|
IPO
|
||||||
InstCombine
|
InstCombine
|
||||||
Linker
|
Linker
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user