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)
78 if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.25"
80 AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
81 #IntelLLVM requires to pass linker flags with a wrapper
82 set(WL "$<$<OR:$<LINK_LANG_AND_ID:C,IntelLLVM>,$<LINK_LANG_AND_ID:CXX,IntelLLVM>,$<LINK_LANG_AND_ID:Fortran,IntelLLVM>>:-Qoption,link,>")
85 # Delay load shell32.dll if possible to speed up process startup.
88 # When linking with Swift, `swiftc.exe` is used as the linker drive rather
89 # than invoking `link.exe` directly. In such a case, the flags should be
90 # marked as `-Xlinker` to pass them directly to the linker. As a temporary
91 # workaround simply elide the delay loading.
92 set (delayload_flags $<$<NOT:$<LINK_LANGUAGE:Swift>>:delayimp ${WL}-delayload:shell32.dll ${WL}-delayload:ole32.dll>)
95 # Link Z3 if the user wants to build it.
97 set(system_libs ${system_libs} ${Z3_LIBRARIES})
100 # Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
101 if(LLVM_INTEGRATED_CRT_ALLOC)
102 if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
103 message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with CMAKE_MSVC_RUNTIME_LIBRARY set to MultiThreaded or MultiThreadedDebug.")
106 string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
108 if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
109 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.")
112 if((LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$") OR LLVM_ENABLE_RPMALLOC)
113 add_compile_definitions(ENABLE_OVERRIDE ENABLE_PRELOAD)
114 set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
115 set(delayload_flags "${delayload_flags} ${WL}-INCLUDE:malloc")
116 elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
117 set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/snmalloc/override/new.cc")
118 set(system_libs ${system_libs} "mincore.lib" "${WL}-INCLUDE:malloc")
119 elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
120 set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
121 if(NOT EXISTS "${MIMALLOC_LIB}")
122 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")
124 set(system_libs ${system_libs} "${MIMALLOC_LIB}" "${WL}-INCLUDE:malloc")
128 # FIXME: We are currently guarding AIX headers with _XOPEN_SOURCE=700.
129 # See llvm/CMakeLists.txt. However, we need _SC_NPROCESSORS_ONLN in
130 # unistd.h and it is guarded by _ALL_SOURCE, so we remove the _XOPEN_SOURCE
131 # guard here. We should remove the guards all together once AIX cleans up
132 # the system headers.
133 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
134 remove_definitions("-D_XOPEN_SOURCE=700")
137 add_subdirectory(BLAKE3)
139 add_llvm_component_library(LLVMSupport
147 ARMAttributeParser.cpp
152 BalancedPartitioning.cpp
153 BinaryStreamError.cpp
154 BinaryStreamReader.cpp
156 BinaryStreamWriter.cpp
158 BranchProbability.cpp
162 circular_raw_ostream.cpp
171 ConvertUTFWrapper.cpp
172 CrashRecoveryContext.cpp
174 CSKYAttributeParser.cpp
180 DivisionByConstantInfo.cpp
181 DAGDeltaAlgorithm.cpp
184 ELFAttributeParser.cpp
188 ExponentialBackoff.cpp
193 FloatingPointMode.cpp
199 HexagonAttributeParser.cpp
200 HexagonAttributes.cpp
219 MSP430AttributeParser.cpp
221 OptimizedStructLayout.cpp
228 RandomNumberGenerator.cpp
233 RISCVAttributeParser.cpp
264 UnicodeNameToCodepoint.cpp
265 UnicodeNameToCodepointGenerated.cpp
267 VirtualFileSystem.cpp
273 raw_socket_stream.cpp
283 $<TARGET_OBJECTS:LLVMSupportBlake3>
299 ADDITIONAL_HEADER_DIRS
302 ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
303 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
304 ${Backtrace_INCLUDE_DIRS}
307 ${system_libs} ${imported_libs} ${delayload_flags}
313 set(llvm_system_libs ${system_libs})
315 # This block is only needed for llvm-config. When we deprecate llvm-config and
316 # move to using CMake export, this block can be removed.
318 # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
320 string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
321 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
324 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
326 get_library_name(${zlib_library} zlib_library)
327 set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
331 # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
333 string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
334 get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION_${build_type})
337 get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION)
339 if (zstd_target STREQUAL zstd::libzstd_shared)
340 get_library_name(${zstd_library} zstd_library)
341 set(llvm_system_libs ${llvm_system_libs} "${zstd_library}")
343 set(llvm_system_libs ${llvm_system_libs} "${zstd_STATIC_LIBRARY}")
347 set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
350 if(LLVM_INTEGRATED_CRT_ALLOC)
351 if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
352 set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
353 add_compile_definitions(_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
354 if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
355 "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
356 set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
362 target_include_directories(LLVMSupport SYSTEM