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