[OpenMP] Use add_llvm_library to build the target PluginInterface in plugins-nextgen

This patch uses `add_llvm_library` to build the target `PluginInterface` since it can handle LLVM dependences much better. One temporary drawback of using this is that currently LLVM CMake macro doesn't support object libraries very well (there was a try a couple years ago but it was reverted later 29e5722949). After switching to that, `CXX_VISIBILITY_PRESET` can not be set correctly, which can cause runtime error that a function call from one plugin could go to another. As a consequence, `PluginInterface` is built as a static library for now. I have asked the question in CMake community (https://discourse.cmake.org/t/set-target-properties-doesnt-work-properly/7016). Once that issue is solved, I'll switch it back to object library. It is not necessarily too bad to use static library, especially `BUILDTREE_ONLY` is already set such that `PluginInterface.a` will not be installed.

Reviewed By: jhuber6

Differential Revision: https://reviews.llvm.org/D139371
This commit is contained in:
Shilei Tian 2022-12-06 11:36:07 -05:00
parent adc7c589c3
commit e682a76c3b
2 changed files with 45 additions and 28 deletions

View File

@ -11,24 +11,39 @@
##===----------------------------------------------------------------------===##
# Plugin Interface library.
add_library(PluginInterface OBJECT PluginInterface.cpp GlobalHandler.cpp)
add_llvm_library(PluginInterface PluginInterface.cpp GlobalHandler.cpp
BUILDTREE_ONLY
# Define the TARGET_NAME.
add_definitions("-DTARGET_NAME=PluginInterface")
LINK_COMPONENTS
Support
# Define the DEBUG_PREFIX.
add_definitions(-DDEBUG_PREFIX="PluginInterface")
LINK_LIBS
elf_common
)
# NOTE: Please don't move `MemoryManager` to `LINK_LIBS` above, even though it
# is an interface "library". Don't expect it to be treated as a "library" such
# that we just need to link it via CMake and its include path will be updated
# automatically. It is because `PluginInterface` is a static library here, and
# per CMake design (which makes sense), privately linked libraries have to be
# exported. However, there is no a typical way in CMake to export an interface
# library without install rules. We apparently don't need `MemoryManager`'s
# header out of the build tree.
target_include_directories(PluginInterface PRIVATE
$<TARGET_PROPERTY:MemoryManager,INTERFACE_INCLUDE_DIRECTORIES>
)
# Define the TARGET_NAME and DEBUG_PREFIX.
target_compile_definitions(PluginInterface PRIVATE
TARGET_NAME="PluginInterface"
DEBUG_PREFIX="PluginInterface"
)
target_include_directories(PluginInterface
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${LIBOMPTARGET_INCLUDE_DIR}
)
set_target_properties(PluginInterface PROPERTIES
POSITION_INDEPENDENT_CODE ON
CXX_VISIBILITY_PRESET protected)
llvm_update_compile_flags(PluginInterface)
set(LINK_LLVM_LIBS LLVMSupport)
if (LLVM_LINK_LLVM_DYLIB)
set(LINK_LLVM_LIBS LLVM)
endif()
target_link_libraries(PluginInterface INTERFACE ${LINK_LLVM_LIBS} PRIVATE elf_common MemoryManager)
add_dependencies(PluginInterface ${LINK_LLVM_LIBS})
target_include_directories(PluginInterface INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(PluginInterface PRIVATE ${LIBOMPTARGET_INCLUDE_DIR})

View File

@ -10,21 +10,23 @@
#
##===----------------------------------------------------------------------===##
add_library(elf_common OBJECT elf_common.cpp ELFSymbols.cpp)
add_llvm_library(elf_common elf_common.cpp ELFSymbols.cpp
BUILDTREE_ONLY
LINK_COMPONENTS
BinaryFormat
Object
Support
LINK_LIBS
${OPENMP_PTHREAD_LIB}
)
# Build elf_common with PIC to be able to link it with plugin shared libraries.
set_property(TARGET elf_common PROPERTY POSITION_INDEPENDENT_CODE ON)
llvm_update_compile_flags(elf_common)
set(LINK_LLVM_LIBS LLVMBinaryFormat LLVMObject LLVMSupport)
if (LLVM_LINK_LLVM_DYLIB)
set(LINK_LLVM_LIBS LLVM)
endif()
target_link_libraries(elf_common INTERFACE ${LINK_LLVM_LIBS})
add_dependencies(elf_common ${LINK_LLVM_LIBS})
# The code uses Debug.h, which requires threads support.
target_link_libraries(elf_common INTERFACE ${OPENMP_PTHREAD_LIB})
# Expose elf_common.h directory to the users of this library.
target_include_directories(elf_common INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(elf_common PRIVATE ${LIBOMPTARGET_INCLUDE_DIR})
target_include_directories(elf_common
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${LIBOMPTARGET_INCLUDE_DIR}
)