blob: a0641f52407ef12566cf62f0d04f3d071168a6b2 [file] [log] [blame]
set(DISPATCH_USE_SANITIZER "" CACHE STRING
"Define the sanitizer used to build binaries and tests.")
if(CMAKE_SYSTEM_NAME STREQUAL Darwin AND DISPATCH_USE_SANITIZER)
message(FATAL_ERROR "building libdispatch with sanitization is not supported on Darwin")
endif()
if(DISPATCH_USE_SANITIZER)
# TODO(compnerd) ensure that the compiler supports these options before adding
# them. At the moment, assume that this will just be used with a GNU
# compatible driver and that the options are spelt correctly in light of that.
add_compile_options("-fno-omit-frame-pointer")
if(CMAKE_BUILD_TYPE MATCHES "Debug")
add_compile_options("-O1")
elseif(NOT CMAKE_BUILD_TYPE MATCHES "Debug" AND
NOT CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
add_compile_options("-gline-tables-only")
endif()
if(LLVM_USE_SANITIZER STREQUAL "Address")
add_compile_options("-fsanitize=address")
elseif(DISPATCH_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
add_compile_options("-fsanitize=memory")
if(DISPATCH_USE_SANITIZER STREQUAL "MemoryWithOrigins")
add_compile_options("-fsanitize-memory-track-origins")
endif()
elseif(DISPATCH_USE_SANITIZER STREQUAL "Undefined")
add_compile_options("-fsanitize=undefined")
add_compile_options("-fno-sanitize=vptr,function")
add_compile_options("-fno-sanitize-recover=all")
elseif(DISPATCH_USE_SANITIZER STREQUAL "Thread")
add_compile_options("-fsanitize=thread")
elseif(DISPATCH_USE_SANITIZER STREQUAL "Address;Undefined" OR
DISPATCH_USE_SANITIZER STREQUAL "Undefined;Address")
add_compile_options("-fsanitize=address,undefined")
add_compile_options("-fno-sanitize=vptr,function")
add_compile_options("-fno-sanitize-recover=all")
elseif(DISPATCH_USE_SANITIZER STREQUAL "Leaks")
add_compile_options("-fsanitize=leak")
else()
message(FATAL_ERROR "unsupported value of DISPATCH_USE_SANITIZER: ${DISPATCH_USE_SANITIZER}")
endif()
endif()