Skip to content

Commit 833da47

Browse files
azeeymergify[bot]
authored andcommitted
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> (cherry picked from commit a3c8e29) # Conflicts: # cmake/IgnSetCompilerFlags.cmake
1 parent 4deb840 commit 833da47

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

cmake/IgnSetCompilerFlags.cmake

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -294,23 +294,40 @@ macro(ign_setup_msvc)
294294
# W2: Warning level 2: significant warnings.
295295
# TODO: Recommend Wall in the future.
296296
# Note: MSVC /Wall generates tons of warnings on gtest code.
297-
set(MSVC_MINIMAL_FLAGS "/Gy /W2")
297+
# bigobj: Increase the number of sections in an object file, which is often needed
298+
# for complex templated code or when using Whole Program Optimization (/GL).
299+
set(MSVC_MINIMAL_FLAGS "/Gy /W2 /bigobj")
298300

299301
# Zi: Produce complete debug information
300302
# Note: We provide Zi to ordinary release mode because it does not impact
301303
# performance and can be helpful for debugging.
302304
set(MSVC_DEBUG_FLAGS "${MSVC_MINIMAL_FLAGS} /Zi")
303305

304-
# GL: Enable Whole Program Optimization
305-
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS} /GL")
306+
option(GZ_MSVC_WPO "Enable Whole Program Optimization on MSVC" ON)
307+
if(GZ_MSVC_WPO)
308+
# GL: Enable Whole Program Optimization
309+
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS} /GL")
306310

311+
<<<<<<< HEAD:cmake/IgnSetCompilerFlags.cmake
307312
# UNDEBUG: Undefine NDEBUG so that assertions can be triggered
308313
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS} /UNDEBUG")
309-
310-
# INCREMENTAL:NO fix LNK4075 warning
311-
# LTCG: need when using /GL above
312-
# see https://docs.microsoft.com/en-us/cpp/build/reference/gl-whole-program-optimization
313-
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO /LTCG")
314+
=======
315+
# Use Release flags for RelWithDebInfo
316+
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS}")
317+
>>>>>>> a3c8e29 (Make Whole Program Optimization (WPO) optional on MSVC (#532)):cmake/GzSetCompilerFlags.cmake
318+
319+
# LTCG: need when using /GL above
320+
set(MSVC_RELEASE_LINKER_FLAGS "/LTCG")
321+
322+
# INCREMENTAL:NO fix LNK4075 warning
323+
# see https://docs.microsoft.com/en-us/cpp/build/reference/gl-whole-program-optimization
324+
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO /LTCG")
325+
else()
326+
set(MSVC_RELEASE_FLAGS "${MSVC_DEBUG_FLAGS}")
327+
set(MSVC_RELWITHDEBINFO_FLAGS "${MSVC_RELEASE_FLAGS}")
328+
set(MSVC_RELEASE_LINKER_FLAGS "")
329+
set(MSVC_RELWITHDEBINFO_LINKER_FLAGS "/INCREMENTAL:NO")
330+
endif()
314331

315332
# cmake automatically provides /Zi /Ob0 /Od /RTC1
316333
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${MSVC_DEBUG_FLAGS}")
@@ -319,11 +336,16 @@ macro(ign_setup_msvc)
319336
# cmake automatically provides /O2 /Ob2 /DNDEBUG
320337
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${MSVC_RELEASE_FLAGS}")
321338
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_RELEASE_FLAGS}")
339+
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
340+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
341+
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} ${MSVC_RELEASE_LINKER_FLAGS}")
322342

323343
# cmake automatically provides /Zi /O2 /Ob1 /DNDEBUG
324344
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_FLAGS}")
325345
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_FLAGS}")
326346
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
347+
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
348+
set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} ${MSVC_RELWITHDEBINFO_LINKER_FLAGS}")
327349

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

0 commit comments

Comments
 (0)