1include(GetLibraryName) 2 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). 10check_cxx_compiler_flag("-Werror=global-constructors" HAS_WERROR_GLOBAL_CTORS) 11if (HAS_WERROR_GLOBAL_CTORS) 12 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=global-constructors") 13 CHECK_CXX_SOURCE_COMPILES(" 14 #include <mutex> 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}) 21 endif() 22endif() 23 24if(LLVM_ENABLE_ZLIB) 25 list(APPEND imported_libs ZLIB::ZLIB) 26endif() 27 28if(LLVM_ENABLE_ZSTD) 29 if(TARGET zstd::libzstd_shared AND NOT LLVM_USE_STATIC_ZSTD) 30 set(zstd_target zstd::libzstd_shared) 31 else() 32 set(zstd_target zstd::libzstd_static) 33 endif() 34endif() 35 36if(LLVM_ENABLE_ZSTD) 37 list(APPEND imported_libs ${zstd_target}) 38endif() 39 40if( WIN32 ) 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) 45elseif( CMAKE_HOST_UNIX ) 46 if( HAVE_LIBRT ) 47 set(system_libs ${system_libs} rt) 48 endif() 49 if( HAVE_LIBDL ) 50 set(system_libs ${system_libs} ${CMAKE_DL_LIBS}) 51 endif() 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}) 59 endif() 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) 64 endif() 65 if( UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" ) 66 set(system_libs ${system_libs} kstat socket) 67 endif() 68 if( FUCHSIA ) 69 set(system_libs ${system_libs} zircon) 70 endif() 71 if ( HAIKU ) 72 add_compile_definitions(_BSD_SOURCE) 73 set(system_libs ${system_libs} bsd network) 74 endif() 75endif( WIN32 ) 76 77set(WL "") 78if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.25" 79 AND MSVC 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,>") 83endif() 84 85# Delay load shell32.dll if possible to speed up process startup. 86set (delayload_flags) 87if (MSVC) 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>) 93endif() 94 95# Link Z3 if the user wants to build it. 96if(LLVM_WITH_Z3) 97 set(system_libs ${system_libs} ${Z3_LIBRARIES}) 98endif() 99 100# Override the C runtime allocator on Windows and embed it into LLVM tools & libraries 101if(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.") 104 endif() 105 106 string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}") 107 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.") 110 endif() 111 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") 123 endif() 124 set(system_libs ${system_libs} "${MIMALLOC_LIB}" "${WL}-INCLUDE:malloc") 125 endif() 126endif() 127 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. 133if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX") 134 remove_definitions("-D_XOPEN_SOURCE=700") 135endif() 136 137add_subdirectory(BLAKE3) 138 139add_llvm_component_library(LLVMSupport 140 ABIBreak.cpp 141 AMDGPUMetadata.cpp 142 APFixedPoint.cpp 143 APFloat.cpp 144 APInt.cpp 145 APSInt.cpp 146 ARMBuildAttributes.cpp 147 AArch64BuildAttributes.cpp 148 ARMAttributeParser.cpp 149 ARMWinEH.cpp 150 Allocator.cpp 151 AutoConvert.cpp 152 Base64.cpp 153 BalancedPartitioning.cpp 154 BinaryStreamError.cpp 155 BinaryStreamReader.cpp 156 BinaryStreamRef.cpp 157 BinaryStreamWriter.cpp 158 BlockFrequency.cpp 159 BranchProbability.cpp 160 BuryPointer.cpp 161 CachePruning.cpp 162 Caching.cpp 163 circular_raw_ostream.cpp 164 Chrono.cpp 165 COM.cpp 166 CodeGenCoverage.cpp 167 CommandLine.cpp 168 Compression.cpp 169 CRC.cpp 170 ConvertUTF.cpp 171 ConvertEBCDIC.cpp 172 ConvertUTFWrapper.cpp 173 CrashRecoveryContext.cpp 174 CSKYAttributes.cpp 175 CSKYAttributeParser.cpp 176 DataExtractor.cpp 177 Debug.cpp 178 DebugCounter.cpp 179 DeltaAlgorithm.cpp 180 DeltaTree.cpp 181 DivisionByConstantInfo.cpp 182 DAGDeltaAlgorithm.cpp 183 DJB.cpp 184 DynamicAPInt.cpp 185 ELFAttributeParser.cpp 186 ELFAttributes.cpp 187 Error.cpp 188 ErrorHandling.cpp 189 ExponentialBackoff.cpp 190 ExtensibleRTTI.cpp 191 FileCollector.cpp 192 FileUtilities.cpp 193 FileOutputBuffer.cpp 194 FloatingPointMode.cpp 195 FoldingSet.cpp 196 FormattedStream.cpp 197 FormatVariadic.cpp 198 GlobPattern.cpp 199 GraphWriter.cpp 200 HexagonAttributeParser.cpp 201 HexagonAttributes.cpp 202 InitLLVM.cpp 203 InstructionCost.cpp 204 IntEqClasses.cpp 205 IntervalMap.cpp 206 JSON.cpp 207 KnownBits.cpp 208 LEB128.cpp 209 LineIterator.cpp 210 Locale.cpp 211 LockFileManager.cpp 212 ManagedStatic.cpp 213 MathExtras.cpp 214 MemAlloc.cpp 215 MemoryBuffer.cpp 216 MemoryBufferRef.cpp 217 ModRef.cpp 218 MD5.cpp 219 MSP430Attributes.cpp 220 MSP430AttributeParser.cpp 221 NativeFormatting.cpp 222 OptimizedStructLayout.cpp 223 Optional.cpp 224 OptionStrCmp.cpp 225 PGOOptions.cpp 226 Parallel.cpp 227 PluginLoader.cpp 228 PrettyStackTrace.cpp 229 RandomNumberGenerator.cpp 230 Regex.cpp 231 RewriteBuffer.cpp 232 RewriteRope.cpp 233 RISCVAttributes.cpp 234 RISCVAttributeParser.cpp 235 RISCVISAUtils.cpp 236 ScaledNumber.cpp 237 ScopedPrinter.cpp 238 SHA1.cpp 239 SHA256.cpp 240 Signposts.cpp 241 SipHash.cpp 242 SlowDynamicAPInt.cpp 243 SmallPtrSet.cpp 244 SmallVector.cpp 245 SourceMgr.cpp 246 SpecialCaseList.cpp 247 Statistic.cpp 248 StringExtras.cpp 249 StringMap.cpp 250 StringSaver.cpp 251 StringRef.cpp 252 SuffixTreeNode.cpp 253 SuffixTree.cpp 254 SystemUtils.cpp 255 TarWriter.cpp 256 ThreadPool.cpp 257 TimeProfiler.cpp 258 Timer.cpp 259 ToolOutputFile.cpp 260 TrieRawHashMap.cpp 261 Twine.cpp 262 TypeSize.cpp 263 Unicode.cpp 264 UnicodeCaseFold.cpp 265 UnicodeNameToCodepoint.cpp 266 UnicodeNameToCodepointGenerated.cpp 267 VersionTuple.cpp 268 VirtualFileSystem.cpp 269 WithColor.cpp 270 YAMLParser.cpp 271 YAMLTraits.cpp 272 raw_os_ostream.cpp 273 raw_ostream.cpp 274 raw_socket_stream.cpp 275 regcomp.c 276 regerror.c 277 regexec.c 278 regfree.c 279 regstrlcpy.c 280 xxhash.cpp 281 Z3Solver.cpp 282 283 ${ALLOCATOR_FILES} 284 $<TARGET_OBJECTS:LLVMSupportBlake3> 285 286# System 287 Atomic.cpp 288 DynamicLibrary.cpp 289 Errno.cpp 290 Memory.cpp 291 Path.cpp 292 Process.cpp 293 Program.cpp 294 RWMutex.cpp 295 Signals.cpp 296 Threading.cpp 297 Valgrind.cpp 298 Watchdog.cpp 299 300 ADDITIONAL_HEADER_DIRS 301 Unix 302 Windows 303 ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT 304 ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support 305 ${Backtrace_INCLUDE_DIRS} 306 307 LINK_LIBS 308 ${system_libs} ${imported_libs} ${delayload_flags} 309 310 LINK_COMPONENTS 311 Demangle 312 ) 313 314set(llvm_system_libs ${system_libs}) 315 316# This block is only needed for llvm-config. When we deprecate llvm-config and 317# move to using CMake export, this block can be removed. 318if(LLVM_ENABLE_ZLIB) 319 # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators. 320 if(CMAKE_BUILD_TYPE) 321 string(TOUPPER ${CMAKE_BUILD_TYPE} build_type) 322 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type}) 323 endif() 324 if(NOT zlib_library) 325 get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION) 326 endif() 327 get_library_name(${zlib_library} zlib_library) 328 set(llvm_system_libs ${llvm_system_libs} "${zlib_library}") 329endif() 330 331if(LLVM_ENABLE_ZSTD) 332 # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators. 333 if(CMAKE_BUILD_TYPE) 334 string(TOUPPER ${CMAKE_BUILD_TYPE} build_type) 335 get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION_${build_type}) 336 endif() 337 if(NOT zstd_library) 338 get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION) 339 endif() 340 if (zstd_target STREQUAL zstd::libzstd_shared) 341 get_library_name(${zstd_library} zstd_library) 342 set(llvm_system_libs ${llvm_system_libs} "${zstd_library}") 343 else() 344 set(llvm_system_libs ${llvm_system_libs} "${zstd_STATIC_LIBRARY}") 345 endif() 346endif() 347 348set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}") 349 350 351if(LLVM_INTEGRATED_CRT_ALLOC) 352 if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$") 353 set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17) 354 add_compile_definitions(_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) 355 if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND 356 "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64") 357 set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16") 358 endif() 359 endif() 360endif() 361 362if(LLVM_WITH_Z3) 363 target_include_directories(LLVMSupport SYSTEM 364 PRIVATE 365 ${Z3_INCLUDE_DIR} 366 ) 367endif() 368