]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: Add support for the new ASAN fiber switch API 5362/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 1 Jun 2017 15:20:58 +0000 (17:20 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 13 Jun 2017 14:51:56 +0000 (16:51 +0200)
m4/pdns_enable_sanitizers.m4
pdns/mtasker_context.hh

index c392480a0a1d9b9f6e64ebcc406fd3785832af71..6773e1a9911319d1eed0f9bf3a1bb264e785c73a 100644 (file)
@@ -44,8 +44,37 @@ AC_DEFUN([PDNS_ENABLE_ASAN], [
         AC_CHECK_HEADERS([sanitizer/common_interface_defs.h], asan_headers=yes, asan_headers=no)
         AS_IF([test x"$asan_headers" = "xyes" ],
           [AC_CHECK_DECL(__sanitizer_start_switch_fiber,
-            [ AC_DEFINE([HAVE_FIBER_SANITIZER], [1], [Define if ASAN fiber annotation interface is available.]) ],
-            [ ],
+            [
+              AC_MSG_CHECKING([for the exact signature of __sanitizer_finish_switch_fiber])
+              AC_COMPILE_IFELSE([
+                AC_LANG_PROGRAM(
+                  [#include <sanitizer/common_interface_defs.h>],
+                  [
+                    __sanitizer_finish_switch_fiber(nullptr);
+                  ])
+              ], [
+                AC_MSG_RESULT([a single pointer])
+                AC_DEFINE([HAVE_FIBER_SANITIZER], [1], [Define if ASAN fiber annotation interface is available.])
+                AC_DEFINE(HAVE_SANITIZER_FINISH_SWITCH_FIBER_SINGLE_PTR, [1], [Define to 1 if __sanitizer_finish_switch_fiber takes only a pointer])
+              ], [
+                AC_COMPILE_IFELSE([
+                  AC_LANG_PROGRAM(
+                    [#include <sanitizer/common_interface_defs.h>],
+                    [
+                      __sanitizer_finish_switch_fiber(nullptr, nullptr, nullptr);
+                    ])
+                ], [
+                  AC_MSG_RESULT([three pointers])
+                  AC_DEFINE([HAVE_FIBER_SANITIZER], [1], [Define if ASAN fiber annotation interface is available.])
+                  AC_DEFINE(HAVE_SANITIZER_FINISH_SWITCH_FIBER_THREE_PTRS, [1], [Define to 1 if __sanitizer_finish_switch_fiber takes three pointers])
+                ], [
+                  AC_MSG_RESULT([unknown])
+                  AC_MSG_NOTICE([ASAN fiber switching is not available due to an unknown API version])
+                ])
+              ])
+            ], [
+              AC_MSG_NOTICE([ASAN fiber switching is not available])
+            ],
             [#include <sanitizer/common_interface_defs.h>]
           )]
         )
index 9acff39176d097f3127f5b78f4ab55487cba719d..2e35fed3297e85dbcaaaeb7d631247c5e8d441b7 100644 (file)
@@ -76,7 +76,13 @@ static inline void notifyStackSwitchToKernel()
 static inline void notifyStackSwitchDone()
 {
 #ifdef HAVE_FIBER_SANITIZER
+#ifdef HAVE_SANITIZER_FINISH_SWITCH_FIBER_SINGLE_PTR
   __sanitizer_finish_switch_fiber(nullptr);
+#else /* HAVE_SANITIZER_FINISH_SWITCH_FIBER_SINGLE_PTR */
+#ifdef HAVE_SANITIZER_FINISH_SWITCH_FIBER_THREE_PTRS
+  __sanitizer_finish_switch_fiber(nullptr, nullptr, nullptr);
+#endif /* HAVE_SANITIZER_FINISH_SWITCH_FIBER_THREE_PTRS */
+#endif /* HAVE_SANITIZER_FINISH_SWITCH_FIBER_SINGLE_PTR */
 #endif /* HAVE_FIBER_SANITIZER */
 }