@@ -264,6 +264,49 @@ if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
264264 string (REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} " )
265265endif ()
266266
267+ function (get_sanitizer_flags OUT_VAR USE_SANITIZER)
268+ set (SANITIZER_FLAGS)
269+ set (USE_SANITIZER "${USE_SANITIZER} " )
270+ # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
271+ # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
272+ if (USE_SANITIZER AND NOT MSVC )
273+ append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer" )
274+ append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only" )
275+
276+ if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
277+ NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO" )
278+ append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only" )
279+ endif ()
280+ if (USE_SANITIZER STREQUAL "Address" )
281+ append_flags(SANITIZER_FLAGS "-fsanitize=address" )
282+ elseif (USE_SANITIZER STREQUAL "HWAddress" )
283+ append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress" )
284+ elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?" )
285+ append_flags(SANITIZER_FLAGS -fsanitize=memory)
286+ if (USE_SANITIZER STREQUAL "MemoryWithOrigins" )
287+ append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins" )
288+ endif ()
289+ elseif (USE_SANITIZER STREQUAL "Undefined" )
290+ append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all" )
291+ elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
292+ USE_SANITIZER STREQUAL "Undefined;Address" )
293+ append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all" )
294+ elseif (USE_SANITIZER STREQUAL "Thread" )
295+ append_flags(SANITIZER_FLAGS -fsanitize=thread)
296+ elseif (USE_SANITIZER STREQUAL "DataFlow" )
297+ append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
298+ else ()
299+ message (WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER} " )
300+ endif ()
301+ elseif (USE_SANITIZER AND MSVC )
302+ message (WARNING "LLVM_USE_SANITIZER is not supported on this platform." )
303+ endif ()
304+ set (${OUT_VAR} "${SANITIZER_FLAGS} " PARENT_SCOPE)
305+ endfunction ()
306+
307+ get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER} " )
308+ list (APPEND LIBCXXABI_COMPILE_FLAGS ${SANITIZER_FLAGS} )
309+
267310# Let the library headers know they are currently being used to build the
268311# library.
269312add_definitions (-D_LIBCXXABI_BUILDING_LIBRARY)
0 commit comments