Skip to content

Commit c34654e

Browse files
cmake/msvc: unify CRT model and add VTune-safe flags for RelWithDebInfo (#349)
RelWithDebInfo was built with /MD while Release used /MT, creating cross-heap mismatches that crashed in MSVCP140.dll when VTune injected its collector DLLs. Changes ------------ • All build types now use the same C++ runtime (either all static or all dynamic, depending on the MSVC_BUILD_L0_DYNAMIC_VCRUNTIME flag). This prevents the "two-different-heaps" problem that caused the MSVCP140.dll crash when VTune was attached. • For RelWithDebInfo we also turned off “incremental linking” and kept a full PDB file. VTune can read these symbols and no longer trips over the extra jump table that incremental builds add. Bottom line: you can now profile the RelWithDebInfo build in VTune without any access-violation errors.
1 parent 41da2f6 commit c34654e

1 file changed

Lines changed: 27 additions & 11 deletions

File tree

CMakeLists.txt

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,22 @@ endif()
131131
#MSVC compile flags
132132
if(MSVC)
133133
IF (NOT MSVC_BUILD_L0_DYNAMIC_VCRUNTIME)
134-
string(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
135-
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
134+
string(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
135+
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
136+
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
136137
ELSE()
137-
string(REPLACE "/MTd" "/MDd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
138-
string(REPLACE "/MT" "/MD" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
138+
string(REPLACE "/MTd" "/MDd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
139+
string(REPLACE "/MT" "/MD" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
140+
string(REPLACE "/MT" "/MD" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
139141
if(NOT (CMAKE_CXX_FLAGS_RELEASE MATCHES "/MD"))
140142
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
141143
endif()
142144
if(NOT (CMAKE_CXX_FLAGS_DEBUG MATCHES "/MDd"))
143145
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
144146
endif()
147+
if(NOT (CMAKE_CXX_FLAGS_RELWITHDEBINFO MATCHES "/MD"))
148+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MD")
149+
endif()
145150
ENDIF()
146151

147152
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL IntelLLVM)
@@ -158,21 +163,32 @@ if(MSVC)
158163
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
159164

160165
# enable creation of PDB files for Release Builds
161-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
162-
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} ${CMAKE_CXX_LINKER_WRAPPER_FLAG}/DEBUG ${CMAKE_CXX_LINKER_WRAPPER_FLAG}/OPT:REF ${CMAKE_CXX_LINKER_WRAPPER_FLAG}/OPT:ICF")
166+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
167+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zi")
168+
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE
169+
"${CMAKE_SHARED_LINKER_FLAGS_RELEASE} \
170+
${CMAKE_CXX_LINKER_WRAPPER_FLAG}/DEBUG \
171+
${CMAKE_CXX_LINKER_WRAPPER_FLAG}/OPT:REF \
172+
${CMAKE_CXX_LINKER_WRAPPER_FLAG}/OPT:ICF")
173+
174+
# VTune-friendly settings for RelWithDebInfo
175+
set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
176+
"${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} \
177+
${CMAKE_CXX_LINKER_WRAPPER_FLAG}/DEBUG \
178+
${CMAKE_CXX_LINKER_WRAPPER_FLAG}/INCREMENTAL:NO")
163179

164180
# enable CET shadow stack
165181
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG}/CETCOMPAT")
166182

167183
#Use of sccache with MSVC requires workaround of replacing /Zi with /Z7
168184
#https://github.com/mozilla/sccache
169185
if(USE_Z7) #sccache
170-
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
171-
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
172-
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
173-
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
186+
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
187+
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
188+
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
189+
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
174190
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
175-
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
191+
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
176192
endif()
177193

178194
endif()

0 commit comments

Comments
 (0)