Skip to content

Commit a3c8e29

Browse files
azeeyAddisu Z. Taddese
andauthored
Make Whole Program Optimization (WPO) optional on MSVC (#532)
* Add GZ_MSVC_WPO option to toggle Whole Program Optimization This adds a \GZ_MSVC_WPO\ option (default ON) that controls the injection of \/GL\ and \/LTCG\ on MSVC. It also fixes a bug where \/LTCG\ was only applied to RelWithDebInfo shared linker flags, and not to Release or other target types. \/INCREMENTAL:NO\ is appropriately restricted to RelWithDebInfo. Generated-By: Gemini 3.1 Pro Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai> * Add /bigobj flag to MSVC_MINIMAL_FLAGS Increases the number of sections in an object file to prevent C1128 errors when building complex templated code with Whole Program Optimization (/GL) enabled. Generated-By: Gemini 3.0 Pro --------- Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai> Co-authored-by: Addisu Z. Taddese <addisu@openrobotics.org>
1 parent f7108fa commit a3c8e29

1 file changed

Lines changed: 26 additions & 9 deletions

File tree

cmake/GzSetCompilerFlags.cmake

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -289,23 +289,35 @@ macro(_gz_setup_msvc)
289289
# W2: Warning level 2: significant warnings.
290290
# TODO: Recommend Wall in the future.
291291
# Note: MSVC /Wall generates tons of warnings on gtest code.
292-
set(MSVC_MINIMAL_FLAGS "/Gy /W2")
292+
# bigobj: Increase the number of sections in an object file, which is often needed
293+
# for complex templated code or when using Whole Program Optimization (/GL).
294+
set(MSVC_MINIMAL_FLAGS "/Gy /W2 /bigobj")
293295

294296
# Zi: Produce complete debug information
295297
# Note: We provide Zi to ordinary release mode because it does not impact
296298
# performance and can be helpful for debugging.
297299
set(MSVC_DEBUG_FLAGS "${MSVC_MINIMAL_FLAGS} /Zi")
298300

299-
# GL: Enable Whole Program Optimization
300-
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS} /GL")
301+
option(GZ_MSVC_WPO "Enable Whole Program Optimization on MSVC" ON)
302+
if(GZ_MSVC_WPO)
303+
# GL: Enable Whole Program Optimization
304+
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS} /GL")
301305

302-
# Use Release flags for RelWithDebInfo
303-
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS}")
306+
# Use Release flags for RelWithDebInfo
307+
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS}")
304308

305-
# INCREMENTAL:NO fix LNK4075 warning
306-
# LTCG: need when using /GL above
307-
# see https://docs.microsoft.com/en-us/cpp/build/reference/gl-whole-program-optimization
308-
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO /LTCG")
309+
# LTCG: need when using /GL above
310+
set(MSVC_RELEASE_LINKER_FLAGS "/LTCG")
311+
312+
# INCREMENTAL:NO fix LNK4075 warning
313+
# see https://docs.microsoft.com/en-us/cpp/build/reference/gl-whole-program-optimization
314+
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO /LTCG")
315+
else()
316+
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS}")
317+
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS}")
318+
set(MSVC_RELEASE_LINKER_FLAGS "")
319+
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO")
320+
endif()
309321

310322
# cmake automatically provides /Zi /Ob0 /Od /RTC1
311323
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${MSVC_DEBUG_FLAGS}")
@@ -314,11 +326,16 @@ macro(_gz_setup_msvc)
314326
# cmake automatically provides /O2 /Ob2 /DNDEBUG
315327
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${MSVC_RELEASE_FLAGS}")
316328
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_RELEASE_FLAGS}")
329+
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
330+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
331+
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
317332

318333
# cmake automatically provides /Zi /O2 /Ob1 /DNDEBUG
319334
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_FLAGS}")
320335
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_FLAGS}")
321336
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
337+
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
338+
set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
322339

323340
# cmake automatically provides /O1 /Ob1 /DNDEBUG
324341
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} ${MSVC_MINIMAL_FLAGS}")

0 commit comments

Comments
 (0)