aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/libsodium/m4/ax_check_catchable_segv.m4
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/libsodium/m4/ax_check_catchable_segv.m4')
-rw-r--r--sys/contrib/libsodium/m4/ax_check_catchable_segv.m442
1 files changed, 42 insertions, 0 deletions
diff --git a/sys/contrib/libsodium/m4/ax_check_catchable_segv.m4 b/sys/contrib/libsodium/m4/ax_check_catchable_segv.m4
new file mode 100644
index 000000000000..ec3ca4b698ac
--- /dev/null
+++ b/sys/contrib/libsodium/m4/ax_check_catchable_segv.m4
@@ -0,0 +1,42 @@
+# SYNOPSIS
+#
+# AX_CHECK_CATCHABLE_SEGV
+#
+# DESCRIPTION
+#
+# Check whether segmentation violations can be caught using signal handlers.
+
+#serial 1
+
+AC_DEFUN([AX_CHECK_CATCHABLE_SEGV], [dnl
+ AC_PREREQ(2.64)
+ AS_VAR_PUSHDEF([CACHEVAR], [ax_cv_check_[]_AC_LANG_ABBREV[]CATCHABLE_SEGV])dnl
+ AC_CACHE_CHECK([whether segmentation violations can be caught when using the _AC_LANG compiler], CACHEVAR, [
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[
+#include <signal.h>
+#include <stdlib.h>
+static void sig(int _) { exit(0); }
+ ]], [[
+volatile unsigned char * volatile x = (volatile unsigned char *) malloc(8);
+size_t i;
+
+signal(SIGSEGV, sig);
+signal(SIGBUS, sig);
+#if !defined(__SANITIZE_ADDRESS__) && !defined(__EMSCRIPTEN__)
+for (i = 0; i < 10000000; i += 1024) { x[-i] = x[i] = (unsigned char) i; }
+#endif
+free((void *) x);
+exit(1)
+ ]])],
+ [AS_VAR_SET(CACHEVAR, [yes])],
+ [AS_VAR_SET(CACHEVAR, [no])],
+ [AS_VAR_SET(CACHEVAR, [unknown])]
+ )
+ ])
+ AS_VAR_IF(CACHEVAR, yes,
+ [AC_DEFINE([HAVE_CATCHABLE_SEGV], [1], [Define if segmentation violations can be caught using signal handlers])],
+ [AC_MSG_WARN([On this platform, segmentation violations cannot be caught using signal handlers. This is expected if you enabled a tool such as Address Sanitizer (-fsanitize=address), but be aware that using Address Sanitizer may also significantly reduce performance.])]
+ )
+ AS_VAR_POPDEF([CACHEVAR])dnl
+])