[WebAssembly] Add new target feature in support of 'extended-const' proposal
[llvm-project.git] / llvm / lib / Support / CMakeLists.txt
blobb9afc33d89d2ed7068b9bcc1470292d9812a8e82
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   set(imported_libs ZLIB::ZLIB)
26 endif()
28 if( MSVC OR MINGW )
29   # libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
30   # advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
31   set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32)
32 elseif( CMAKE_HOST_UNIX )
33   if( HAVE_LIBRT )
34     set(system_libs ${system_libs} rt)
35   endif()
36   if( HAVE_LIBDL )
37     set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
38   endif()
39   if( HAVE_BACKTRACE AND NOT "${Backtrace_LIBRARIES}" STREQUAL "" )
40     # On BSDs, CMake returns a fully qualified path to the backtrace library.
41     # We need to remove the path and the 'lib' prefix, to make it look like a
42     # regular short library name, suitable for appending to a -l link flag.
43     get_filename_component(Backtrace_LIBFILE ${Backtrace_LIBRARIES} NAME_WE)
44     STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
45     set(system_libs ${system_libs} ${Backtrace_LIBFILE})
46   endif()
47   if( LLVM_ENABLE_TERMINFO )
48     set(imported_libs ${imported_libs} Terminfo::terminfo)
49   endif()
50   if( LLVM_ENABLE_THREADS AND (HAVE_LIBATOMIC OR HAVE_CXX_LIBATOMICS64) )
51     set(system_libs ${system_libs} atomic)
52   endif()
53   set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
54   if( UNIX AND NOT (BEOS OR HAIKU) )
55     set(system_libs ${system_libs} m)
56   endif()
57   if( FUCHSIA )
58     set(system_libs ${system_libs} zircon)
59   endif()
60   if ( HAIKU )
61     add_definitions(-D_BSD_SOURCE)
62     set(system_libs ${system_libs} bsd)
63   endif()
64 endif( MSVC OR MINGW )
66 # Delay load shell32.dll if possible to speed up process startup.
67 set (delayload_flags)
68 if (MSVC)
69   set (delayload_flags delayimp -delayload:shell32.dll -delayload:ole32.dll)
70 endif()
72 # Link Z3 if the user wants to build it.
73 if(LLVM_WITH_Z3)
74   set(system_libs ${system_libs} ${Z3_LIBRARIES})
75 endif()
77 # Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
78 if(LLVM_INTEGRATED_CRT_ALLOC)
79   if (CMAKE_BUILD_TYPE AND NOT ${LLVM_USE_CRT_${uppercase_CMAKE_BUILD_TYPE}} MATCHES "^(MT|MTd)$")
80     message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with /MT or /MTd. Use LLVM_USE_CRT_${uppercase_CMAKE_BUILD_TYPE} to set the appropriate option.")
81   endif()
83   string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
85   if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
86     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.")
87   endif()
89   if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$")
90     add_definitions(-DENABLE_OVERRIDE -DENABLE_PRELOAD)
91     set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
92   elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
93     set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/override/malloc.cc" "${LLVM_INTEGRATED_CRT_ALLOC}/src/override/new.cc")
94     set(system_libs ${system_libs} "mincore.lib" "-INCLUDE:malloc")
95   elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
96     set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
97     if(NOT EXISTS "${MIMALLOC_LIB}")
98           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")
99     endif()
100     set(system_libs ${system_libs} "${MIMALLOC_LIB}" "-INCLUDE:malloc")
101   endif()
102 endif()
104 add_llvm_component_library(LLVMSupport
105   AArch64TargetParser.cpp
106   ABIBreak.cpp
107   ARMTargetParser.cpp
108   AMDGPUMetadata.cpp
109   APFixedPoint.cpp
110   APFloat.cpp
111   APInt.cpp
112   APSInt.cpp
113   ARMBuildAttrs.cpp
114   ARMAttributeParser.cpp
115   ARMWinEH.cpp
116   Allocator.cpp
117   AutoConvert.cpp
118   BinaryStreamError.cpp
119   BinaryStreamReader.cpp
120   BinaryStreamRef.cpp
121   BinaryStreamWriter.cpp
122   BlockFrequency.cpp
123   BranchProbability.cpp
124   BuryPointer.cpp
125   CachePruning.cpp
126   Caching.cpp
127   circular_raw_ostream.cpp
128   Chrono.cpp
129   COM.cpp
130   CodeGenCoverage.cpp
131   CommandLine.cpp
132   Compression.cpp
133   CRC.cpp
134   ConvertUTF.cpp
135   ConvertUTFWrapper.cpp
136   CrashRecoveryContext.cpp
137   CSKYAttributes.cpp
138   CSKYAttributeParser.cpp
139   CSKYTargetParser.cpp
140   DataExtractor.cpp
141   Debug.cpp
142   DebugCounter.cpp
143   DeltaAlgorithm.cpp
144   DivisionByConstantInfo.cpp
145   DAGDeltaAlgorithm.cpp
146   DJB.cpp
147   ELFAttributeParser.cpp
148   ELFAttributes.cpp
149   Error.cpp
150   ErrorHandling.cpp
151   ExtensibleRTTI.cpp
152   FileCollector.cpp
153   FileUtilities.cpp
154   FileOutputBuffer.cpp
155   FoldingSet.cpp
156   FormattedStream.cpp
157   FormatVariadic.cpp
158   GlobPattern.cpp
159   GraphWriter.cpp
160   Hashing.cpp
161   InitLLVM.cpp
162   InstructionCost.cpp
163   IntEqClasses.cpp
164   IntervalMap.cpp
165   ItaniumManglingCanonicalizer.cpp
166   JSON.cpp
167   KnownBits.cpp
168   LEB128.cpp
169   LineIterator.cpp
170   Locale.cpp
171   LockFileManager.cpp
172   LowLevelType.cpp
173   ManagedStatic.cpp
174   MathExtras.cpp
175   MemAlloc.cpp
176   MemoryBuffer.cpp
177   MemoryBufferRef.cpp
178   MD5.cpp
179   MSP430Attributes.cpp
180   MSP430AttributeParser.cpp
181   NativeFormatting.cpp
182   OptimizedStructLayout.cpp
183   Optional.cpp
184   Parallel.cpp
185   PluginLoader.cpp
186   PrettyStackTrace.cpp
187   RandomNumberGenerator.cpp
188   Regex.cpp
189   RISCVAttributes.cpp
190   RISCVAttributeParser.cpp
191   RISCVISAInfo.cpp
192   ScaledNumber.cpp
193   ScopedPrinter.cpp
194   SHA1.cpp
195   SHA256.cpp
196   Signposts.cpp
197   SmallPtrSet.cpp
198   SmallVector.cpp
199   SourceMgr.cpp
200   SpecialCaseList.cpp
201   Statistic.cpp
202   StringExtras.cpp
203   StringMap.cpp
204   StringSaver.cpp
205   StringRef.cpp
206   SuffixTree.cpp
207   SymbolRemappingReader.cpp
208   SystemUtils.cpp
209   TarWriter.cpp
210   TargetParser.cpp
211   ThreadPool.cpp
212   TimeProfiler.cpp
213   Timer.cpp
214   ToolOutputFile.cpp
215   TrigramIndex.cpp
216   Triple.cpp
217   Twine.cpp
218   TypeSize.cpp
219   Unicode.cpp
220   UnicodeCaseFold.cpp
221   VersionTuple.cpp
222   VirtualFileSystem.cpp
223   WithColor.cpp
224   X86TargetParser.cpp
225   YAMLParser.cpp
226   YAMLTraits.cpp
227   raw_os_ostream.cpp
228   raw_ostream.cpp
229   regcomp.c
230   regerror.c
231   regexec.c
232   regfree.c
233   regstrlcpy.c
234   xxhash.cpp
235   Z3Solver.cpp
237   ${ALLOCATOR_FILES}
239 # System
240   Atomic.cpp
241   DynamicLibrary.cpp
242   Errno.cpp
243   Host.cpp
244   Memory.cpp
245   Path.cpp
246   Process.cpp
247   Program.cpp
248   RWMutex.cpp
249   Signals.cpp
250   ThreadLocal.cpp
251   Threading.cpp
252   Valgrind.cpp
253   Watchdog.cpp
255   ADDITIONAL_HEADER_DIRS
256   Unix
257   Windows
258   ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
259   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
260   ${Backtrace_INCLUDE_DIRS}
262   LINK_LIBS
263   ${system_libs} ${imported_libs} ${delayload_flags}
265   LINK_COMPONENTS
266   Demangle
267   )
269 set(llvm_system_libs ${system_libs})
271 # This block is only needed for llvm-config. When we deprecate llvm-config and
272 # move to using CMake export, this block can be removed.
273 if(LLVM_ENABLE_ZLIB)
274   # CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
275   if(CMAKE_BUILD_TYPE)
276     string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
277     get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
278   endif()
279   if(NOT zlib_library)
280     get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
281   endif()
282   get_library_name(${zlib_library} zlib_library)
283   set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
284 endif()
286 if(LLVM_ENABLE_TERMINFO)
287   if(NOT terminfo_library)
288     get_property(terminfo_library TARGET Terminfo::terminfo PROPERTY LOCATION)
289   endif()
290   get_library_name(${terminfo_library} terminfo_library)
291   set(llvm_system_libs ${llvm_system_libs} "${terminfo_library}")
292 endif()
294 set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
297 if(LLVM_INTEGRATED_CRT_ALLOC)
298   if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
299     set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
300     add_definitions(-D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
301     if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
302         "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
303       set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
304     endif()
305   endif()
306 endif()
308 if(LLVM_WITH_Z3)
309   target_include_directories(LLVMSupport SYSTEM
310     PRIVATE
311     ${Z3_INCLUDE_DIR}
312     )
313 endif()