summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Noetzli <andres.noetzli@gmail.com>2019-11-16 22:38:34 -0800
committerGitHub <noreply@github.com>2019-11-16 22:38:34 -0800
commit990ff24487fd0b6998231894825eb9cd4610494e (patch)
tree46c037f9feb147de353f906666c8099028e392d6
parent6a24e015ca539d80317276761a42f0117dd43575 (diff)
Add support for ThreadSanitizer instrumentation (#3467)
This commit adds support for compiling CVC4 with ThreadSanitizer instrumentation. This is useful for debugging issues when CVC4 is used in a multi-threaded context (e.g. #3292).
-rw-r--r--CMakeLists.txt15
-rwxr-xr-xconfigure.sh7
-rw-r--r--src/base/configuration.cpp2
-rw-r--r--src/base/configuration.h2
-rw-r--r--src/base/configuration_private.h16
-rw-r--r--src/options/options_handler.cpp1
6 files changed, 41 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 294286e30..fbdd05c95 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -68,6 +68,7 @@ option(ENABLE_GPL "Enable GPL dependencies")
# > only necessary for options set for build types
cvc4_option(ENABLE_ASAN "Enable ASAN build")
cvc4_option(ENABLE_UBSAN "Enable UBSan build")
+cvc4_option(ENABLE_TSAN "Enable TSan build")
cvc4_option(ENABLE_ASSERTIONS "Enable assertions")
cvc4_option(ENABLE_COMP_INC_TRACK
"Enable optimizations for incremental SMT-COMP tracks")
@@ -156,7 +157,7 @@ endif()
# to cmake standards (first letter uppercase).
set(BUILD_TYPES Production Debug Testing Competition)
-if(ENABLE_ASAN OR ENABLE_UBSAN)
+if(ENABLE_ASAN OR ENABLE_UBSAN OR ENABLE_TSAN)
set(CMAKE_BUILD_TYPE Debug)
endif()
@@ -302,6 +303,14 @@ if(ENABLE_UBSAN)
add_definitions(-DCVC4_USE_UBSAN)
endif()
+if(ENABLE_TSAN)
+ # -fsanitize=thread requires CMAKE_REQUIRED_FLAGS to be explicitely set,
+ # otherwise the -fsanitize=thread check will fail while linking.
+ set(CMAKE_REQUIRED_FLAGS -fsanitize=thread)
+ add_required_c_cxx_flag("-fsanitize=thread")
+ unset(CMAKE_REQUIRED_FLAGS)
+endif()
+
if(ENABLE_ASSERTIONS)
add_definitions(-DCVC4_ASSERTIONS)
else()
@@ -542,7 +551,9 @@ print_config("Replay :" ENABLE_REPLAY)
print_config("Statistics :" ENABLE_STATISTICS)
print_config("Tracing :" ENABLE_TRACING)
message("")
-print_config("Asan :" ENABLE_ASAN)
+print_config("ASan :" ENABLE_ASAN)
+print_config("UBSan :" ENABLE_UBSAN)
+print_config("TSan :" ENABLE_TSAN)
print_config("Coverage (gcov) :" ENABLE_COVERAGE)
print_config("Profiling (gprof) :" ENABLE_PROFILING)
print_config("Unit tests :" ENABLE_UNIT_TESTING)
diff --git a/configure.sh b/configure.sh
index 701744570..5763fa7ce 100755
--- a/configure.sh
+++ b/configure.sh
@@ -46,6 +46,7 @@ The following flags enable optional features (disable with --no-<option name>).
--python3 prefer using Python 3 (also for Python bindings)
--asan build with ASan instrumentation
--ubsan build with UBSan instrumentation
+ --tsan build with TSan instrumentation
The following options configure parameterized features.
@@ -110,6 +111,7 @@ buildtype=default
abc=default
asan=default
ubsan=default
+tsan=default
assertions=default
best=default
cadical=default
@@ -174,6 +176,9 @@ do
--ubsan) ubsan=ON;;
--no-ubsan) ubsan=OFF;;
+ --tsan) tsan=ON;;
+ --no-tsan) tsan=OFF;;
+
--assertions) assertions=ON;;
--no-assertions) assertions=OFF;;
@@ -356,6 +361,8 @@ cmake_opts=""
&& cmake_opts="$cmake_opts -DENABLE_ASAN=$asan"
[ $ubsan != default ] \
&& cmake_opts="$cmake_opts -DENABLE_UBSAN=$ubsan"
+[ $tsan != default ] \
+ && cmake_opts="$cmake_opts -DENABLE_TSAN=$tsan"
[ $assertions != default ] \
&& cmake_opts="$cmake_opts -DENABLE_ASSERTIONS=$assertions"
[ $best != default ] \
diff --git a/src/base/configuration.cpp b/src/base/configuration.cpp
index 0400a4e4d..fb4d94f9d 100644
--- a/src/base/configuration.cpp
+++ b/src/base/configuration.cpp
@@ -86,6 +86,8 @@ bool Configuration::isAsanBuild() { return IS_ASAN_BUILD; }
bool Configuration::isUbsanBuild() { return IS_UBSAN_BUILD; }
+bool Configuration::isTsanBuild() { return IS_TSAN_BUILD; }
+
bool Configuration::isCompetitionBuild() {
return IS_COMPETITION_BUILD;
}
diff --git a/src/base/configuration.h b/src/base/configuration.h
index db0cd5cde..60cdd5a9c 100644
--- a/src/base/configuration.h
+++ b/src/base/configuration.h
@@ -67,6 +67,8 @@ public:
static bool isUbsanBuild();
+ static bool isTsanBuild();
+
static bool isCompetitionBuild();
static std::string getPackageName();
diff --git a/src/base/configuration_private.h b/src/base/configuration_private.h
index 82938adb9..f3e76d53b 100644
--- a/src/base/configuration_private.h
+++ b/src/base/configuration_private.h
@@ -178,6 +178,22 @@ namespace CVC4 {
#define IS_UBSAN_BUILD false
#endif /* CVC4_USE_UBSAN */
+#define IS_TSAN_BUILD false
+
+// GCC test
+#if defined(__SANITIZE_THREAD__)
+#undef IS_TSAN_BUILD
+#define IS_TSAN_BUILD true
+#endif /* defined(__SANITIZE_THREAD__) */
+
+// Clang test
+#if defined(__has_feature)
+#if __has_feature(thread_sanitizer)
+#undef IS_TSAN_BUILD
+#define IS_TSAN_BUILD true
+#endif /* __has_feature(thread_sanitizer) */
+#endif /* defined(__has_feature) */
+
}/* CVC4 namespace */
#endif /* CVC4__CONFIGURATION_PRIVATE_H */
diff --git a/src/options/options_handler.cpp b/src/options/options_handler.cpp
index 9fd49864b..d4194d456 100644
--- a/src/options/options_handler.cpp
+++ b/src/options/options_handler.cpp
@@ -2108,6 +2108,7 @@ void OptionsHandler::showConfiguration(std::string option) {
print_config_cond("profiling", Configuration::isProfilingBuild());
print_config_cond("asan", Configuration::isAsanBuild());
print_config_cond("ubsan", Configuration::isUbsanBuild());
+ print_config_cond("tsan", Configuration::isTsanBuild());
print_config_cond("competition", Configuration::isCompetitionBuild());
std::cout << std::endl;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback