| |
| 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() |