From: Remi Gacogne Date: Thu, 1 Jun 2017 15:20:58 +0000 (+0200) Subject: rec: Add support for the new ASAN fiber switch API X-Git-Tag: rec-4.1.0-alpha1~72^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F5362%2Fhead;p=thirdparty%2Fpdns.git rec: Add support for the new ASAN fiber switch API --- diff --git a/m4/pdns_enable_sanitizers.m4 b/m4/pdns_enable_sanitizers.m4 index c392480a0a..6773e1a991 100644 --- a/m4/pdns_enable_sanitizers.m4 +++ b/m4/pdns_enable_sanitizers.m4 @@ -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_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_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 ] )] ) diff --git a/pdns/mtasker_context.hh b/pdns/mtasker_context.hh index 9acff39176..2e35fed329 100644 --- a/pdns/mtasker_context.hh +++ b/pdns/mtasker_context.hh @@ -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 */ }