From daedb463ee2388697089973affce48cd29ea4bb4 Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Tue, 18 Dec 2018 18:17:00 +0000 Subject: [PATCH] [CMake] Default options for faster executables on MSVC - Disable incremental linking by default. /INCREMENTAL adds extra thunks in the EXE, which makes execution slower. - Set /MT (static CRT lib) by default instead of CMake's default /MD (dll CRT lib). The previous default /MD makes all DLL functions to be thunked, thus making execution slower (memcmp, memset, etc.) - Adds LLVM_ENABLE_INCREMENTAL_LINK which is set to OFF by default. Differential revision: https://reviews.llvm.org/D55056 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349517 91177308-0d34-0410-b5e6-96231b3b80d8 --- CMakeLists.txt | 4 ++++ cmake/modules/ChooseMSVCCRT.cmake | 9 +++++++++ cmake/modules/HandleLLVMOptions.cmake | 8 ++++++++ 3 files changed, 21 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e2e35dcebdb..15f95d2e580 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,6 +370,10 @@ option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF) option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) +if (MSVC) + option(LLVM_ENABLE_INCREMENTAL_LINK "Link incrementally. Enabling it might produce slower executables." OFF) +endif() + option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF) if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" ) diff --git a/cmake/modules/ChooseMSVCCRT.cmake b/cmake/modules/ChooseMSVCCRT.cmake index 0e6e1aa5525..cdd7deec4c8 100644 --- a/cmake/modules/ChooseMSVCCRT.cmake +++ b/cmake/modules/ChooseMSVCCRT.cmake @@ -66,6 +66,15 @@ variables (LLVM_USE_CRT_DEBUG, etc) instead.") get_current_crt(LLVM_USE_CRT_${build} MSVC_CRT_REGEX CMAKE_CXX_FLAGS_${build}) + + # Make /MT the default in Release builds to make them faster + # and avoid the DLL function thunking. + if ((${build} STREQUAL "MINSIZEREL") OR + (${build} STREQUAL "RELEASE") OR + (${build} STREQUAL "RELWITHDEBINFO")) + set(LLVM_USE_CRT_${build} "MT") + endif() + set(LLVM_USE_CRT_${build} "${LLVM_USE_CRT_${build}}" CACHE STRING "Specify VC++ CRT to use for ${build_type} configurations." diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake index 49db3088bbc..e8b0e27e000 100644 --- a/cmake/modules/HandleLLVMOptions.cmake +++ b/cmake/modules/HandleLLVMOptions.cmake @@ -381,6 +381,14 @@ if( MSVC ) # "Enforce type conversion rules". append("/Zc:rvalueCast" CMAKE_CXX_FLAGS) + if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND NOT LLVM_ENABLE_INCREMENTAL_LINK) + foreach(CONFIG RELEASE RELWITHDEBINFO MINSIZEREL) + foreach(FLAG EXE MODULE SHARED STATIC) + string(REGEX REPLACE "[-/](INCREMENTAL:YES|INCREMENTAL:NO|INCREMENTAL)" "/INCREMENTAL:NO" CMAKE_${FLAG}_LINKER_FLAGS_${CONFIG} "${CMAKE_${FLAG}_LINKER_FLAGS_${CONFIG}}") + endforeach() + endforeach() + endif() + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT LLVM_ENABLE_LTO) # clang-cl and cl by default produce non-deterministic binaries because # link.exe /incremental requires a timestamp in the .obj file. clang-cl -- 2.50.1