Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / lib / Support / CMakeLists.txt
blobb96d62c7a6224d63da261e0db9d6c491559a4d04
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("
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()
22 endif()
24 if(LLVM_ENABLE_ZLIB)
25   list(APPEND imported_libs ZLIB::ZLIB)
26 endif()
28 if(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()
34 endif()
36 if(LLVM_ENABLE_ZSTD)
37   list(APPEND imported_libs ${zstd_target})
38 endif()
40 if( MSVC OR MINGW )
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   set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32)
44 elseif( CMAKE_HOST_UNIX )
45   if( HAVE_LIBRT )
46     set(system_libs ${system_libs} rt)
47   endif()
48   if( HAVE_LIBDL )
49     set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
50   endif()
51   if( HAVE_BACKTRACE AND NOT "${Backtrace_LIBRARIES}" STREQUAL "" )
52     # On BSDs, CMake returns a fully qualified path to the backtrace library.
53     # We need to remove the path and the 'lib' prefix, to make it look like a
54     # regular short library name, suitable for appending to a -l link flag.
55     get_filename_component(Backtrace_LIBFILE ${Backtrace_LIBRARIES} NAME_WE)
56     STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
57     set(system_libs ${system_libs} ${Backtrace_LIBFILE})
58   endif()
59   if( LLVM_ENABLE_TERMINFO )
60     set(imported_libs ${imported_libs} Terminfo::terminfo)
61   endif()
62   set(system_libs ${system_libs} ${LLVM_ATOMIC_LIB})
63   set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
64   if( UNIX AND NOT (BEOS OR HAIKU) )
65     set(system_libs ${system_libs} m)
66   endif()
67   if( UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
68     set(system_libs ${system_libs} kstat)
69   endif()
70   if( FUCHSIA )
71     set(system_libs ${system_libs} zircon)
72   endif()
73   if ( HAIKU )
74     add_compile_definitions(_BSD_SOURCE)
75     set(system_libs ${system_libs} bsd)
76   endif()
77 endif( MSVC OR MINGW )
79 # Delay load shell32.dll if possible to speed up process startup.
80 set (delayload_flags)
81 if (MSVC)
82   # When linking with Swift, `swiftc.exe` is used as the linker drive rather
83   # than invoking `link.exe` directly.  In such a case, the flags should be
84   # marked as `-Xlinker` to pass them directly to the linker.  As a temporary
85   # workaround simply elide the delay loading.
86   set (delayload_flags $<$<NOT:$<LINK_LANGUAGE:Swift>>:delayimp -delayload:shell32.dll -delayload:ole32.dll>)
87 endif()
89 # Link Z3 if the user wants to build it.
90 if(LLVM_WITH_Z3)
91   set(system_libs ${system_libs} ${Z3_LIBRARIES})
92 endif()
94 # Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
95 if(LLVM_INTEGRATED_CRT_ALLOC)
96   if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
97     message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with CMAKE_MSVC_RUNTIME_LIBRARY set to MultiThreaded or MultiThreadedDebug.")
98   endif()
100   string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
102   if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
103     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   endif()
106   if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$")
107     add_compile_definitions(ENABLE_OVERRIDE ENABLE_PRELOAD)
108     set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
109   elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
110     set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/snmalloc/override/new.cc")
111     set(system_libs ${system_libs} "mincore.lib" "-INCLUDE:malloc")
112   elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
113     set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
114     if(NOT EXISTS "${MIMALLOC_LIB}")
115           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     endif()
117     set(system_libs ${system_libs} "${MIMALLOC_LIB}" "-INCLUDE:malloc")
118   endif()
119 endif()
121 # FIXME: We are currently guarding AIX headers with _XOPEN_SOURCE=700.
122 # See llvm/CMakeLists.txt. However, we need _SC_NPROCESSORS_ONLN in
123 # unistd.h and it is guarded by _ALL_SOURCE, so we remove the _XOPEN_SOURCE
124 # guard here. We should remove the guards all together once AIX cleans up
125 # the system headers.
126 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
127   remove_definitions("-D_XOPEN_SOURCE=700")
128 endif()
130 add_subdirectory(BLAKE3)
132 add_llvm_component_library(LLVMSupport
133   ABIBreak.cpp
134   AMDGPUMetadata.cpp
135   APFixedPoint.cpp
136   APFloat.cpp
137   APInt.cpp
138   APSInt.cpp
139   ARMBuildAttrs.cpp
140   ARMAttributeParser.cpp
141   ARMWinEH.cpp
142   Allocator.cpp
143   AutoConvert.cpp
144   Base64.cpp
145   BalancedPartitioning.cpp
146   BinaryStreamError.cpp
147   BinaryStreamReader.cpp
148   BinaryStreamRef.cpp
149   BinaryStreamWriter.cpp
150   BlockFrequency.cpp
151   BranchProbability.cpp
152   BuryPointer.cpp
153   CachePruning.cpp
154   Caching.cpp
155   circular_raw_ostream.cpp
156   Chrono.cpp
157   COM.cpp
158   CodeGenCoverage.cpp
159   CommandLine.cpp
160   Compression.cpp
161   CRC.cpp
162   ConvertUTF.cpp
163   ConvertEBCDIC.cpp
164   ConvertUTFWrapper.cpp
165   CrashRecoveryContext.cpp
166   CSKYAttributes.cpp
167   CSKYAttributeParser.cpp
168   DataExtractor.cpp
169   Debug.cpp
170   DebugCounter.cpp
171   DeltaAlgorithm.cpp
172   DivisionByConstantInfo.cpp
173   DAGDeltaAlgorithm.cpp
174   DJB.cpp
175   ELFAttributeParser.cpp
176   ELFAttributes.cpp
177   Error.cpp
178   ErrorHandling.cpp
179   ExtensibleRTTI.cpp
180   FileCollector.cpp
181   FileUtilities.cpp
182   FileOutputBuffer.cpp
183   FloatingPointMode.cpp
184   FoldingSet.cpp
185   FormattedStream.cpp
186   FormatVariadic.cpp
187   GlobPattern.cpp
188   GraphWriter.cpp
189   Hashing.cpp
190   InitLLVM.cpp
191   InstructionCost.cpp
192   IntEqClasses.cpp
193   IntervalMap.cpp
194   JSON.cpp
195   KnownBits.cpp
196   LEB128.cpp
197   LineIterator.cpp
198   Locale.cpp
199   LockFileManager.cpp
200   ManagedStatic.cpp
201   MathExtras.cpp
202   MemAlloc.cpp
203   MemoryBuffer.cpp
204   MemoryBufferRef.cpp
205   MD5.cpp
206   MSP430Attributes.cpp
207   MSP430AttributeParser.cpp
208   NativeFormatting.cpp
209   OptimizedStructLayout.cpp
210   Optional.cpp
211   PGOOptions.cpp
212   Parallel.cpp
213   PluginLoader.cpp
214   PrettyStackTrace.cpp
215   RandomNumberGenerator.cpp
216   Regex.cpp
217   RISCVAttributes.cpp
218   RISCVAttributeParser.cpp
219   RISCVISAInfo.cpp
220   ScaledNumber.cpp
221   ScopedPrinter.cpp
222   SHA1.cpp
223   SHA256.cpp
224   Signposts.cpp
225   SmallPtrSet.cpp
226   SmallVector.cpp
227   SourceMgr.cpp
228   SpecialCaseList.cpp
229   Statistic.cpp
230   StringExtras.cpp
231   StringMap.cpp
232   StringSaver.cpp
233   StringRef.cpp
234   SuffixTreeNode.cpp
235   SuffixTree.cpp
236   SystemUtils.cpp
237   TarWriter.cpp
238   ThreadPool.cpp
239   TimeProfiler.cpp
240   Timer.cpp
241   ToolOutputFile.cpp
242   Twine.cpp
243   TypeSize.cpp
244   Unicode.cpp
245   UnicodeCaseFold.cpp
246   UnicodeNameToCodepoint.cpp
247   UnicodeNameToCodepointGenerated.cpp
248   VersionTuple.cpp
249   VirtualFileSystem.cpp
250   WithColor.cpp
251   YAMLParser.cpp
252   YAMLTraits.cpp
253   raw_os_ostream.cpp
254   raw_ostream.cpp
255   regcomp.c
256   regerror.c
257   regexec.c
258   regfree.c
259   regstrlcpy.c
260   xxhash.cpp
261   Z3Solver.cpp
263   ${ALLOCATOR_FILES}
264   $<TARGET_OBJECTS:LLVMSupportBlake3>
266 # System
267   Atomic.cpp
268   DynamicLibrary.cpp
269   Errno.cpp
270   Memory.cpp
271   Path.cpp
272   Process.cpp
273   Program.cpp
274   RWMutex.cpp
275   Signals.cpp
276   Threading.cpp
277   Valgrind.cpp
278   Watchdog.cpp
280   ADDITIONAL_HEADER_DIRS
281   Unix
282   Windows
283   ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
284   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
285   ${Backtrace_INCLUDE_DIRS}
287   LINK_LIBS
288   ${system_libs} ${imported_libs} ${delayload_flags}
290   LINK_COMPONENTS
291   Demangle
292   )
294 set(llvm_system_libs ${system_libs})
296 # This block is only needed for llvm-config. When we deprecate llvm-config and
297 # move to using CMake export, this block can be removed.
298 if(LLVM_ENABLE_ZLIB)
299   # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
300   if(CMAKE_BUILD_TYPE)
301     string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
302     get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
303   endif()
304   if(NOT zlib_library)
305     get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
306   endif()
307   get_library_name(${zlib_library} zlib_library)
308   set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
309 endif()
311 if(LLVM_ENABLE_ZSTD)
312   # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
313   if(CMAKE_BUILD_TYPE)
314     string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
315     get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION_${build_type})
316   endif()
317   if(NOT zstd_library)
318     get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION)
319   endif()
320   get_library_name(${zstd_library} zstd_library)
321   set(llvm_system_libs ${llvm_system_libs} "${zstd_library}")
322 endif()
324 if(LLVM_ENABLE_TERMINFO)
325   if(NOT terminfo_library)
326     get_property(terminfo_library TARGET Terminfo::terminfo PROPERTY LOCATION)
327   endif()
328   get_library_name(${terminfo_library} terminfo_library)
329   set(llvm_system_libs ${llvm_system_libs} "${terminfo_library}")
330 endif()
332 set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
335 if(LLVM_INTEGRATED_CRT_ALLOC)
336   if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
337     set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
338     add_compile_definitions(_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
339     if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
340         "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
341       set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
342     endif()
343   endif()
344 endif()
346 if(LLVM_WITH_Z3)
347   target_include_directories(LLVMSupport SYSTEM
348     PRIVATE
349     ${Z3_INCLUDE_DIR}
350     )
351 endif()