Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add detection for TSan fiber support.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 16 Jan 2020 20:35:55 +0000 (21:35 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 16 Jan 2020 22:10:32 +0000 (23:10 +0100)
MANIFEST.in
src/internal_config.h.in
tools/cmake/DefinePackages.cmake
tools/cmake/Flags.cmake
tools/cmake/test_prog/prog_tsan.cpp [new file with mode: 0644]

index 013c512..4523c60 100644 (file)
@@ -2722,6 +2722,7 @@ include tools/cmake/test_prog/prog_asan.cpp
 include tools/cmake/test_prog/prog_makecontext.c
 include tools/cmake/test_prog/prog_stackgrowth.c
 include tools/cmake/test_prog/prog_stacksetup.c
+include tools/cmake/test_prog/prog_tsan.cpp
 include tools/doxygen/fig2dev_postprocessor.pl
 include tools/doxygen/list_routing_models_examples.sh
 include tools/doxygen/xbt_log_extract_hierarchy.pl
index c87e6ac..ee308f5 100644 (file)
@@ -24,6 +24,7 @@
 
 /* Address Sanitizer */
 #cmakedefine01 HAVE_SANITIZER_THREAD
+#cmakedefine01 HAVE_SANITIZER_THREAD_FIBER_SUPPORT
 #cmakedefine01 HAVE_SANITIZER_ADDRESS
 #cmakedefine01 HAVE_SANITIZER_ADDRESS_FIBER_SUPPORT
 
index ce4f338..07af2e2 100644 (file)
@@ -1089,6 +1089,7 @@ set(CMAKE_SOURCE_FILES
   tools/cmake/test_prog/prog_makecontext.c
   tools/cmake/test_prog/prog_stackgrowth.c
   tools/cmake/test_prog/prog_stacksetup.c
+  tools/cmake/test_prog/prog_tsan.cpp
   tools/cmake/cross-mingw.cmake
   tools/smpi/generate_smpi_defines.pl
   tools/stack-cleaner/as
index b23c24e..7bf32b9 100644 (file)
@@ -228,9 +228,12 @@ if(enable_thread_sanitizer)
     set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -fsanitize=thread -fno-omit-frame-pointer -no-pie")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fno-omit-frame-pointer -no-pie")
     set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -fsanitize=thread -no-pie")
-    set(HAVE_SANITIZER_THREAD TRUE CACHE INTERNAL "")
+    try_compile(HAVE_SANITIZER_THREAD ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_tsan.cpp)
+    try_compile(HAVE_SANITIZER_THREAD_FIBER_SUPPORT ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_tsan.cpp
+      COMPILE_DEFINITIONS -DCHECK_FIBER_SUPPORT)
 else()
     set(HAVE_SANITIZER_THREAD FALSE CACHE INTERNAL "")
+    set(HAVE_SANITIZER_THREAD_FIBER_SUPPORT FALSE CACHE INTERNAL "")
 endif()
 
 if(enable_undefined_sanitizer)
diff --git a/tools/cmake/test_prog/prog_tsan.cpp b/tools/cmake/test_prog/prog_tsan.cpp
new file mode 100644 (file)
index 0000000..41ef8ba
--- /dev/null
@@ -0,0 +1,27 @@
+/* Copyright (c) 2020. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* Check availability of ThreadSanitizer */
+
+#if defined(__has_feature)
+#define HAS_FEATURE(x) __has_feature(x)
+#else
+#define HAS_FEATURE(x) 0
+#endif
+
+#if not HAS_FEATURE(thread_sanitizer) && not defined(__SANITIZE_THREAD__)
+#error "TSan feature not found."
+#endif
+
+#if defined(CHECK_FIBER_SUPPORT)
+#include <sanitizer/tsan_interface.h>
+// Verify the existence of the fiber annotation interface, with the expected signature
+void* (*create_fiber)(unsigned)       = __tsan_create_fiber;
+void (*destroy_fiber)(void*)          = __tsan_destroy_fiber;
+void (*switch_fiber)(void*, unsigned) = __tsan_switch_to_fiber;
+#endif
+
+int main(void) {}