1*9880d681SAndroid Build Coastguard Worker# This CMake module is responsible for interpreting the user defined LLVM_ 2*9880d681SAndroid Build Coastguard Worker# options and executing the appropriate CMake commands to realize the users' 3*9880d681SAndroid Build Coastguard Worker# selections. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker# This is commonly needed so make sure it's defined before we include anything 6*9880d681SAndroid Build Coastguard Worker# else. 7*9880d681SAndroid Build Coastguard Workerstring(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerinclude(CheckCompilerVersion) 10*9880d681SAndroid Build Coastguard Workerinclude(HandleLLVMStdlib) 11*9880d681SAndroid Build Coastguard Workerinclude(AddLLVMDefinitions) 12*9880d681SAndroid Build Coastguard Workerinclude(CheckCCompilerFlag) 13*9880d681SAndroid Build Coastguard Workerinclude(CheckCXXCompilerFlag) 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerif (CMAKE_LINKER MATCHES "lld-link.exe") 17*9880d681SAndroid Build Coastguard Worker # Pass /MANIFEST:NO so that CMake doesn't run mt.exe on our binaries. Adding 18*9880d681SAndroid Build Coastguard Worker # manifests with mt.exe breaks LLD's symbol tables and takes as much time as 19*9880d681SAndroid Build Coastguard Worker # the link. See PR24476. 20*9880d681SAndroid Build Coastguard Worker append("/MANIFEST:NO" 21*9880d681SAndroid Build Coastguard Worker CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) 22*9880d681SAndroid Build Coastguard Workerendif() 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerif( LLVM_ENABLE_ASSERTIONS ) 25*9880d681SAndroid Build Coastguard Worker # MSVC doesn't like _DEBUG on release builds. See PR 4379. 26*9880d681SAndroid Build Coastguard Worker if( NOT MSVC ) 27*9880d681SAndroid Build Coastguard Worker add_definitions( -D_DEBUG ) 28*9880d681SAndroid Build Coastguard Worker endif() 29*9880d681SAndroid Build Coastguard Worker # On non-Debug builds cmake automatically defines NDEBUG, so we 30*9880d681SAndroid Build Coastguard Worker # explicitly undefine it: 31*9880d681SAndroid Build Coastguard Worker if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" ) 32*9880d681SAndroid Build Coastguard Worker add_definitions( -UNDEBUG ) 33*9880d681SAndroid Build Coastguard Worker # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines. 34*9880d681SAndroid Build Coastguard Worker foreach (flags_var_to_scrub 35*9880d681SAndroid Build Coastguard Worker CMAKE_CXX_FLAGS_RELEASE 36*9880d681SAndroid Build Coastguard Worker CMAKE_CXX_FLAGS_RELWITHDEBINFO 37*9880d681SAndroid Build Coastguard Worker CMAKE_CXX_FLAGS_MINSIZEREL 38*9880d681SAndroid Build Coastguard Worker CMAKE_C_FLAGS_RELEASE 39*9880d681SAndroid Build Coastguard Worker CMAKE_C_FLAGS_RELWITHDEBINFO 40*9880d681SAndroid Build Coastguard Worker CMAKE_C_FLAGS_MINSIZEREL) 41*9880d681SAndroid Build Coastguard Worker string (REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " 42*9880d681SAndroid Build Coastguard Worker "${flags_var_to_scrub}" "${${flags_var_to_scrub}}") 43*9880d681SAndroid Build Coastguard Worker endforeach() 44*9880d681SAndroid Build Coastguard Worker endif() 45*9880d681SAndroid Build Coastguard Workerendif() 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerif(LLVM_ENABLE_EXPENSIVE_CHECKS) 48*9880d681SAndroid Build Coastguard Worker add_definitions(-DEXPENSIVE_CHECKS) 49*9880d681SAndroid Build Coastguard Worker add_definitions(-D_GLIBCXX_DEBUG) 50*9880d681SAndroid Build Coastguard Workerendif() 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerstring(TOUPPER "${LLVM_ABI_BREAKING_CHECKS}" uppercase_LLVM_ABI_BREAKING_CHECKS) 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerif( uppercase_LLVM_ABI_BREAKING_CHECKS STREQUAL "WITH_ASSERTS" ) 55*9880d681SAndroid Build Coastguard Worker if( LLVM_ENABLE_ASSERTIONS ) 56*9880d681SAndroid Build Coastguard Worker set( LLVM_ENABLE_ABI_BREAKING_CHECKS 1 ) 57*9880d681SAndroid Build Coastguard Worker endif() 58*9880d681SAndroid Build Coastguard Workerelseif( uppercase_LLVM_ABI_BREAKING_CHECKS STREQUAL "FORCE_ON" ) 59*9880d681SAndroid Build Coastguard Worker set( LLVM_ENABLE_ABI_BREAKING_CHECKS 1 ) 60*9880d681SAndroid Build Coastguard Workerelseif( uppercase_LLVM_ABI_BREAKING_CHECKS STREQUAL "FORCE_OFF" ) 61*9880d681SAndroid Build Coastguard Worker # We don't need to do anything special to turn off ABI breaking checks. 62*9880d681SAndroid Build Coastguard Workerelseif( NOT DEFINED LLVM_ABI_BREAKING_CHECKS ) 63*9880d681SAndroid Build Coastguard Worker # Treat LLVM_ABI_BREAKING_CHECKS like "FORCE_OFF" when it has not been 64*9880d681SAndroid Build Coastguard Worker # defined. 65*9880d681SAndroid Build Coastguard Workerelse() 66*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "Unknown value for LLVM_ABI_BREAKING_CHECKS: \"${LLVM_ABI_BREAKING_CHECKS}\"!") 67*9880d681SAndroid Build Coastguard Workerendif() 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerif(WIN32) 70*9880d681SAndroid Build Coastguard Worker set(LLVM_HAVE_LINK_VERSION_SCRIPT 0) 71*9880d681SAndroid Build Coastguard Worker if(CYGWIN) 72*9880d681SAndroid Build Coastguard Worker set(LLVM_ON_WIN32 0) 73*9880d681SAndroid Build Coastguard Worker set(LLVM_ON_UNIX 1) 74*9880d681SAndroid Build Coastguard Worker else(CYGWIN) 75*9880d681SAndroid Build Coastguard Worker set(LLVM_ON_WIN32 1) 76*9880d681SAndroid Build Coastguard Worker set(LLVM_ON_UNIX 0) 77*9880d681SAndroid Build Coastguard Worker endif(CYGWIN) 78*9880d681SAndroid Build Coastguard Workerelse(WIN32) 79*9880d681SAndroid Build Coastguard Worker if(UNIX) 80*9880d681SAndroid Build Coastguard Worker set(LLVM_ON_WIN32 0) 81*9880d681SAndroid Build Coastguard Worker set(LLVM_ON_UNIX 1) 82*9880d681SAndroid Build Coastguard Worker if(APPLE) 83*9880d681SAndroid Build Coastguard Worker set(LLVM_HAVE_LINK_VERSION_SCRIPT 0) 84*9880d681SAndroid Build Coastguard Worker else(APPLE) 85*9880d681SAndroid Build Coastguard Worker set(LLVM_HAVE_LINK_VERSION_SCRIPT 1) 86*9880d681SAndroid Build Coastguard Worker endif(APPLE) 87*9880d681SAndroid Build Coastguard Worker else(UNIX) 88*9880d681SAndroid Build Coastguard Worker MESSAGE(SEND_ERROR "Unable to determine platform") 89*9880d681SAndroid Build Coastguard Worker endif(UNIX) 90*9880d681SAndroid Build Coastguard Workerendif(WIN32) 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerset(EXEEXT ${CMAKE_EXECUTABLE_SUFFIX}) 93*9880d681SAndroid Build Coastguard Workerset(LTDL_SHLIB_EXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker# We use *.dylib rather than *.so on darwin. 96*9880d681SAndroid Build Coastguard Workerset(LLVM_PLUGIN_EXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerif(APPLE) 99*9880d681SAndroid Build Coastguard Worker # Darwin-specific linker flags for loadable modules. 100*9880d681SAndroid Build Coastguard Worker set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-flat_namespace -Wl,-undefined -Wl,suppress") 101*9880d681SAndroid Build Coastguard Workerendif() 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker# Pass -Wl,-z,defs. This makes sure all symbols are defined. Otherwise a DSO 104*9880d681SAndroid Build Coastguard Worker# build might work on ELF but fail on MachO/COFF. 105*9880d681SAndroid Build Coastguard Workerif(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32 OR CYGWIN OR 106*9880d681SAndroid Build Coastguard Worker ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR 107*9880d681SAndroid Build Coastguard Worker ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") AND 108*9880d681SAndroid Build Coastguard Worker NOT LLVM_USE_SANITIZER) 109*9880d681SAndroid Build Coastguard Worker set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs") 110*9880d681SAndroid Build Coastguard Workerendif() 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerfunction(append value) 114*9880d681SAndroid Build Coastguard Worker foreach(variable ${ARGN}) 115*9880d681SAndroid Build Coastguard Worker set(${variable} "${${variable}} ${value}" PARENT_SCOPE) 116*9880d681SAndroid Build Coastguard Worker endforeach(variable) 117*9880d681SAndroid Build Coastguard Workerendfunction() 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerfunction(append_if condition value) 120*9880d681SAndroid Build Coastguard Worker if (${condition}) 121*9880d681SAndroid Build Coastguard Worker foreach(variable ${ARGN}) 122*9880d681SAndroid Build Coastguard Worker set(${variable} "${${variable}} ${value}" PARENT_SCOPE) 123*9880d681SAndroid Build Coastguard Worker endforeach(variable) 124*9880d681SAndroid Build Coastguard Worker endif() 125*9880d681SAndroid Build Coastguard Workerendfunction() 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workermacro(add_flag_if_supported flag name) 128*9880d681SAndroid Build Coastguard Worker check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}") 129*9880d681SAndroid Build Coastguard Worker append_if("C_SUPPORTS_${name}" "${flag}" CMAKE_C_FLAGS) 130*9880d681SAndroid Build Coastguard Worker check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}") 131*9880d681SAndroid Build Coastguard Worker append_if("CXX_SUPPORTS_${name}" "${flag}" CMAKE_CXX_FLAGS) 132*9880d681SAndroid Build Coastguard Workerendmacro() 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerfunction(add_flag_or_print_warning flag name) 135*9880d681SAndroid Build Coastguard Worker check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}") 136*9880d681SAndroid Build Coastguard Worker check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}") 137*9880d681SAndroid Build Coastguard Worker if (C_SUPPORTS_${name} AND CXX_SUPPORTS_${name}) 138*9880d681SAndroid Build Coastguard Worker message(STATUS "Building with ${flag}") 139*9880d681SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) 140*9880d681SAndroid Build Coastguard Worker set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE) 141*9880d681SAndroid Build Coastguard Worker set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${flag}" PARENT_SCOPE) 142*9880d681SAndroid Build Coastguard Worker else() 143*9880d681SAndroid Build Coastguard Worker message(WARNING "${flag} is not supported.") 144*9880d681SAndroid Build Coastguard Worker endif() 145*9880d681SAndroid Build Coastguard Workerendfunction() 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerif( LLVM_ENABLE_PIC ) 148*9880d681SAndroid Build Coastguard Worker if( XCODE ) 149*9880d681SAndroid Build Coastguard Worker # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't 150*9880d681SAndroid Build Coastguard Worker # know how to disable this, so just force ENABLE_PIC off for now. 151*9880d681SAndroid Build Coastguard Worker message(WARNING "-fPIC not supported with Xcode.") 152*9880d681SAndroid Build Coastguard Worker elseif( WIN32 OR CYGWIN) 153*9880d681SAndroid Build Coastguard Worker # On Windows all code is PIC. MinGW warns if -fPIC is used. 154*9880d681SAndroid Build Coastguard Worker else() 155*9880d681SAndroid Build Coastguard Worker add_flag_or_print_warning("-fPIC" FPIC) 156*9880d681SAndroid Build Coastguard Worker endif() 157*9880d681SAndroid Build Coastguard Workerendif() 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerif(NOT WIN32 AND NOT CYGWIN) 160*9880d681SAndroid Build Coastguard Worker # MinGW warns if -fvisibility-inlines-hidden is used. 161*9880d681SAndroid Build Coastguard Worker check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG) 162*9880d681SAndroid Build Coastguard Worker append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility-inlines-hidden" CMAKE_CXX_FLAGS) 163*9880d681SAndroid Build Coastguard Workerendif() 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 ) 166*9880d681SAndroid Build Coastguard Worker # TODO: support other platforms and toolchains. 167*9880d681SAndroid Build Coastguard Worker if( LLVM_BUILD_32_BITS ) 168*9880d681SAndroid Build Coastguard Worker message(STATUS "Building 32 bits executables and libraries.") 169*9880d681SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") 170*9880d681SAndroid Build Coastguard Worker set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") 171*9880d681SAndroid Build Coastguard Worker set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32") 172*9880d681SAndroid Build Coastguard Worker set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32") 173*9880d681SAndroid Build Coastguard Worker set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -m32") 174*9880d681SAndroid Build Coastguard Worker endif( LLVM_BUILD_32_BITS ) 175*9880d681SAndroid Build Coastguard Workerendif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 ) 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerif (LLVM_BUILD_STATIC) 178*9880d681SAndroid Build Coastguard Worker set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") 179*9880d681SAndroid Build Coastguard Workerendif() 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerif( XCODE ) 182*9880d681SAndroid Build Coastguard Worker # For Xcode enable several build settings that correspond to 183*9880d681SAndroid Build Coastguard Worker # many warnings that are on by default in Clang but are 184*9880d681SAndroid Build Coastguard Worker # not enabled for historical reasons. For versions of Xcode 185*9880d681SAndroid Build Coastguard Worker # that do not support these options they will simply 186*9880d681SAndroid Build Coastguard Worker # be ignored. 187*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_RETURN_TYPE "YES") 188*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_NEWLINE "YES") 189*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VALUE "YES") 190*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VARIABLE "YES") 191*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SIGN_COMPARE "YES") 192*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_FUNCTION "YES") 193*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED "YES") 194*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS "YES") 195*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNINITIALIZED_AUTOS "YES") 196*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_BOOL_CONVERSION "YES") 197*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_EMPTY_BODY "YES") 198*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_ENUM_CONVERSION "YES") 199*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_INT_CONVERSION "YES") 200*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_CONSTANT_CONVERSION "YES") 201*9880d681SAndroid Build Coastguard Worker set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_NON_VIRTUAL_DESTRUCTOR "YES") 202*9880d681SAndroid Build Coastguard Workerendif() 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker# On Win32 using MS tools, provide an option to set the number of parallel jobs 205*9880d681SAndroid Build Coastguard Worker# to use. 206*9880d681SAndroid Build Coastguard Workerif( MSVC_IDE ) 207*9880d681SAndroid Build Coastguard Worker set(LLVM_COMPILER_JOBS "0" CACHE STRING 208*9880d681SAndroid Build Coastguard Worker "Number of parallel compiler jobs. 0 means use all processors. Default is 0.") 209*9880d681SAndroid Build Coastguard Worker if( NOT LLVM_COMPILER_JOBS STREQUAL "1" ) 210*9880d681SAndroid Build Coastguard Worker if( LLVM_COMPILER_JOBS STREQUAL "0" ) 211*9880d681SAndroid Build Coastguard Worker add_llvm_definitions( /MP ) 212*9880d681SAndroid Build Coastguard Worker else() 213*9880d681SAndroid Build Coastguard Worker message(STATUS "Number of parallel compiler jobs set to " ${LLVM_COMPILER_JOBS}) 214*9880d681SAndroid Build Coastguard Worker add_llvm_definitions( /MP${LLVM_COMPILER_JOBS} ) 215*9880d681SAndroid Build Coastguard Worker endif() 216*9880d681SAndroid Build Coastguard Worker else() 217*9880d681SAndroid Build Coastguard Worker message(STATUS "Parallel compilation disabled") 218*9880d681SAndroid Build Coastguard Worker endif() 219*9880d681SAndroid Build Coastguard Workerendif() 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerif( MSVC ) 222*9880d681SAndroid Build Coastguard Worker if( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0 ) 223*9880d681SAndroid Build Coastguard Worker # For MSVC 2013, disable iterator null pointer checking in debug mode, 224*9880d681SAndroid Build Coastguard Worker # especially so std::equal(nullptr, nullptr, nullptr) will not assert. 225*9880d681SAndroid Build Coastguard Worker add_llvm_definitions("-D_DEBUG_POINTER_IMPL=") 226*9880d681SAndroid Build Coastguard Worker endif() 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker include(ChooseMSVCCRT) 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker # set stack reserved size to ~10MB 231*9880d681SAndroid Build Coastguard Worker # CMake previously automatically set this value for MSVC builds, but the 232*9880d681SAndroid Build Coastguard Worker # behavior was changed in CMake 2.8.11 (Issue 12437) to use the MSVC default 233*9880d681SAndroid Build Coastguard Worker # value (1 MB) which is not enough for us in tasks such as parsing recursive 234*9880d681SAndroid Build Coastguard Worker # C++ templates in Clang. 235*9880d681SAndroid Build Coastguard Worker set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10000000") 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker if( MSVC11 ) 238*9880d681SAndroid Build Coastguard Worker add_llvm_definitions(-D_VARIADIC_MAX=10) 239*9880d681SAndroid Build Coastguard Worker endif() 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker # Add definitions that make MSVC much less annoying. 242*9880d681SAndroid Build Coastguard Worker add_llvm_definitions( 243*9880d681SAndroid Build Coastguard Worker # For some reason MS wants to deprecate a bunch of standard functions... 244*9880d681SAndroid Build Coastguard Worker -D_CRT_SECURE_NO_DEPRECATE 245*9880d681SAndroid Build Coastguard Worker -D_CRT_SECURE_NO_WARNINGS 246*9880d681SAndroid Build Coastguard Worker -D_CRT_NONSTDC_NO_DEPRECATE 247*9880d681SAndroid Build Coastguard Worker -D_CRT_NONSTDC_NO_WARNINGS 248*9880d681SAndroid Build Coastguard Worker -D_SCL_SECURE_NO_DEPRECATE 249*9880d681SAndroid Build Coastguard Worker -D_SCL_SECURE_NO_WARNINGS 250*9880d681SAndroid Build Coastguard Worker ) 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker # Tell MSVC to use the Unicode version of the Win32 APIs instead of ANSI. 253*9880d681SAndroid Build Coastguard Worker add_llvm_definitions( 254*9880d681SAndroid Build Coastguard Worker -DUNICODE 255*9880d681SAndroid Build Coastguard Worker -D_UNICODE 256*9880d681SAndroid Build Coastguard Worker ) 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker set(msvc_warning_flags 259*9880d681SAndroid Build Coastguard Worker # Disabled warnings. 260*9880d681SAndroid Build Coastguard Worker -wd4141 # Suppress ''modifier' : used more than once' (because of __forceinline combined with inline) 261*9880d681SAndroid Build Coastguard Worker -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned' 262*9880d681SAndroid Build Coastguard Worker -wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored' 263*9880d681SAndroid Build Coastguard Worker -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data' 264*9880d681SAndroid Build Coastguard Worker -wd4258 # Suppress ''var' : definition from the for loop is ignored; the definition from the enclosing scope is used' 265*9880d681SAndroid Build Coastguard Worker -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data' 266*9880d681SAndroid Build Coastguard Worker -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception' 267*9880d681SAndroid Build Coastguard Worker -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized' 268*9880d681SAndroid Build Coastguard Worker -wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized' 269*9880d681SAndroid Build Coastguard Worker -wd4355 # Suppress ''this' : used in base member initializer list' 270*9880d681SAndroid Build Coastguard Worker -wd4456 # Suppress 'declaration of 'var' hides local variable' 271*9880d681SAndroid Build Coastguard Worker -wd4457 # Suppress 'declaration of 'var' hides function parameter' 272*9880d681SAndroid Build Coastguard Worker -wd4458 # Suppress 'declaration of 'var' hides class member' 273*9880d681SAndroid Build Coastguard Worker -wd4459 # Suppress 'declaration of 'var' hides global declaration' 274*9880d681SAndroid Build Coastguard Worker -wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated' 275*9880d681SAndroid Build Coastguard Worker -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible' 276*9880d681SAndroid Build Coastguard Worker -wd4722 # Suppress 'function' : destructor never returns, potential memory leak 277*9880d681SAndroid Build Coastguard Worker -wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)' 278*9880d681SAndroid Build Coastguard Worker -wd4100 # Suppress 'unreferenced formal parameter' 279*9880d681SAndroid Build Coastguard Worker -wd4127 # Suppress 'conditional expression is constant' 280*9880d681SAndroid Build Coastguard Worker -wd4512 # Suppress 'assignment operator could not be generated' 281*9880d681SAndroid Build Coastguard Worker -wd4505 # Suppress 'unreferenced local function has been removed' 282*9880d681SAndroid Build Coastguard Worker -wd4610 # Suppress '<class> can never be instantiated' 283*9880d681SAndroid Build Coastguard Worker -wd4510 # Suppress 'default constructor could not be generated' 284*9880d681SAndroid Build Coastguard Worker -wd4702 # Suppress 'unreachable code' 285*9880d681SAndroid Build Coastguard Worker -wd4245 # Suppress 'signed/unsigned mismatch' 286*9880d681SAndroid Build Coastguard Worker -wd4706 # Suppress 'assignment within conditional expression' 287*9880d681SAndroid Build Coastguard Worker -wd4310 # Suppress 'cast truncates constant value' 288*9880d681SAndroid Build Coastguard Worker -wd4701 # Suppress 'potentially uninitialized local variable' 289*9880d681SAndroid Build Coastguard Worker -wd4703 # Suppress 'potentially uninitialized local pointer variable' 290*9880d681SAndroid Build Coastguard Worker -wd4389 # Suppress 'signed/unsigned mismatch' 291*9880d681SAndroid Build Coastguard Worker -wd4611 # Suppress 'interaction between '_setjmp' and C++ object destruction is non-portable' 292*9880d681SAndroid Build Coastguard Worker -wd4805 # Suppress 'unsafe mix of type <type> and type <type> in operation' 293*9880d681SAndroid Build Coastguard Worker -wd4204 # Suppress 'nonstandard extension used : non-constant aggregate initializer' 294*9880d681SAndroid Build Coastguard Worker -wd4577 # Suppress 'noexcept used with no exception handling mode specified; termination on exception is not guaranteed' 295*9880d681SAndroid Build Coastguard Worker -wd4091 # Suppress 'typedef: ignored on left of '' when no variable is declared' 296*9880d681SAndroid Build Coastguard Worker # C4592 is disabled because of false positives in Visual Studio 2015 297*9880d681SAndroid Build Coastguard Worker # Update 1. Re-evaluate the usefulness of this diagnostic with Update 2. 298*9880d681SAndroid Build Coastguard Worker -wd4592 # Suppress ''var': symbol will be dynamically initialized (implementation limitation) 299*9880d681SAndroid Build Coastguard Worker -wd4319 # Suppress ''operator' : zero extending 'type' to 'type' of greater size' 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker # Ideally, we'd like this warning to be enabled, but MSVC 2013 doesn't 302*9880d681SAndroid Build Coastguard Worker # support the 'aligned' attribute in the way that clang sources requires (for 303*9880d681SAndroid Build Coastguard Worker # any code that uses the LLVM_ALIGNAS macro), so this is must be disabled to 304*9880d681SAndroid Build Coastguard Worker # avoid unwanted alignment warnings. 305*9880d681SAndroid Build Coastguard Worker # When we switch to requiring a version of MSVC that supports the 'alignas' 306*9880d681SAndroid Build Coastguard Worker # specifier (MSVC 2015?) this warning can be re-enabled. 307*9880d681SAndroid Build Coastguard Worker -wd4324 # Suppress 'structure was padded due to __declspec(align())' 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker # Promoted warnings. 310*9880d681SAndroid Build Coastguard Worker -w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning. 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker # Promoted warnings to errors. 313*9880d681SAndroid Build Coastguard Worker -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error. 314*9880d681SAndroid Build Coastguard Worker ) 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker # Enable warnings 317*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_WARNINGS) 318*9880d681SAndroid Build Coastguard Worker # Put /W4 in front of all the -we flags. cl.exe doesn't care, but for 319*9880d681SAndroid Build Coastguard Worker # clang-cl having /W4 after the -we flags will re-enable the warnings 320*9880d681SAndroid Build Coastguard Worker # disabled by -we. 321*9880d681SAndroid Build Coastguard Worker set(msvc_warning_flags "/W4 ${msvc_warning_flags}") 322*9880d681SAndroid Build Coastguard Worker # CMake appends /W3 by default, and having /W3 followed by /W4 will result in 323*9880d681SAndroid Build Coastguard Worker # cl : Command line warning D9025 : overriding '/W3' with '/W4'. Since this is 324*9880d681SAndroid Build Coastguard Worker # a command line warning and not a compiler warning, it cannot be suppressed except 325*9880d681SAndroid Build Coastguard Worker # by fixing the command line. 326*9880d681SAndroid Build Coastguard Worker string(REGEX REPLACE " /W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") 327*9880d681SAndroid Build Coastguard Worker string(REGEX REPLACE " /W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_PEDANTIC) 330*9880d681SAndroid Build Coastguard Worker # No MSVC equivalent available 331*9880d681SAndroid Build Coastguard Worker endif (LLVM_ENABLE_PEDANTIC) 332*9880d681SAndroid Build Coastguard Worker endif (LLVM_ENABLE_WARNINGS) 333*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_WERROR) 334*9880d681SAndroid Build Coastguard Worker append("/WX" msvc_warning_flags) 335*9880d681SAndroid Build Coastguard Worker endif (LLVM_ENABLE_WERROR) 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Worker foreach(flag ${msvc_warning_flags}) 338*9880d681SAndroid Build Coastguard Worker append("${flag}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 339*9880d681SAndroid Build Coastguard Worker endforeach(flag) 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Worker # /Zc:strictStrings is incompatible with VS12's (Visual Studio 2013's) 344*9880d681SAndroid Build Coastguard Worker # debug mode headers. Instead of only enabling them in VS2013's debug mode, 345*9880d681SAndroid Build Coastguard Worker # we'll just enable them for Visual Studio 2015 (VS 14, MSVC_VERSION 1900) 346*9880d681SAndroid Build Coastguard Worker # and up. 347*9880d681SAndroid Build Coastguard Worker if (NOT (MSVC_VERSION LESS 1900)) 348*9880d681SAndroid Build Coastguard Worker # Disable string literal const->non-const type conversion. 349*9880d681SAndroid Build Coastguard Worker # "When specified, the compiler requires strict const-qualification 350*9880d681SAndroid Build Coastguard Worker # conformance for pointers initialized by using string literals." 351*9880d681SAndroid Build Coastguard Worker append("/Zc:strictStrings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 352*9880d681SAndroid Build Coastguard Worker endif(NOT (MSVC_VERSION LESS 1900)) 353*9880d681SAndroid Build Coastguard Worker 354*9880d681SAndroid Build Coastguard Worker # "Generate Intrinsic Functions". 355*9880d681SAndroid Build Coastguard Worker append("/Oi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker # "Enforce type conversion rules". 358*9880d681SAndroid Build Coastguard Worker append("/Zc:rvalueCast" CMAKE_CXX_FLAGS) 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 361*9880d681SAndroid Build Coastguard Worker # clang-cl and cl by default produce non-deterministic binaries because 362*9880d681SAndroid Build Coastguard Worker # link.exe /incremental requires a timestamp in the .obj file. clang-cl 363*9880d681SAndroid Build Coastguard Worker # has the flag /Brepro to force deterministic binaries. We want to pass that 364*9880d681SAndroid Build Coastguard Worker # whenever you're building with clang unless you're passing /incremental. 365*9880d681SAndroid Build Coastguard Worker # This checks CMAKE_CXX_COMPILER_ID in addition to check_cxx_compiler_flag() 366*9880d681SAndroid Build Coastguard Worker # because cl.exe does not emit an error on flags it doesn't understand, 367*9880d681SAndroid Build Coastguard Worker # letting check_cxx_compiler_flag() claim it understands all flags. 368*9880d681SAndroid Build Coastguard Worker check_cxx_compiler_flag("/Brepro" SUPPORTS_BREPRO) 369*9880d681SAndroid Build Coastguard Worker if (SUPPORTS_BREPRO) 370*9880d681SAndroid Build Coastguard Worker # Check if /INCREMENTAL is passed to the linker and complain that it 371*9880d681SAndroid Build Coastguard Worker # won't work with /Brepro. 372*9880d681SAndroid Build Coastguard Worker string(TOUPPER "${CMAKE_EXE_LINKER_FLAGS}" upper_exe_flags) 373*9880d681SAndroid Build Coastguard Worker string(TOUPPER "${CMAKE_MODULE_LINKER_FLAGS}" upper_module_flags) 374*9880d681SAndroid Build Coastguard Worker string(TOUPPER "${CMAKE_SHARED_LINKER_FLAGS}" upper_shared_flags) 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Worker string(FIND "${upper_exe_flags} ${upper_module_flags} ${upper_shared_flags}" 377*9880d681SAndroid Build Coastguard Worker "/INCREMENTAL" linker_flag_idx) 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Worker if (${linker_flag_idx} GREATER -1) 380*9880d681SAndroid Build Coastguard Worker message(WARNING "/Brepro not compatible with /INCREMENTAL linking - builds will be non-deterministic") 381*9880d681SAndroid Build Coastguard Worker else() 382*9880d681SAndroid Build Coastguard Worker append("/Brepro" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 383*9880d681SAndroid Build Coastguard Worker endif() 384*9880d681SAndroid Build Coastguard Worker endif() 385*9880d681SAndroid Build Coastguard Worker endif() 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Worker # Disable sized deallocation if the flag is supported. MSVC fails to compile 388*9880d681SAndroid Build Coastguard Worker # the operator new overload in User otherwise. 389*9880d681SAndroid Build Coastguard Worker check_c_compiler_flag("/WX /Zc:sizedDealloc-" SUPPORTS_SIZED_DEALLOC) 390*9880d681SAndroid Build Coastguard Worker append_if(SUPPORTS_SIZED_DEALLOC "/Zc:sizedDealloc-" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Workerelseif( LLVM_COMPILER_IS_GCC_COMPATIBLE ) 393*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_WARNINGS) 394*9880d681SAndroid Build Coastguard Worker append("-Wall -W -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 395*9880d681SAndroid Build Coastguard Worker append("-Wcast-qual" CMAKE_CXX_FLAGS) 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Worker # Turn off missing field initializer warnings for gcc to avoid noise from 398*9880d681SAndroid Build Coastguard Worker # false positives with empty {}. Turn them on otherwise (they're off by 399*9880d681SAndroid Build Coastguard Worker # default for clang). 400*9880d681SAndroid Build Coastguard Worker check_cxx_compiler_flag("-Wmissing-field-initializers" CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG) 401*9880d681SAndroid Build Coastguard Worker if (CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG) 402*9880d681SAndroid Build Coastguard Worker if (CMAKE_COMPILER_IS_GNUCXX) 403*9880d681SAndroid Build Coastguard Worker append("-Wno-missing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 404*9880d681SAndroid Build Coastguard Worker else() 405*9880d681SAndroid Build Coastguard Worker append("-Wmissing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 406*9880d681SAndroid Build Coastguard Worker endif() 407*9880d681SAndroid Build Coastguard Worker endif() 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Worker append_if(LLVM_ENABLE_PEDANTIC "-pedantic" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 410*9880d681SAndroid Build Coastguard Worker append_if(LLVM_ENABLE_PEDANTIC "-Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 411*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-Wcovered-switch-default" COVERED_SWITCH_DEFAULT_FLAG) 412*9880d681SAndroid Build Coastguard Worker append_if(USE_NO_UNINITIALIZED "-Wno-uninitialized" CMAKE_CXX_FLAGS) 413*9880d681SAndroid Build Coastguard Worker append_if(USE_NO_MAYBE_UNINITIALIZED "-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS) 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Worker # Check if -Wnon-virtual-dtor warns even though the class is marked final. 416*9880d681SAndroid Build Coastguard Worker # If it does, don't add it. So it won't be added on clang 3.4 and older. 417*9880d681SAndroid Build Coastguard Worker # This also catches cases when -Wnon-virtual-dtor isn't supported by 418*9880d681SAndroid Build Coastguard Worker # the compiler at all. This flag is not activated for gcc since it will 419*9880d681SAndroid Build Coastguard Worker # incorrectly identify a protected non-virtual base when there is a friend 420*9880d681SAndroid Build Coastguard Worker # declaration. 421*9880d681SAndroid Build Coastguard Worker if (NOT CMAKE_COMPILER_IS_GNUCXX) 422*9880d681SAndroid Build Coastguard Worker set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) 423*9880d681SAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11 -Werror=non-virtual-dtor") 424*9880d681SAndroid Build Coastguard Worker CHECK_CXX_SOURCE_COMPILES("class base {public: virtual void anchor();protected: ~base();}; 425*9880d681SAndroid Build Coastguard Worker class derived final : public base { public: ~derived();}; 426*9880d681SAndroid Build Coastguard Worker int main() { return 0; }" 427*9880d681SAndroid Build Coastguard Worker CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR) 428*9880d681SAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) 429*9880d681SAndroid Build Coastguard Worker append_if(CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR 430*9880d681SAndroid Build Coastguard Worker "-Wnon-virtual-dtor" CMAKE_CXX_FLAGS) 431*9880d681SAndroid Build Coastguard Worker endif() 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Worker # Enable -Wdelete-non-virtual-dtor if available. 434*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-Wdelete-non-virtual-dtor" DELETE_NON_VIRTUAL_DTOR_FLAG) 435*9880d681SAndroid Build Coastguard Worker 436*9880d681SAndroid Build Coastguard Worker # Check if -Wcomment is OK with an // comment ending with '\' if the next 437*9880d681SAndroid Build Coastguard Worker # line is also a // comment. 438*9880d681SAndroid Build Coastguard Worker set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) 439*9880d681SAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror -Wcomment") 440*9880d681SAndroid Build Coastguard Worker CHECK_C_SOURCE_COMPILES("// \\\\\\n//\\nint main() {return 0;}" 441*9880d681SAndroid Build Coastguard Worker C_WCOMMENT_ALLOWS_LINE_WRAP) 442*9880d681SAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) 443*9880d681SAndroid Build Coastguard Worker if (NOT C_WCOMMENT_ALLOWS_LINE_WRAP) 444*9880d681SAndroid Build Coastguard Worker append("-Wno-comment" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 445*9880d681SAndroid Build Coastguard Worker endif() 446*9880d681SAndroid Build Coastguard Worker endif (LLVM_ENABLE_WARNINGS) 447*9880d681SAndroid Build Coastguard Worker append_if(LLVM_ENABLE_WERROR "-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 448*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-Werror=date-time" WERROR_DATE_TIME) 449*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_CXX1Y) 450*9880d681SAndroid Build Coastguard Worker check_cxx_compiler_flag("-std=c++1y" CXX_SUPPORTS_CXX1Y) 451*9880d681SAndroid Build Coastguard Worker append_if(CXX_SUPPORTS_CXX1Y "-std=c++1y" CMAKE_CXX_FLAGS) 452*9880d681SAndroid Build Coastguard Worker else() 453*9880d681SAndroid Build Coastguard Worker check_cxx_compiler_flag("-std=c++11" CXX_SUPPORTS_CXX11) 454*9880d681SAndroid Build Coastguard Worker if (CXX_SUPPORTS_CXX11) 455*9880d681SAndroid Build Coastguard Worker if (CYGWIN OR MINGW) 456*9880d681SAndroid Build Coastguard Worker # MinGW and Cygwin are a bit stricter and lack things like 457*9880d681SAndroid Build Coastguard Worker # 'strdup', 'stricmp', etc in c++11 mode. 458*9880d681SAndroid Build Coastguard Worker append("-std=gnu++11" CMAKE_CXX_FLAGS) 459*9880d681SAndroid Build Coastguard Worker else() 460*9880d681SAndroid Build Coastguard Worker append("-std=c++11" CMAKE_CXX_FLAGS) 461*9880d681SAndroid Build Coastguard Worker endif() 462*9880d681SAndroid Build Coastguard Worker else() 463*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "LLVM requires C++11 support but the '-std=c++11' flag isn't supported.") 464*9880d681SAndroid Build Coastguard Worker endif() 465*9880d681SAndroid Build Coastguard Worker endif() 466*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_MODULES) 467*9880d681SAndroid Build Coastguard Worker set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) 468*9880d681SAndroid Build Coastguard Worker set(module_flags "-fmodules -fmodules-cache-path=module.cache") 469*9880d681SAndroid Build Coastguard Worker if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 470*9880d681SAndroid Build Coastguard Worker # On Darwin -fmodules does not imply -fcxx-modules. 471*9880d681SAndroid Build Coastguard Worker set(module_flags "${module_flags} -fcxx-modules") 472*9880d681SAndroid Build Coastguard Worker endif() 473*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY) 474*9880d681SAndroid Build Coastguard Worker set(module_flags "${module_flags} -Xclang -fmodules-local-submodule-visibility") 475*9880d681SAndroid Build Coastguard Worker endif() 476*9880d681SAndroid Build Coastguard Worker if (LLVM_ENABLE_MODULE_DEBUGGING AND 477*9880d681SAndroid Build Coastguard Worker ((uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") OR 478*9880d681SAndroid Build Coastguard Worker (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO"))) 479*9880d681SAndroid Build Coastguard Worker set(module_flags "${module_flags} -gmodules") 480*9880d681SAndroid Build Coastguard Worker endif() 481*9880d681SAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${module_flags}") 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Worker # Check that we can build code with modules enabled, and that repeatedly 484*9880d681SAndroid Build Coastguard Worker # including <cassert> still manages to respect NDEBUG properly. 485*9880d681SAndroid Build Coastguard Worker CHECK_CXX_SOURCE_COMPILES("#undef NDEBUG 486*9880d681SAndroid Build Coastguard Worker #include <cassert> 487*9880d681SAndroid Build Coastguard Worker #define NDEBUG 488*9880d681SAndroid Build Coastguard Worker #include <cassert> 489*9880d681SAndroid Build Coastguard Worker int main() { assert(this code is not compiled); }" 490*9880d681SAndroid Build Coastguard Worker CXX_SUPPORTS_MODULES) 491*9880d681SAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) 492*9880d681SAndroid Build Coastguard Worker if (CXX_SUPPORTS_MODULES) 493*9880d681SAndroid Build Coastguard Worker append("${module_flags}" CMAKE_CXX_FLAGS) 494*9880d681SAndroid Build Coastguard Worker else() 495*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "LLVM_ENABLE_MODULES is not supported by this compiler") 496*9880d681SAndroid Build Coastguard Worker endif() 497*9880d681SAndroid Build Coastguard Worker endif(LLVM_ENABLE_MODULES) 498*9880d681SAndroid Build Coastguard Workerendif( MSVC ) 499*9880d681SAndroid Build Coastguard Worker 500*9880d681SAndroid Build Coastguard Workermacro(append_common_sanitizer_flags) 501*9880d681SAndroid Build Coastguard Worker if (NOT MSVC) 502*9880d681SAndroid Build Coastguard Worker # Append -fno-omit-frame-pointer and turn on debug info to get better 503*9880d681SAndroid Build Coastguard Worker # stack traces. 504*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-fno-omit-frame-pointer" FNO_OMIT_FRAME_POINTER) 505*9880d681SAndroid Build Coastguard Worker if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND 506*9880d681SAndroid Build Coastguard Worker NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO") 507*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-gline-tables-only" GLINE_TABLES_ONLY) 508*9880d681SAndroid Build Coastguard Worker endif() 509*9880d681SAndroid Build Coastguard Worker # Use -O1 even in debug mode, otherwise sanitizers slowdown is too large. 510*9880d681SAndroid Build Coastguard Worker if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") 511*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-O1" O1) 512*9880d681SAndroid Build Coastguard Worker endif() 513*9880d681SAndroid Build Coastguard Worker elseif (CLANG_CL) 514*9880d681SAndroid Build Coastguard Worker # Keep frame pointers around. 515*9880d681SAndroid Build Coastguard Worker append("/Oy-" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 516*9880d681SAndroid Build Coastguard Worker if (CMAKE_LINKER MATCHES "lld-link.exe") 517*9880d681SAndroid Build Coastguard Worker # Use DWARF debug info with LLD. 518*9880d681SAndroid Build Coastguard Worker append("-gdwarf" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 519*9880d681SAndroid Build Coastguard Worker else() 520*9880d681SAndroid Build Coastguard Worker # Enable codeview otherwise. 521*9880d681SAndroid Build Coastguard Worker append("/Z7" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 522*9880d681SAndroid Build Coastguard Worker endif() 523*9880d681SAndroid Build Coastguard Worker # Always ask the linker to produce symbols with asan. 524*9880d681SAndroid Build Coastguard Worker append("-debug" CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) 525*9880d681SAndroid Build Coastguard Worker endif() 526*9880d681SAndroid Build Coastguard Workerendmacro() 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Worker# Turn on sanitizers if necessary. 529*9880d681SAndroid Build Coastguard Workerif(LLVM_USE_SANITIZER) 530*9880d681SAndroid Build Coastguard Worker if (LLVM_ON_UNIX) 531*9880d681SAndroid Build Coastguard Worker if (LLVM_USE_SANITIZER STREQUAL "Address") 532*9880d681SAndroid Build Coastguard Worker append_common_sanitizer_flags() 533*9880d681SAndroid Build Coastguard Worker append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 534*9880d681SAndroid Build Coastguard Worker elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?") 535*9880d681SAndroid Build Coastguard Worker append_common_sanitizer_flags() 536*9880d681SAndroid Build Coastguard Worker append("-fsanitize=memory" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 537*9880d681SAndroid Build Coastguard Worker if(LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins") 538*9880d681SAndroid Build Coastguard Worker append("-fsanitize-memory-track-origins" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 539*9880d681SAndroid Build Coastguard Worker endif() 540*9880d681SAndroid Build Coastguard Worker elseif (LLVM_USE_SANITIZER STREQUAL "Undefined") 541*9880d681SAndroid Build Coastguard Worker append_common_sanitizer_flags() 542*9880d681SAndroid Build Coastguard Worker append("-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all" 543*9880d681SAndroid Build Coastguard Worker CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 544*9880d681SAndroid Build Coastguard Worker elseif (LLVM_USE_SANITIZER STREQUAL "Thread") 545*9880d681SAndroid Build Coastguard Worker append_common_sanitizer_flags() 546*9880d681SAndroid Build Coastguard Worker append("-fsanitize=thread" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 547*9880d681SAndroid Build Coastguard Worker elseif (LLVM_USE_SANITIZER STREQUAL "Address;Undefined" OR 548*9880d681SAndroid Build Coastguard Worker LLVM_USE_SANITIZER STREQUAL "Undefined;Address") 549*9880d681SAndroid Build Coastguard Worker append_common_sanitizer_flags() 550*9880d681SAndroid Build Coastguard Worker append("-fsanitize=address,undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all" 551*9880d681SAndroid Build Coastguard Worker CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 552*9880d681SAndroid Build Coastguard Worker else() 553*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}") 554*9880d681SAndroid Build Coastguard Worker endif() 555*9880d681SAndroid Build Coastguard Worker elseif(MSVC) 556*9880d681SAndroid Build Coastguard Worker if (LLVM_USE_SANITIZER STREQUAL "Address") 557*9880d681SAndroid Build Coastguard Worker append_common_sanitizer_flags() 558*9880d681SAndroid Build Coastguard Worker append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 559*9880d681SAndroid Build Coastguard Worker else() 560*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${LLVM_USE_SANITIZER}") 561*9880d681SAndroid Build Coastguard Worker endif() 562*9880d681SAndroid Build Coastguard Worker else() 563*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "LLVM_USE_SANITIZER is not supported on this platform.") 564*9880d681SAndroid Build Coastguard Worker endif() 565*9880d681SAndroid Build Coastguard Worker if (LLVM_USE_SANITIZE_COVERAGE) 566*9880d681SAndroid Build Coastguard Worker append("-fsanitize-coverage=edge,indirect-calls,8bit-counters,trace-cmp" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 567*9880d681SAndroid Build Coastguard Worker endif() 568*9880d681SAndroid Build Coastguard Workerendif() 569*9880d681SAndroid Build Coastguard Worker 570*9880d681SAndroid Build Coastguard Worker# Turn on -gsplit-dwarf if requested 571*9880d681SAndroid Build Coastguard Workerif(LLVM_USE_SPLIT_DWARF) 572*9880d681SAndroid Build Coastguard Worker add_definitions("-gsplit-dwarf") 573*9880d681SAndroid Build Coastguard Workerendif() 574*9880d681SAndroid Build Coastguard Worker 575*9880d681SAndroid Build Coastguard Workeradd_llvm_definitions( -D__STDC_CONSTANT_MACROS ) 576*9880d681SAndroid Build Coastguard Workeradd_llvm_definitions( -D__STDC_FORMAT_MACROS ) 577*9880d681SAndroid Build Coastguard Workeradd_llvm_definitions( -D__STDC_LIMIT_MACROS ) 578*9880d681SAndroid Build Coastguard Worker 579*9880d681SAndroid Build Coastguard Worker# clang doesn't print colored diagnostics when invoked from Ninja 580*9880d681SAndroid Build Coastguard Workerif (UNIX AND 581*9880d681SAndroid Build Coastguard Worker CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND 582*9880d681SAndroid Build Coastguard Worker CMAKE_GENERATOR STREQUAL "Ninja") 583*9880d681SAndroid Build Coastguard Worker append("-fcolor-diagnostics" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 584*9880d681SAndroid Build Coastguard Workerendif() 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Worker# Add flags for add_dead_strip(). 587*9880d681SAndroid Build Coastguard Worker# FIXME: With MSVS, consider compiling with /Gy and linking with /OPT:REF? 588*9880d681SAndroid Build Coastguard Worker# But MinSizeRel seems to add that automatically, so maybe disable these 589*9880d681SAndroid Build Coastguard Worker# flags instead if LLVM_NO_DEAD_STRIP is set. 590*9880d681SAndroid Build Coastguard Workerif(NOT CYGWIN AND NOT WIN32) 591*9880d681SAndroid Build Coastguard Worker if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND 592*9880d681SAndroid Build Coastguard Worker NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") 593*9880d681SAndroid Build Coastguard Worker check_c_compiler_flag("-Werror -fno-function-sections" C_SUPPORTS_FNO_FUNCTION_SECTIONS) 594*9880d681SAndroid Build Coastguard Worker if (C_SUPPORTS_FNO_FUNCTION_SECTIONS) 595*9880d681SAndroid Build Coastguard Worker # Don't add -ffunction-section if it can be disabled with -fno-function-sections. 596*9880d681SAndroid Build Coastguard Worker # Doing so will break sanitizers. 597*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-ffunction-sections" FFUNCTION_SECTIONS) 598*9880d681SAndroid Build Coastguard Worker endif() 599*9880d681SAndroid Build Coastguard Worker add_flag_if_supported("-fdata-sections" FDATA_SECTIONS) 600*9880d681SAndroid Build Coastguard Worker endif() 601*9880d681SAndroid Build Coastguard Workerendif() 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Workerif(MSVC) 604*9880d681SAndroid Build Coastguard Worker # Remove flags here, for exceptions and RTTI. 605*9880d681SAndroid Build Coastguard Worker # Each target property or source property should be responsible to control 606*9880d681SAndroid Build Coastguard Worker # them. 607*9880d681SAndroid Build Coastguard Worker # CL.EXE complains to override flags like "/GR /GR-". 608*9880d681SAndroid Build Coastguard Worker string(REGEX REPLACE "(^| ) */EH[-cs]+ *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 609*9880d681SAndroid Build Coastguard Worker string(REGEX REPLACE "(^| ) */GR-? *( |$)" "\\1 \\2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 610*9880d681SAndroid Build Coastguard Workerendif() 611*9880d681SAndroid Build Coastguard Worker 612*9880d681SAndroid Build Coastguard Worker# Provide public options to globally control RTTI and EH 613*9880d681SAndroid Build Coastguard Workeroption(LLVM_ENABLE_EH "Enable Exception handling" OFF) 614*9880d681SAndroid Build Coastguard Workeroption(LLVM_ENABLE_RTTI "Enable run time type information" OFF) 615*9880d681SAndroid Build Coastguard Workerif(LLVM_ENABLE_EH AND NOT LLVM_ENABLE_RTTI) 616*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "Exception handling requires RTTI. You must set LLVM_ENABLE_RTTI to ON") 617*9880d681SAndroid Build Coastguard Workerendif() 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Workeroption(LLVM_BUILD_INSTRUMENTED "Build LLVM and tools with PGO instrumentation (experimental)" Off) 620*9880d681SAndroid Build Coastguard Workermark_as_advanced(LLVM_BUILD_INSTRUMENTED) 621*9880d681SAndroid Build Coastguard Workerappend_if(LLVM_BUILD_INSTRUMENTED "-fprofile-instr-generate='${LLVM_PROFILE_FILE_PATTERN}'" 622*9880d681SAndroid Build Coastguard Worker CMAKE_CXX_FLAGS 623*9880d681SAndroid Build Coastguard Worker CMAKE_C_FLAGS 624*9880d681SAndroid Build Coastguard Worker CMAKE_EXE_LINKER_FLAGS 625*9880d681SAndroid Build Coastguard Worker CMAKE_SHARED_LINKER_FLAGS) 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Workeroption(LLVM_BUILD_INSTRUMENTED_COVERAGE "Build LLVM and tools with Code Coverage instrumentation (experimental)" Off) 628*9880d681SAndroid Build Coastguard Workermark_as_advanced(LLVM_BUILD_INSTRUMENTED_COVERAGE) 629*9880d681SAndroid Build Coastguard Workerappend_if(LLVM_BUILD_INSTRUMENTED_COVERAGE "-fprofile-instr-generate='${LLVM_PROFILE_FILE_PATTERN}' -fcoverage-mapping" 630*9880d681SAndroid Build Coastguard Worker CMAKE_CXX_FLAGS 631*9880d681SAndroid Build Coastguard Worker CMAKE_C_FLAGS 632*9880d681SAndroid Build Coastguard Worker CMAKE_EXE_LINKER_FLAGS 633*9880d681SAndroid Build Coastguard Worker CMAKE_SHARED_LINKER_FLAGS) 634*9880d681SAndroid Build Coastguard Worker 635*9880d681SAndroid Build Coastguard Workerset(LLVM_ENABLE_LTO OFF CACHE STRING "Build LLVM with LTO. May be specified as Thin or Full to use a particular kind of LTO") 636*9880d681SAndroid Build Coastguard Workerstring(TOUPPER "${LLVM_ENABLE_LTO}" uppercase_LLVM_ENABLE_LTO) 637*9880d681SAndroid Build Coastguard Workerif(uppercase_LLVM_ENABLE_LTO STREQUAL "THIN") 638*9880d681SAndroid Build Coastguard Worker append("-flto=thin" CMAKE_CXX_FLAGS CMAKE_C_FLAGS 639*9880d681SAndroid Build Coastguard Worker CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) 640*9880d681SAndroid Build Coastguard Workerelseif(uppercase_LLVM_ENABLE_LTO STREQUAL "FULL") 641*9880d681SAndroid Build Coastguard Worker append("-flto=full" CMAKE_CXX_FLAGS CMAKE_C_FLAGS 642*9880d681SAndroid Build Coastguard Worker CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) 643*9880d681SAndroid Build Coastguard Workerelseif(LLVM_ENABLE_LTO) 644*9880d681SAndroid Build Coastguard Worker append("-flto" CMAKE_CXX_FLAGS CMAKE_C_FLAGS 645*9880d681SAndroid Build Coastguard Worker CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) 646*9880d681SAndroid Build Coastguard Workerendif() 647*9880d681SAndroid Build Coastguard Worker 648*9880d681SAndroid Build Coastguard Worker# This option makes utils/extract_symbols.py be used to determine the list of 649*9880d681SAndroid Build Coastguard Worker# symbols to export from LLVM tools. This is necessary when using MSVC if you 650*9880d681SAndroid Build Coastguard Worker# want to allow plugins, though note that the plugin has to explicitly link 651*9880d681SAndroid Build Coastguard Worker# against (exactly one) tool so we can't unilaterally turn on 652*9880d681SAndroid Build Coastguard Worker# LLVM_ENABLE_PLUGINS when it's enabled. 653*9880d681SAndroid Build Coastguard Workeroption(LLVM_EXPORT_SYMBOLS_FOR_PLUGINS "Export symbols from LLVM tools so that plugins can import them" OFF) 654*9880d681SAndroid Build Coastguard Workerif(BUILD_SHARED_LIBS AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS) 655*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "BUILD_SHARED_LIBS not compatible with LLVM_EXPORT_SYMBOLS_FOR_PLUGINS") 656*9880d681SAndroid Build Coastguard Workerendif() 657*9880d681SAndroid Build Coastguard Workerif(LLVM_LINK_LLVM_DYLIB AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS) 658*9880d681SAndroid Build Coastguard Worker message(FATAL_ERROR "LLVM_LINK_LLVM_DYLIB not compatible with LLVM_EXPORT_SYMBOLS_FOR_PLUGINS") 659*9880d681SAndroid Build Coastguard Workerendif() 660*9880d681SAndroid Build Coastguard Worker 661*9880d681SAndroid Build Coastguard Worker# Plugin support 662*9880d681SAndroid Build Coastguard Worker# FIXME: Make this configurable. 663*9880d681SAndroid Build Coastguard Workerif(WIN32 OR CYGWIN) 664*9880d681SAndroid Build Coastguard Worker if(BUILD_SHARED_LIBS) 665*9880d681SAndroid Build Coastguard Worker set(LLVM_ENABLE_PLUGINS ON) 666*9880d681SAndroid Build Coastguard Worker else() 667*9880d681SAndroid Build Coastguard Worker set(LLVM_ENABLE_PLUGINS OFF) 668*9880d681SAndroid Build Coastguard Worker endif() 669*9880d681SAndroid Build Coastguard Workerelse() 670*9880d681SAndroid Build Coastguard Worker set(LLVM_ENABLE_PLUGINS ON) 671*9880d681SAndroid Build Coastguard Workerendif() 672