Clang] Fix expansion of response files in -Wp after integrated-cc1 change
[llvm-project.git] / llvm / cmake / modules / HandleLLVMOptions.cmake
blobd519a7e8e9f0997ea5b43465d11d5944bd4ea8e5
1 # This CMake module is responsible for interpreting the user defined LLVM_
2 # options and executing the appropriate CMake commands to realize the users'
3 # selections.
5 # This is commonly needed so make sure it's defined before we include anything
6 # else.
7 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
9 include(CheckCompilerVersion)
10 include(HandleLLVMStdlib)
11 include(CheckCCompilerFlag)
12 include(CheckCXXCompilerFlag)
13 include(CheckSymbolExists)
15 if(CMAKE_LINKER MATCHES "lld-link" OR (WIN32 AND LLVM_USE_LINKER STREQUAL "lld") OR LLVM_ENABLE_LLD)
16   set(LINKER_IS_LLD_LINK TRUE)
17 else()
18   set(LINKER_IS_LLD_LINK FALSE)
19 endif()
21 set(LLVM_ENABLE_LTO OFF CACHE STRING "Build LLVM with LTO. May be specified as Thin or Full to use a particular kind of LTO")
22 string(TOUPPER "${LLVM_ENABLE_LTO}" uppercase_LLVM_ENABLE_LTO)
24 # Ninja Job Pool support
25 # The following only works with the Ninja generator in CMake >= 3.0.
26 set(LLVM_PARALLEL_COMPILE_JOBS "" CACHE STRING
27   "Define the maximum number of concurrent compilation jobs (Ninja only).")
28 if(LLVM_PARALLEL_COMPILE_JOBS)
29   if(NOT CMAKE_MAKE_PROGRAM MATCHES "ninja")
30     message(WARNING "Job pooling is only available with Ninja generators.")
31   else()
32     set_property(GLOBAL APPEND PROPERTY JOB_POOLS compile_job_pool=${LLVM_PARALLEL_COMPILE_JOBS})
33     set(CMAKE_JOB_POOL_COMPILE compile_job_pool)
34   endif()
35 endif()
37 set(LLVM_PARALLEL_LINK_JOBS "" CACHE STRING
38   "Define the maximum number of concurrent link jobs (Ninja only).")
39 if(CMAKE_MAKE_PROGRAM MATCHES "ninja")
40   if(NOT LLVM_PARALLEL_LINK_JOBS AND uppercase_LLVM_ENABLE_LTO STREQUAL "THIN")
41     message(STATUS "ThinLTO provides its own parallel linking - limiting parallel link jobs to 2.")
42     set(LLVM_PARALLEL_LINK_JOBS "2")
43   endif()
44   if(LLVM_PARALLEL_LINK_JOBS)
45     set_property(GLOBAL APPEND PROPERTY JOB_POOLS link_job_pool=${LLVM_PARALLEL_LINK_JOBS})
46     set(CMAKE_JOB_POOL_LINK link_job_pool)
47   endif()
48 elseif(LLVM_PARALLEL_LINK_JOBS)
49   message(WARNING "Job pooling is only available with Ninja generators.")
50 endif()
52 if( LLVM_ENABLE_ASSERTIONS )
53   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
54   if( NOT MSVC )
55     add_definitions( -D_DEBUG )
56   endif()
57   # On non-Debug builds cmake automatically defines NDEBUG, so we
58   # explicitly undefine it:
59   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
60     add_definitions( -UNDEBUG )
61     # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines.
62     foreach (flags_var_to_scrub
63         CMAKE_CXX_FLAGS_RELEASE
64         CMAKE_CXX_FLAGS_RELWITHDEBINFO
65         CMAKE_CXX_FLAGS_MINSIZEREL
66         CMAKE_C_FLAGS_RELEASE
67         CMAKE_C_FLAGS_RELWITHDEBINFO
68         CMAKE_C_FLAGS_MINSIZEREL)
69       string (REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " "
70         "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
71     endforeach()
72   endif()
73 endif()
75 if(LLVM_ENABLE_EXPENSIVE_CHECKS)
76   add_definitions(-DEXPENSIVE_CHECKS)
77   add_definitions(-D_GLIBCXX_DEBUG)
78 endif()
80 string(TOUPPER "${LLVM_ABI_BREAKING_CHECKS}" uppercase_LLVM_ABI_BREAKING_CHECKS)
82 if( uppercase_LLVM_ABI_BREAKING_CHECKS STREQUAL "WITH_ASSERTS" )
83   if( LLVM_ENABLE_ASSERTIONS )
84     set( LLVM_ENABLE_ABI_BREAKING_CHECKS 1 )
85   endif()
86 elseif( uppercase_LLVM_ABI_BREAKING_CHECKS STREQUAL "FORCE_ON" )
87   set( LLVM_ENABLE_ABI_BREAKING_CHECKS 1 )
88 elseif( uppercase_LLVM_ABI_BREAKING_CHECKS STREQUAL "FORCE_OFF" )
89   # We don't need to do anything special to turn off ABI breaking checks.
90 elseif( NOT DEFINED LLVM_ABI_BREAKING_CHECKS )
91   # Treat LLVM_ABI_BREAKING_CHECKS like "FORCE_OFF" when it has not been
92   # defined.
93 else()
94   message(FATAL_ERROR "Unknown value for LLVM_ABI_BREAKING_CHECKS: \"${LLVM_ABI_BREAKING_CHECKS}\"!")
95 endif()
97 if( LLVM_REVERSE_ITERATION )
98   set( LLVM_ENABLE_REVERSE_ITERATION 1 )
99 endif()
101 if(WIN32)
102   set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
103   if(CYGWIN)
104     set(LLVM_ON_WIN32 0)
105     set(LLVM_ON_UNIX 1)
106   else(CYGWIN)
107     set(LLVM_ON_WIN32 1)
108     set(LLVM_ON_UNIX 0)
109   endif(CYGWIN)
110 else(WIN32)
111   if(FUCHSIA OR UNIX)
112     set(LLVM_ON_WIN32 0)
113     set(LLVM_ON_UNIX 1)
114     if(APPLE OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
115       set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
116     else()
117       set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
118     endif()
119   else(FUCHSIA OR UNIX)
120     MESSAGE(SEND_ERROR "Unable to determine platform")
121   endif(FUCHSIA OR UNIX)
122 endif(WIN32)
124 set(EXEEXT ${CMAKE_EXECUTABLE_SUFFIX})
125 set(LTDL_SHLIB_EXT ${CMAKE_SHARED_LIBRARY_SUFFIX})
127 # We use *.dylib rather than *.so on darwin.
128 set(LLVM_PLUGIN_EXT ${CMAKE_SHARED_LIBRARY_SUFFIX})
130 if(APPLE)
131   if(LLVM_ENABLE_LLD AND LLVM_ENABLE_LTO)
132     message(FATAL_ERROR "lld does not support LTO on Darwin")
133   endif()
134   # Darwin-specific linker flags for loadable modules.
135   set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
136 endif()
138 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
139   # RHEL7 has ar and ranlib being non-deterministic by default. The D flag forces determinism,
140   # however only GNU version of ar and ranlib (2.27) have this option. 
141   # RHEL DTS7 is also affected by this, which uses GNU binutils 2.28
142   execute_process(COMMAND ${CMAKE_AR} rD t.a
143                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR} RESULT_VARIABLE AR_RESULT OUTPUT_VARIABLE RANLIB_OUTPUT)
144   if(${AR_RESULT} EQUAL 0)
145     execute_process(COMMAND ${CMAKE_RANLIB} -D t.a
146                     WORKING_DIRECTORY ${CMAKE_BINARY_DIR} RESULT_VARIABLE RANLIB_RESULT OUTPUT_VARIABLE RANLIB_OUTPUT)
147     if(${RANLIB_RESULT} EQUAL 0)
148       set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Dqc <TARGET> <LINK_FLAGS> <OBJECTS>")
149       set(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> Dq  <TARGET> <LINK_FLAGS> <OBJECTS>")
150       set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
152       set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Dqc <TARGET> <LINK_FLAGS> <OBJECTS>")
153       set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> Dq  <TARGET> <LINK_FLAGS> <OBJECTS>")
154       set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
155     endif()
156     file(REMOVE ${CMAKE_BINARY_DIR}/t.a)
157   endif()
158 endif()
160 if(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
161   if(NOT LLVM_BUILD_32_BITS)
162     if (CMAKE_CXX_COMPILER_ID MATCHES "XL")
163       append("-q64" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
164     else()
165       append("-maix64" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
166     endif()
167     set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -X64 qc <TARGET> <LINK_FLAGS> <OBJECTS>")
168     set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> -X64 q  <TARGET> <LINK_FLAGS> <OBJECTS>")
169     set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -X64 <TARGET>")
170     set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -X64 <TARGET>")
171   endif()
172   # -fPIC does not enable the large code model for GCC on AIX but does for XL.
173   if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
174     append("-mcmodel=large" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
175   elseif(CMAKE_CXX_COMPILER_ID MATCHES "XL")
176     # XL generates a small number of relocations not of the large model, -bbigtoc is needed.
177     append("-Wl,-bbigtoc"
178            CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
179   endif()
180 endif()
182 # Pass -Wl,-z,defs. This makes sure all symbols are defined. Otherwise a DSO
183 # build might work on ELF but fail on MachO/COFF.
184 if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin|FreeBSD|OpenBSD|DragonFly|AIX|SunOS" OR
185         WIN32 OR CYGWIN) AND
186    NOT LLVM_USE_SANITIZER)
187   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs")
188 endif()
190 # Pass -Wl,-z,nodelete. This makes sure our shared libraries are not unloaded
191 # by dlclose(). We need that since the CLI API relies on cross-references
192 # between global objects which became horribly broken when one of the libraries
193 # is unloaded.
194 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
195   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,nodelete")
196   set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,nodelete")
197 endif()
200 function(append value)
201   foreach(variable ${ARGN})
202     set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
203   endforeach(variable)
204 endfunction()
206 function(append_if condition value)
207   if (${condition})
208     foreach(variable ${ARGN})
209       set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
210     endforeach(variable)
211   endif()
212 endfunction()
214 macro(add_flag_if_supported flag name)
215   check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}")
216   append_if("C_SUPPORTS_${name}" "${flag}" CMAKE_C_FLAGS)
217   check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}")
218   append_if("CXX_SUPPORTS_${name}" "${flag}" CMAKE_CXX_FLAGS)
219 endmacro()
221 function(add_flag_or_print_warning flag name)
222   check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}")
223   check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}")
224   if (C_SUPPORTS_${name} AND CXX_SUPPORTS_${name})
225     message(STATUS "Building with ${flag}")
226     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE)
227     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE)
228     set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${flag}" PARENT_SCOPE)
229   else()
230     message(WARNING "${flag} is not supported.")
231   endif()
232 endfunction()
234 if( LLVM_ENABLE_LLD )
235   if ( LLVM_USE_LINKER )
236     message(FATAL_ERROR "LLVM_ENABLE_LLD and LLVM_USE_LINKER can't be set at the same time")
237   endif()
238   set(LLVM_USE_LINKER "lld")
239 endif()
241 if( LLVM_USE_LINKER )
242   set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
243   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fuse-ld=${LLVM_USE_LINKER}")
244   check_cxx_source_compiles("int main() { return 0; }" CXX_SUPPORTS_CUSTOM_LINKER)
245   if ( NOT CXX_SUPPORTS_CUSTOM_LINKER )
246     message(FATAL_ERROR "Host compiler does not support '-fuse-ld=${LLVM_USE_LINKER}'")
247   endif()
248   set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
249   append("-fuse-ld=${LLVM_USE_LINKER}"
250     CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
251 endif()
253 if( LLVM_ENABLE_PIC )
254   if( XCODE )
255     # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
256     # know how to disable this, so just force ENABLE_PIC off for now.
257     message(WARNING "-fPIC not supported with Xcode.")
258   elseif( WIN32 OR CYGWIN)
259     # On Windows all code is PIC. MinGW warns if -fPIC is used.
260   else()
261     add_flag_or_print_warning("-fPIC" FPIC)
262   endif()
263   # GCC for MIPS can miscompile LLVM due to PR37701.
264   if(CMAKE_COMPILER_IS_GNUCXX AND LLVM_NATIVE_ARCH STREQUAL "Mips" AND
265          NOT Uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
266     add_flag_or_print_warning("-fno-shrink-wrap" FNO_SHRINK_WRAP)
267   endif()
268 endif()
270 if(NOT WIN32 AND NOT CYGWIN AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
271   # MinGW warns if -fvisibility-inlines-hidden is used.
272   # GCC on AIX warns if -fvisibility-inlines-hidden is used.
273   check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG)
274   append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility-inlines-hidden" CMAKE_CXX_FLAGS)
275 endif()
277 if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MINGW)
278   add_definitions( -D_FILE_OFFSET_BITS=64 )
279 endif()
281 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
282   # TODO: support other platforms and toolchains.
283   if( LLVM_BUILD_32_BITS )
284     message(STATUS "Building 32 bits executables and libraries.")
285     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
286     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
287     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
288     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32")
289     set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -m32")
291     # FIXME: CMAKE_SIZEOF_VOID_P is still 8
292     add_definitions(-D_LARGEFILE_SOURCE)
293     add_definitions(-D_FILE_OFFSET_BITS=64)
294   endif( LLVM_BUILD_32_BITS )
295 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
297 # If building on a GNU specific 32-bit system, make sure off_t is 64 bits
298 # so that off_t can stored offset > 2GB.
299 # Android until version N (API 24) doesn't support it.
300 if (ANDROID AND (ANDROID_NATIVE_API_LEVEL LESS 24))
301   set(LLVM_FORCE_SMALLFILE_FOR_ANDROID TRUE)
302 endif()
303 if( CMAKE_SIZEOF_VOID_P EQUAL 4 AND NOT LLVM_FORCE_SMALLFILE_FOR_ANDROID)
304   # FIXME: It isn't handled in LLVM_BUILD_32_BITS.
305   add_definitions( -D_LARGEFILE_SOURCE )
306   add_definitions( -D_FILE_OFFSET_BITS=64 )
307 endif()
309 if( XCODE )
310   # For Xcode enable several build settings that correspond to
311   # many warnings that are on by default in Clang but are
312   # not enabled for historical reasons.  For versions of Xcode
313   # that do not support these options they will simply
314   # be ignored.
315   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_RETURN_TYPE "YES")
316   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_NEWLINE "YES")
317   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VALUE "YES")
318   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VARIABLE "YES")
319   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SIGN_COMPARE "YES")
320   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_FUNCTION "YES")
321   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED "YES")
322   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS "YES")
323   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNINITIALIZED_AUTOS "YES")
324   set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_BOOL_CONVERSION "YES")
325   set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_EMPTY_BODY "YES")
326   set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_ENUM_CONVERSION "YES")
327   set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_INT_CONVERSION "YES")
328   set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_CONSTANT_CONVERSION "YES")
329   set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_NON_VIRTUAL_DESTRUCTOR "YES")
330 endif()
332 # On Win32 using MS tools, provide an option to set the number of parallel jobs
333 # to use.
334 if( MSVC_IDE )
335   set(LLVM_COMPILER_JOBS "0" CACHE STRING
336     "Number of parallel compiler jobs. 0 means use all processors. Default is 0.")
337   if( NOT LLVM_COMPILER_JOBS STREQUAL "1" )
338     if( LLVM_COMPILER_JOBS STREQUAL "0" )
339       add_definitions( /MP )
340     else()
341       message(STATUS "Number of parallel compiler jobs set to " ${LLVM_COMPILER_JOBS})
342       add_definitions( /MP${LLVM_COMPILER_JOBS} )
343     endif()
344   else()
345     message(STATUS "Parallel compilation disabled")
346   endif()
347 endif()
349 # set stack reserved size to ~10MB
350 if(MSVC)
351   # CMake previously automatically set this value for MSVC builds, but the
352   # behavior was changed in CMake 2.8.11 (Issue 12437) to use the MSVC default
353   # value (1 MB) which is not enough for us in tasks such as parsing recursive
354   # C++ templates in Clang.
355   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10000000")
356 elseif(MINGW) # FIXME: Also cygwin?
357   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--stack,16777216")
359   # Pass -mbig-obj to mingw gas on Win64. COFF has a 2**16 section limit, and
360   # on Win64, every COMDAT function creates at least 3 sections: .text, .pdata,
361   # and .xdata.
362   if (CMAKE_SIZEOF_VOID_P EQUAL 8)
363     append("-Wa,-mbig-obj" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
364   endif()
365 endif()
367 if( MSVC )
368   include(ChooseMSVCCRT)
370   # Add definitions that make MSVC much less annoying.
371   add_definitions(
372     # For some reason MS wants to deprecate a bunch of standard functions...
373     -D_CRT_SECURE_NO_DEPRECATE
374     -D_CRT_SECURE_NO_WARNINGS
375     -D_CRT_NONSTDC_NO_DEPRECATE
376     -D_CRT_NONSTDC_NO_WARNINGS
377     -D_SCL_SECURE_NO_DEPRECATE
378     -D_SCL_SECURE_NO_WARNINGS
379     )
381   # Tell MSVC to use the Unicode version of the Win32 APIs instead of ANSI.
382   add_definitions(
383     -DUNICODE
384     -D_UNICODE
385   )
387   if (LLVM_ENABLE_WERROR)
388     append("/WX" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
389   endif (LLVM_ENABLE_WERROR)
391   append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
393   # Allow users to request PDBs in release mode. CMake offeres the
394   # RelWithDebInfo configuration, but it uses different optimization settings
395   # (/Ob1 vs /Ob2 or -O2 vs -O3). LLVM provides this flag so that users can get
396   # PDBs without changing codegen.
397   option(LLVM_ENABLE_PDB OFF)
398   if (LLVM_ENABLE_PDB AND uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
399     append("/Zi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
400     # /DEBUG disables linker GC and ICF, but we want those in Release mode.
401     append("/DEBUG /OPT:REF /OPT:ICF"
402           CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
403           CMAKE_SHARED_LINKER_FLAGS)
404   endif()
406   # Disable string literal const->non-const type conversion.
407   # "When specified, the compiler requires strict const-qualification
408   # conformance for pointers initialized by using string literals."
409   append("/Zc:strictStrings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
411   # "Generate Intrinsic Functions".
412   append("/Oi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
414   # "Enforce type conversion rules".
415   append("/Zc:rvalueCast" CMAKE_CXX_FLAGS)
417   if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT LLVM_ENABLE_LTO)
418     # clang-cl and cl by default produce non-deterministic binaries because
419     # link.exe /incremental requires a timestamp in the .obj file.  clang-cl
420     # has the flag /Brepro to force deterministic binaries. We want to pass that
421     # whenever you're building with clang unless you're passing /incremental
422     # or using LTO (/Brepro with LTO would result in a warning about the flag
423     # being unused, because we're not generating object files).
424     # This checks CMAKE_CXX_COMPILER_ID in addition to check_cxx_compiler_flag()
425     # because cl.exe does not emit an error on flags it doesn't understand,
426     # letting check_cxx_compiler_flag() claim it understands all flags.
427     check_cxx_compiler_flag("/Brepro" SUPPORTS_BREPRO)
428     if (SUPPORTS_BREPRO)
429       # Check if /INCREMENTAL is passed to the linker and complain that it
430       # won't work with /Brepro.
431       string(TOUPPER "${CMAKE_EXE_LINKER_FLAGS}" upper_exe_flags)
432       string(TOUPPER "${CMAKE_MODULE_LINKER_FLAGS}" upper_module_flags)
433       string(TOUPPER "${CMAKE_SHARED_LINKER_FLAGS}" upper_shared_flags)
435       string(FIND "${upper_exe_flags} ${upper_module_flags} ${upper_shared_flags}"
436         "/INCREMENTAL" linker_flag_idx)
438       if (${linker_flag_idx} GREATER -1)
439         message(WARNING "/Brepro not compatible with /INCREMENTAL linking - builds will be non-deterministic")
440       else()
441         append("/Brepro" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
442       endif()
443     endif()
444   endif()
445 endif( MSVC )
447 # Warnings-as-errors handling for GCC-compatible compilers:
448 if ( LLVM_COMPILER_IS_GCC_COMPATIBLE )
449   append_if(LLVM_ENABLE_WERROR "-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
450   append_if(LLVM_ENABLE_WERROR "-Wno-error" CMAKE_REQUIRED_FLAGS)
451 endif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
453 # Specific default warnings-as-errors for compilers accepting GCC-compatible warning flags:
454 if ( LLVM_COMPILER_IS_GCC_COMPATIBLE OR CMAKE_CXX_COMPILER_ID MATCHES "XL" )
455   add_flag_if_supported("-Werror=date-time" WERROR_DATE_TIME)
456   add_flag_if_supported("-Werror=unguarded-availability-new" WERROR_UNGUARDED_AVAILABILITY_NEW)
457 endif( LLVM_COMPILER_IS_GCC_COMPATIBLE OR CMAKE_CXX_COMPILER_ID MATCHES "XL" )
459 # Modules enablement for GCC-compatible compilers:
460 if ( LLVM_COMPILER_IS_GCC_COMPATIBLE AND LLVM_ENABLE_MODULES )
461   set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
462   set(module_flags "-fmodules -fmodules-cache-path=${PROJECT_BINARY_DIR}/module.cache")
463   if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
464     # On Darwin -fmodules does not imply -fcxx-modules.
465     set(module_flags "${module_flags} -fcxx-modules")
466   endif()
467   if (LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY)
468     set(module_flags "${module_flags} -Xclang -fmodules-local-submodule-visibility")
469   endif()
470   if (LLVM_ENABLE_MODULE_DEBUGGING AND
471       ((uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") OR
472        (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")))
473     set(module_flags "${module_flags} -gmodules")
474   endif()
475   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${module_flags}")
477   # Check that we can build code with modules enabled, and that repeatedly
478   # including <cassert> still manages to respect NDEBUG properly.
479   CHECK_CXX_SOURCE_COMPILES("#undef NDEBUG
480                              #include <cassert>
481                              #define NDEBUG
482                              #include <cassert>
483                              int main() { assert(this code is not compiled); }"
484                              CXX_SUPPORTS_MODULES)
485   set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
486   if (CXX_SUPPORTS_MODULES)
487     append("${module_flags}" CMAKE_CXX_FLAGS)
488   else()
489     message(FATAL_ERROR "LLVM_ENABLE_MODULES is not supported by this compiler")
490   endif()
491 endif( LLVM_COMPILER_IS_GCC_COMPATIBLE AND LLVM_ENABLE_MODULES )
493 if (MSVC)
494   if (NOT CLANG_CL)
495     set(msvc_warning_flags
496       # Disabled warnings.
497       -wd4141 # Suppress ''modifier' : used more than once' (because of __forceinline combined with inline)
498       -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned'
499       -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data'
500       -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data'
501       -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception'
502       -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized'
503       -wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized'
504       -wd4456 # Suppress 'declaration of 'var' hides local variable'
505       -wd4457 # Suppress 'declaration of 'var' hides function parameter'
506       -wd4458 # Suppress 'declaration of 'var' hides class member'
507       -wd4459 # Suppress 'declaration of 'var' hides global declaration'
508       -wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated'
509       -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible'
510       -wd4722 # Suppress 'function' : destructor never returns, potential memory leak
511       -wd4100 # Suppress 'unreferenced formal parameter'
512       -wd4127 # Suppress 'conditional expression is constant'
513       -wd4512 # Suppress 'assignment operator could not be generated'
514       -wd4505 # Suppress 'unreferenced local function has been removed'
515       -wd4610 # Suppress '<class> can never be instantiated'
516       -wd4510 # Suppress 'default constructor could not be generated'
517       -wd4702 # Suppress 'unreachable code'
518       -wd4245 # Suppress ''conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch'
519       -wd4706 # Suppress 'assignment within conditional expression'
520       -wd4310 # Suppress 'cast truncates constant value'
521       -wd4701 # Suppress 'potentially uninitialized local variable'
522       -wd4703 # Suppress 'potentially uninitialized local pointer variable'
523       -wd4389 # Suppress 'signed/unsigned mismatch'
524       -wd4611 # Suppress 'interaction between '_setjmp' and C++ object destruction is non-portable'
525       -wd4805 # Suppress 'unsafe mix of type <type> and type <type> in operation'
526       -wd4204 # Suppress 'nonstandard extension used : non-constant aggregate initializer'
527       -wd4577 # Suppress 'noexcept used with no exception handling mode specified; termination on exception is not guaranteed'
528       -wd4091 # Suppress 'typedef: ignored on left of '' when no variable is declared'
529           # C4592 is disabled because of false positives in Visual Studio 2015
530           # Update 1. Re-evaluate the usefulness of this diagnostic with Update 2.
531       -wd4592 # Suppress ''var': symbol will be dynamically initialized (implementation limitation)
532       -wd4319 # Suppress ''operator' : zero extending 'type' to 'type' of greater size'
533           # C4709 is disabled because of a bug with Visual Studio 2017 as of
534           # v15.8.8. Re-evaluate the usefulness of this diagnostic when the bug
535           # is fixed.
536       -wd4709 # Suppress comma operator within array index expression
538       # Ideally, we'd like this warning to be enabled, but even MSVC 2019 doesn't
539       # support the 'aligned' attribute in the way that clang sources requires (for
540       # any code that uses the LLVM_ALIGNAS macro), so this is must be disabled to
541       # avoid unwanted alignment warnings.
542       -wd4324 # Suppress 'structure was padded due to __declspec(align())'
544       # Promoted warnings.
545       -w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning.
547       # Promoted warnings to errors.
548       -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error.
549       )
550   endif(NOT CLANG_CL)
552   # Enable warnings
553   if (LLVM_ENABLE_WARNINGS)
554     # Put /W4 in front of all the -we flags. cl.exe doesn't care, but for
555     # clang-cl having /W4 after the -we flags will re-enable the warnings
556     # disabled by -we.
557     set(msvc_warning_flags "/W4 ${msvc_warning_flags}")
558     # CMake appends /W3 by default, and having /W3 followed by /W4 will result in
559     # cl : Command line warning D9025 : overriding '/W3' with '/W4'.  Since this is
560     # a command line warning and not a compiler warning, it cannot be suppressed except
561     # by fixing the command line.
562     string(REGEX REPLACE " /W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
563     string(REGEX REPLACE " /W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
565     if (LLVM_ENABLE_PEDANTIC)
566       # No MSVC equivalent available
567     endif (LLVM_ENABLE_PEDANTIC)
568   endif (LLVM_ENABLE_WARNINGS)
570   foreach(flag ${msvc_warning_flags})
571     append("${flag}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
572   endforeach(flag)
573 endif (MSVC)
575 if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL))
577   # Don't add -Wall for clang-cl, because it maps -Wall to -Weverything for
578   # MSVC compatibility.  /W4 is added above instead.
579   if (NOT CLANG_CL)
580     append("-Wall" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
581   endif()
583   append("-Wextra -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
584   append("-Wcast-qual" CMAKE_CXX_FLAGS)
586   # Turn off missing field initializer warnings for gcc to avoid noise from
587   # false positives with empty {}. Turn them on otherwise (they're off by
588   # default for clang).
589   check_cxx_compiler_flag("-Wmissing-field-initializers" CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
590   if (CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
591     if (CMAKE_COMPILER_IS_GNUCXX)
592       append("-Wno-missing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
593     else()
594       append("-Wmissing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
595     endif()
596   endif()
598   if (LLVM_ENABLE_PEDANTIC AND LLVM_COMPILER_IS_GCC_COMPATIBLE)
599     append("-pedantic" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
600     append("-Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
601   endif()
603   add_flag_if_supported("-Wimplicit-fallthrough" IMPLICIT_FALLTHROUGH_FLAG)
604   add_flag_if_supported("-Wcovered-switch-default" COVERED_SWITCH_DEFAULT_FLAG)
605   append_if(USE_NO_UNINITIALIZED "-Wno-uninitialized" CMAKE_CXX_FLAGS)
606   append_if(USE_NO_MAYBE_UNINITIALIZED "-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS)
608   # Disable -Wclass-memaccess, a C++-only warning from GCC 8 that fires on
609   # LLVM's ADT classes.
610   check_cxx_compiler_flag("-Wclass-memaccess" CXX_SUPPORTS_CLASS_MEMACCESS_FLAG)
611   append_if(CXX_SUPPORTS_CLASS_MEMACCESS_FLAG "-Wno-class-memaccess" CMAKE_CXX_FLAGS)
613   # Disable -Wredundant-move on GCC>=9. GCC wants to remove std::move in code
614   # like "A foo(ConvertibleToA a) { return std::move(a); }", but this code does
615   # not compile (or uses the copy constructor instead) on clang<=3.8. Clang also
616   # has a -Wredundant-move, but it only fires when the types match exactly, so
617   # we can keep it here.
618   if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
619     check_cxx_compiler_flag("-Wredundant-move" CXX_SUPPORTS_REDUNDANT_MOVE_FLAG)
620     append_if(CXX_SUPPORTS_REDUNDANT_MOVE_FLAG "-Wno-redundant-move" CMAKE_CXX_FLAGS)
621   endif()
623   # The LLVM libraries have no stable C++ API, so -Wnoexcept-type is not useful.
624   check_cxx_compiler_flag("-Wnoexcept-type" CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG)
625   append_if(CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG "-Wno-noexcept-type" CMAKE_CXX_FLAGS)
627   # Check if -Wnon-virtual-dtor warns even though the class is marked final.
628   # If it does, don't add it. So it won't be added on clang 3.4 and older.
629   # This also catches cases when -Wnon-virtual-dtor isn't supported by
630   # the compiler at all.  This flag is not activated for gcc since it will
631   # incorrectly identify a protected non-virtual base when there is a friend
632   # declaration. Don't activate this in general on Windows as this warning has
633   # too many false positives on COM-style classes, which are destroyed with
634   # Release() (PR32286).
635   if (NOT CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
636     set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
637     set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11 -Werror=non-virtual-dtor")
638     CHECK_CXX_SOURCE_COMPILES("class base {public: virtual void anchor();protected: ~base();};
639                                class derived final : public base { public: ~derived();};
640                                int main() { return 0; }"
641                               CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR)
642     set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
643     append_if(CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR
644               "-Wnon-virtual-dtor" CMAKE_CXX_FLAGS)
645   endif()
647   # Enable -Wdelete-non-virtual-dtor if available.
648   add_flag_if_supported("-Wdelete-non-virtual-dtor" DELETE_NON_VIRTUAL_DTOR_FLAG)
650   # Check if -Wcomment is OK with an // comment ending with '\' if the next
651   # line is also a // comment.
652   set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
653   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror -Wcomment")
654   CHECK_C_SOURCE_COMPILES("// \\\\\\n//\\nint main() {return 0;}"
655                           C_WCOMMENT_ALLOWS_LINE_WRAP)
656   set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
657   if (NOT C_WCOMMENT_ALLOWS_LINE_WRAP)
658     append("-Wno-comment" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
659   endif()
661   # Enable -Wstring-conversion to catch misuse of string literals.
662   add_flag_if_supported("-Wstring-conversion" STRING_CONVERSION_FLAG)
663 endif (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL))
665 if (LLVM_COMPILER_IS_GCC_COMPATIBLE AND NOT LLVM_ENABLE_WARNINGS)
666   append("-w" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
667 endif()
669 macro(append_common_sanitizer_flags)
670   if (NOT MSVC)
671     # Append -fno-omit-frame-pointer and turn on debug info to get better
672     # stack traces.
673     add_flag_if_supported("-fno-omit-frame-pointer" FNO_OMIT_FRAME_POINTER)
674     if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
675         NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
676       add_flag_if_supported("-gline-tables-only" GLINE_TABLES_ONLY)
677     endif()
678     # Use -O1 even in debug mode, otherwise sanitizers slowdown is too large.
679     if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND LLVM_OPTIMIZE_SANITIZED_BUILDS)
680       add_flag_if_supported("-O1" O1)
681     endif()
682   elseif (CLANG_CL)
683     # Keep frame pointers around.
684     append("/Oy-" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
685     # Always ask the linker to produce symbols with asan.
686     append("/Z7" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
687     append("-debug" CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
688   endif()
689 endmacro()
691 # Turn on sanitizers if necessary.
692 if(LLVM_USE_SANITIZER)
693   if (LLVM_ON_UNIX)
694     if (LLVM_USE_SANITIZER STREQUAL "Address")
695       append_common_sanitizer_flags()
696       append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
697     elseif (LLVM_USE_SANITIZER STREQUAL "HWAddress")
698       append_common_sanitizer_flags()
699       append("-fsanitize=hwaddress" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
700     elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
701       append_common_sanitizer_flags()
702       append("-fsanitize=memory" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
703       if(LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins")
704         append("-fsanitize-memory-track-origins" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
705       endif()
706     elseif (LLVM_USE_SANITIZER STREQUAL "Undefined")
707       append_common_sanitizer_flags()
708       append("-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
709               CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
710     elseif (LLVM_USE_SANITIZER STREQUAL "Thread")
711       append_common_sanitizer_flags()
712       append("-fsanitize=thread" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
713     elseif (LLVM_USE_SANITIZER STREQUAL "Address;Undefined" OR
714             LLVM_USE_SANITIZER STREQUAL "Undefined;Address")
715       append_common_sanitizer_flags()
716       append("-fsanitize=address,undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
717               CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
718     elseif (LLVM_USE_SANITIZER STREQUAL "Leaks")
719       append_common_sanitizer_flags()
720       append("-fsanitize=leak" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
721     else()
722       message(FATAL_ERROR "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}")
723     endif()
724   elseif(MSVC)
725     if (LLVM_USE_SANITIZER STREQUAL "Address")
726       append_common_sanitizer_flags()
727       append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
728     else()
729       message(FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${LLVM_USE_SANITIZER}")
730     endif()
731   else()
732     message(FATAL_ERROR "LLVM_USE_SANITIZER is not supported on this platform.")
733   endif()
734   if (LLVM_USE_SANITIZER MATCHES "(Undefined;)?Address(;Undefined)?")
735     add_flag_if_supported("-fsanitize-address-use-after-scope"
736                           FSANITIZE_USE_AFTER_SCOPE_FLAG)
737   endif()
738   if (LLVM_USE_SANITIZE_COVERAGE)
739     append("-fsanitize=fuzzer-no-link" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
740   endif()
741   if (LLVM_USE_SANITIZER MATCHES ".*Undefined.*")
742     set(BLACKLIST_FILE "${CMAKE_SOURCE_DIR}/utils/sanitizers/ubsan_blacklist.txt")
743     if (EXISTS "${BLACKLIST_FILE}")
744       append("-fsanitize-blacklist=${BLACKLIST_FILE}"
745              CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
746     endif()
747   endif()
748 endif()
750 # Turn on -gsplit-dwarf if requested
751 if(LLVM_USE_SPLIT_DWARF)
752   add_definitions("-gsplit-dwarf")
753 endif()
755 add_definitions( -D__STDC_CONSTANT_MACROS )
756 add_definitions( -D__STDC_FORMAT_MACROS )
757 add_definitions( -D__STDC_LIMIT_MACROS )
759 # clang and gcc don't default-print colored diagnostics when invoked from Ninja.
760 if (UNIX AND
761     CMAKE_GENERATOR STREQUAL "Ninja" AND
762     (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
763      (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND
764       NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9))))
765   append("-fdiagnostics-color" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
766 endif()
768 # lld doesn't print colored diagnostics when invoked from Ninja
769 if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja")
770   include(CheckLinkerFlag)
771   check_linker_flag("-Wl,--color-diagnostics" LINKER_SUPPORTS_COLOR_DIAGNOSTICS)
772   append_if(LINKER_SUPPORTS_COLOR_DIAGNOSTICS "-Wl,--color-diagnostics"
773     CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
774 endif()
776 # Add flags for add_dead_strip().
777 # FIXME: With MSVS, consider compiling with /Gy and linking with /OPT:REF?
778 # But MinSizeRel seems to add that automatically, so maybe disable these
779 # flags instead if LLVM_NO_DEAD_STRIP is set.
780 if(NOT CYGWIN AND NOT WIN32)
781   if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND
782      NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
783     check_c_compiler_flag("-Werror -fno-function-sections" C_SUPPORTS_FNO_FUNCTION_SECTIONS)
784     if (C_SUPPORTS_FNO_FUNCTION_SECTIONS)
785       # Don't add -ffunction-sections if it can't be disabled with -fno-function-sections.
786       # Doing so will break sanitizers.
787       add_flag_if_supported("-ffunction-sections" FFUNCTION_SECTIONS)
788     elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
789       append("-qfuncsect" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
790     endif()
791     add_flag_if_supported("-fdata-sections" FDATA_SECTIONS)
792   endif()
793 endif()
795 if(MSVC)
796   # Remove flags here, for exceptions and RTTI.
797   # Each target property or source property should be responsible to control
798   # them.
799   # CL.EXE complains to override flags like "/GR /GR-".
800   string(REGEX REPLACE "(^| ) */EH[-cs]+ *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
801   string(REGEX REPLACE "(^| ) */GR-? *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
802 endif()
804 # Provide public options to globally control RTTI and EH
805 option(LLVM_ENABLE_EH "Enable Exception handling" OFF)
806 option(LLVM_ENABLE_RTTI "Enable run time type information" OFF)
807 if(LLVM_ENABLE_EH AND NOT LLVM_ENABLE_RTTI)
808   message(FATAL_ERROR "Exception handling requires RTTI. You must set LLVM_ENABLE_RTTI to ON")
809 endif()
811 option(LLVM_USE_NEWPM "Build LLVM using the experimental new pass manager" Off)
812 mark_as_advanced(LLVM_USE_NEWPM)
813 if (LLVM_USE_NEWPM)
814   append("-fexperimental-new-pass-manager"
815     CMAKE_CXX_FLAGS
816     CMAKE_C_FLAGS
817     CMAKE_EXE_LINKER_FLAGS
818     CMAKE_SHARED_LINKER_FLAGS)
819 endif()
821 option(LLVM_ENABLE_IR_PGO "Build LLVM and tools with IR PGO instrumentation (deprecated)" Off)
822 mark_as_advanced(LLVM_ENABLE_IR_PGO)
824 set(LLVM_BUILD_INSTRUMENTED OFF CACHE STRING "Build LLVM and tools with PGO instrumentation. May be specified as IR or Frontend")
825 mark_as_advanced(LLVM_BUILD_INSTRUMENTED)
826 string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" uppercase_LLVM_BUILD_INSTRUMENTED)
828 if (LLVM_BUILD_INSTRUMENTED)
829   if (LLVM_ENABLE_IR_PGO OR uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "IR")
830     append("-fprofile-generate=\"${LLVM_PROFILE_DATA_DIR}\""
831       CMAKE_CXX_FLAGS
832       CMAKE_C_FLAGS)
833     if(NOT LINKER_IS_LLD_LINK)
834         append("-fprofile-generate=\"${LLVM_PROFILE_DATA_DIR}\""
835           CMAKE_EXE_LINKER_FLAGS
836           CMAKE_SHARED_LINKER_FLAGS)
837     endif()
838   elseif(uppercase_LLVM_BUILD_INSTRUMENTED STREQUAL "CSIR")
839     append("-fcs-profile-generate=\"${LLVM_CSPROFILE_DATA_DIR}\""
840       CMAKE_CXX_FLAGS
841       CMAKE_C_FLAGS)
842     if(NOT LINKER_IS_LLD_LINK)
843       append("-fcs-profile-generate=\"${LLVM_CSPROFILE_DATA_DIR}\""
844         CMAKE_EXE_LINKER_FLAGS
845         CMAKE_SHARED_LINKER_FLAGS)
846     endif()
847   else()
848     append("-fprofile-instr-generate=\"${LLVM_PROFILE_FILE_PATTERN}\""
849       CMAKE_CXX_FLAGS
850       CMAKE_C_FLAGS)
851     if(NOT LINKER_IS_LLD_LINK)
852       append("-fprofile-instr-generate=\"${LLVM_PROFILE_FILE_PATTERN}\""
853         CMAKE_EXE_LINKER_FLAGS
854         CMAKE_SHARED_LINKER_FLAGS)
855     endif()
856   endif()
857 endif()
859 if(LLVM_PROFDATA_FILE AND EXISTS ${LLVM_PROFDATA_FILE})
860   if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
861     append("-fprofile-instr-use=\"${LLVM_PROFDATA_FILE}\""
862       CMAKE_CXX_FLAGS
863       CMAKE_C_FLAGS)
864     if(NOT LINKER_IS_LLD_LINK)
865       append("-fprofile-instr-use=\"${LLVM_PROFDATA_FILE}\""
866         CMAKE_EXE_LINKER_FLAGS
867         CMAKE_SHARED_LINKER_FLAGS)
868     endif()
869   else()
870     message(FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang")
871   endif()
872 endif()
874 option(LLVM_BUILD_INSTRUMENTED_COVERAGE "Build LLVM and tools with Code Coverage instrumentation" Off)
875 mark_as_advanced(LLVM_BUILD_INSTRUMENTED_COVERAGE)
876 append_if(LLVM_BUILD_INSTRUMENTED_COVERAGE "-fprofile-instr-generate=\"${LLVM_PROFILE_FILE_PATTERN}\" -fcoverage-mapping"
877   CMAKE_CXX_FLAGS
878   CMAKE_C_FLAGS
879   CMAKE_EXE_LINKER_FLAGS
880   CMAKE_SHARED_LINKER_FLAGS)
882 if (LLVM_BUILD_INSTRUMENTED AND LLVM_BUILD_INSTRUMENTED_COVERAGE)
883   message(FATAL_ERROR "LLVM_BUILD_INSTRUMENTED and LLVM_BUILD_INSTRUMENTED_COVERAGE cannot both be specified")
884 endif()
886 if(LLVM_ENABLE_LTO AND LLVM_ON_WIN32 AND NOT LINKER_IS_LLD_LINK)
887   message(FATAL_ERROR "When compiling for Windows, LLVM_ENABLE_LTO requires using lld as the linker (point CMAKE_LINKER at lld-link.exe)")
888 endif()
889 if(uppercase_LLVM_ENABLE_LTO STREQUAL "THIN")
890   append("-flto=thin" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
891   if(NOT LINKER_IS_LLD_LINK)
892     append("-flto=thin" CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
893   endif()
894   # If the linker supports it, enable the lto cache. This improves initial build
895   # time a little since we re-link a lot of the same objects, and significantly
896   # improves incremental build time.
897   # FIXME: We should move all this logic into the clang driver.
898   if(APPLE)
899     append("-Wl,-cache_path_lto,${PROJECT_BINARY_DIR}/lto.cache"
900            CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
901   elseif(UNIX AND LLVM_USE_LINKER STREQUAL "lld")
902     append("-Wl,--thinlto-cache-dir=${PROJECT_BINARY_DIR}/lto.cache"
903            CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
904   elseif(LLVM_USE_LINKER STREQUAL "gold")
905     append("-Wl,--plugin-opt,cache-dir=${PROJECT_BINARY_DIR}/lto.cache"
906            CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
907   elseif(LINKER_IS_LLD_LINK)
908     append("/lldltocache:${PROJECT_BINARY_DIR}/lto.cache"
909            CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
910   endif()
911 elseif(uppercase_LLVM_ENABLE_LTO STREQUAL "FULL")
912   append("-flto=full" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
913   if(NOT LINKER_IS_LLD_LINK)
914     append("-flto=full" CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
915   endif()
916 elseif(LLVM_ENABLE_LTO)
917   append("-flto" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
918   if(NOT LINKER_IS_LLD_LINK)
919     append("-flto" CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
920   endif()
921 endif()
923 # This option makes utils/extract_symbols.py be used to determine the list of
924 # symbols to export from LLVM tools. This is necessary when using MSVC if you
925 # want to allow plugins, though note that the plugin has to explicitly link
926 # against (exactly one) tool so we can't unilaterally turn on
927 # LLVM_ENABLE_PLUGINS when it's enabled.
928 option(LLVM_EXPORT_SYMBOLS_FOR_PLUGINS "Export symbols from LLVM tools so that plugins can import them" OFF)
929 if(BUILD_SHARED_LIBS AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
930   message(FATAL_ERROR "BUILD_SHARED_LIBS not compatible with LLVM_EXPORT_SYMBOLS_FOR_PLUGINS")
931 endif()
932 if(LLVM_LINK_LLVM_DYLIB AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
933   message(FATAL_ERROR "LLVM_LINK_LLVM_DYLIB not compatible with LLVM_EXPORT_SYMBOLS_FOR_PLUGINS")
934 endif()
936 # By default we should enable LLVM_ENABLE_IDE only for multi-configuration
937 # generators. This option disables optional build system features that make IDEs
938 # less usable.
939 set(LLVM_ENABLE_IDE_default OFF)
940 if (CMAKE_CONFIGURATION_TYPES)
941   set(LLVM_ENABLE_IDE_default ON)
942 endif()
943 option(LLVM_ENABLE_IDE
944        "Disable optional build system features that cause problems for IDE generators"
945        ${LLVM_ENABLE_IDE_default})
946 if (CMAKE_CONFIGURATION_TYPES AND NOT LLVM_ENABLE_IDE)
947   message(WARNING "Disabling LLVM_ENABLE_IDE on multi-configuration generators is not recommended.")
948 endif()
950 function(get_compile_definitions)
951   get_directory_property(top_dir_definitions DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS)
952   foreach(definition ${top_dir_definitions})
953     if(DEFINED result)
954       string(APPEND result " -D${definition}")
955     else()
956       set(result "-D${definition}")
957     endif()
958   endforeach()
959   set(LLVM_DEFINITIONS "${result}" PARENT_SCOPE)
960 endfunction()
961 get_compile_definitions()
963 option(LLVM_FORCE_ENABLE_STATS "Enable statistics collection for builds that wouldn't normally enable it" OFF)
965 check_symbol_exists(os_signpost_interval_begin "os/signpost.h" macos_signposts_available)
966 if(macos_signposts_available)
967   check_cxx_source_compiles(
968     "#include <os/signpost.h>
969     int main() { os_signpost_interval_begin(nullptr, 0, \"\", \"\"); return 0; }"
970     macos_signposts_usable)
971   if(macos_signposts_usable)
972     set(LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS "WITH_ASSERTS" CACHE STRING
973         "Enable support for Xcode signposts. Can be WITH_ASSERTS, FORCE_ON, FORCE_OFF")
974     string(TOUPPER "${LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS}"
975                    uppercase_LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS)
976     if( uppercase_LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS STREQUAL "WITH_ASSERTS" )
977       if( LLVM_ENABLE_ASSERTIONS )
978         set( LLVM_SUPPORT_XCODE_SIGNPOSTS 1 )
979       endif()
980     elseif( uppercase_LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS STREQUAL "FORCE_ON" )
981       set( LLVM_SUPPORT_XCODE_SIGNPOSTS 1 )
982     elseif( uppercase_LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS STREQUAL "FORCE_OFF" )
983       # We don't need to do anything special to turn off signposts.
984     elseif( NOT DEFINED LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS )
985       # Treat LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS like "FORCE_OFF" when it has not been
986       # defined.
987     else()
988       message(FATAL_ERROR "Unknown value for LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS:"
989                           " \"${LLVM_ENABLE_SUPPORT_XCODE_SIGNPOSTS}\"!")
990     endif()
991   endif()
992 endif()
994 option(LLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO "Use relative paths in debug info" OFF)
995 set(LLVM_SOURCE_PREFIX "" CACHE STRING "Use prefix for sources in debug info")
997 if(LLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO)
998   check_c_compiler_flag("-fdebug-prefix-map=foo=bar" SUPPORTS_FDEBUG_PREFIX_MAP)
999   if(LLVM_ENABLE_PROJECTS_USED)
1000     get_filename_component(source_root "${LLVM_MAIN_SRC_DIR}/.." ABSOLUTE)
1001   else()
1002     set(source_root "${LLVM_MAIN_SRC_DIR}")
1003   endif()
1004   file(RELATIVE_PATH relative_root "${source_root}" "${CMAKE_BINARY_DIR}")
1005   append_if(SUPPORTS_FDEBUG_PREFIX_MAP "-fdebug-prefix-map=${CMAKE_BINARY_DIR}=${relative_root}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
1006   append_if(SUPPORTS_FDEBUG_PREFIX_MAP "-fdebug-prefix-map=${source_root}/=${LLVM_SOURCE_PREFIX}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
1007   add_flag_if_supported("-no-canonical-prefixes" NO_CANONICAL_PREFIXES)
1008 endif()