1include(GNUInstallDirs)
2include(LLVMDistributionSupport)
3include(LLVMProcessSources)
4include(LLVM-Config)
5include(DetermineGCCCompatible)
6
7function(llvm_update_compile_flags name)
8  get_property(sources TARGET ${name} PROPERTY SOURCES)
9  if("${sources}" MATCHES "\\.c(;|$)")
10    set(update_src_props ON)
11  endif()
12
13  list(APPEND LLVM_COMPILE_CFLAGS " ${LLVM_COMPILE_FLAGS}")
14
15  # LLVM_REQUIRES_EH is an internal flag that individual targets can use to
16  # force EH
17  if(LLVM_REQUIRES_EH OR LLVM_ENABLE_EH)
18    if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI))
19      message(AUTHOR_WARNING "Exception handling requires RTTI. Enabling RTTI for ${name}")
20      set(LLVM_REQUIRES_RTTI ON)
21    endif()
22    if(MSVC)
23      list(APPEND LLVM_COMPILE_FLAGS "/EHsc")
24    endif()
25  else()
26    if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
27      list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")
28      if(LLVM_ENABLE_UNWIND_TABLES)
29        list(APPEND LLVM_COMPILE_FLAGS "-funwind-tables")
30      else()
31        list(APPEND LLVM_COMPILE_FLAGS "-fno-unwind-tables")
32        list(APPEND LLVM_COMPILE_FLAGS "-fno-asynchronous-unwind-tables")
33      endif()
34    elseif(MSVC)
35      list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0)
36      list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-")
37    elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
38      list(APPEND LLVM_COMPILE_FLAGS "-qnoeh")
39    endif()
40  endif()
41
42  # LLVM_REQUIRES_RTTI is an internal flag that individual
43  # targets can use to force RTTI
44  set(LLVM_CONFIG_HAS_RTTI YES CACHE INTERNAL "")
45  if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI))
46    set(LLVM_CONFIG_HAS_RTTI NO CACHE INTERNAL "")
47    list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0)
48    if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
49      list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")
50    elseif (MSVC)
51      list(APPEND LLVM_COMPILE_FLAGS "/GR-")
52    elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
53      list(APPEND LLVM_COMPILE_FLAGS "-qnortti")
54    endif ()
55  elseif(MSVC)
56    list(APPEND LLVM_COMPILE_FLAGS "/GR")
57  endif()
58
59  # Assume that;
60  #   - LLVM_COMPILE_FLAGS is list.
61  #   - PROPERTY COMPILE_FLAGS is string.
62  string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}")
63  string(REPLACE ";" " " target_compile_cflags " ${LLVM_COMPILE_CFLAGS}")
64
65  if(update_src_props)
66    foreach(fn ${sources})
67      get_filename_component(suf ${fn} EXT)
68      if("${suf}" STREQUAL ".cpp")
69        set_property(SOURCE ${fn} APPEND_STRING PROPERTY
70          COMPILE_FLAGS "${target_compile_flags}")
71      endif()
72      if("${suf}" STREQUAL ".c")
73        set_property(SOURCE ${fn} APPEND_STRING PROPERTY
74          COMPILE_FLAGS "${target_compile_cflags}")
75      endif()
76    endforeach()
77  else()
78    # Update target props, since all sources are C++.
79    set_property(TARGET ${name} APPEND_STRING PROPERTY
80      COMPILE_FLAGS "${target_compile_flags}")
81  endif()
82
83  set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS})
84endfunction()
85
86function(add_llvm_symbol_exports target_name export_file)
87  if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
88    set(native_export_file "${target_name}.exports")
89    add_custom_command(OUTPUT ${native_export_file}
90      COMMAND sed -e "s/^/_/" < ${export_file} > ${native_export_file}
91      DEPENDS ${export_file}
92      VERBATIM
93      COMMENT "Creating export file for ${target_name}")
94    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
95                 LINK_FLAGS " -Wl,-exported_symbols_list,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
96  elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
97    # FIXME: `-Wl,-bE:` bypasses whatever handling there is in the build
98    # compiler driver to defer to the specified export list.
99    set(native_export_file "${export_file}")
100    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
101                 LINK_FLAGS " -Wl,-bE:${export_file}")
102  elseif(LLVM_HAVE_LINK_VERSION_SCRIPT)
103    # Gold and BFD ld require a version script rather than a plain list.
104    set(native_export_file "${target_name}.exports")
105    # FIXME: Don't write the "local:" line on OpenBSD.
106    # in the export file, also add a linker script to version LLVM symbols (form: LLVM_N.M)
107    add_custom_command(OUTPUT ${native_export_file}
108      COMMAND "${Python3_EXECUTABLE}" "-c"
109      "import sys; \
110       lines = ['    ' + l.rstrip() for l in sys.stdin] + ['  local: *;']; \
111       print('LLVM_${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} {'); \
112       print('  global:') if len(lines) > 1 else None; \
113       print(';\\n'.join(lines) + '\\n};')"
114      < ${export_file} > ${native_export_file}
115      DEPENDS ${export_file}
116      VERBATIM
117      COMMENT "Creating export file for ${target_name}")
118    if (${LLVM_LINKER_IS_SOLARISLD})
119      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
120                   LINK_FLAGS "  -Wl,-M,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
121    else()
122      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
123                   LINK_FLAGS "  -Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
124    endif()
125  elseif(WIN32)
126    set(native_export_file "${target_name}.def")
127
128    add_custom_command(OUTPUT ${native_export_file}
129      COMMAND "${Python3_EXECUTABLE}" -c "import sys;print(''.join(['EXPORTS\\n']+sys.stdin.readlines(),))"
130        < ${export_file} > ${native_export_file}
131      DEPENDS ${export_file}
132      VERBATIM
133      COMMENT "Creating export file for ${target_name}")
134    set(export_file_linker_flag "${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
135    if(MSVC)
136      # cl.exe or clang-cl, i.e. MSVC style command line interface
137      set(export_file_linker_flag "/DEF:\"${export_file_linker_flag}\"")
138    elseif(CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
139      # clang in msvc mode, calling a link.exe/lld-link style linker
140      set(export_file_linker_flag "-Wl,/DEF:\"${export_file_linker_flag}\"")
141    elseif(MINGW)
142      # ${export_file_linker_flag}, which is the plain file name, works as is
143      # when passed to the compiler driver, which then passes it on to the
144      # linker as an input file.
145      set(export_file_linker_flag "\"${export_file_linker_flag}\"")
146    else()
147      message(FATAL_ERROR "Unsupported Windows toolchain")
148    endif()
149    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
150                 LINK_FLAGS " ${export_file_linker_flag}")
151  endif()
152
153  add_custom_target(${target_name}_exports DEPENDS ${native_export_file})
154  set_target_properties(${target_name}_exports PROPERTIES FOLDER "Misc")
155
156  get_property(srcs TARGET ${target_name} PROPERTY SOURCES)
157  foreach(src ${srcs})
158    get_filename_component(extension ${src} EXT)
159    if(extension STREQUAL ".cpp")
160      set(first_source_file ${src})
161      break()
162    endif()
163  endforeach()
164
165  # Force re-linking when the exports file changes. Actually, it
166  # forces recompilation of the source file. The LINK_DEPENDS target
167  # property only works for makefile-based generators.
168  # FIXME: This is not safe because this will create the same target
169  # ${native_export_file} in several different file:
170  # - One where we emitted ${target_name}_exports
171  # - One where we emitted the build command for the following object.
172  # set_property(SOURCE ${first_source_file} APPEND PROPERTY
173  #   OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file})
174
175  set_property(DIRECTORY APPEND
176    PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file})
177
178  add_dependencies(${target_name} ${target_name}_exports)
179
180  # Add dependency to *_exports later -- CMake issue 14747
181  list(APPEND LLVM_COMMON_DEPENDS ${target_name}_exports)
182  set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
183endfunction(add_llvm_symbol_exports)
184
185if (NOT DEFINED LLVM_LINKER_DETECTED AND NOT WIN32)
186  # Detect what linker we have here.
187  if(APPLE)
188    # Linkers with ld64-compatible flags.
189    set(version_flag "-Wl,-v")
190  else()
191    # Linkers with BFD ld-compatible flags.
192    set(version_flag "-Wl,--version")
193  endif()
194
195  if (CMAKE_HOST_WIN32)
196    set(DEVNULL "NUL")
197  else()
198    set(DEVNULL "/dev/null")
199  endif()
200
201  if(LLVM_USE_LINKER)
202    set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} ${version_flag} -o ${DEVNULL})
203  else()
204    separate_arguments(flags UNIX_COMMAND "${CMAKE_EXE_LINKER_FLAGS}")
205    set(command ${CMAKE_C_COMPILER} ${flags} ${version_flag} -o ${DEVNULL})
206  endif()
207  execute_process(
208    COMMAND ${command}
209    OUTPUT_VARIABLE stdout
210    ERROR_VARIABLE stderr
211    )
212
213  if(APPLE)
214    if("${stderr}" MATCHES "PROGRAM:ld")
215      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
216      set(LLVM_LINKER_IS_APPLE YES CACHE INTERNAL "")
217      message(STATUS "Linker detection: Apple")
218    elseif("${stderr}" MATCHES "^LLD" OR
219           "${stdout}" MATCHES "^LLD")
220      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
221      set(LLVM_LINKER_IS_LLD YES CACHE INTERNAL "")
222      message(STATUS "Linker detection: lld")
223    else()
224      set(LLVM_LINKER_DETECTED NO CACHE INTERNAL "")
225      message(STATUS "Linker detection: unknown")
226    endif()
227  else()
228    if("${stdout}" MATCHES "^mold")
229      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
230      set(LLVM_LINKER_IS_MOLD YES CACHE INTERNAL "")
231      message(STATUS "Linker detection: mold")
232    elseif("${stdout}" MATCHES "GNU gold")
233      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
234      set(LLVM_LINKER_IS_GOLD YES CACHE INTERNAL "")
235      message(STATUS "Linker detection: GNU Gold")
236    elseif("${stdout}" MATCHES "^LLD")
237      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
238      set(LLVM_LINKER_IS_LLD YES CACHE INTERNAL "")
239      message(STATUS "Linker detection: LLD")
240    elseif("${stdout}" MATCHES "GNU ld")
241      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
242      set(LLVM_LINKER_IS_GNULD YES CACHE INTERNAL "")
243      message(STATUS "Linker detection: GNU ld")
244    elseif("${stderr}" MATCHES "(illumos)" OR
245           "${stdout}" MATCHES "(illumos)")
246      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
247      set(LLVM_LINKER_IS_SOLARISLD YES CACHE INTERNAL "")
248      set(LLVM_LINKER_IS_SOLARISLD_ILLUMOS YES CACHE INTERNAL "")
249      message(STATUS "Linker detection: Solaris ld (illumos)")
250    elseif("${stderr}" MATCHES "Solaris Link Editors" OR
251           "${stdout}" MATCHES "Solaris Link Editors")
252      set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "")
253      set(LLVM_LINKER_IS_SOLARISLD YES CACHE INTERNAL "")
254      message(STATUS "Linker detection: Solaris ld")
255    else()
256      set(LLVM_LINKER_DETECTED NO CACHE INTERNAL "")
257      message(STATUS "Linker detection: unknown")
258    endif()
259  endif()
260
261  # Apple's linker complains about duplicate libraries, which CMake likes to do
262  # to support ELF platforms. To silence that warning, we can use
263  # -no_warn_duplicate_libraries, but only in versions of the linker that
264  # support that flag.
265  if(NOT LLVM_USE_LINKER AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
266    include(CheckLinkerFlag)
267    check_linker_flag(C "-Wl,-no_warn_duplicate_libraries" LLVM_LINKER_SUPPORTS_NO_WARN_DUPLICATE_LIBRARIES)
268  else()
269    set(LLVM_LINKER_SUPPORTS_NO_WARN_DUPLICATE_LIBRARIES OFF CACHE INTERNAL "")
270  endif()
271endif()
272
273function(add_link_opts target_name)
274  get_llvm_distribution(${target_name} in_distribution in_distribution_var)
275  if(NOT in_distribution)
276    # Don't LTO optimize targets that aren't part of any distribution.
277    if (LLVM_ENABLE_LTO)
278      # We may consider avoiding LTO altogether by using -fembed-bitcode
279      # and teaching the linker to select machine code from .o files, see
280      # https://lists.llvm.org/pipermail/llvm-dev/2021-April/149843.html
281      if((UNIX OR MINGW) AND LINKER_IS_LLD)
282        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
283                      LINK_FLAGS " -Wl,--lto-O0")
284      elseif(LINKER_IS_LLD_LINK)
285        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
286                      LINK_FLAGS " /opt:lldlto=0")
287      elseif(APPLE AND NOT uppercase_LLVM_ENABLE_LTO STREQUAL "THIN")
288        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
289                      LINK_FLAGS " -Wl,-mllvm,-O0")
290      endif()
291    endif()
292  endif()
293
294  # Don't use linker optimizations in debug builds since it slows down the
295  # linker in a context where the optimizations are not important.
296  if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
297    if(NOT LLVM_NO_DEAD_STRIP)
298      if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
299        # ld64's implementation of -dead_strip breaks tools that use plugins.
300        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
301                     LINK_FLAGS " -Wl,-dead_strip")
302      elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS" AND LLVM_LINKER_IS_SOLARISLD)
303        # Support for ld -z discard-unused=sections was only added in
304        # Solaris 11.4.  GNU ld ignores it, but warns every time.
305        include(LLVMCheckLinkerFlag)
306        llvm_check_linker_flag(CXX "-Wl,-z,discard-unused=sections" LINKER_SUPPORTS_Z_DISCARD_UNUSED)
307        if (LINKER_SUPPORTS_Z_DISCARD_UNUSED)
308          set_property(TARGET ${target_name} APPEND_STRING PROPERTY
309                       LINK_FLAGS " -Wl,-z,discard-unused=sections")
310        endif()
311      elseif(NOT MSVC AND NOT CMAKE_SYSTEM_NAME MATCHES "AIX|OS390")
312        # TODO Revisit this later on z/OS.
313        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
314                     LINK_FLAGS " -Wl,--gc-sections")
315      endif()
316    else() #LLVM_NO_DEAD_STRIP
317      if(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
318        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
319                     LINK_FLAGS " -Wl,-bnogc")
320      endif()
321    endif()
322  endif()
323
324  if(LLVM_LINKER_SUPPORTS_NO_WARN_DUPLICATE_LIBRARIES)
325    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
326                 LINK_FLAGS " -Wl,-no_warn_duplicate_libraries")
327  endif()
328
329  if(ARG_SUPPORT_PLUGINS AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
330    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
331                 LINK_FLAGS " -Wl,-brtl")
332  endif()
333endfunction(add_link_opts)
334
335# Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}.
336# Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more,
337# or a certain builder, for eaxample, msbuild.exe, would be confused.
338function(set_output_directory target)
339  cmake_parse_arguments(ARG "" "BINARY_DIR;LIBRARY_DIR" "" ${ARGN})
340
341  # module_dir -- corresponding to LIBRARY_OUTPUT_DIRECTORY.
342  # It affects output of add_library(MODULE).
343  if(WIN32 OR CYGWIN)
344    # DLL platform
345    set(module_dir ${ARG_BINARY_DIR})
346  else()
347    set(module_dir ${ARG_LIBRARY_DIR})
348  endif()
349  if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".")
350    foreach(build_mode ${CMAKE_CONFIGURATION_TYPES})
351      string(TOUPPER "${build_mode}" CONFIG_SUFFIX)
352      if(ARG_BINARY_DIR)
353        string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${ARG_BINARY_DIR})
354        set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi})
355      endif()
356      if(ARG_LIBRARY_DIR)
357        string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${ARG_LIBRARY_DIR})
358        set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li})
359      endif()
360      if(module_dir)
361        string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} mi ${module_dir})
362        set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${mi})
363      endif()
364    endforeach()
365  else()
366    if(ARG_BINARY_DIR)
367      set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ARG_BINARY_DIR})
368    endif()
369    if(ARG_LIBRARY_DIR)
370      set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ARG_LIBRARY_DIR})
371    endif()
372    if(module_dir)
373      set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${module_dir})
374    endif()
375  endif()
376endfunction()
377
378# If on Windows and building with MSVC, add the resource script containing the
379# VERSIONINFO data to the project.  This embeds version resource information
380# into the output .exe or .dll.
381# TODO: Enable for MinGW Windows builds too.
382#
383function(add_windows_version_resource_file OUT_VAR)
384  set(sources ${ARGN})
385  if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
386    set(resource_file ${LLVM_SOURCE_DIR}/resources/windows_version_resource.rc)
387    if(EXISTS ${resource_file})
388      set(sources ${sources} ${resource_file})
389      source_group("Resource Files" ${resource_file})
390      set(windows_resource_file ${resource_file} PARENT_SCOPE)
391    endif()
392  endif(MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
393
394  set(${OUT_VAR} ${sources} PARENT_SCOPE)
395endfunction(add_windows_version_resource_file)
396
397# set_windows_version_resource_properties(name resource_file...
398#   VERSION_MAJOR int
399#     Optional major version number (defaults to LLVM_VERSION_MAJOR)
400#   VERSION_MINOR int
401#     Optional minor version number (defaults to LLVM_VERSION_MINOR)
402#   VERSION_PATCHLEVEL int
403#     Optional patchlevel version number (defaults to LLVM_VERSION_PATCH)
404#   VERSION_STRING
405#     Optional version string (defaults to PACKAGE_VERSION)
406#   PRODUCT_NAME
407#     Optional product name string (defaults to "LLVM")
408#   )
409function(set_windows_version_resource_properties name resource_file)
410  cmake_parse_arguments(ARG
411    ""
412    "VERSION_MAJOR;VERSION_MINOR;VERSION_PATCHLEVEL;VERSION_STRING;PRODUCT_NAME"
413    ""
414    ${ARGN})
415
416  if (NOT DEFINED ARG_VERSION_MAJOR)
417    if (${LLVM_VERSION_MAJOR})
418      set(ARG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
419    else()
420      set(ARG_VERSION_MAJOR 0)
421    endif()
422  endif()
423
424  if (NOT DEFINED ARG_VERSION_MINOR)
425    if (${LLVM_VERSION_MINOR})
426      set(ARG_VERSION_MINOR ${LLVM_VERSION_MINOR})
427    else()
428      set(ARG_VERSION_MINOR 0)
429    endif()
430  endif()
431
432  if (NOT DEFINED ARG_VERSION_PATCHLEVEL)
433    if (${LLVM_VERSION_PATCH})
434      set(ARG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
435    else()
436      set(ARG_VERSION_PATCHLEVEL 0)
437    endif()
438  endif()
439
440  if (NOT DEFINED ARG_VERSION_STRING)
441    if (${PACKAGE_VERSION})
442      set(ARG_VERSION_STRING ${PACKAGE_VERSION})
443    else()
444      set(ARG_VERSION_STRING 0)
445    endif()
446  endif()
447
448  if (NOT DEFINED ARG_PRODUCT_NAME)
449    set(ARG_PRODUCT_NAME "LLVM")
450  endif()
451
452  set_property(SOURCE ${resource_file}
453               PROPERTY COMPILE_FLAGS /nologo)
454  set_property(SOURCE ${resource_file}
455               PROPERTY COMPILE_DEFINITIONS
456               "RC_VERSION_FIELD_1=${ARG_VERSION_MAJOR}"
457               "RC_VERSION_FIELD_2=${ARG_VERSION_MINOR}"
458               "RC_VERSION_FIELD_3=${ARG_VERSION_PATCHLEVEL}"
459               "RC_VERSION_FIELD_4=0"
460               "RC_FILE_VERSION=\"${ARG_VERSION_STRING}\""
461               "RC_INTERNAL_NAME=\"${name}\""
462               "RC_PRODUCT_NAME=\"${ARG_PRODUCT_NAME}\""
463               "RC_PRODUCT_VERSION=\"${ARG_VERSION_STRING}\"")
464endfunction(set_windows_version_resource_properties)
465
466# llvm_add_library(name sources...
467#   SHARED;STATIC
468#     STATIC by default w/o BUILD_SHARED_LIBS.
469#     SHARED by default w/  BUILD_SHARED_LIBS.
470#   OBJECT
471#     Also create an OBJECT library target. Default if STATIC && SHARED.
472#   MODULE
473#     Target ${name} might not be created on unsupported platforms.
474#     Check with "if(TARGET ${name})".
475#   DISABLE_LLVM_LINK_LLVM_DYLIB
476#     Do not link this library to libLLVM, even if
477#     LLVM_LINK_LLVM_DYLIB is enabled.
478#   OUTPUT_NAME name
479#     Corresponds to OUTPUT_NAME in target properties.
480#   DEPENDS targets...
481#     Same semantics as add_dependencies().
482#   LINK_COMPONENTS components...
483#     Same as the variable LLVM_LINK_COMPONENTS.
484#   LINK_LIBS lib_targets...
485#     Same semantics as target_link_libraries().
486#   ADDITIONAL_HEADERS
487#     May specify header files for IDE generators.
488#   SONAME
489#     Should set SONAME link flags and create symlinks
490#   NO_INSTALL_RPATH
491#     Suppress default RPATH settings in shared libraries.
492#   PLUGIN_TOOL
493#     The tool (i.e. cmake target) that this plugin will link against
494#   COMPONENT_LIB
495#      This is used to specify that this is a component library of
496#      LLVM which means that the source resides in llvm/lib/ and it is a
497#      candidate for inclusion into libLLVM.so.
498#   )
499function(llvm_add_library name)
500  cmake_parse_arguments(ARG
501    "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB"
502    "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
503    "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
504    ${ARGN})
505  list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
506  if(ARG_ADDITIONAL_HEADERS)
507    # Pass through ADDITIONAL_HEADERS.
508    set(ARG_ADDITIONAL_HEADERS ADDITIONAL_HEADERS ${ARG_ADDITIONAL_HEADERS})
509  endif()
510  if(ARG_OBJLIBS)
511    set(ALL_FILES ${ARG_OBJLIBS})
512  else()
513    llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS})
514  endif()
515
516  if(ARG_MODULE)
517    if(ARG_SHARED OR ARG_STATIC)
518      message(WARNING "MODULE with SHARED|STATIC doesn't make sense.")
519    endif()
520    # Plugins that link against a tool are allowed even when plugins in general are not
521    if(NOT LLVM_ENABLE_PLUGINS AND NOT (ARG_PLUGIN_TOOL AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS))
522      message(STATUS "${name} ignored -- Loadable modules not supported on this platform.")
523      return()
524    endif()
525  else()
526    if(ARG_PLUGIN_TOOL)
527      message(WARNING "PLUGIN_TOOL without MODULE doesn't make sense.")
528    endif()
529    if(BUILD_SHARED_LIBS AND NOT ARG_STATIC)
530      set(ARG_SHARED TRUE)
531    endif()
532    if(NOT ARG_SHARED)
533      set(ARG_STATIC TRUE)
534    endif()
535  endif()
536
537  # Generate objlib
538  if((ARG_SHARED AND ARG_STATIC) OR ARG_OBJECT)
539    # Generate an obj library for both targets.
540    set(obj_name "obj.${name}")
541    add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
542      ${ALL_FILES}
543      )
544    llvm_update_compile_flags(${obj_name})
545    if(CMAKE_GENERATOR STREQUAL "Xcode")
546      set(DUMMY_FILE ${CMAKE_CURRENT_BINARY_DIR}/Dummy.c)
547      file(WRITE ${DUMMY_FILE} "// This file intentionally empty\n")
548      set_property(SOURCE ${DUMMY_FILE} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wno-empty-translation-unit")
549    endif()
550    set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>" ${DUMMY_FILE})
551
552    # Do add_dependencies(obj) later due to CMake issue 14747.
553    list(APPEND objlibs ${obj_name})
554
555    # Bring in the target include directories from our original target.
556    target_include_directories(${obj_name} PRIVATE $<TARGET_PROPERTY:${name},INCLUDE_DIRECTORIES>)
557
558    set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
559    if(ARG_DEPENDS)
560      add_dependencies(${obj_name} ${ARG_DEPENDS})
561    endif()
562    # Treat link libraries like PUBLIC dependencies.  LINK_LIBS might
563    # result in generating header files.  Add a dependendency so that
564    # the generated header is created before this object library.
565    if(ARG_LINK_LIBS)
566      cmake_parse_arguments(LINK_LIBS_ARG
567        ""
568        ""
569        "PUBLIC;PRIVATE"
570        ${ARG_LINK_LIBS})
571      foreach(link_lib ${LINK_LIBS_ARG_PUBLIC})
572        if(LLVM_PTHREAD_LIB)
573          # Can't specify a dependence on -lpthread
574          if(NOT ${link_lib} STREQUAL ${LLVM_PTHREAD_LIB})
575            add_dependencies(${obj_name} ${link_lib})
576          endif()
577        else()
578          add_dependencies(${obj_name} ${link_lib})
579        endif()
580      endforeach()
581    endif()
582  endif()
583
584  if(ARG_SHARED AND ARG_STATIC)
585    # static
586    set(name_static "${name}_static")
587    if(ARG_OUTPUT_NAME)
588      set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}")
589    endif()
590    # DEPENDS has been appended to LLVM_COMMON_LIBS.
591    llvm_add_library(${name_static} STATIC
592      ${output_name}
593      OBJLIBS ${ALL_FILES} # objlib
594      LINK_LIBS ${ARG_LINK_LIBS}
595      LINK_COMPONENTS ${ARG_LINK_COMPONENTS}
596      )
597
598    # Bring in the target link info from our original target.
599    target_link_directories(${name_static} PRIVATE $<TARGET_PROPERTY:${name},LINK_DIRECTORIES>)
600    target_link_libraries(${name_static} PRIVATE $<TARGET_PROPERTY:${name},LINK_LIBRARIES>)
601
602    # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY.
603    set(ARG_STATIC)
604  endif()
605
606  if(ARG_MODULE)
607    add_library(${name} MODULE ${ALL_FILES})
608  elseif(ARG_SHARED)
609    add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
610    add_library(${name} SHARED ${ALL_FILES})
611  else()
612    add_library(${name} STATIC ${ALL_FILES})
613  endif()
614
615  if(ARG_COMPONENT_LIB)
616    set_target_properties(${name} PROPERTIES LLVM_COMPONENT TRUE)
617    set_property(GLOBAL APPEND PROPERTY LLVM_COMPONENT_LIBS ${name})
618  endif()
619
620  if(NOT ARG_NO_INSTALL_RPATH)
621    if(ARG_MODULE OR ARG_SHARED)
622      llvm_setup_rpath(${name})
623    endif()
624  endif()
625
626  setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
627
628  if(DEFINED windows_resource_file)
629    set_windows_version_resource_properties(${name} ${windows_resource_file})
630    set(windows_resource_file ${windows_resource_file} PARENT_SCOPE)
631  endif()
632
633  set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
634  # $<TARGET_OBJECTS> doesn't require compile flags.
635  if(NOT obj_name)
636    llvm_update_compile_flags(${name})
637  endif()
638  add_link_opts( ${name} )
639  if(ARG_OUTPUT_NAME)
640    set_target_properties(${name}
641      PROPERTIES
642      OUTPUT_NAME ${ARG_OUTPUT_NAME}
643      )
644  endif()
645
646  if(ARG_MODULE)
647    set_target_properties(${name} PROPERTIES
648      PREFIX ""
649      SUFFIX ${LLVM_PLUGIN_EXT}
650      )
651  endif()
652
653  if(ARG_SHARED)
654    if(MSVC)
655      set_target_properties(${name} PROPERTIES
656        PREFIX ""
657        )
658    endif()
659
660    # Set SOVERSION on shared libraries that lack explicit SONAME
661    # specifier, on *nix systems that are not Darwin.
662    if(UNIX AND NOT APPLE AND NOT ARG_SONAME)
663      set_target_properties(${name}
664        PROPERTIES
665        # Since 18.1.0, the ABI version is indicated by the major and minor version.
666        SOVERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}${LLVM_VERSION_SUFFIX}
667        VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}${LLVM_VERSION_SUFFIX})
668    endif()
669  endif()
670
671  if(ARG_MODULE OR ARG_SHARED)
672    # Do not add -Dname_EXPORTS to the command-line when building files in this
673    # target. Doing so is actively harmful for the modules build because it
674    # creates extra module variants, and not useful because we don't use these
675    # macros.
676    set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
677
678    if (LLVM_EXPORTED_SYMBOL_FILE)
679      add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
680    endif()
681  endif()
682
683  if(ARG_SHARED)
684    if(NOT APPLE AND ARG_SONAME)
685      get_target_property(output_name ${name} OUTPUT_NAME)
686      if(${output_name} STREQUAL "output_name-NOTFOUND")
687        set(output_name ${name})
688      endif()
689      set(library_name ${output_name}-${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX})
690      set(api_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
691      set_target_properties(${name} PROPERTIES OUTPUT_NAME ${library_name})
692      if(UNIX)
693        llvm_install_library_symlink(${api_name} ${library_name} SHARED
694          COMPONENT ${name})
695        llvm_install_library_symlink(${output_name} ${library_name} SHARED
696          COMPONENT ${name})
697      endif()
698    endif()
699  endif()
700
701  if(ARG_STATIC)
702    set(libtype PUBLIC)
703  else()
704    # We can use PRIVATE since SO knows its dependent libs.
705    set(libtype PRIVATE)
706  endif()
707
708  if(ARG_MODULE AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS AND ARG_PLUGIN_TOOL AND (WIN32 OR CYGWIN))
709    # On DLL platforms symbols are imported from the tool by linking against it.
710    set(llvm_libs ${ARG_PLUGIN_TOOL})
711  elseif (NOT ARG_COMPONENT_LIB)
712    if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
713      set(llvm_libs LLVM)
714    else()
715      llvm_map_components_to_libnames(llvm_libs
716       ${ARG_LINK_COMPONENTS}
717       ${LLVM_LINK_COMPONENTS}
718       )
719    endif()
720  else()
721    # Components have not been defined explicitly in CMake, so add the
722    # dependency information for this library through their name, and let
723    # LLVMBuildResolveComponentsLink resolve the mapping.
724    #
725    # It would be nice to verify that we have the dependencies for this library
726    # name, but using get_property(... SET) doesn't suffice to determine if a
727    # property has been set to an empty value.
728    set_property(TARGET ${name} PROPERTY LLVM_LINK_COMPONENTS ${ARG_LINK_COMPONENTS} ${LLVM_LINK_COMPONENTS})
729
730    # This property is an internal property only used to make sure the
731    # link step applied in LLVMBuildResolveComponentsLink uses the same
732    # property as the target_link_libraries call below.
733    set_property(TARGET ${name} PROPERTY LLVM_LIBTYPE ${libtype})
734  endif()
735
736  target_link_libraries(${name} ${libtype}
737      ${ARG_LINK_LIBS}
738      ${lib_deps}
739      ${llvm_libs}
740      )
741
742  if(LLVM_COMMON_DEPENDS)
743    add_dependencies(${name} ${LLVM_COMMON_DEPENDS})
744    # Add dependencies also to objlibs.
745    # CMake issue 14747 --  add_dependencies() might be ignored to objlib's user.
746    foreach(objlib ${objlibs})
747      add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS})
748    endforeach()
749  endif()
750
751  add_custom_linker_flags(${name})
752
753  if(ARG_SHARED OR ARG_MODULE)
754    llvm_externalize_debuginfo(${name})
755    llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
756  endif()
757  # clang and newer versions of ninja use high-resolutions timestamps,
758  # but older versions of libtool on Darwin don't, so the archive will
759  # often get an older timestamp than the last object that was added
760  # or updated.  To fix this, we add a custom command to touch archive
761  # after it's been built so that ninja won't rebuild it unnecessarily
762  # the next time it's run.
763  if(ARG_STATIC AND LLVM_TOUCH_STATIC_LIBRARIES)
764    add_custom_command(TARGET ${name}
765      POST_BUILD
766      COMMAND touch ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}
767      )
768  endif()
769endfunction()
770
771function(add_llvm_install_targets target)
772  cmake_parse_arguments(ARG "" "COMPONENT;PREFIX;SYMLINK" "DEPENDS" ${ARGN})
773  if(ARG_COMPONENT)
774    set(component_option -DCMAKE_INSTALL_COMPONENT="${ARG_COMPONENT}")
775  endif()
776  if(ARG_PREFIX)
777    set(prefix_option -DCMAKE_INSTALL_PREFIX="${ARG_PREFIX}")
778  endif()
779
780  set(file_dependencies)
781  set(target_dependencies)
782  foreach(dependency ${ARG_DEPENDS})
783    if(TARGET ${dependency})
784      list(APPEND target_dependencies ${dependency})
785    else()
786      list(APPEND file_dependencies ${dependency})
787    endif()
788  endforeach()
789
790  add_custom_target(${target}
791                    DEPENDS ${file_dependencies}
792                    COMMAND "${CMAKE_COMMAND}"
793                            ${component_option}
794                            ${prefix_option}
795                            -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
796                    USES_TERMINAL)
797  set_target_properties(${target} PROPERTIES FOLDER "Component Install Targets")
798  add_custom_target(${target}-stripped
799                    DEPENDS ${file_dependencies}
800                    COMMAND "${CMAKE_COMMAND}"
801                            ${component_option}
802                            ${prefix_option}
803                            -DCMAKE_INSTALL_DO_STRIP=1
804                            -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
805                    USES_TERMINAL)
806  set_target_properties(${target}-stripped PROPERTIES FOLDER "Component Install Targets (Stripped)")
807  if(target_dependencies)
808    add_dependencies(${target} ${target_dependencies})
809    add_dependencies(${target}-stripped ${target_dependencies})
810  endif()
811
812  if(ARG_SYMLINK)
813    add_dependencies(${target} install-${ARG_SYMLINK})
814    add_dependencies(${target}-stripped install-${ARG_SYMLINK}-stripped)
815  endif()
816endfunction()
817
818# Define special targets that behave like a component group. They don't have any
819# source attached but other components can add themselves to them. If the
820# component supports is a Target and it supports JIT compilation, HAS_JIT must
821# be passed. One can use ADD_TO_COMPONENT option from add_llvm_component_library
822# to link extra component into an existing group.
823function(add_llvm_component_group name)
824  cmake_parse_arguments(ARG "HAS_JIT" "" "LINK_COMPONENTS" ${ARGN})
825  add_custom_target(${name})
826  if(ARG_HAS_JIT)
827    set_property(TARGET ${name} PROPERTY COMPONENT_HAS_JIT ON)
828  endif()
829  if(ARG_LINK_COMPONENTS)
830    set_property(TARGET ${name} PROPERTY LLVM_LINK_COMPONENTS ${ARG_LINK_COMPONENTS})
831  endif()
832endfunction()
833
834# An LLVM component is a cmake target with the following cmake properties
835# eventually set:
836#   - LLVM_COMPONENT_NAME: the name of the component, which can be the name of
837#     the associated library or the one specified through COMPONENT_NAME
838#   - LLVM_LINK_COMPONENTS: a list of component this component depends on
839#   - COMPONENT_HAS_JIT: (only for group component) whether this target group
840#     supports JIT compilation
841# Additionnaly, the ADD_TO_COMPONENT <component> option make it possible to add this
842# component to the LLVM_LINK_COMPONENTS of <component>.
843function(add_llvm_component_library name)
844  cmake_parse_arguments(ARG
845    ""
846    "COMPONENT_NAME;ADD_TO_COMPONENT"
847    ""
848    ${ARGN})
849  add_llvm_library(${name} COMPONENT_LIB ${ARG_UNPARSED_ARGUMENTS})
850  string(REGEX REPLACE "^LLVM" "" component_name ${name})
851  set_property(TARGET ${name} PROPERTY LLVM_COMPONENT_NAME ${component_name})
852
853  if(ARG_COMPONENT_NAME)
854    set_property(GLOBAL PROPERTY LLVM_COMPONENT_NAME_${ARG_COMPONENT_NAME} ${component_name})
855  endif()
856
857  if(ARG_ADD_TO_COMPONENT)
858    set_property(TARGET ${ARG_ADD_TO_COMPONENT} APPEND PROPERTY LLVM_LINK_COMPONENTS ${component_name})
859  endif()
860
861endfunction()
862
863macro(add_llvm_library name)
864  cmake_parse_arguments(ARG
865    "SHARED;BUILDTREE_ONLY;MODULE;INSTALL_WITH_TOOLCHAIN"
866    ""
867    ""
868    ${ARGN})
869  if(ARG_MODULE)
870    llvm_add_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS})
871  elseif( BUILD_SHARED_LIBS OR ARG_SHARED )
872    llvm_add_library(${name} SHARED ${ARG_UNPARSED_ARGUMENTS})
873  else()
874    llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS})
875  endif()
876
877  # Libraries that are meant to only be exposed via the build tree only are
878  # never installed and are only exported as a target in the special build tree
879  # config file.
880  if (NOT ARG_BUILDTREE_ONLY AND NOT ARG_MODULE)
881    set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
882    set(in_llvm_libs YES)
883  endif()
884
885  if (ARG_MODULE AND NOT TARGET ${name})
886    # Add empty "phony" target
887    add_custom_target(${name})
888  elseif( EXCLUDE_FROM_ALL )
889    set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
890  elseif(ARG_BUILDTREE_ONLY)
891    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
892  else()
893    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)
894      if(in_llvm_libs)
895        set(umbrella UMBRELLA llvm-libraries)
896      else()
897        set(umbrella)
898      endif()
899
900      get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella})
901      install(TARGETS ${name}
902              ${export_to_llvmexports}
903              LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
904              ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
905              RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name})
906
907      if (NOT LLVM_ENABLE_IDE)
908        add_llvm_install_targets(install-${name}
909                                 DEPENDS ${name}
910                                 COMPONENT ${name})
911      endif()
912    endif()
913    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
914  endif()
915  if (ARG_MODULE)
916    set_target_properties(${name} PROPERTIES FOLDER "Loadable modules")
917  else()
918    set_target_properties(${name} PROPERTIES FOLDER "Libraries")
919  endif()
920endmacro(add_llvm_library name)
921
922macro(generate_llvm_objects name)
923  cmake_parse_arguments(ARG "GENERATE_DRIVER" "" "DEPENDS" ${ARGN})
924
925  llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
926
927  list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
928
929  # Generate objlib
930  if(LLVM_ENABLE_OBJLIB OR (ARG_GENERATE_DRIVER AND LLVM_TOOL_LLVM_DRIVER_BUILD))
931    # Generate an obj library for both targets.
932    set(obj_name "obj.${name}")
933    add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
934      ${ALL_FILES}
935      )
936    llvm_update_compile_flags(${obj_name})
937    set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
938    if(ARG_DEPENDS)
939      add_dependencies(${obj_name} ${ARG_DEPENDS})
940    endif()
941
942    set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
943  endif()
944
945  if (ARG_GENERATE_DRIVER)
946    string(REPLACE "-" "_" TOOL_NAME ${name})
947    foreach(path ${CMAKE_MODULE_PATH})
948      if(EXISTS ${path}/llvm-driver-template.cpp.in)
949        configure_file(
950          ${path}/llvm-driver-template.cpp.in
951          ${CMAKE_CURRENT_BINARY_DIR}/${name}-driver.cpp)
952        break()
953      endif()
954    endforeach()
955
956    list(APPEND ALL_FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}-driver.cpp)
957
958    if (LLVM_TOOL_LLVM_DRIVER_BUILD
959        AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)
960       )
961      set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_COMPONENTS ${LLVM_LINK_COMPONENTS})
962      set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_DEPS ${ARG_DEPENDS} ${LLVM_COMMON_DEPENDS})
963      set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_OBJLIBS "${obj_name}")
964
965      set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOLS ${name})
966      set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${name} ${name})
967      target_link_libraries(${obj_name} ${LLVM_PTHREAD_LIB})
968      llvm_config(${obj_name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
969    endif()
970  endif()
971endmacro()
972
973macro(add_llvm_executable name)
974  cmake_parse_arguments(ARG
975    "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS"
976    "ENTITLEMENTS;BUNDLE_PATH"
977    ""
978    ${ARGN})
979  generate_llvm_objects(${name} ${ARG_UNPARSED_ARGUMENTS})
980  add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
981
982  if(XCODE)
983    # Note: the dummy.cpp source file provides no definitions. However,
984    # it forces Xcode to properly link the static library.
985    list(APPEND ALL_FILES "${LLVM_MAIN_SRC_DIR}/cmake/dummy.cpp")
986  endif()
987
988  if( EXCLUDE_FROM_ALL )
989    add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
990  else()
991    add_executable(${name} ${ALL_FILES})
992  endif()
993
994  setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
995
996  if(NOT ARG_NO_INSTALL_RPATH)
997    llvm_setup_rpath(${name})
998  elseif(NOT "${LLVM_LOCAL_RPATH}" STREQUAL "")
999    # Enable BUILD_WITH_INSTALL_RPATH unless CMAKE_BUILD_RPATH is set.
1000    if("${CMAKE_BUILD_RPATH}" STREQUAL "")
1001      set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON)
1002    endif()
1003
1004    set_property(TARGET ${name} PROPERTY INSTALL_RPATH "${LLVM_LOCAL_RPATH}")
1005  endif()
1006
1007  if(DEFINED windows_resource_file)
1008    set_windows_version_resource_properties(${name} ${windows_resource_file})
1009  endif()
1010
1011  # $<TARGET_OBJECTS> doesn't require compile flags.
1012  if(NOT LLVM_ENABLE_OBJLIB)
1013    llvm_update_compile_flags(${name})
1014  endif()
1015
1016  if (ARG_SUPPORT_PLUGINS AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
1017    set(LLVM_NO_DEAD_STRIP On)
1018  endif()
1019
1020  add_link_opts( ${name} )
1021
1022  # Do not add -Dname_EXPORTS to the command-line when building files in this
1023  # target. Doing so is actively harmful for the modules build because it
1024  # creates extra module variants, and not useful because we don't use these
1025  # macros.
1026  set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
1027
1028  if (LLVM_EXPORTED_SYMBOL_FILE)
1029    add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
1030  endif(LLVM_EXPORTED_SYMBOL_FILE)
1031
1032  if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
1033    set(USE_SHARED USE_SHARED)
1034  endif()
1035
1036  set(EXCLUDE_FROM_ALL OFF)
1037  set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
1038  llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
1039  if( LLVM_COMMON_DEPENDS )
1040    add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
1041    foreach(objlib ${obj_name})
1042      add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS})
1043    endforeach()
1044  endif( LLVM_COMMON_DEPENDS )
1045
1046  add_custom_linker_flags(${name})
1047
1048  if(NOT ARG_IGNORE_EXTERNALIZE_DEBUGINFO)
1049    llvm_externalize_debuginfo(${name})
1050  endif()
1051  if (LLVM_PTHREAD_LIB)
1052    # libpthreads overrides some standard library symbols, so main
1053    # executable must be linked with it in order to provide consistent
1054    # API for all shared libaries loaded by this executable.
1055    target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB})
1056  endif()
1057
1058  if(HAVE_LLVM_LIBC)
1059    target_link_libraries(${name} PRIVATE llvmlibc)
1060  endif()
1061
1062  llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
1063endmacro(add_llvm_executable name)
1064
1065# add_llvm_pass_plugin(name [NO_MODULE] ...)
1066#   Add ${name} as an llvm plugin.
1067#   If option LLVM_${name_upper}_LINK_INTO_TOOLS is set to ON, the plugin is registered statically.
1068#   Otherwise a pluggable shared library is registered.
1069#
1070#   If NO_MODULE is specified, when option LLVM_${name_upper}_LINK_INTO_TOOLS is set to OFF,
1071#   only an object library is built, and no module is built. This is specific to the Polly use case.
1072#
1073#   The SUBPROJECT argument contains the LLVM project the plugin belongs
1074#   to. If set, the plugin will link statically by default it if the
1075#   project was enabled.
1076function(add_llvm_pass_plugin name)
1077  cmake_parse_arguments(ARG
1078    "NO_MODULE" "SUBPROJECT" ""
1079    ${ARGN})
1080
1081  string(TOUPPER ${name} name_upper)
1082
1083  # Enable the plugin by default if it was explicitly enabled by the user.
1084  # Note: If was set to "all", LLVM's CMakeLists.txt replaces it with a
1085  # list of all projects, counting as explicitly enabled.
1086  set(link_into_tools_default OFF)
1087  if (ARG_SUBPROJECT AND LLVM_TOOL_${name_upper}_BUILD)
1088    set(link_into_tools_default ON)
1089  endif()
1090  option(LLVM_${name_upper}_LINK_INTO_TOOLS "Statically link ${name} into tools (if available)" ${link_into_tools_default})
1091
1092  # If we statically link the plugin, don't use llvm dylib because we're going
1093  # to be part of it.
1094  if(LLVM_${name_upper}_LINK_INTO_TOOLS)
1095      list(APPEND ARG_UNPARSED_ARGUMENTS DISABLE_LLVM_LINK_LLVM_DYLIB)
1096  endif()
1097
1098  if(LLVM_${name_upper}_LINK_INTO_TOOLS)
1099    list(REMOVE_ITEM ARG_UNPARSED_ARGUMENTS BUILDTREE_ONLY)
1100    # process_llvm_pass_plugins takes care of the actual linking, just create an
1101    # object library as of now
1102    add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS})
1103    target_compile_definitions(${name} PRIVATE LLVM_${name_upper}_LINK_INTO_TOOLS)
1104    set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS LLVM_LINK_INTO_TOOLS)
1105    if (TARGET intrinsics_gen)
1106      add_dependencies(obj.${name} intrinsics_gen)
1107    endif()
1108    if (TARGET omp_gen)
1109      add_dependencies(obj.${name} omp_gen)
1110    endif()
1111    if (TARGET acc_gen)
1112      add_dependencies(obj.${name} acc_gen)
1113    endif()
1114    set_property(GLOBAL APPEND PROPERTY LLVM_STATIC_EXTENSIONS ${name})
1115  elseif(NOT ARG_NO_MODULE)
1116    add_llvm_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS})
1117  else()
1118    add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS})
1119  endif()
1120  message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})")
1121
1122endfunction(add_llvm_pass_plugin)
1123
1124# process_llvm_pass_plugins([GEN_CONFIG])
1125#
1126# Correctly set lib dependencies between plugins and tools, based on tools
1127# registered with the ENABLE_PLUGINS option.
1128#
1129# if GEN_CONFIG option is set, also generate X Macro file for extension
1130# handling. It provides a HANDLE_EXTENSION(extension_namespace, ExtensionProject)
1131# call for each extension allowing client code to define
1132# HANDLE_EXTENSION to have a specific code be run for each extension.
1133#
1134function(process_llvm_pass_plugins)
1135  cmake_parse_arguments(ARG
1136      "GEN_CONFIG" "" ""
1137    ${ARGN})
1138
1139  if(ARG_GEN_CONFIG)
1140      get_property(LLVM_STATIC_EXTENSIONS GLOBAL PROPERTY LLVM_STATIC_EXTENSIONS)
1141  else()
1142      include(LLVMConfigExtensions)
1143  endif()
1144
1145  # Add static plugins to the Extension component
1146  foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS})
1147      set_property(TARGET LLVMExtensions APPEND PROPERTY LINK_LIBRARIES ${llvm_extension})
1148      set_property(TARGET LLVMExtensions APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension})
1149  endforeach()
1150
1151  # Eventually generate the extension headers, and store config to a cmake file
1152  # for usage in third-party configuration.
1153  if(ARG_GEN_CONFIG)
1154
1155      ## Part 1: Extension header to be included whenever we need extension
1156      #  processing.
1157      if(NOT DEFINED LLVM_INSTALL_PACKAGE_DIR)
1158          message(FATAL_ERROR "LLVM_INSTALL_PACKAGE_DIR must be defined and writable. GEN_CONFIG should only be passe when building LLVM proper.")
1159      endif()
1160      # LLVM_INSTALL_PACKAGE_DIR might be absolute, so don't reuse below.
1161      string(REPLACE "${CMAKE_CFG_INTDIR}" "." llvm_cmake_builddir "${LLVM_LIBRARY_DIR}")
1162      set(llvm_cmake_builddir "${llvm_cmake_builddir}/cmake/llvm")
1163      file(WRITE
1164          "${llvm_cmake_builddir}/LLVMConfigExtensions.cmake"
1165          "set(LLVM_STATIC_EXTENSIONS ${LLVM_STATIC_EXTENSIONS})")
1166      install(FILES
1167          ${llvm_cmake_builddir}/LLVMConfigExtensions.cmake
1168          DESTINATION ${LLVM_INSTALL_PACKAGE_DIR}
1169          COMPONENT cmake-exports)
1170
1171      set(ExtensionDef "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def")
1172      file(WRITE "${ExtensionDef}.tmp" "//extension handlers\n")
1173      foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS})
1174          file(APPEND "${ExtensionDef}.tmp" "HANDLE_EXTENSION(${llvm_extension})\n")
1175      endforeach()
1176      file(APPEND "${ExtensionDef}.tmp" "#undef HANDLE_EXTENSION\n")
1177
1178      # only replace if there's an actual change
1179      execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
1180          "${ExtensionDef}.tmp"
1181          "${ExtensionDef}")
1182      file(REMOVE "${ExtensionDef}.tmp")
1183
1184      ## Part 2: Extension header that captures each extension dependency, to be
1185      #  used by llvm-config.
1186      set(ExtensionDeps "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc")
1187
1188      # Max needed to correctly size the required library array.
1189      set(llvm_plugin_max_deps_length 0)
1190      foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS})
1191        get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES)
1192        list(LENGTH llvm_plugin_deps llvm_plugin_deps_length)
1193        if(llvm_plugin_deps_length GREATER llvm_plugin_max_deps_length)
1194            set(llvm_plugin_max_deps_length ${llvm_plugin_deps_length})
1195        endif()
1196      endforeach()
1197
1198      list(LENGTH LLVM_STATIC_EXTENSIONS llvm_static_extension_count)
1199      file(WRITE
1200          "${ExtensionDeps}.tmp"
1201          "#include <array>\n\
1202           struct ExtensionDescriptor {\n\
1203              const char* Name;\n\
1204              const char* RequiredLibraries[1 + 1 + ${llvm_plugin_max_deps_length}];\n\
1205           };\n\
1206           std::array<ExtensionDescriptor, ${llvm_static_extension_count}> AvailableExtensions{\n")
1207
1208      foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS})
1209        get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES)
1210
1211        file(APPEND "${ExtensionDeps}.tmp" "ExtensionDescriptor{\"${llvm_extension}\", {")
1212        foreach(llvm_plugin_dep ${llvm_plugin_deps})
1213            # Turn library dependency back to component name, if possible.
1214            # That way llvm-config can avoid redundant dependencies.
1215            STRING(REGEX REPLACE "^-l" ""  plugin_dep_name ${llvm_plugin_dep})
1216            STRING(REGEX MATCH "^LLVM" is_llvm_library ${plugin_dep_name})
1217            if(is_llvm_library)
1218                STRING(REGEX REPLACE "^LLVM" ""  plugin_dep_name ${plugin_dep_name})
1219                STRING(TOLOWER ${plugin_dep_name} plugin_dep_name)
1220            endif()
1221            file(APPEND "${ExtensionDeps}.tmp" "\"${plugin_dep_name}\", ")
1222        endforeach()
1223
1224        # Self + mandatory trailing null, because the number of RequiredLibraries differs between extensions.
1225        file(APPEND "${ExtensionDeps}.tmp" \"${llvm_extension}\", "nullptr}},\n")
1226      endforeach()
1227      file(APPEND "${ExtensionDeps}.tmp" "};\n")
1228
1229      # only replace if there's an actual change
1230      execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
1231          "${ExtensionDeps}.tmp"
1232          "${ExtensionDeps}")
1233      file(REMOVE "${ExtensionDeps}.tmp")
1234  endif()
1235endfunction()
1236
1237function(export_executable_symbols target)
1238  if (LLVM_EXPORTED_SYMBOL_FILE)
1239    # The symbol file should contain the symbols we want the executable to
1240    # export
1241    set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
1242  elseif (LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
1243    # Extract the symbols to export from the static libraries that the
1244    # executable links against.
1245    set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
1246    set(exported_symbol_file ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${target}.symbols)
1247    # We need to consider not just the direct link dependencies, but also the
1248    # transitive link dependencies. Do this by starting with the set of direct
1249    # dependencies, then the dependencies of those dependencies, and so on.
1250    get_target_property(new_libs ${target} LINK_LIBRARIES)
1251    set(link_libs ${new_libs})
1252    while(NOT "${new_libs}" STREQUAL "")
1253      foreach(lib ${new_libs})
1254        if(TARGET ${lib})
1255          get_target_property(lib_type ${lib} TYPE)
1256          if("${lib_type}" STREQUAL "STATIC_LIBRARY")
1257            list(APPEND static_libs ${lib})
1258          else()
1259            list(APPEND other_libs ${lib})
1260          endif()
1261          get_target_property(transitive_libs ${lib} INTERFACE_LINK_LIBRARIES)
1262          foreach(transitive_lib ${transitive_libs})
1263            if(TARGET ${transitive_lib} AND NOT ${transitive_lib} IN_LIST link_libs)
1264              list(APPEND newer_libs ${transitive_lib})
1265              list(APPEND link_libs ${transitive_lib})
1266            endif()
1267          endforeach(transitive_lib)
1268        endif()
1269      endforeach(lib)
1270      set(new_libs ${newer_libs})
1271      set(newer_libs "")
1272    endwhile()
1273    list(REMOVE_DUPLICATES static_libs)
1274    if (MSVC)
1275      set(mangling microsoft)
1276    else()
1277      set(mangling itanium)
1278    endif()
1279    get_host_tool_path(llvm-nm LLVM_NM llvm_nm_exe llvm_nm_target)
1280    get_host_tool_path(llvm-readobj LLVM_READOBJ llvm_readobj_exe llvm_readobj_target)
1281    add_custom_command(OUTPUT ${exported_symbol_file}
1282                       COMMAND "${Python3_EXECUTABLE}"
1283                         ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py
1284                         --mangling=${mangling} ${static_libs}
1285                         -o ${exported_symbol_file}
1286                         --nm=${llvm_nm_exe}
1287                         --readobj=${llvm_readobj_exe}
1288                       WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}
1289                       DEPENDS ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py
1290                         ${static_libs} ${llvm_nm_target} ${llvm_readobj_target}
1291                       VERBATIM
1292                       COMMENT "Generating export list for ${target}")
1293    add_llvm_symbol_exports( ${target} ${exported_symbol_file} )
1294    # If something links against this executable then we want a
1295    # transitive link against only the libraries whose symbols
1296    # we aren't exporting.
1297    set_target_properties(${target} PROPERTIES INTERFACE_LINK_LIBRARIES "${other_libs}")
1298    # The default import library suffix that cmake uses for cygwin/mingw is
1299    # ".dll.a", but for clang.exe that causes a collision with libclang.dll,
1300    # where the import libraries of both get named libclang.dll.a. Use a suffix
1301    # of ".exe.a" to avoid this.
1302    if(CYGWIN OR MINGW)
1303      set_target_properties(${target} PROPERTIES IMPORT_SUFFIX ".exe.a")
1304    endif()
1305  elseif(NOT (WIN32 OR CYGWIN))
1306    # On Windows auto-exporting everything doesn't work because of the limit on
1307    # the size of the exported symbol table, but on other platforms we can do
1308    # it without any trouble.
1309    set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
1310    # CMake doesn't set CMAKE_EXE_EXPORTS_${lang}_FLAG on Solaris, so
1311    # ENABLE_EXPORTS has no effect.  While Solaris ld defaults to -rdynamic
1312    # behaviour, GNU ld needs it.
1313    if (APPLE OR ${CMAKE_SYSTEM_NAME} STREQUAL "SunOS")
1314      set_property(TARGET ${target} APPEND_STRING PROPERTY
1315        LINK_FLAGS " -rdynamic")
1316    endif()
1317  endif()
1318endfunction()
1319
1320# Export symbols if LLVM plugins are enabled.
1321function(export_executable_symbols_for_plugins target)
1322  if(LLVM_ENABLE_PLUGINS OR LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
1323    export_executable_symbols(${target})
1324  endif()
1325endfunction()
1326
1327if(NOT LLVM_TOOLCHAIN_TOOLS)
1328  set (LLVM_TOOLCHAIN_TOOLS
1329    llvm-ar
1330    llvm-cov
1331    llvm-cxxfilt
1332    llvm-dlltool
1333    llvm-dwp
1334    llvm-ranlib
1335    llvm-lib
1336    llvm-mca
1337    llvm-ml
1338    llvm-nm
1339    llvm-objcopy
1340    llvm-objdump
1341    llvm-pdbutil
1342    llvm-rc
1343    llvm-readobj
1344    llvm-size
1345    llvm-strings
1346    llvm-strip
1347    llvm-profdata
1348    llvm-symbolizer
1349    # symlink version of some of above tools that are enabled by
1350    # LLVM_INSTALL_BINUTILS_SYMLINKS.
1351    addr2line
1352    ar
1353    c++filt
1354    ranlib
1355    nm
1356    objcopy
1357    objdump
1358    readelf
1359    size
1360    strings
1361    strip
1362    )
1363  # Build llvm-mt if libxml2 is enabled. Can be used by runtimes.
1364  if (LLVM_ENABLE_LIBXML2)
1365    list(APPEND LLVM_TOOLCHAIN_TOOLS llvm-mt)
1366  endif()
1367endif()
1368
1369macro(llvm_add_tool project name)
1370  cmake_parse_arguments(ARG "DEPENDS;GENERATE_DRIVER" "" "" ${ARGN})
1371  if( NOT LLVM_BUILD_TOOLS )
1372    set(EXCLUDE_FROM_ALL ON)
1373  endif()
1374  if(ARG_GENERATE_DRIVER
1375     AND LLVM_TOOL_LLVM_DRIVER_BUILD
1376     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)
1377    )
1378    generate_llvm_objects(${name} ${ARGN})
1379    add_custom_target(${name} DEPENDS llvm-driver)
1380  else()
1381    add_llvm_executable(${name} ${ARGN})
1382
1383    if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1384      if( LLVM_BUILD_TOOLS )
1385        get_target_export_arg(${name} LLVM export_to_llvmexports)
1386        install(TARGETS ${name}
1387                ${export_to_llvmexports}
1388                RUNTIME DESTINATION ${${project}_TOOLS_INSTALL_DIR}
1389                COMPONENT ${name})
1390
1391        if (NOT LLVM_ENABLE_IDE)
1392          add_llvm_install_targets(install-${name}
1393                                  DEPENDS ${name}
1394                                  COMPONENT ${name})
1395        endif()
1396      endif()
1397    endif()
1398    if( LLVM_BUILD_TOOLS )
1399      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
1400    endif()
1401    set_target_properties(${name} PROPERTIES FOLDER "Tools")
1402  endif()
1403endmacro(llvm_add_tool project name)
1404
1405macro(add_llvm_tool name)
1406  llvm_add_tool(LLVM ${ARGV})
1407endmacro()
1408
1409
1410macro(add_llvm_example name)
1411  if( NOT LLVM_BUILD_EXAMPLES )
1412    set(EXCLUDE_FROM_ALL ON)
1413  endif()
1414  add_llvm_executable(${name} ${ARGN})
1415  if( LLVM_BUILD_EXAMPLES )
1416    install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}")
1417  endif()
1418  set_target_properties(${name} PROPERTIES FOLDER "Examples")
1419endmacro(add_llvm_example name)
1420
1421macro(add_llvm_example_library name)
1422  if( NOT LLVM_BUILD_EXAMPLES )
1423    set(EXCLUDE_FROM_ALL ON)
1424    add_llvm_library(${name} BUILDTREE_ONLY ${ARGN})
1425  else()
1426    add_llvm_library(${name} ${ARGN})
1427  endif()
1428
1429  set_target_properties(${name} PROPERTIES FOLDER "Examples")
1430endmacro(add_llvm_example_library name)
1431
1432# This is a macro that is used to create targets for executables that are needed
1433# for development, but that are not intended to be installed by default.
1434macro(add_llvm_utility name)
1435  if ( NOT LLVM_BUILD_UTILS )
1436    set(EXCLUDE_FROM_ALL ON)
1437  endif()
1438
1439  add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
1440  set_target_properties(${name} PROPERTIES FOLDER "Utils")
1441  if ( ${name} IN_LIST LLVM_TOOLCHAIN_UTILITIES OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1442    if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS)
1443      get_target_export_arg(${name} LLVM export_to_llvmexports)
1444      install(TARGETS ${name}
1445              ${export_to_llvmexports}
1446              RUNTIME DESTINATION ${LLVM_UTILS_INSTALL_DIR}
1447              COMPONENT ${name})
1448
1449      if (NOT LLVM_ENABLE_IDE)
1450        add_llvm_install_targets(install-${name}
1451                                 DEPENDS ${name}
1452                                 COMPONENT ${name})
1453      endif()
1454      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
1455    elseif(LLVM_BUILD_UTILS)
1456      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
1457    endif()
1458  endif()
1459endmacro(add_llvm_utility name)
1460
1461macro(add_llvm_fuzzer name)
1462  cmake_parse_arguments(ARG "" "DUMMY_MAIN" "" ${ARGN})
1463  if( LLVM_LIB_FUZZING_ENGINE )
1464    set(LLVM_OPTIONAL_SOURCES ${ARG_DUMMY_MAIN})
1465    add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS})
1466    target_link_libraries(${name} PRIVATE ${LLVM_LIB_FUZZING_ENGINE})
1467    set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
1468  elseif( LLVM_USE_SANITIZE_COVERAGE )
1469    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
1470    set(LLVM_OPTIONAL_SOURCES ${ARG_DUMMY_MAIN})
1471    add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS})
1472    set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
1473  elseif( ARG_DUMMY_MAIN )
1474    add_llvm_executable(${name} ${ARG_DUMMY_MAIN} ${ARG_UNPARSED_ARGUMENTS})
1475    set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
1476  endif()
1477endmacro()
1478
1479macro(add_llvm_target target_name)
1480  include_directories(BEFORE
1481    ${CMAKE_CURRENT_BINARY_DIR}
1482    ${CMAKE_CURRENT_SOURCE_DIR})
1483  add_llvm_component_library(LLVM${target_name} ${ARGN})
1484  set( CURRENT_LLVM_TARGET LLVM${target_name} )
1485endmacro(add_llvm_target)
1486
1487function(canonicalize_tool_name name output)
1488  string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" nameStrip ${name})
1489  string(REPLACE "-" "_" nameUNDERSCORE ${nameStrip})
1490  string(TOUPPER ${nameUNDERSCORE} nameUPPER)
1491  set(${output} "${nameUPPER}" PARENT_SCOPE)
1492endfunction(canonicalize_tool_name)
1493
1494# Custom add_subdirectory wrapper
1495# Takes in a project name (i.e. LLVM), the subdirectory name, and an optional
1496# path if it differs from the name.
1497function(add_llvm_subdirectory project type name)
1498  set(add_llvm_external_dir "${ARGN}")
1499  if("${add_llvm_external_dir}" STREQUAL "")
1500    set(add_llvm_external_dir ${name})
1501  endif()
1502  canonicalize_tool_name(${name} nameUPPER)
1503  set(canonical_full_name ${project}_${type}_${nameUPPER})
1504  get_property(already_processed GLOBAL PROPERTY ${canonical_full_name}_PROCESSED)
1505  if(already_processed)
1506    return()
1507  endif()
1508  set_property(GLOBAL PROPERTY ${canonical_full_name}_PROCESSED YES)
1509
1510  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt)
1511    # Treat it as in-tree subproject.
1512    option(${canonical_full_name}_BUILD
1513           "Whether to build ${name} as part of ${project}" On)
1514    mark_as_advanced(${project}_${type}_${name}_BUILD)
1515    if(${canonical_full_name}_BUILD)
1516      add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir})
1517    endif()
1518  else()
1519    set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
1520      "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}"
1521      CACHE PATH "Path to ${name} source directory")
1522    set(${canonical_full_name}_BUILD_DEFAULT ON)
1523    if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR OR NOT EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
1524      set(${canonical_full_name}_BUILD_DEFAULT OFF)
1525    endif()
1526    if("${LLVM_EXTERNAL_${nameUPPER}_BUILD}" STREQUAL "OFF")
1527      set(${canonical_full_name}_BUILD_DEFAULT OFF)
1528    endif()
1529    option(${canonical_full_name}_BUILD
1530      "Whether to build ${name} as part of LLVM"
1531      ${${canonical_full_name}_BUILD_DEFAULT})
1532    if (${canonical_full_name}_BUILD)
1533      if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
1534        add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir})
1535      elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "")
1536        message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}")
1537      endif()
1538    endif()
1539  endif()
1540endfunction()
1541
1542# Add external project that may want to be built as part of llvm such as Clang,
1543# lld, and Polly. This adds two options. One for the source directory of the
1544# project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to
1545# enable or disable building it with everything else.
1546# Additional parameter can be specified as the name of directory.
1547macro(add_llvm_external_project name)
1548  add_llvm_subdirectory(LLVM TOOL ${name} ${ARGN})
1549endmacro()
1550
1551macro(add_llvm_tool_subdirectory name)
1552  add_llvm_external_project(${name})
1553endmacro(add_llvm_tool_subdirectory)
1554
1555macro(add_custom_linker_flags name)
1556  if (LLVM_${name}_LINKER_FLAGS)
1557    message(DEBUG "Applying ${LLVM_${name}_LINKER_FLAGS} to ${name}")
1558    target_link_options(${name} PRIVATE ${LLVM_${name}_LINKER_FLAGS})
1559  endif()
1560endmacro()
1561
1562function(get_project_name_from_src_var var output)
1563  string(REGEX MATCH "LLVM_EXTERNAL_(.*)_SOURCE_DIR"
1564         MACHED_TOOL "${var}")
1565  if(MACHED_TOOL)
1566    set(${output} ${CMAKE_MATCH_1} PARENT_SCOPE)
1567  else()
1568    set(${output} PARENT_SCOPE)
1569  endif()
1570endfunction()
1571
1572function(create_subdirectory_options project type)
1573  file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
1574  foreach(dir ${sub-dirs})
1575    if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
1576      canonicalize_tool_name(${dir} name)
1577      option(${project}_${type}_${name}_BUILD
1578           "Whether to build ${name} as part of ${project}" On)
1579      mark_as_advanced(${project}_${type}_${name}_BUILD)
1580    endif()
1581  endforeach()
1582endfunction(create_subdirectory_options)
1583
1584function(create_llvm_tool_options)
1585  create_subdirectory_options(LLVM TOOL)
1586endfunction(create_llvm_tool_options)
1587
1588function(llvm_add_implicit_projects project)
1589  set(list_of_implicit_subdirs "")
1590  file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
1591  foreach(dir ${sub-dirs})
1592    if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
1593      canonicalize_tool_name(${dir} name)
1594      # I don't like special casing things by order, but the llvm-driver ends up
1595      # linking the object libraries from all the tools that opt-in, so adding
1596      # it separately at the end is probably the simplest case.
1597      if("${name}" STREQUAL "LLVM_DRIVER")
1598        continue()
1599      endif()
1600      if (${project}_TOOL_${name}_BUILD)
1601        get_filename_component(fn "${dir}" NAME)
1602        list(APPEND list_of_implicit_subdirs "${fn}")
1603      endif()
1604    endif()
1605  endforeach()
1606
1607  foreach(external_proj ${list_of_implicit_subdirs})
1608    add_llvm_subdirectory(${project} TOOL "${external_proj}" ${ARGN})
1609  endforeach()
1610endfunction(llvm_add_implicit_projects)
1611
1612function(add_llvm_implicit_projects)
1613  llvm_add_implicit_projects(LLVM)
1614endfunction(add_llvm_implicit_projects)
1615
1616# Generic support for adding a unittest.
1617function(add_unittest test_suite test_name)
1618  if( NOT LLVM_BUILD_TESTS )
1619    set(EXCLUDE_FROM_ALL ON)
1620  endif()
1621
1622  if (SUPPORTS_VARIADIC_MACROS_FLAG)
1623    list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros")
1624  endif ()
1625  # Some parts of gtest rely on this GNU extension, don't warn on it.
1626  if(SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG)
1627    list(APPEND LLVM_COMPILE_FLAGS "-Wno-gnu-zero-variadic-macro-arguments")
1628  endif()
1629
1630  if (NOT DEFINED LLVM_REQUIRES_RTTI)
1631    set(LLVM_REQUIRES_RTTI OFF)
1632  endif()
1633
1634  list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream
1635  add_llvm_executable(${test_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN})
1636
1637  # The runtime benefits of LTO don't outweight the compile time costs for tests.
1638  if(LLVM_ENABLE_LTO)
1639    if((UNIX OR MINGW) AND LINKER_IS_LLD)
1640      set_property(TARGET ${test_name} APPEND_STRING PROPERTY
1641                    LINK_FLAGS " -Wl,--lto-O0")
1642    elseif(LINKER_IS_LLD_LINK)
1643      set_property(TARGET ${test_name} APPEND_STRING PROPERTY
1644                    LINK_FLAGS " /opt:lldlto=0")
1645    elseif(APPLE AND NOT uppercase_LLVM_ENABLE_LTO STREQUAL "THIN")
1646      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
1647                    LINK_FLAGS " -Wl,-mllvm,-O0")
1648    endif()
1649  endif()
1650
1651  target_link_options(${test_name} PRIVATE "${LLVM_UNITTEST_LINK_FLAGS}")
1652
1653  set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
1654  set_output_directory(${test_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})
1655  # libpthreads overrides some standard library symbols, so main
1656  # executable must be linked with it in order to provide consistent
1657  # API for all shared libaries loaded by this executable.
1658  target_link_libraries(${test_name} PRIVATE llvm_gtest_main llvm_gtest ${LLVM_PTHREAD_LIB})
1659
1660  add_dependencies(${test_suite} ${test_name})
1661  get_target_property(test_suite_folder ${test_suite} FOLDER)
1662  if (test_suite_folder)
1663    set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}")
1664  endif ()
1665endfunction()
1666
1667# Use for test binaries that call llvm::getInputFileDirectory(). Use of this
1668# is discouraged.
1669function(add_unittest_with_input_files test_suite test_name)
1670  set(LLVM_UNITTEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
1671  configure_file(
1672    ${LLVM_MAIN_SRC_DIR}/unittests/unittest.cfg.in
1673    ${CMAKE_CURRENT_BINARY_DIR}/llvm.srcdir.txt)
1674
1675  add_unittest(${test_suite} ${test_name} ${ARGN})
1676endfunction()
1677
1678# Generic support for adding a benchmark.
1679function(add_benchmark benchmark_name)
1680  if( NOT LLVM_BUILD_BENCHMARKS )
1681    set(EXCLUDE_FROM_ALL ON)
1682  endif()
1683
1684  add_llvm_executable(${benchmark_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN})
1685  set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
1686  set_output_directory(${benchmark_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})
1687  set_property(TARGET ${benchmark_name} PROPERTY FOLDER "Utils")
1688  target_link_libraries(${benchmark_name} PRIVATE benchmark)
1689endfunction()
1690
1691# This function canonicalize the CMake variables passed by names
1692# from CMake boolean to 0/1 suitable for passing into Python or C++,
1693# in place.
1694function(llvm_canonicalize_cmake_booleans)
1695  foreach(var ${ARGN})
1696    if(${var})
1697      set(${var} 1 PARENT_SCOPE)
1698    else()
1699      set(${var} 0 PARENT_SCOPE)
1700    endif()
1701  endforeach()
1702endfunction(llvm_canonicalize_cmake_booleans)
1703
1704macro(set_llvm_build_mode)
1705  # Configuration-time: See Unit/lit.site.cfg.in
1706  if (CMAKE_CFG_INTDIR STREQUAL ".")
1707    set(LLVM_BUILD_MODE ".")
1708  else ()
1709    set(LLVM_BUILD_MODE "%(build_mode)s")
1710  endif ()
1711endmacro()
1712
1713# Takes a list of path names in pathlist and a base directory, and returns
1714# a list of paths relative to the base directory in out_pathlist.
1715# Paths that are on a different drive than the basedir (on Windows) or that
1716# contain symlinks are returned absolute.
1717# Use with LLVM_LIT_PATH_FUNCTION below.
1718function(make_paths_relative out_pathlist basedir pathlist)
1719  # Passing ARG_PATH_VALUES as-is to execute_process() makes cmake strip
1720  # empty list entries. So escape the ;s in the list and do the splitting
1721  # ourselves. cmake has no relpath function, so use Python for that.
1722  string(REPLACE ";" "\\;" pathlist_escaped "${pathlist}")
1723  execute_process(COMMAND "${Python3_EXECUTABLE}" "-c" "\n
1724import os, sys\n
1725base = sys.argv[1]
1726def haslink(p):\n
1727    if not p or p == os.path.dirname(p): return False\n
1728    return os.path.islink(p) or haslink(os.path.dirname(p))\n
1729def relpath(p):\n
1730    if not p: return ''\n
1731    if os.path.splitdrive(p)[0] != os.path.splitdrive(base)[0]: return p\n
1732    if haslink(p) or haslink(base): return p\n
1733    return os.path.relpath(p, base)\n
1734if len(sys.argv) < 3: sys.exit(0)\n
1735sys.stdout.write(';'.join(relpath(p) for p in sys.argv[2].split(';')))"
1736    ${basedir}
1737    ${pathlist_escaped}
1738    OUTPUT_VARIABLE pathlist_relative
1739    ERROR_VARIABLE error
1740    RESULT_VARIABLE result)
1741  if (NOT result EQUAL 0)
1742    message(FATAL_ERROR "make_paths_relative() failed due to error '${result}', with stderr\n${error}")
1743  endif()
1744  set(${out_pathlist} "${pathlist_relative}" PARENT_SCOPE)
1745endfunction()
1746
1747# Converts a file that's relative to the current python file to an absolute
1748# path. Since this uses __file__, it has to be emitted into python files that
1749# use it and can't be in a lit module. Use with make_paths_relative().
1750string(CONCAT LLVM_LIT_PATH_FUNCTION
1751  "# Allow generated file to be relocatable.\n"
1752  "import os\n"
1753  "import platform\n"
1754  "def path(p):\n"
1755  "    if not p: return ''\n"
1756  "    # Follows lit.util.abs_path_preserve_drive, which cannot be imported here.\n"
1757  "    if platform.system() == 'Windows':\n"
1758  "        return os.path.abspath(os.path.join(os.path.dirname(__file__), p))\n"
1759  "    else:\n"
1760  "        return os.path.realpath(os.path.join(os.path.dirname(__file__), p))\n"
1761  )
1762
1763# This function provides an automatic way to 'configure'-like generate a file
1764# based on a set of common and custom variables, specifically targeting the
1765# variables needed for the 'lit.site.cfg' files. This function bundles the
1766# common variables that any Lit instance is likely to need, and custom
1767# variables can be passed in.
1768# The keyword PATHS is followed by a list of cmake variable names that are
1769# mentioned as `path("@varname@")` in the lit.cfg.py.in file. Variables in that
1770# list are treated as paths that are relative to the directory the generated
1771# lit.cfg.py file is in, and the `path()` function converts the relative
1772# path back to absolute form. This makes it possible to move a build directory
1773# containing lit.cfg.py files from one machine to another.
1774function(configure_lit_site_cfg site_in site_out)
1775  cmake_parse_arguments(ARG "" "" "MAIN_CONFIG;PATHS" ${ARGN})
1776
1777  if ("${ARG_MAIN_CONFIG}" STREQUAL "")
1778    get_filename_component(INPUT_DIR ${site_in} DIRECTORY)
1779    set(ARG_MAIN_CONFIG "${INPUT_DIR}/lit.cfg")
1780  endif()
1781
1782  foreach(c ${LLVM_TARGETS_TO_BUILD})
1783    set(TARGETS_BUILT "${TARGETS_BUILT} ${c}")
1784  endforeach(c)
1785  set(TARGETS_TO_BUILD ${TARGETS_BUILT})
1786
1787  set(SHLIBEXT "${LTDL_SHLIB_EXT}")
1788
1789  set_llvm_build_mode()
1790
1791  # For standalone builds of subprojects, these might not be the build tree but
1792  # a provided binary tree.
1793  set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR})
1794  set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR})
1795  string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}")
1796  string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" LLVM_LIBS_DIR  "${LLVM_LIBRARY_DIR}")
1797  # Like LLVM_{TOOLS,LIBS}_DIR, but pointing at the build tree.
1798  string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" CURRENT_TOOLS_DIR "${LLVM_RUNTIME_OUTPUT_INTDIR}")
1799  string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" CURRENT_LIBS_DIR  "${LLVM_LIBRARY_OUTPUT_INTDIR}")
1800  string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" SHLIBDIR "${LLVM_SHLIB_OUTPUT_INTDIR}")
1801
1802  # FIXME: "ENABLE_SHARED" doesn't make sense, since it is used just for
1803  # plugins. We may rename it.
1804  if(LLVM_ENABLE_PLUGINS)
1805    set(ENABLE_SHARED "1")
1806  else()
1807    set(ENABLE_SHARED "0")
1808  endif()
1809
1810  if(LLVM_ENABLE_ASSERTIONS)
1811    set(ENABLE_ASSERTIONS "1")
1812  else()
1813    set(ENABLE_ASSERTIONS "0")
1814  endif()
1815
1816  set(HOST_OS ${CMAKE_SYSTEM_NAME})
1817  set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR})
1818
1819  set(HOST_CC "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
1820  set(HOST_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}")
1821  set(HOST_LDFLAGS "${CMAKE_EXE_LINKER_FLAGS}")
1822
1823  string(CONCAT LIT_SITE_CFG_IN_HEADER
1824    "# Autogenerated from ${site_in}\n# Do not edit!\n\n"
1825    "${LLVM_LIT_PATH_FUNCTION}"
1826    )
1827
1828  # Override config_target_triple (and the env)
1829  if(LLVM_TARGET_TRIPLE_ENV)
1830    # This is expanded into the heading.
1831    string(CONCAT LIT_SITE_CFG_IN_HEADER "${LIT_SITE_CFG_IN_HEADER}"
1832      "import os\n"
1833      "target_env = \"${LLVM_TARGET_TRIPLE_ENV}\"\n"
1834      "config.target_triple = config.environment[target_env] = os.environ.get(target_env, \"${LLVM_TARGET_TRIPLE}\")\n"
1835      )
1836
1837    # This is expanded to; config.target_triple = ""+config.target_triple+""
1838    set(LLVM_TARGET_TRIPLE "\"+config.target_triple+\"")
1839  endif()
1840
1841  if (ARG_PATHS)
1842    # Walk ARG_PATHS and collect the current value of the variables in there.
1843    # list(APPEND) ignores empty elements exactly if the list is empty,
1844    # so start the list with a dummy element and drop it, to make sure that
1845    # even empty values make it into the values list.
1846    set(ARG_PATH_VALUES "dummy")
1847    foreach(path ${ARG_PATHS})
1848      list(APPEND ARG_PATH_VALUES "${${path}}")
1849    endforeach()
1850    list(REMOVE_AT ARG_PATH_VALUES 0)
1851
1852    get_filename_component(OUTPUT_DIR ${site_out} DIRECTORY)
1853    make_paths_relative(
1854        ARG_PATH_VALUES_RELATIVE "${OUTPUT_DIR}" "${ARG_PATH_VALUES}")
1855
1856    list(LENGTH ARG_PATHS len_paths)
1857    list(LENGTH ARG_PATH_VALUES len_path_values)
1858    list(LENGTH ARG_PATH_VALUES_RELATIVE len_path_value_rels)
1859    if ((NOT ${len_paths} EQUAL ${len_path_values}) OR
1860        (NOT ${len_paths} EQUAL ${len_path_value_rels}))
1861      message(SEND_ERROR "PATHS lengths got confused")
1862    endif()
1863
1864    # Transform variables mentioned in ARG_PATHS to relative paths for
1865    # the configure_file() call. Variables are copied to subscopeds by cmake,
1866    # so this only modifies the local copy of the variables.
1867    math(EXPR arg_path_limit "${len_paths} - 1")
1868    foreach(i RANGE ${arg_path_limit})
1869      list(GET ARG_PATHS ${i} val1)
1870      list(GET ARG_PATH_VALUES_RELATIVE ${i} val2)
1871      set(${val1} ${val2})
1872    endforeach()
1873  endif()
1874
1875  configure_file(${site_in} ${site_out} @ONLY)
1876
1877  if (EXISTS "${ARG_MAIN_CONFIG}")
1878    # Remember main config / generated site config for llvm-lit.in.
1879    get_property(LLVM_LIT_CONFIG_FILES GLOBAL PROPERTY LLVM_LIT_CONFIG_FILES)
1880    list(APPEND LLVM_LIT_CONFIG_FILES "${ARG_MAIN_CONFIG}" "${site_out}")
1881    set_property(GLOBAL PROPERTY LLVM_LIT_CONFIG_FILES ${LLVM_LIT_CONFIG_FILES})
1882  endif()
1883endfunction()
1884
1885function(dump_all_cmake_variables)
1886  get_cmake_property(_variableNames VARIABLES)
1887  foreach (_variableName ${_variableNames})
1888    message(STATUS "${_variableName}=${${_variableName}}")
1889  endforeach()
1890endfunction()
1891
1892function(get_llvm_lit_path base_dir file_name)
1893  cmake_parse_arguments(ARG "ALLOW_EXTERNAL" "" "" ${ARGN})
1894
1895  if (ARG_ALLOW_EXTERNAL)
1896    set (LLVM_EXTERNAL_LIT "" CACHE STRING "Command used to spawn lit")
1897    if ("${LLVM_EXTERNAL_LIT}" STREQUAL "")
1898      set(LLVM_EXTERNAL_LIT "${LLVM_DEFAULT_EXTERNAL_LIT}")
1899    endif()
1900
1901    if (NOT "${LLVM_EXTERNAL_LIT}" STREQUAL "")
1902      if (EXISTS ${LLVM_EXTERNAL_LIT})
1903        get_filename_component(LIT_FILE_NAME ${LLVM_EXTERNAL_LIT} NAME)
1904        get_filename_component(LIT_BASE_DIR ${LLVM_EXTERNAL_LIT} DIRECTORY)
1905        set(${file_name} ${LIT_FILE_NAME} PARENT_SCOPE)
1906        set(${base_dir} ${LIT_BASE_DIR} PARENT_SCOPE)
1907        return()
1908      elseif (NOT DEFINED CACHE{LLVM_EXTERNAL_LIT_MISSING_WARNED_ONCE})
1909        message(WARNING "LLVM_EXTERNAL_LIT set to ${LLVM_EXTERNAL_LIT}, but the path does not exist.")
1910        set(LLVM_EXTERNAL_LIT_MISSING_WARNED_ONCE YES CACHE INTERNAL "")
1911      endif()
1912    endif()
1913  endif()
1914
1915  set(lit_file_name "llvm-lit")
1916  if (CMAKE_HOST_WIN32 AND NOT CYGWIN)
1917    # llvm-lit needs suffix.py for multiprocess to find a main module.
1918    set(lit_file_name "${lit_file_name}.py")
1919  endif ()
1920  set(${file_name} ${lit_file_name} PARENT_SCOPE)
1921
1922  get_property(LLVM_LIT_BASE_DIR GLOBAL PROPERTY LLVM_LIT_BASE_DIR)
1923  if (NOT "${LLVM_LIT_BASE_DIR}" STREQUAL "")
1924    set(${base_dir} ${LLVM_LIT_BASE_DIR} PARENT_SCOPE)
1925  endif()
1926
1927  # Allow individual projects to provide an override
1928  if (NOT "${LLVM_LIT_OUTPUT_DIR}" STREQUAL "")
1929    set(LLVM_LIT_BASE_DIR ${LLVM_LIT_OUTPUT_DIR})
1930  elseif(NOT "${LLVM_RUNTIME_OUTPUT_INTDIR}" STREQUAL "")
1931    set(LLVM_LIT_BASE_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
1932  else()
1933    set(LLVM_LIT_BASE_DIR "")
1934  endif()
1935
1936  # Cache this so we don't have to do it again and have subsequent calls
1937  # potentially disagree on the value.
1938  set_property(GLOBAL PROPERTY LLVM_LIT_BASE_DIR ${LLVM_LIT_BASE_DIR})
1939  set(${base_dir} ${LLVM_LIT_BASE_DIR} PARENT_SCOPE)
1940endfunction()
1941
1942# A raw function to create a lit target. This is used to implement the testuite
1943# management functions.
1944function(add_lit_target target comment)
1945  cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
1946  set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}")
1947  separate_arguments(LIT_ARGS)
1948  if (NOT CMAKE_CFG_INTDIR STREQUAL ".")
1949    list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR})
1950  endif ()
1951
1952  # Get the path to the lit to *run* tests with.  This can be overriden by
1953  # the user by specifying -DLLVM_EXTERNAL_LIT=<path-to-lit.py>
1954  get_llvm_lit_path(
1955    lit_base_dir
1956    lit_file_name
1957    ALLOW_EXTERNAL
1958    )
1959
1960  set(LIT_COMMAND "${Python3_EXECUTABLE};${lit_base_dir}/${lit_file_name}")
1961  list(APPEND LIT_COMMAND ${LIT_ARGS})
1962  foreach(param ${ARG_PARAMS})
1963    list(APPEND LIT_COMMAND --param ${param})
1964  endforeach()
1965  if (ARG_UNPARSED_ARGUMENTS)
1966    add_custom_target(${target}
1967      COMMAND ${LIT_COMMAND} ${ARG_UNPARSED_ARGUMENTS}
1968      COMMENT "${comment}"
1969      USES_TERMINAL
1970      )
1971  else()
1972    add_custom_target(${target}
1973      COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.")
1974    message(STATUS "${target} does nothing.")
1975  endif()
1976
1977  if (ARG_DEPENDS)
1978    add_dependencies(${target} ${ARG_DEPENDS})
1979  endif()
1980
1981  # Tests should be excluded from "Build Solution".
1982  set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
1983endfunction()
1984
1985# Convert a target name like check-clang to a variable name like CLANG.
1986function(umbrella_lit_testsuite_var target outvar)
1987  if (NOT target MATCHES "^check-")
1988    message(FATAL_ERROR "umbrella lit suites must be check-*, not '${target}'")
1989  endif()
1990  string(SUBSTRING "${target}" 6 -1 var)
1991  string(REPLACE "-" "_" var ${var})
1992  string(TOUPPER "${var}" var)
1993  set(${outvar} "${var}" PARENT_SCOPE)
1994endfunction()
1995
1996# Start recording all lit test suites for a combined 'check-foo' target.
1997# The recording continues until umbrella_lit_testsuite_end() creates the target.
1998function(umbrella_lit_testsuite_begin target)
1999  umbrella_lit_testsuite_var(${target} name)
2000  set_property(GLOBAL APPEND PROPERTY LLVM_LIT_UMBRELLAS ${name})
2001endfunction()
2002
2003# Create a combined 'check-foo' target for a set of related test suites.
2004# It runs all suites added since the matching umbrella_lit_testsuite_end() call.
2005# Tests marked EXCLUDE_FROM_CHECK_ALL are not gathered.
2006function(umbrella_lit_testsuite_end target)
2007  umbrella_lit_testsuite_var(${target} name)
2008
2009  get_property(testsuites GLOBAL PROPERTY LLVM_${name}_LIT_TESTSUITES)
2010  get_property(params GLOBAL PROPERTY LLVM_${name}_LIT_PARAMS)
2011  get_property(depends GLOBAL PROPERTY LLVM_${name}_LIT_DEPENDS)
2012  get_property(extra_args GLOBAL PROPERTY LLVM_${name}_LIT_EXTRA_ARGS)
2013  # Additional test targets are not gathered, but may be set externally.
2014  get_property(additional_test_targets
2015               GLOBAL PROPERTY LLVM_${name}_ADDITIONAL_TEST_TARGETS)
2016
2017  string(TOLOWER ${name} name)
2018  add_lit_target(${target}
2019    "Running ${name} regression tests"
2020    ${testsuites}
2021    PARAMS ${params}
2022    DEPENDS ${depends} ${additional_test_targets}
2023    ARGS ${extra_args}
2024    )
2025endfunction()
2026
2027# A function to add a set of lit test suites to be driven through 'check-*' targets.
2028function(add_lit_testsuite target comment)
2029  cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
2030
2031  # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all.
2032  if(NOT ARG_EXCLUDE_FROM_CHECK_ALL)
2033    get_property(gather_names GLOBAL PROPERTY LLVM_LIT_UMBRELLAS)
2034    foreach(name ${gather_names})
2035    # Register the testsuites, params and depends for the umbrella check rule.
2036      set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS})
2037      set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_PARAMS ${ARG_PARAMS})
2038      set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_DEPENDS ${ARG_DEPENDS})
2039      set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_EXTRA_ARGS ${ARG_ARGS})
2040    endforeach()
2041  endif()
2042
2043  # Produce a specific suffixed check rule.
2044  add_lit_target(${target} ${comment}
2045    ${ARG_UNPARSED_ARGUMENTS}
2046    PARAMS ${ARG_PARAMS}
2047    DEPENDS ${ARG_DEPENDS}
2048    ARGS ${ARG_ARGS}
2049    )
2050endfunction()
2051
2052function(add_lit_testsuites project directory)
2053  if (NOT LLVM_ENABLE_IDE)
2054    cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "FOLDER" "PARAMS;DEPENDS;ARGS" ${ARGN})
2055
2056    if (NOT ARG_FOLDER)
2057      set(ARG_FOLDER "Test Subdirectories")
2058    endif()
2059
2060    # Search recursively for test directories by assuming anything not
2061    # in a directory called Inputs contains tests.
2062    file(GLOB_RECURSE to_process LIST_DIRECTORIES true ${directory}/*)
2063    foreach(lit_suite ${to_process})
2064      if(NOT IS_DIRECTORY ${lit_suite})
2065        continue()
2066      endif()
2067      string(FIND ${lit_suite} Inputs is_inputs)
2068      string(FIND ${lit_suite} Output is_output)
2069      if (NOT (is_inputs EQUAL -1 AND is_output EQUAL -1))
2070        continue()
2071      endif()
2072
2073      # Create a check- target for the directory.
2074      string(REPLACE ${directory} "" name_slash ${lit_suite})
2075      if (name_slash)
2076        string(REPLACE "/" "-" name_slash ${name_slash})
2077        string(REPLACE "\\" "-" name_dashes ${name_slash})
2078        string(TOLOWER "${project}${name_dashes}" name_var)
2079        add_lit_target("check-${name_var}" "Running lit suite ${lit_suite}"
2080          ${lit_suite}
2081          ${EXCLUDE_FROM_CHECK_ALL}
2082          PARAMS ${ARG_PARAMS}
2083          DEPENDS ${ARG_DEPENDS}
2084          ARGS ${ARG_ARGS}
2085        )
2086        set_target_properties(check-${name_var} PROPERTIES FOLDER ${ARG_FOLDER})
2087      endif()
2088    endforeach()
2089  endif()
2090endfunction()
2091
2092function(llvm_install_library_symlink name dest type)
2093  cmake_parse_arguments(ARG "" "COMPONENT;SOVERSION" "" ${ARGN})
2094  foreach(path ${CMAKE_MODULE_PATH})
2095    if(EXISTS ${path}/LLVMInstallSymlink.cmake)
2096      set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake)
2097      break()
2098    endif()
2099  endforeach()
2100
2101  set(component ${ARG_COMPONENT})
2102  if(NOT component)
2103    set(component ${name})
2104  endif()
2105
2106  set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX})
2107  if (ARG_SOVERSION)
2108    set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}.${ARG_SOVERSION})
2109  else()
2110    set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX})
2111  endif()
2112
2113  if(LLVM_USE_SYMLINKS)
2114    set(LLVM_LINK_OR_COPY create_symlink)
2115  else()
2116    set(LLVM_LINK_OR_COPY copy)
2117  endif()
2118
2119  set(output_dir lib${LLVM_LIBDIR_SUFFIX})
2120  if(WIN32 AND "${type}" STREQUAL "SHARED")
2121    set(output_dir "${CMAKE_INSTALL_BINDIR}")
2122  endif()
2123
2124  install(SCRIPT ${INSTALL_SYMLINK}
2125          CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\" \"${LLVM_LINK_OR_COPY}\")"
2126          COMPONENT ${component})
2127
2128endfunction()
2129
2130function(llvm_install_symlink project name dest)
2131  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
2132  if(LLVM_TOOL_LLVM_DRIVER_BUILD
2133     AND ${dest} IN_LIST LLVM_DRIVER_TOOLS
2134     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${dest} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)
2135    )
2136    return()
2137  endif()
2138  cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN})
2139  foreach(path ${CMAKE_MODULE_PATH})
2140    if(EXISTS ${path}/LLVMInstallSymlink.cmake)
2141      set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake)
2142      break()
2143    endif()
2144  endforeach()
2145
2146  if(ARG_COMPONENT)
2147    set(component ${ARG_COMPONENT})
2148  else()
2149    if(ARG_ALWAYS_GENERATE)
2150      set(component ${dest})
2151    else()
2152      set(component ${name})
2153    endif()
2154  endif()
2155
2156  set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX})
2157  set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX})
2158  if (${dest} STREQUAL "llvm-driver")
2159    set(full_dest llvm${CMAKE_EXECUTABLE_SUFFIX})
2160  endif()
2161
2162  if(LLVM_USE_SYMLINKS)
2163    set(LLVM_LINK_OR_COPY create_symlink)
2164  else()
2165    set(LLVM_LINK_OR_COPY copy)
2166  endif()
2167
2168  set(output_dir "${${project}_TOOLS_INSTALL_DIR}")
2169
2170  install(SCRIPT ${INSTALL_SYMLINK}
2171          CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\" \"${LLVM_LINK_OR_COPY}\")"
2172          COMPONENT ${component})
2173
2174  if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE)
2175    add_llvm_install_targets(install-${name}
2176                             DEPENDS ${name} ${dest}
2177                             COMPONENT ${component}
2178                             SYMLINK ${dest})
2179  endif()
2180endfunction()
2181
2182function(llvm_add_tool_symlink project link_name target)
2183  cmake_parse_arguments(ARG "ALWAYS_GENERATE" "OUTPUT_DIR" "" ${ARGN})
2184
2185  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
2186
2187  if (${target} IN_LIST LLVM_DRIVER_TOOLS)
2188    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${target} ${link_name})
2189  endif()
2190  set(dest_binary "$<TARGET_FILE:${target}>")
2191
2192  # This got a bit gross... For multi-configuration generators the target
2193  # properties return the resolved value of the string, not the build system
2194  # expression. To reconstruct the platform-agnostic path we have to do some
2195  # magic. First we grab one of the types, and a type-specific path. Then from
2196  # the type-specific path we find the last occurrence of the type in the path,
2197  # and replace it with CMAKE_CFG_INTDIR. This allows the build step to be type
2198  # agnostic again.
2199  if(NOT ARG_OUTPUT_DIR)
2200    # If you're not overriding the OUTPUT_DIR, we can make the link relative in
2201    # the same directory.
2202    if(LLVM_USE_SYMLINKS)
2203      set(dest_binary "$<TARGET_FILE_NAME:${target}>")
2204    endif()
2205    if(CMAKE_CONFIGURATION_TYPES)
2206      list(GET CMAKE_CONFIGURATION_TYPES 0 first_type)
2207      string(TOUPPER ${first_type} first_type_upper)
2208      set(first_type_suffix _${first_type_upper})
2209    endif()
2210    get_target_property(target_type ${target} TYPE)
2211    if(${target_type} STREQUAL "STATIC_LIBRARY")
2212      get_target_property(ARG_OUTPUT_DIR ${target} ARCHIVE_OUTPUT_DIRECTORY${first_type_suffix})
2213    elseif(UNIX AND ${target_type} STREQUAL "SHARED_LIBRARY")
2214      get_target_property(ARG_OUTPUT_DIR ${target} LIBRARY_OUTPUT_DIRECTORY${first_type_suffix})
2215    else()
2216      get_target_property(ARG_OUTPUT_DIR ${target} RUNTIME_OUTPUT_DIRECTORY${first_type_suffix})
2217    endif()
2218    if(CMAKE_CONFIGURATION_TYPES)
2219      string(FIND "${ARG_OUTPUT_DIR}" "/${first_type}/" type_start REVERSE)
2220      string(SUBSTRING "${ARG_OUTPUT_DIR}" 0 ${type_start} path_prefix)
2221      string(SUBSTRING "${ARG_OUTPUT_DIR}" ${type_start} -1 path_suffix)
2222      string(REPLACE "/${first_type}/" "/${CMAKE_CFG_INTDIR}/"
2223             path_suffix ${path_suffix})
2224      set(ARG_OUTPUT_DIR ${path_prefix}${path_suffix})
2225    endif()
2226  endif()
2227
2228  if(LLVM_USE_SYMLINKS)
2229    set(LLVM_LINK_OR_COPY create_symlink)
2230  else()
2231    set(LLVM_LINK_OR_COPY copy)
2232  endif()
2233
2234  set(output_path "${ARG_OUTPUT_DIR}/${link_name}${CMAKE_EXECUTABLE_SUFFIX}")
2235
2236  set(target_name ${link_name})
2237  if(TARGET ${link_name})
2238    set(target_name ${link_name}-link)
2239  endif()
2240
2241
2242  if(ARG_ALWAYS_GENERATE)
2243    set_property(DIRECTORY APPEND PROPERTY
2244      ADDITIONAL_MAKE_CLEAN_FILES ${dest_binary})
2245    add_custom_command(TARGET ${target} POST_BUILD
2246      COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}")
2247  else()
2248    add_custom_command(OUTPUT ${output_path}
2249                     COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}"
2250                     DEPENDS ${target})
2251
2252    # TODO: Make use of generator expressions below once CMake 3.19 or higher is the minimum supported version.
2253    set(should_build_all)
2254    get_target_property(target_excluded_from_all ${target} EXCLUDE_FROM_ALL)
2255    if (NOT target_excluded_from_all)
2256      set(should_build_all ALL)
2257    endif()
2258    add_custom_target(${target_name} ${should_build_all} DEPENDS ${target} ${output_path})
2259    set_target_properties(${target_name} PROPERTIES FOLDER Tools)
2260
2261    # Make sure both the link and target are toolchain tools
2262    if (${link_name} IN_LIST LLVM_TOOLCHAIN_TOOLS AND ${target} IN_LIST LLVM_TOOLCHAIN_TOOLS)
2263      set(TOOL_IS_TOOLCHAIN ON)
2264    endif()
2265
2266    if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS)
2267      llvm_install_symlink("${project}" ${link_name} ${target})
2268    endif()
2269  endif()
2270endfunction()
2271
2272function(add_llvm_tool_symlink link_name target)
2273  llvm_add_tool_symlink(LLVM ${ARGV})
2274endfunction()
2275
2276function(llvm_externalize_debuginfo name)
2277  if(NOT LLVM_EXTERNALIZE_DEBUGINFO)
2278    return()
2279  endif()
2280
2281  if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP)
2282    if(APPLE)
2283      if(NOT CMAKE_STRIP)
2284        set(CMAKE_STRIP xcrun strip)
2285      endif()
2286      set(strip_command COMMAND ${CMAKE_STRIP} -S -x $<TARGET_FILE:${name}>)
2287    else()
2288      set(strip_command COMMAND ${CMAKE_STRIP} -g -x $<TARGET_FILE:${name}>)
2289    endif()
2290  endif()
2291
2292  if(APPLE)
2293    if(LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION)
2294      set(file_ext ${LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION})
2295    else()
2296      set(file_ext dSYM)
2297    endif()
2298
2299    set(output_name "$<TARGET_FILE_NAME:${name}>.${file_ext}")
2300
2301    if(LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR)
2302      set(output_path "-o=${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}/${output_name}")
2303    else()
2304      set(output_path "-o=${output_name}")
2305    endif()
2306
2307    if(CMAKE_CXX_FLAGS MATCHES "-flto"
2308      OR CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} MATCHES "-flto")
2309
2310      set(lto_object ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${name}-lto.o)
2311      set_property(TARGET ${name} APPEND_STRING PROPERTY
2312        LINK_FLAGS " -Wl,-object_path_lto,${lto_object}")
2313    endif()
2314    if(NOT CMAKE_DSYMUTIL)
2315      set(CMAKE_DSYMUTIL xcrun dsymutil)
2316    endif()
2317    add_custom_command(TARGET ${name} POST_BUILD
2318      COMMAND ${CMAKE_DSYMUTIL} ${output_path} $<TARGET_FILE:${name}>
2319      ${strip_command}
2320      )
2321  else()
2322    add_custom_command(TARGET ${name} POST_BUILD
2323      COMMAND ${CMAKE_OBJCOPY} --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug
2324      ${strip_command} -R .gnu_debuglink
2325      COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}>
2326      )
2327  endif()
2328endfunction()
2329
2330# Usage: llvm_codesign(name [FORCE] [ENTITLEMENTS file] [BUNDLE_PATH path])
2331function(llvm_codesign name)
2332  cmake_parse_arguments(ARG "FORCE" "ENTITLEMENTS;BUNDLE_PATH" "" ${ARGN})
2333
2334  if(NOT LLVM_CODESIGNING_IDENTITY)
2335    return()
2336  endif()
2337
2338  if(CMAKE_GENERATOR STREQUAL "Xcode")
2339    set_target_properties(${name} PROPERTIES
2340      XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${LLVM_CODESIGNING_IDENTITY}
2341    )
2342    if(DEFINED ARG_ENTITLEMENTS)
2343      set_target_properties(${name} PROPERTIES
2344        XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${ARG_ENTITLEMENTS}
2345      )
2346    endif()
2347  elseif(APPLE AND CMAKE_HOST_SYSTEM_NAME MATCHES Darwin)
2348    if(NOT CMAKE_CODESIGN)
2349      set(CMAKE_CODESIGN xcrun codesign)
2350    endif()
2351    if(NOT CMAKE_CODESIGN_ALLOCATE)
2352      execute_process(
2353        COMMAND xcrun -f codesign_allocate
2354        OUTPUT_STRIP_TRAILING_WHITESPACE
2355        OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE
2356      )
2357    endif()
2358    if(DEFINED ARG_ENTITLEMENTS)
2359      set(pass_entitlements --entitlements ${ARG_ENTITLEMENTS})
2360    endif()
2361
2362    if (NOT ARG_BUNDLE_PATH)
2363      set(ARG_BUNDLE_PATH $<TARGET_FILE:${name}>)
2364    endif()
2365
2366    # ld64 now always codesigns the binaries it creates. Apply the force arg
2367    # unconditionally so that we can - for example - add entitlements to the
2368    # targets that need it.
2369    set(force_flag "-f")
2370
2371    add_custom_command(
2372      TARGET ${name} POST_BUILD
2373      COMMAND ${CMAKE_COMMAND} -E
2374              env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE}
2375              ${CMAKE_CODESIGN} -s ${LLVM_CODESIGNING_IDENTITY}
2376              ${pass_entitlements} ${force_flag} ${ARG_BUNDLE_PATH}
2377    )
2378  endif()
2379endfunction()
2380
2381function(llvm_setup_rpath name)
2382  if(CMAKE_INSTALL_RPATH)
2383    return()
2384  endif()
2385
2386  if(LLVM_INSTALL_PREFIX AND NOT (LLVM_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX))
2387    set(extra_libdir ${LLVM_LIBRARY_DIR})
2388  elseif(LLVM_BUILD_LIBRARY_DIR)
2389    set(extra_libdir ${LLVM_LIBRARY_DIR})
2390  endif()
2391
2392  if (APPLE)
2393    set(_install_name_dir INSTALL_NAME_DIR "@rpath")
2394    set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
2395  elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS)
2396    # $ORIGIN is not interpreted at link time by aix ld.
2397    # Since BUILD_SHARED_LIBS is only recommended for use by developers,
2398    # hardcode the rpath to build/install lib dir first in this mode.
2399    # FIXME: update this when there is better solution.
2400    set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
2401  elseif(UNIX)
2402    set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
2403    set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}")
2404    if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
2405      set_property(TARGET ${name} APPEND_STRING PROPERTY
2406                   LINK_FLAGS " -Wl,-z,origin ")
2407    endif()
2408    if(LLVM_LINKER_IS_GNULD AND NOT ${LLVM_LIBRARY_OUTPUT_INTDIR} STREQUAL "")
2409      # $ORIGIN is not interpreted at link time by ld.bfd
2410      set_property(TARGET ${name} APPEND_STRING PROPERTY
2411                   LINK_FLAGS " -Wl,-rpath-link,${LLVM_LIBRARY_OUTPUT_INTDIR} ")
2412    endif()
2413  else()
2414    return()
2415  endif()
2416
2417  # Enable BUILD_WITH_INSTALL_RPATH unless CMAKE_BUILD_RPATH is set and not
2418  # building for macOS or AIX, as those platforms seemingly require it.
2419  # On AIX, the tool chain doesn't support modifying rpaths/libpaths for XCOFF
2420  # on install at the moment, so BUILD_WITH_INSTALL_RPATH is required.
2421  if("${CMAKE_BUILD_RPATH}" STREQUAL "")
2422    if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin|AIX")
2423      set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON)
2424    else()
2425      set_property(TARGET ${name} APPEND PROPERTY BUILD_RPATH "${_build_rpath}")
2426    endif()
2427  endif()
2428
2429  set_target_properties(${name} PROPERTIES
2430                        INSTALL_RPATH "${_install_rpath}"
2431                        ${_install_name_dir})
2432endfunction()
2433
2434function(setup_dependency_debugging name)
2435  if(NOT LLVM_DEPENDENCY_DEBUGGING)
2436    return()
2437  endif()
2438
2439  if("intrinsics_gen" IN_LIST ARGN)
2440    return()
2441  endif()
2442
2443  set(deny_attributes_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Attributes.inc\"))")
2444  set(deny_intrinsics_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Intrinsics.inc\"))")
2445
2446  set(sandbox_command "sandbox-exec -p '(version 1) (allow default) ${deny_attributes_inc} ${deny_intrinsics_inc}'")
2447  set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command})
2448endfunction()
2449
2450# If the sources at the given `path` are under version control, set `out_var`
2451# to the the path of a file which will be modified when the VCS revision
2452# changes, attempting to create that file if it does not exist; if no such
2453# file exists and one cannot be created, instead set `out_var` to the
2454# empty string.
2455#
2456# If the sources are not under version control, do not define `out_var`.
2457function(find_first_existing_vc_file path out_var)
2458  if(NOT EXISTS "${path}")
2459    return()
2460  endif()
2461  find_package(Git)
2462  if(GIT_FOUND)
2463    execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir
2464      WORKING_DIRECTORY ${path}
2465      RESULT_VARIABLE git_result
2466      OUTPUT_VARIABLE git_output
2467      ERROR_QUIET)
2468    if(git_result EQUAL 0)
2469      string(STRIP "${git_output}" git_output)
2470      get_filename_component(git_dir ${git_output} ABSOLUTE BASE_DIR ${path})
2471      # Some branchless cases (e.g. 'repo') may not yet have .git/logs/HEAD
2472      if (NOT EXISTS "${git_dir}/logs/HEAD")
2473        execute_process(COMMAND ${CMAKE_COMMAND} -E touch HEAD
2474          WORKING_DIRECTORY "${git_dir}/logs"
2475          RESULT_VARIABLE touch_head_result
2476          ERROR_QUIET)
2477        if (NOT touch_head_result EQUAL 0)
2478          set(${out_var} "" PARENT_SCOPE)
2479          return()
2480        endif()
2481      endif()
2482      set(${out_var} "${git_dir}/logs/HEAD" PARENT_SCOPE)
2483    endif()
2484  endif()
2485endfunction()
2486
2487function(get_host_tool_path tool_name setting_name exe_var_name target_var_name)
2488  set(${setting_name}_DEFAULT "")
2489
2490  if(LLVM_NATIVE_TOOL_DIR)
2491    if(EXISTS "${LLVM_NATIVE_TOOL_DIR}/${tool_name}${LLVM_HOST_EXECUTABLE_SUFFIX}")
2492      set(${setting_name}_DEFAULT "${LLVM_NATIVE_TOOL_DIR}/${tool_name}${LLVM_HOST_EXECUTABLE_SUFFIX}")
2493    endif()
2494  endif()
2495
2496  set(${setting_name} "${${setting_name}_DEFAULT}" CACHE
2497    STRING "Host ${tool_name} executable. Saves building if cross-compiling.")
2498
2499  if(${setting_name})
2500    set(exe_name ${${setting_name}})
2501    set(target_name "")
2502  elseif(LLVM_USE_HOST_TOOLS)
2503    get_native_tool_path(${tool_name} exe_name)
2504    set(target_name ${exe_name})
2505  else()
2506    set(exe_name $<TARGET_FILE:${tool_name}>)
2507    set(target_name ${tool_name})
2508  endif()
2509  set(${exe_var_name} "${exe_name}" CACHE STRING "")
2510  set(${target_var_name} "${target_name}" CACHE STRING "")
2511endfunction()
2512
2513function(setup_host_tool tool_name setting_name exe_var_name target_var_name)
2514  get_host_tool_path(${tool_name} ${setting_name} ${exe_var_name} ${target_var_name})
2515  # Set up a native tool build if necessary
2516  if(LLVM_USE_HOST_TOOLS AND NOT ${setting_name})
2517    build_native_tool(${tool_name} exe_name DEPENDS ${tool_name})
2518    add_custom_target(${target_var_name} DEPENDS ${exe_name})
2519  endif()
2520endfunction()
2521