summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt21
1 files changed, 18 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e52a9c41..78871cb2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -168,12 +168,13 @@ else ()
endif ()
set(USE_SANITIZER FALSE)
+
function(SANITIZER NAME FLAGS)
if (${NAME})
if (USE_SANITIZER)
message(FATAL_ERROR "Only one sanitizer allowed")
endif()
- set(USE_SANITIZER TRUE)
+ set(USE_SANITIZER TRUE PARENT_SCOPE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}" PARENT_SCOPE)
endif ()
@@ -182,8 +183,22 @@ SANITIZER(USE_ASAN "-fsanitize=address")
SANITIZER(USE_MSAN "-fsanitize=memory")
SANITIZER(USE_LSAN "-fsanitize=leak")
-set(UBSAN_BLACKLIST ${WABT_SOURCE_DIR}/ubsan.blacklist)
-SANITIZER(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover -fsanitize-blacklist=${UBSAN_BLACKLIST}")
+if (USE_UBSAN)
+ # -fno-sanitize-recover was deprecated, see if we are compiling with a newer
+ # clang that requires -fno-sanitize-recover=all.
+ include(CheckCCompilerFlag)
+ CHECK_CXX_COMPILER_FLAG("-fsanitize=undefined -fno-sanitize-recover -Wall -Werror" HAS_UBSAN_RECOVER_BARE)
+ if (HAS_UBSAN_RECOVER_BARE)
+ SANITIZER(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover -fsanitize-blacklist=${UBSAN_BLACKLIST}")
+ endif()
+ CHECK_CXX_COMPILER_FLAG("-fsanitize=undefined -fno-sanitize-recover=all -Wall -Werror" HAS_UBSAN_RECOVER_ALL)
+ if (HAS_UBSAN_RECOVER_ALL)
+ SANITIZER(USE_UBSAN "-fsanitize=undefined -fno-sanitize-recover=all -fsanitize-blacklist=${UBSAN_BLACKLIST}")
+ endif ()
+ if (NOT USE_SANITIZER)
+ message(FATAL_ERROR "UBSAN is not supported")
+ endif ()
+endif ()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${WABT_SOURCE_DIR}/cmake)
find_package(RE2C)