MSVC: Use dubbed FH4 to make C++ exception handling smaller

Visual Studio 2019 introduced the dubbed FH4 feature
which can make C++ exception handling smaller on x64.
According to the article [1], it's enabled by default
for UWP applications, and Microsoft also use it in
their own widely-known commercial products such as
Office to reduce the binary size.

So make use of this feature for Qt when possible, to
get smaller binary.

As a drive-by, add "/EHs-c-" explicitly to the flags
when we want to disable C++ exception handling.

[1] Official article that introduces dubbed FH4:
https://devblogs.microsoft.com/cppblog/making-cpp-exception-handling-smaller-x64/

Change-Id: I2e3330de477f78372cf7903d0ef7a732b09552a9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
This commit is contained in:
Yuhang Zhao 2021-12-02 17:14:00 +08:00
parent 83f2f27bb6
commit 5074344c9c

View File

@ -148,16 +148,19 @@ function(qt_internal_set_exceptions_flags target exceptions_on)
if(exceptions_on)
if(MSVC)
set(_flag "/EHsc")
if(MSVC_VERSION GREATER_EQUAL 1929)
set(_flag ${_flag} "/d2FH4")
endif()
endif()
else()
set(_defs "QT_NO_EXCEPTIONS")
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
set(_flag "/wd4530" "/wd4577")
set(_flag "/EHs-c-" "/wd4530" "/wd4577")
elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|AppleClang|InteLLLVM")
set(_flag "-fno-exceptions")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
if (MSVC)
set(_flag "/wd4530" "/wd4577")
set(_flag "/EHs-c-" "/wd4530" "/wd4577")
else()
set(_flag "-fno-exceptions")
endif()