Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial changes for llvm shared library build using explicit visibility annotations #96630

Merged
merged 3 commits into from
Sep 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 32 additions & 10 deletions llvm/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

cmake_minimum_required(VERSION 3.20.0)

include(CMakeDependentOption)

set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
NO_POLICY_SCOPE)
Expand Down Expand Up @@ -839,20 +841,40 @@ endif()

if(MSVC)
option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
# Set this variable to OFF here so it can't be set with a command-line
# argument.
set (LLVM_LINK_LLVM_DYLIB OFF)
if (BUILD_SHARED_LIBS)
message(FATAL_ERROR "BUILD_SHARED_LIBS options is not supported on Windows.")
endif()
else()
option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
else()
option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
set(LLVM_BUILD_LLVM_DYLIB_default OFF)
if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
set(LLVM_BUILD_LLVM_DYLIB_default ON)
endif()
option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
endif()

# Used to test building the llvm shared library with explicit symbol visibility on
# Windows and Linux. For ELF platforms default symbols visibility is set to hidden.
set(LLVM_BUILD_LLVM_DYLIB_VIS FALSE CACHE BOOL "")
mark_as_advanced(LLVM_BUILD_LLVM_DYLIB_VIS)

set(CAN_BUILD_LLVM_DYLIB OFF)
if(NOT MSVC OR LLVM_BUILD_LLVM_DYLIB_VIS)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is LLVM_BUILD_LLVM_DYLIB_VIS defined? What does the _VIS suffix stand for?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its a temporary option to allow testing the build with explicit visibility on Windows and Linux the idea is it will go away in the end, when I've gotten all my changes merged. It has to be separate from LLVM_BUILD_LLVM_DYLIB because there will be linker errors from symbols not exported when building llvm tools until the whole llvm codebase has export visibility macros added to it.
The idea was it was not a publicly defined option so people don't try use and submit bug reports against it. If you want I can publicly define it with a don't use for testing purposes only description.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could consider making it an internal variable:

set(LLVM_BUILD_LLVM_DYLIB_VIS OFF CACHE INTERNAL "")

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't realize it had that mode, I've update code to define it like that.

set(CAN_BUILD_LLVM_DYLIB ON)
endif()

cmake_dependent_option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF
"CAN_BUILD_LLVM_DYLIB" OFF)

set(LLVM_BUILD_LLVM_DYLIB_default OFF)
if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
set(LLVM_BUILD_LLVM_DYLIB_default ON)
endif()
cmake_dependent_option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default}
"CAN_BUILD_LLVM_DYLIB" OFF)

cmake_dependent_option(LLVM_DYLIB_EXPORT_INLINES "Force inline members of classes to be DLL exported when
building with clang-cl so the libllvm DLL is compatible with MSVC"
OFF
"MSVC;LLVM_BUILD_LLVM_DYLIB_VIS" OFF)

if(LLVM_BUILD_LLVM_DYLIB_VIS)
set(LLVM_BUILD_LLVM_DYLIB ON)
endif()

if (LLVM_LINK_LLVM_DYLIB AND BUILD_SHARED_LIBS)
Expand Down
45 changes: 45 additions & 0 deletions llvm/cmake/modules/AddLLVM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -606,6 +606,10 @@ function(llvm_add_library name)
endif()
endforeach()
endif()

if(ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
target_compile_definitions(${obj_name} PRIVATE LLVM_BUILD_STATIC)
endif()
endif()

if(ARG_SHARED AND ARG_STATIC)
Expand Down Expand Up @@ -641,8 +645,36 @@ function(llvm_add_library name)
endif()
set_target_properties(${name} PROPERTIES FOLDER "${subproject_title}/Libraries")

## If were compiling with clang-cl use /Zc:dllexportInlines- to exclude inline
## class members from being dllexport'ed to reduce compile time.
## This will also keep us below the 64k exported symbol limit
## https://blog.llvm.org/2018/11/30-faster-windows-builds-with-clang-cl_14.html
if(LLVM_BUILD_LLVM_DYLIB AND NOT LLVM_DYLIB_EXPORT_INLINES AND
MSVC AND CMAKE_CXX_COMPILER_ID MATCHES Clang)
target_compile_options(${name} PUBLIC /Zc:dllexportInlines-)
if(TARGET ${obj_name})
target_compile_options(${obj_name} PUBLIC /Zc:dllexportInlines-)
endif()
endif()

if(ARG_COMPONENT_LIB)
set_target_properties(${name} PROPERTIES LLVM_COMPONENT TRUE)
if(LLVM_BUILD_LLVM_DYLIB OR BUILD_SHARED_LIBS)
target_compile_definitions(${name} PRIVATE LLVM_EXPORTS)
endif()

# When building shared objects for each target there are some internal APIs
# that are used across shared objects which we can't hide.
if (LLVM_BUILD_LLVM_DYLIB_VIS AND NOT BUILD_SHARED_LIBS AND NOT APPLE AND
(NOT (WIN32 OR CYGWIN) OR (MINGW AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")) AND
NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX") AND
NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET)

set_target_properties(${name} PROPERTIES
C_VISIBILITY_PRESET hidden
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN YES)
endif()
set_property(GLOBAL APPEND PROPERTY LLVM_COMPONENT_LIBS ${name})
endif()

Expand Down Expand Up @@ -741,6 +773,9 @@ function(llvm_add_library name)
if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
set(llvm_libs LLVM)
else()
if(ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
target_compile_definitions(${name} PRIVATE LLVM_BUILD_STATIC)
endif()
llvm_map_components_to_libnames(llvm_libs
${ARG_LINK_COMPONENTS}
${LLVM_LINK_COMPONENTS}
Expand Down Expand Up @@ -1116,6 +1151,16 @@ macro(add_llvm_executable name)
if (ARG_EXPORT_SYMBOLS)
export_executable_symbols(${name})
endif()

if(ARG_DISABLE_LLVM_LINK_LLVM_DYLIB OR NOT LLVM_LINK_LLVM_DYLIB)
target_compile_definitions(${name} PRIVATE LLVM_BUILD_STATIC)
endif()

if(LLVM_BUILD_LLVM_DYLIB_VIS AND NOT LLVM_DYLIB_EXPORT_INLINES AND
MSVC AND CMAKE_CXX_COMPILER_ID MATCHES Clang)
# This has to match how the libraries the executable is linked to are built or there be linker errors.
target_compile_options(${name} PRIVATE /Zc:dllexportInlines-)
endif()
endmacro(add_llvm_executable name)

# add_llvm_pass_plugin(name [NO_MODULE] ...)
Expand Down
6 changes: 6 additions & 0 deletions llvm/cmake/modules/HandleLLVMOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,12 @@ if (MSVC)
# any code that uses the LLVM_ALIGNAS macro), so this is must be disabled to
# avoid unwanted alignment warnings.
-wd4324 # Suppress 'structure was padded due to __declspec(align())'
# This is triggered for every variable that is a template type of a class even
# if there private when the class is dllexport'ed
-wd4251 # Suppress 'needs to have dll-interface to be used by clients'
# We only putting dll export on classes with out of line members so this
# warning gets triggered a lot for bases we haven't exported'
-wd4275 # non dll-interface class used as base for dll-interface class

# Promoted warnings.
-w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning.
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/ADT/Any.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

namespace llvm {

class LLVM_EXTERNAL_VISIBILITY Any {
class LLVM_ABI Any {

// The `Typeid<T>::Id` static data member below is a globally unique
// identifier for the type `T`. It is explicitly marked with default
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/Analysis/LazyCallGraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ class LazyCallGraph {
/// outer structure. SCCs do not support mutation of the call graph, that
/// must be done through the containing \c RefSCC in order to fully reason
/// about the ordering and connections of the graph.
class LLVM_EXTERNAL_VISIBILITY SCC {
class LLVM_ABI SCC {
friend class LazyCallGraph;
friend class LazyCallGraph::Node;

Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/Analysis/LoopInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ extern template class LoopBase<BasicBlock, Loop>;

/// Represents a single loop in the control flow graph. Note that not all SCCs
/// in the CFG are necessarily loops.
class LLVM_EXTERNAL_VISIBILITY Loop : public LoopBase<BasicBlock, Loop> {
class LLVM_ABI Loop : public LoopBase<BasicBlock, Loop> {
public:
/// A range representing the start and end location of a loop.
class LocRange {
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/Analysis/LoopNestAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ using LoopVectorTy = SmallVector<Loop *, 8>;
class LPMUpdater;

/// This class represents a loop nest and can be used to query its properties.
class LLVM_EXTERNAL_VISIBILITY LoopNest {
class LLVM_ABI LoopNest {
public:
using InstrVectorTy = SmallVector<const Instruction *>;

Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/CodeGen/MachineFunction.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ struct LandingPadInfo {
: LandingPadBlock(MBB) {}
};

class LLVM_EXTERNAL_VISIBILITY MachineFunction {
class LLVM_ABI MachineFunction {
Function &F;
const LLVMTargetMachine &Target;
const TargetSubtargetInfo *STI;
Expand Down
3 changes: 1 addition & 2 deletions llvm/include/llvm/IR/Function.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ class User;
class BranchProbabilityInfo;
class BlockFrequencyInfo;

class LLVM_EXTERNAL_VISIBILITY Function : public GlobalObject,
public ilist_node<Function> {
class LLVM_ABI Function : public GlobalObject, public ilist_node<Function> {
public:
using BasicBlockListType = SymbolTableList<BasicBlock>;

Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/IR/Module.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class VersionTuple;
/// constant references to global variables in the module. When a global
/// variable is destroyed, it should have no entries in the GlobalList.
/// The main container class for the LLVM Intermediate Representation.
class LLVM_EXTERNAL_VISIBILITY Module {
class LLVM_ABI Module {
/// @name Types And Enumerations
/// @{
public:
Expand Down
74 changes: 68 additions & 6 deletions llvm/include/llvm/Support/Compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@
/// this attribute will be made public and visible outside of any shared library
/// they are linked in to.

#if LLVM_HAS_CPP_ATTRIBUTE(gnu::visibility)
#if LLVM_HAS_CPP_ATTRIBUTE(gnu::visibility) && defined(__GNUC__) && \
!defined(__clang__)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clang should support this under the GNU standard. Can you add a note on why this condition is needed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the need for it was, it was part of @tstellar initial changes to the file that i based my code on. I can just remove it if there wasn't some clear purpose for it.

Copy link
Collaborator

@tstellar tstellar Jul 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clang supports it, but IIRC the rules about where in the function declaration the c++11 style attributes can be placed is different between gcc in clang. See the comments here:

https://github.com/tstellar/template-visibility/blob/testing/templates.h

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That file is my pain. I did add a option to the clang tool to switch between the two places where to generate the macro for for functions. I also did try generating export macros on template classes, but it just creates ton a more code that needs to be fixed for MSVC and can be problematic for class static fields when classes with instantiations outside the llvm shared library.

#define LLVM_ATTRIBUTE_VISIBILITY_HIDDEN [[gnu::visibility("hidden")]]
#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT [[gnu::visibility("default")]]
#elif __has_attribute(visibility)
Expand All @@ -121,18 +122,79 @@
#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#endif


#if (!(defined(_WIN32) || defined(__CYGWIN__)) || \
(defined(__MINGW32__) && defined(__clang__)))
#define LLVM_LIBRARY_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_HIDDEN
#if defined(LLVM_BUILD_LLVM_DYLIB) || defined(LLVM_BUILD_SHARED_LIBS)
#define LLVM_EXTERNAL_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#else
#define LLVM_EXTERNAL_VISIBILITY
#endif

#if (!(defined(_WIN32) || defined(__CYGWIN__)) || \
(defined(__MINGW32__) && defined(__clang__)))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why the defined(__MINGW32__) && defined(__clang__) ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know it was existing code that got rearranged slightly, it was controlling LLVM_EXTERNAL_VISIBILITY before

#define LLVM_LIBRARY_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_HIDDEN
#define LLVM_ALWAYS_EXPORT LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure how I feel about this abstraction (LLVM_ATTRIBUTE_VISIBILITY_*), but I suppose that it doesn't matter too much.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the alternative for non windows platforms other than this? I used LLVM_ALWAYS_EXPORT for some special JIT debugger registration functions that were annotated with LLVM_ATTRIBUTE_VISIBILITY_DEFAULT before.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Explicitly spelling out the attribute OSS what I was suggesting. On Linux, protected visibility has interesting behavior where symbols are not interpositionable and are externally visible. Using that is potentially useful for load times on Linux for exported symbols.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know about protected, wouldn't it also indirectly stop symbols being merging across shared libraries and executables by the loader? maybe that would be what you always want for the JIT debugger symbols.

#elif defined(_WIN32)
#define LLVM_ALWAYS_EXPORT __declspec(dllexport)
#define LLVM_LIBRARY_VISIBILITY
#else
#define LLVM_LIBRARY_VISIBILITY
#define LLVM_EXTERNAL_VISIBILITY
#define LLVM_ALWAYS_EXPORT
#endif

/// LLVM_ABI is the main export/visibility macro to mark something as explicitly
/// exported when llvm is built as a shared library with everything else that is
/// unannotated will have internal visibility.
///
/// LLVM_EXPORT_TEMPLATE is used on explicit template instantiations in source
/// files that were declared extern in a header. This macro is only set as a
/// compiler export attribute on windows, on other platforms it does nothing.
///
/// LLVM_TEMPLATE_ABI is for annotating extern template declarations in headers
/// for both functions and classes. On windows its turned in to dllimport for
/// library consumers, for other platforms its a default visibility attribute.
///
/// LLVM_C_ABI is used to annotated functions and data that need to be exported
/// for the libllvm-c API. This used both for the llvm-c headers and for the
/// functions declared in the different Target's c++ source files that don't
/// include the header forward declaring them.
#ifndef LLVM_ABI_GENERATING_ANNOTATIONS
// Marker to add to classes or functions in public headers that should not have
// export macros added to them by the clang tool
#define LLVM_ABI_NOT_EXPORTED
#if defined(LLVM_BUILD_LLVM_DYLIB) || defined(LLVM_BUILD_SHARED_LIBS) || \
defined(LLVM_ENABLE_PLUGINS)
Comment on lines +163 to +164
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should hoist this into CMake and map this to LLVM_BUILD_STATIC.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just wanted avoid doing it in CMake yet because its more complex to do and easy to get wrong.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay; I guess getting it in is a good first step. The CMake bits, I think you should wait to get sign off from @petrhosek as well.

// Some libraries like those for tablegen are linked in to tools that used
// in the build so can't depend on the llvm shared library. If export macros
// were left enabled when building these we would get duplicate or
// missing symbol linker errors on windows.
#if defined(LLVM_BUILD_STATIC)
#define LLVM_ABI
#define LLVM_TEMPLATE_ABI
#define LLVM_EXPORT_TEMPLATE
#elif defined(_WIN32) && !defined(__MINGW32__)
#if defined(LLVM_EXPORTS)
#define LLVM_ABI __declspec(dllexport)
#define LLVM_TEMPLATE_ABI
#define LLVM_EXPORT_TEMPLATE __declspec(dllexport)
#else
#define LLVM_ABI __declspec(dllimport)
#define LLVM_TEMPLATE_ABI __declspec(dllimport)
#define LLVM_EXPORT_TEMPLATE
#endif
#elif defined(__ELF__) || defined(__MINGW32__)
#define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#define LLVM_TEMPLATE_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#define LLVM_EXPORT_TEMPLATE
#elif defined(__MACH__) || defined(__WASM__)
#define LLVM_ABI LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
#define LLVM_TEMPLATE_ABI
#define LLVM_EXPORT_TEMPLATE
#endif
#else
#define LLVM_ABI
#define LLVM_TEMPLATE_ABI
#define LLVM_EXPORT_TEMPLATE
#endif
#define LLVM_C_ABI LLVM_ABI
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We really should not conflate the LLVM ABI and the LLVM C ABI.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The idea was it could maybe made separate later on for some kind of optimized llvmc only build. There also exported functions in Target libs like LLVMInitialize* that are used both in C and c++ API.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's actually more towards what my point was :) We shouldn't be defining the C ABI in terms of the C++ ABI. The C ABI is guaranteed stable while the C++ is not. It may be someone wants to not expose the C++ ABI (builds statically) but still build the C interface as a DSO.

#endif

#if defined(__GNUC__)
Expand Down
33 changes: 20 additions & 13 deletions llvm/tools/llvm-shlib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ if(LLVM_LINK_LLVM_DYLIB AND LLVM_DYLIB_EXPORTED_SYMBOL_FILE)
endif()

if(LLVM_BUILD_LLVM_DYLIB)
if(MSVC)
if(MSVC AND NOT LLVM_BUILD_LLVM_DYLIB_VIS)
message(FATAL_ERROR "Generating libLLVM is not supported on MSVC")
endif()
if(ZOS)
Expand Down Expand Up @@ -49,18 +49,25 @@ if(LLVM_BUILD_LLVM_DYLIB)
${CMAKE_CURRENT_SOURCE_DIR}/simple_version_script.map.in
${LLVM_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map)

# GNU ld doesn't resolve symbols in the version script.
set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
if (NOT LLVM_LINKER_IS_SOLARISLD AND NOT MINGW)
# Solaris ld does not accept global: *; so there is no way to version *all* global symbols
set(LIB_NAMES -Wl,--version-script,${LLVM_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map ${LIB_NAMES})
endif()
if (NOT MINGW AND NOT LLVM_LINKER_IS_SOLARISLD_ILLUMOS)
# Optimize function calls for default visibility definitions to avoid PLT and
# reduce dynamic relocations.
# Note: for -fno-pic default, the address of a function may be different from
# inside and outside libLLVM.so.
target_link_options(LLVM PRIVATE LINKER:-Bsymbolic-functions)
if(MSVC)
target_link_directories(LLVM PRIVATE ${LLVM_LIBRARY_DIR})
foreach(library ${LIB_NAMES})
target_link_options(LLVM PRIVATE /WHOLEARCHIVE:${library}.lib)
endforeach()
else()
# GNU ld doesn't resolve symbols in the version script.
set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
if (NOT LLVM_LINKER_IS_SOLARISLD AND NOT MINGW)
# Solaris ld does not accept global: *; so there is no way to version *all* global symbols
set(LIB_NAMES -Wl,--version-script,${LLVM_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map ${LIB_NAMES})
endif()
if (NOT MINGW AND NOT LLVM_LINKER_IS_SOLARISLD_ILLUMOS)
# Optimize function calls for default visibility definitions to avoid PLT and
# reduce dynamic relocations.
# Note: for -fno-pic default, the address of a function may be different from
# inside and outside libLLVM.so.
target_link_options(LLVM PRIVATE LINKER:-Bsymbolic-functions)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

endif()
endif()
endif()

Expand Down
2 changes: 1 addition & 1 deletion llvm/utils/TableGen/Basic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ set(LLVM_LINK_COMPONENTS
TableGen
)

add_llvm_library(LLVMTableGenBasic OBJECT EXCLUDE_FROM_ALL
add_llvm_library(LLVMTableGenBasic OBJECT EXCLUDE_FROM_ALL DISABLE_LLVM_LINK_LLVM_DYLIB
CodeGenIntrinsics.cpp
SDNodeProperties.cpp
)
Expand Down
2 changes: 1 addition & 1 deletion llvm/utils/TableGen/Common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ set(LLVM_LINK_COMPONENTS
TableGen
)

add_llvm_library(LLVMTableGenCommon STATIC OBJECT EXCLUDE_FROM_ALL
add_llvm_library(LLVMTableGenCommon STATIC OBJECT EXCLUDE_FROM_ALL DISABLE_LLVM_LINK_LLVM_DYLIB
GlobalISel/CodeExpander.cpp
GlobalISel/CombinerUtils.cpp
GlobalISel/CXXPredicates.cpp
Expand Down
Loading