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 list(APPEND imported_libs ZLIB::ZLIB)
29 if(TARGET zstd::libzstd_shared AND NOT LLVM_USE_STATIC_ZSTD)
30 set(zstd_target zstd::libzstd_shared)
32 set(zstd_target zstd::libzstd_static)
37 list(APPEND imported_libs ${zstd_target})
41 # libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
42 # advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
43 # ntdll required for RtlGetLastNtStatus in lib/Support/ErrorHandling.cpp.
44 set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32 ws2_32 ntdll)
45 elseif( CMAKE_HOST_UNIX )
47 set(system_libs ${system_libs} rt)
50 set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
52 if( HAVE_BACKTRACE AND NOT "${Backtrace_LIBRARIES}" STREQUAL "" )
53 # On BSDs, CMake returns a fully qualified path to the backtrace library.
54 # We need to remove the path and the 'lib' prefix, to make it look like a
55 # regular short library name, suitable for appending to a -l link flag.
56 get_filename_component(Backtrace_LIBFILE ${Backtrace_LIBRARIES} NAME_WE)
57 STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
58 set(system_libs ${system_libs} ${Backtrace_LIBFILE})
60 set(system_libs ${system_libs} ${LLVM_ATOMIC_LIB})
61 set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
62 if( UNIX AND NOT (BEOS OR HAIKU) )
63 set(system_libs ${system_libs} m)
65 if( UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
66 set(system_libs ${system_libs} kstat socket)
69 set(system_libs ${system_libs} zircon)
72 add_compile_definitions(_BSD_SOURCE)
73 set(system_libs ${system_libs} bsd network)
77 # Delay load shell32.dll if possible to speed up process startup.
80 # When linking with Swift, `swiftc.exe` is used as the linker drive rather
81 # than invoking `link.exe` directly. In such a case, the flags should be
82 # marked as `-Xlinker` to pass them directly to the linker. As a temporary
83 # workaround simply elide the delay loading.
84 set (delayload_flags $<$<NOT:$<LINK_LANGUAGE:Swift>>:delayimp -delayload:shell32.dll -delayload:ole32.dll>)
87 # Link Z3 if the user wants to build it.
89 set(system_libs ${system_libs} ${Z3_LIBRARIES})
92 # Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
93 if(LLVM_INTEGRATED_CRT_ALLOC)
94 if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
95 message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with CMAKE_MSVC_RUNTIME_LIBRARY set to MultiThreaded or MultiThreadedDebug.")
98 string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
100 if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
101 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.")
104 if((LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$") OR LLVM_ENABLE_RPMALLOC)
105 add_compile_definitions(ENABLE_OVERRIDE ENABLE_PRELOAD)
106 set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
107 set(delayload_flags "${delayload_flags} -INCLUDE:malloc")
108 elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
109 set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/snmalloc/override/new.cc")
110 set(system_libs ${system_libs} "mincore.lib" "-INCLUDE:malloc")
111 elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
112 set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
113 if(NOT EXISTS "${MIMALLOC_LIB}")
114 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")
116 set(system_libs ${system_libs} "${MIMALLOC_LIB}" "-INCLUDE:malloc")
120 # FIXME: We are currently guarding AIX headers with _XOPEN_SOURCE=700.
121 # See llvm/CMakeLists.txt. However, we need _SC_NPROCESSORS_ONLN in
122 # unistd.h and it is guarded by _ALL_SOURCE, so we remove the _XOPEN_SOURCE
123 # guard here. We should remove the guards all together once AIX cleans up
124 # the system headers.
125 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
126 remove_definitions("-D_XOPEN_SOURCE=700")
129 add_subdirectory(BLAKE3)
131 add_llvm_component_library(LLVMSupport
139 ARMAttributeParser.cpp
144 BalancedPartitioning.cpp
145 BinaryStreamError.cpp
146 BinaryStreamReader.cpp
148 BinaryStreamWriter.cpp
150 BranchProbability.cpp
154 circular_raw_ostream.cpp
163 ConvertUTFWrapper.cpp
164 CrashRecoveryContext.cpp
166 CSKYAttributeParser.cpp
171 DivisionByConstantInfo.cpp
172 DAGDeltaAlgorithm.cpp
175 ELFAttributeParser.cpp
179 ExponentialBackoff.cpp
184 FloatingPointMode.cpp
190 HexagonAttributeParser.cpp
191 HexagonAttributes.cpp
209 MSP430AttributeParser.cpp
211 OptimizedStructLayout.cpp
217 RandomNumberGenerator.cpp
220 RISCVAttributeParser.cpp
250 UnicodeNameToCodepoint.cpp
251 UnicodeNameToCodepointGenerated.cpp
253 VirtualFileSystem.cpp
259 raw_socket_stream.cpp
269 $<TARGET_OBJECTS:LLVMSupportBlake3>
285 ADDITIONAL_HEADER_DIRS
288 ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
289 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
290 ${Backtrace_INCLUDE_DIRS}
293 ${system_libs} ${imported_libs} ${delayload_flags}
299 set(llvm_system_libs ${system_libs})
301 # This block is only needed for llvm-config. When we deprecate llvm-config and
302 # move to using CMake export, this block can be removed.
304 # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
306 string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
307 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
310 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
312 get_library_name(${zlib_library} zlib_library)
313 set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
317 # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
319 string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
320 get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION_${build_type})
323 get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION)
325 if (zstd_target STREQUAL zstd::libzstd_shared)
326 get_library_name(${zstd_library} zstd_library)
327 set(llvm_system_libs ${llvm_system_libs} "${zstd_library}")
329 set(llvm_system_libs ${llvm_system_libs} "${zstd_STATIC_LIBRARY}")
333 set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
336 if(LLVM_INTEGRATED_CRT_ALLOC)
337 if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
338 set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
339 add_compile_definitions(_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
340 if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
341 "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
342 set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
348 target_include_directories(LLVMSupport SYSTEM