1 include(GetLibraryName)
3 # Ensure that libSupport does not carry any static global initializer.
4 # libSupport can be embedded in use cases where we don't want to load all
5 # cl::opt unless we want to parse the command line.
6 # ManagedStatic can be used to enable lazy-initialization of globals.
7 # We don't use `add_flag_if_supported` as instead of compiling an empty file we
8 # check if the current platform is able to compile global std::mutex with this
9 # flag (Linux can, Darwin can't for example).
10 check_cxx_compiler_flag("-Werror=global-constructors" HAS_WERROR_GLOBAL_CTORS)
11 if (HAS_WERROR_GLOBAL_CTORS)
12 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=global-constructors")
13 CHECK_CXX_SOURCE_COMPILES("
15 static std::mutex TestGlobalCtorDtor;
16 static std::recursive_mutex TestGlobalCtorDtor2;
17 int main() { (void)TestGlobalCtorDtor; (void)TestGlobalCtorDtor2; return 0;}
18 " LLVM_HAS_NOGLOBAL_CTOR_MUTEX)
19 if (NOT LLVM_HAS_NOGLOBAL_CTOR_MUTEX)
20 string(REPLACE "-Werror=global-constructors" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
25 set(imported_libs ZLIB::ZLIB)
29 # libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
30 # advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
31 set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32)
32 elseif( CMAKE_HOST_UNIX )
34 set(system_libs ${system_libs} rt)
37 set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
39 if( HAVE_BACKTRACE AND NOT "${Backtrace_LIBRARIES}" STREQUAL "" )
40 # On BSDs, CMake returns a fully qualified path to the backtrace library.
41 # We need to remove the path and the 'lib' prefix, to make it look like a
42 # regular short library name, suitable for appending to a -l link flag.
43 get_filename_component(Backtrace_LIBFILE ${Backtrace_LIBRARIES} NAME_WE)
44 STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
45 set(system_libs ${system_libs} ${Backtrace_LIBFILE})
47 if( LLVM_ENABLE_TERMINFO )
48 set(imported_libs ${imported_libs} "${TERMINFO_LIB}")
50 if( LLVM_ENABLE_THREADS AND (HAVE_LIBATOMIC OR HAVE_CXX_LIBATOMICS64) )
51 set(system_libs ${system_libs} atomic)
53 set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
54 if( UNIX AND NOT (BEOS OR HAIKU) )
55 set(system_libs ${system_libs} m)
58 set(system_libs ${system_libs} zircon)
61 add_definitions(-D_BSD_SOURCE)
62 set(system_libs ${system_libs} bsd)
64 endif( MSVC OR MINGW )
66 # Delay load shell32.dll if possible to speed up process startup.
69 set (delayload_flags delayimp -delayload:shell32.dll -delayload:ole32.dll)
72 # Link Z3 if the user wants to build it.
74 set(system_libs ${system_libs} ${Z3_LIBRARIES})
77 # Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
78 if(LLVM_INTEGRATED_CRT_ALLOC)
79 if (CMAKE_BUILD_TYPE AND NOT ${LLVM_USE_CRT_${uppercase_CMAKE_BUILD_TYPE}} MATCHES "^(MT|MTd)$")
80 message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with /MT or /MTd. Use LLVM_USE_CRT_${uppercase_CMAKE_BUILD_TYPE} to set the appropriate option.")
83 string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
85 if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
86 message(FATAL_ERROR "Cannot find the path to `git clone` for the CRT allocator! (${LLVM_INTEGRATED_CRT_ALLOC}). Currently, rpmalloc, snmalloc and mimalloc are supported.")
89 if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$")
90 add_definitions(-DENABLE_OVERRIDE -DENABLE_PRELOAD)
91 set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
92 elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
93 set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/override/malloc.cc" "${LLVM_INTEGRATED_CRT_ALLOC}/src/override/new.cc")
94 set(system_libs ${system_libs} "mincore.lib" "-INCLUDE:malloc")
95 elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
96 set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
97 if(NOT EXISTS "${MIMALLOC_LIB}")
98 message(FATAL_ERROR "Cannot find the mimalloc static library. To build it, first apply the patch from https://github.com/microsoft/mimalloc/issues/268 then build the Release x64 target through ${LLVM_INTEGRATED_CRT_ALLOC}\\ide\\vs2019\\mimalloc.sln")
100 set(system_libs ${system_libs} "${MIMALLOC_LIB}" "-INCLUDE:malloc")
104 add_llvm_component_library(LLVMSupport
105 AArch64TargetParser.cpp
114 ARMAttributeParser.cpp
118 BinaryStreamError.cpp
119 BinaryStreamReader.cpp
121 BinaryStreamWriter.cpp
123 BranchProbability.cpp
126 circular_raw_ostream.cpp
134 ConvertUTFWrapper.cpp
135 CrashRecoveryContext.cpp
140 DAGDeltaAlgorithm.cpp
142 ELFAttributeParser.cpp
160 ItaniumManglingCanonicalizer.cpp
175 OptimizedStructLayout.cpp
180 RandomNumberGenerator.cpp
183 RISCVAttributeParser.cpp
199 SymbolRemappingReader.cpp
214 VirtualFileSystem.cpp
248 ADDITIONAL_HEADER_DIRS
251 ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
252 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
253 ${Backtrace_INCLUDE_DIRS}
256 ${system_libs} ${imported_libs} ${delayload_flags}
262 set(llvm_system_libs ${system_libs})
264 # This block is only needed for llvm-config. When we deprecate llvm-config and
265 # move to using CMake export, this block can be removed.
267 # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
269 string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
270 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
273 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
275 get_library_name(${zlib_library} zlib_library)
276 set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
279 if(LLVM_ENABLE_TERMINFO)
280 get_library_name(${TERMINFO_LIB} terminfo_library)
281 set(llvm_system_libs ${llvm_system_libs} "${terminfo_library}")
284 set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
287 if(LLVM_INTEGRATED_CRT_ALLOC)
288 if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
289 set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
290 add_definitions(-D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
291 if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
292 "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
293 set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
299 target_include_directories(LLVMSupport SYSTEM