[clang] Add test for CWG190 "Layout-compatible POD-struct types" (#121668)
[llvm-project.git] / llvm / lib / Support / CMakeLists.txt
blob2ecaea4b02bf61839dd22723a3b14d7f492fd4ac
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( 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)
45 elseif( 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()
75 endif( WIN32 )
77 set(WL "")
78 if(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,>")
83 endif()
85 # Delay load shell32.dll if possible to speed up process startup.
86 set (delayload_flags)
87 if (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>)
93 endif()
95 # Link Z3 if the user wants to build it.
96 if(LLVM_WITH_Z3)
97   set(system_libs ${system_libs} ${Z3_LIBRARIES})
98 endif()
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.")
104   endif()
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.")
110   endif()
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()
126 endif()
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")
135 endif()
137 add_subdirectory(BLAKE3)
139 add_llvm_component_library(LLVMSupport
140   ABIBreak.cpp
141   AMDGPUMetadata.cpp
142   APFixedPoint.cpp
143   APFloat.cpp
144   APInt.cpp
145   APSInt.cpp
146   ARMBuildAttrs.cpp
147   ARMAttributeParser.cpp
148   ARMWinEH.cpp
149   Allocator.cpp
150   AutoConvert.cpp
151   Base64.cpp
152   BalancedPartitioning.cpp
153   BinaryStreamError.cpp
154   BinaryStreamReader.cpp
155   BinaryStreamRef.cpp
156   BinaryStreamWriter.cpp
157   BlockFrequency.cpp
158   BranchProbability.cpp
159   BuryPointer.cpp
160   CachePruning.cpp
161   Caching.cpp
162   circular_raw_ostream.cpp
163   Chrono.cpp
164   COM.cpp
165   CodeGenCoverage.cpp
166   CommandLine.cpp
167   Compression.cpp
168   CRC.cpp
169   ConvertUTF.cpp
170   ConvertEBCDIC.cpp
171   ConvertUTFWrapper.cpp
172   CrashRecoveryContext.cpp
173   CSKYAttributes.cpp
174   CSKYAttributeParser.cpp
175   DataExtractor.cpp
176   Debug.cpp
177   DebugCounter.cpp
178   DeltaAlgorithm.cpp
179   DeltaTree.cpp
180   DivisionByConstantInfo.cpp
181   DAGDeltaAlgorithm.cpp
182   DJB.cpp
183   DynamicAPInt.cpp
184   ELFAttributeParser.cpp
185   ELFAttributes.cpp
186   Error.cpp
187   ErrorHandling.cpp
188   ExponentialBackoff.cpp
189   ExtensibleRTTI.cpp
190   FileCollector.cpp
191   FileUtilities.cpp
192   FileOutputBuffer.cpp
193   FloatingPointMode.cpp
194   FoldingSet.cpp
195   FormattedStream.cpp
196   FormatVariadic.cpp
197   GlobPattern.cpp
198   GraphWriter.cpp
199   HexagonAttributeParser.cpp
200   HexagonAttributes.cpp
201   InitLLVM.cpp
202   InstructionCost.cpp
203   IntEqClasses.cpp
204   IntervalMap.cpp
205   JSON.cpp
206   KnownBits.cpp
207   LEB128.cpp
208   LineIterator.cpp
209   Locale.cpp
210   LockFileManager.cpp
211   ManagedStatic.cpp
212   MathExtras.cpp
213   MemAlloc.cpp
214   MemoryBuffer.cpp
215   MemoryBufferRef.cpp
216   ModRef.cpp
217   MD5.cpp
218   MSP430Attributes.cpp
219   MSP430AttributeParser.cpp
220   NativeFormatting.cpp
221   OptimizedStructLayout.cpp
222   Optional.cpp
223   OptionStrCmp.cpp
224   PGOOptions.cpp
225   Parallel.cpp
226   PluginLoader.cpp
227   PrettyStackTrace.cpp
228   RandomNumberGenerator.cpp
229   Regex.cpp
230   RewriteBuffer.cpp
231   RewriteRope.cpp
232   RISCVAttributes.cpp
233   RISCVAttributeParser.cpp
234   RISCVISAUtils.cpp
235   ScaledNumber.cpp
236   ScopedPrinter.cpp
237   SHA1.cpp
238   SHA256.cpp
239   Signposts.cpp
240   SipHash.cpp
241   SlowDynamicAPInt.cpp
242   SmallPtrSet.cpp
243   SmallVector.cpp
244   SourceMgr.cpp
245   SpecialCaseList.cpp
246   Statistic.cpp
247   StringExtras.cpp
248   StringMap.cpp
249   StringSaver.cpp
250   StringRef.cpp
251   SuffixTreeNode.cpp
252   SuffixTree.cpp
253   SystemUtils.cpp
254   TarWriter.cpp
255   ThreadPool.cpp
256   TimeProfiler.cpp
257   Timer.cpp
258   ToolOutputFile.cpp
259   TrieRawHashMap.cpp
260   Twine.cpp
261   TypeSize.cpp
262   Unicode.cpp
263   UnicodeCaseFold.cpp
264   UnicodeNameToCodepoint.cpp
265   UnicodeNameToCodepointGenerated.cpp
266   VersionTuple.cpp
267   VirtualFileSystem.cpp
268   WithColor.cpp
269   YAMLParser.cpp
270   YAMLTraits.cpp
271   raw_os_ostream.cpp
272   raw_ostream.cpp
273   raw_socket_stream.cpp
274   regcomp.c
275   regerror.c
276   regexec.c
277   regfree.c
278   regstrlcpy.c
279   xxhash.cpp
280   Z3Solver.cpp
282   ${ALLOCATOR_FILES}
283   $<TARGET_OBJECTS:LLVMSupportBlake3>
285 # System
286   Atomic.cpp
287   DynamicLibrary.cpp
288   Errno.cpp
289   Memory.cpp
290   Path.cpp
291   Process.cpp
292   Program.cpp
293   RWMutex.cpp
294   Signals.cpp
295   Threading.cpp
296   Valgrind.cpp
297   Watchdog.cpp
299   ADDITIONAL_HEADER_DIRS
300   Unix
301   Windows
302   ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
303   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
304   ${Backtrace_INCLUDE_DIRS}
306   LINK_LIBS
307   ${system_libs} ${imported_libs} ${delayload_flags}
309   LINK_COMPONENTS
310   Demangle
311   )
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.
317 if(LLVM_ENABLE_ZLIB)
318   # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
319   if(CMAKE_BUILD_TYPE)
320     string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
321     get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
322   endif()
323   if(NOT zlib_library)
324     get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
325   endif()
326   get_library_name(${zlib_library} zlib_library)
327   set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
328 endif()
330 if(LLVM_ENABLE_ZSTD)
331   # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
332   if(CMAKE_BUILD_TYPE)
333     string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
334     get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION_${build_type})
335   endif()
336   if(NOT zstd_library)
337     get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION)
338   endif()
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}")
342   else()
343     set(llvm_system_libs ${llvm_system_libs} "${zstd_STATIC_LIBRARY}")
344   endif()
345 endif()
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")
357     endif()
358   endif()
359 endif()
361 if(LLVM_WITH_Z3)
362   target_include_directories(LLVMSupport SYSTEM
363     PRIVATE
364     ${Z3_INCLUDE_DIR}
365     )
366 endif()