]> granicus.if.org Git - llvm/commitdiff
[CMake] Default options for faster executables on MSVC
authorAlexandre Ganea <alexandre.ganea@ubisoft.com>
Tue, 28 May 2019 14:14:48 +0000 (14:14 +0000)
committerAlexandre Ganea <alexandre.ganea@ubisoft.com>
Tue, 28 May 2019 14:14:48 +0000 (14:14 +0000)
Differential Revision: https://reviews.llvm.org/D55056

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361826 91177308-0d34-0410-b5e6-96231b3b80d8

CMakeLists.txt
cmake/modules/ChooseMSVCCRT.cmake
cmake/modules/HandleLLVMOptions.cmake

index 895f9ab7189d172ca7244c1263719fdfda88f344..5862644dff11851ec02abd89acfc50425d01baa2 100644 (file)
@@ -435,6 +435,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" )
index 0e6e1aa55254e51480ba489e54c545c7a6accc25..50bddf83ef54978237392b58df8448a6fb7114f2 100644 (file)
@@ -50,6 +50,17 @@ macro(set_flag_in_var flagsvar regex flag)
   set(${flagsvar} "${${flagsvar}}" CACHE STRING "${flagsvar_docs}" FORCE)
 endmacro(set_flag_in_var)
 
+macro(disable_MT_if_LLDB build message)
+  if (LLVM_TOOL_LLDB_BUILD)
+    if ((NOT ${build} STREQUAL "DEBUG") AND (LLVM_USE_CRT_${build} STREQUAL "MT"))
+      if (LLVM_TOOL_CLANG_BUILD OR LLVM_TOOL_LLD_BUILD)
+        set(performance " This might impact runtime performance for Clang or LLD. Preferably build them separately.")
+      endif()
+      message(WARNING "${message}.${performance}")
+      set(LLVM_USE_CRT_${build} "MD")
+    endif()
+  endif()
+endmacro(disable_MT_if_LLDB)
 
 macro(choose_msvc_crt MSVC_CRT)
   if(LLVM_USE_CRT)
@@ -66,13 +77,26 @@ 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()
+
+      disable_MT_if_LLDB(${build} "Using /MD as required by LLDB")
+
       set(LLVM_USE_CRT_${build}
         "${LLVM_USE_CRT_${build}}"
         CACHE STRING "Specify VC++ CRT to use for ${build_type} configurations."
         FORCE)
       set_property(CACHE LLVM_USE_CRT_${build}
         PROPERTY STRINGS ;${${MSVC_CRT}})
-    endif(NOT LLVM_USE_CRT_${build})
+    else()
+      disable_MT_if_LLDB(${build} "Disabling /MT as required by LLDB")
+    endif()
   endforeach(build_type)
 
   foreach(build_type ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
index cb9a01e1d39f7899cca3692394ec34647c500af0..3154c1487fa293148028dade652354af7095ed00 100644 (file)
@@ -418,6 +418,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)\r
+    foreach(CONFIG RELEASE RELWITHDEBINFO MINSIZEREL)\r
+      foreach(FLAG EXE MODULE SHARED STATIC)\r
+        string(REGEX REPLACE "[-/](INCREMENTAL:YES|INCREMENTAL:NO|INCREMENTAL)" "/INCREMENTAL:NO" CMAKE_${FLAG}_LINKER_FLAGS_${CONFIG} "${CMAKE_${FLAG}_LINKER_FLAGS_${CONFIG}}")\r
+      endforeach()\r
+    endforeach()\r
+  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