diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -274,31 +274,25 @@ # Don't use linker optimizations in debug builds since it slows down the # linker in a context where the optimizations are not important. - if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") - if(NOT LLVM_NO_DEAD_STRIP) - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - # ld64's implementation of -dead_strip breaks tools that use plugins. - set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-dead_strip") - elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - # Support for ld -z discard-unused=sections was only added in - # Solaris 11.4. - include(LLVMCheckLinkerFlag) - llvm_check_linker_flag(CXX "-Wl,-z,discard-unused=sections" LINKER_SUPPORTS_Z_DISCARD_UNUSED) - if (LINKER_SUPPORTS_Z_DISCARD_UNUSED) - set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-z,discard-unused=sections") - endif() - elseif(NOT MSVC AND NOT CMAKE_SYSTEM_NAME MATCHES "AIX|OS390") - # TODO Revisit this later on z/OS. - set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,--gc-sections") - endif() - else() #LLVM_NO_DEAD_STRIP - if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") - set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-bnogc") + if(NOT LLVM_NO_DEAD_STRIP) + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + # ld64's implementation of -dead_strip breaks tools that use plugins. + target_link_options(${target_name} PRIVATE "$<$>:-Wl,-dead_strip>") + elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # Support for ld -z discard-unused=sections was only added in + # Solaris 11.4. + include(LLVMCheckLinkerFlag) + llvm_check_linker_flag(CXX "-Wl,-z,discard-unused=sections" LINKER_SUPPORTS_Z_DISCARD_UNUSED) + if (LINKER_SUPPORTS_Z_DISCARD_UNUSED) + target_link_options(${target_name} PRIVATE "$<$>:-Wl,-z,discard-unused=sections>") endif() + elseif(NOT MSVC AND NOT CMAKE_SYSTEM_NAME MATCHES "AIX|OS390") + # TODO Revisit this later on z/OS. + target_link_options(${target_name} PRIVATE "$<$>:-Wl,--gc-sections>") + endif() + else() #LLVM_NO_DEAD_STRIP + if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") + target_link_options(${target_name} PRIVATE "$<$>:-Wl,-bnogc>") endif() endif() diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -30,6 +30,9 @@ 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") string(TOUPPER "${LLVM_ENABLE_LTO}" uppercase_LLVM_ENABLE_LTO) +set(is_c_or_cxx "$,$>") +set(is_not_debug "$>") + # Ninja Job Pool support # The following only works with the Ninja generator in CMake >= 3.0. set(LLVM_PARALLEL_COMPILE_JOBS "" CACHE STRING @@ -65,23 +68,21 @@ endif() # On non-Debug builds cmake automatically defines NDEBUG, so we # explicitly undefine it: - if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" ) - # NOTE: use `add_compile_options` rather than `add_definitions` since - # `add_definitions` does not support generator expressions. - add_compile_options($<$,$>:-UNDEBUG>) - if (MSVC) - # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines. - foreach (flags_var_to_scrub - CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS_MINSIZEREL - CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_C_FLAGS_MINSIZEREL) - string (REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " - "${flags_var_to_scrub}" "${${flags_var_to_scrub}}") - endforeach() - endif() + # NOTE: use `add_compile_options` rather than `add_definitions` since + # `add_definitions` does not support generator expressions. + add_compile_options("$<$:-UNDEBUG>") + if (MSVC) + # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines. + foreach (flags_var_to_scrub + CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS_MINSIZEREL + CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_C_FLAGS_MINSIZEREL) + string (REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " + "${flags_var_to_scrub}" "${${flags_var_to_scrub}}") + endforeach() endif() endif() @@ -259,22 +260,26 @@ endfunction() macro(add_flag_if_supported flag name) - check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}") - append_if("C_SUPPORTS_${name}" "${flag}" CMAKE_C_FLAGS) - check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}") - append_if("CXX_SUPPORTS_${name}" "${flag}" CMAKE_CXX_FLAGS) + string(GENEX_STRIP "${flag}" bare_flag) + check_c_compiler_flag("-Werror ${bare_flag}" "C_SUPPORTS_${name}") + if (${C_SUPPORTS_${name}}) + add_compile_options($<$:${flag}>) + endif() + check_cxx_compiler_flag("-Werror ${bare_flag}" "CXX_SUPPORTS_${name}") + if (${CXX_SUPPORTS_${name}}) + add_compile_options($<$:${flag}>) + endif() endmacro() function(add_flag_or_print_warning flag name) - check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}") - check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}") + string(GENEX_STRIP "${flag}" bare_flag) + check_c_compiler_flag("-Werror ${bare_flag}" "C_SUPPORTS_${name}") + check_cxx_compiler_flag("-Werror ${bare_flag}" "CXX_SUPPORTS_${name}") if (C_SUPPORTS_${name} AND CXX_SUPPORTS_${name}) - message(STATUS "Building with ${flag}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${flag}" PARENT_SCOPE) + message(STATUS "Building with ${bare_flag}") + add_compile_options("$<$,$,$>:${flag}>") else() - message(WARNING "${flag} is not supported.") + message(WARNING "${bare_flag} is not supported.") endif() endfunction() @@ -333,9 +338,8 @@ endif() endif() # GCC for MIPS can miscompile LLVM due to PR37701. - if(CMAKE_COMPILER_IS_GNUCXX AND LLVM_NATIVE_ARCH STREQUAL "Mips" AND - NOT Uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") - add_flag_or_print_warning("-fno-shrink-wrap" FNO_SHRINK_WRAP) + if(CMAKE_COMPILER_IS_GNUCXX AND LLVM_NATIVE_ARCH STREQUAL "Mips") + add_flag_or_print_warning("$<${is_not_debug}>:-fno-shrink-wrap>" FNO_SHRINK_WRAP) endif() # gcc with -O3 -fPIC generates TLS sequences that violate the spec on # Solaris/sparcv9, causing executables created with the system linker @@ -492,12 +496,10 @@ # (/Ob1 vs /Ob2 or -O2 vs -O3). LLVM provides this flag so that users can get # PDBs without changing codegen. option(LLVM_ENABLE_PDB OFF) - if (LLVM_ENABLE_PDB AND uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE") - append("/Zi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + if (LLVM_ENABLE_PDB) + add_compile_options("$<$,${is_c_or_cxx}>:/ZI>") # /DEBUG disables linker GC and ICF, but we want those in Release mode. - append("/DEBUG /OPT:REF /OPT:ICF" - CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS - CMAKE_SHARED_LINKER_FLAGS) + add_link_options($<$:/DEBUG /OPT:REF /OPT:ICF>) endif() # Get all linker flags in upper case form so we can search them. @@ -813,13 +815,10 @@ # Append -fno-omit-frame-pointer and turn on debug info to get better # stack traces. add_flag_if_supported("-fno-omit-frame-pointer" FNO_OMIT_FRAME_POINTER) - if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND - NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO") - add_flag_if_supported("-gline-tables-only" GLINE_TABLES_ONLY) - endif() + add_flag_if_supported("$<$>,$>>:-gline-tables-only>" GLINE_TABLES_ONLY) # Use -O1 even in debug mode, otherwise sanitizers slowdown is too large. - if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND LLVM_OPTIMIZE_SANITIZED_BUILDS) - add_flag_if_supported("-O1" O1) + if (LLVM_OPTIMIZE_SANITIZED_BUILDS) + add_flag_if_supported("$<$:-O1>" O1) endif() else() # Always ask the linker to produce symbols with asan. @@ -936,17 +935,16 @@ endif() # Turn on -gsplit-dwarf if requested in debug builds. -if (LLVM_USE_SPLIT_DWARF AND - ((uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") OR - (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO"))) +if (LLVM_USE_SPLIT_DWARF) # Limit to clang and gcc so far. Add compilers supporting this option. if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - add_compile_options(-gsplit-dwarf) - include(LLVMCheckLinkerFlag) - llvm_check_linker_flag(CXX "-Wl,--gdb-index" LINKER_SUPPORTS_GDB_INDEX) - append_if(LINKER_SUPPORTS_GDB_INDEX "-Wl,--gdb-index" - CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) + add_compile_options($<$,$>:-gsplit-dwarf>) + include(LLVMCheckLinkerFlag) + llvm_check_linker_flag(CXX "-Wl,--gdb-index" LINKER_SUPPORTS_GDB_INDEX) + if (${LINKER_SUPPORTS_GDB_INDEX}) + add_link_options($<$,$>:LINKER:--gdb-index>) + endif() endif() endif() @@ -976,22 +974,19 @@ # But MinSizeRel seems to add that automatically, so maybe disable these # flags instead if LLVM_NO_DEAD_STRIP is set. if(NOT CYGWIN AND NOT MSVC) - if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND - NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") + if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") check_c_compiler_flag("-Werror -fno-function-sections" C_SUPPORTS_FNO_FUNCTION_SECTIONS) if (C_SUPPORTS_FNO_FUNCTION_SECTIONS) # Don't add -ffunction-sections if it can't be disabled with -fno-function-sections. # Doing so will break sanitizers. - add_flag_if_supported("-ffunction-sections" FFUNCTION_SECTIONS) + add_flag_if_supported("$<${is_not_debug}:-ffunction-sections>" FFUNCTION_SECTIONS) elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") - append("-qfuncsect" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + add_compile_options("$<$:-qfuncsect>") endif() - add_flag_if_supported("-fdata-sections" FDATA_SECTIONS) + add_flag_if_supported("$<${is_not_debug}:-fdata-sections>" FDATA_SECTIONS) endif() elseif(MSVC) - if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" ) - append("/Gw" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) - endif() + add_compile_options("$<$:/Gw>") endif() if(MSVC)