Add enable_fp_exceptions() function in utils.[ch]
authorSøren Sandmann Pedersen <ssp@redhat.com>
Wed, 20 Oct 2010 17:53:07 +0000 (13:53 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Fri, 17 Dec 2010 21:57:18 +0000 (16:57 -0500)
This function enables floating point traps if possible.

configure.ac
test/utils.c
test/utils.h

index 147e1bf..2570c84 100644 (file)
@@ -639,6 +639,14 @@ if test x$have_getpagesize = xyes; then
    AC_DEFINE(HAVE_GETPAGESIZE, 1, [Whether we have getpagesize()])
 fi
 
+AC_CHECK_HEADER([fenv.h],
+   [AC_DEFINE(HAVE_FENV_H, [1], [Define to 1 if we have <fenv.h>])])
+
+AC_CHECK_LIB(m, feenableexcept, have_feenableexcept=yes, have_feenableexcept=no)
+if test x$have_feenableexcept = xyes; then
+   AC_DEFINE(HAVE_FEENABLEEXCEPT, 1, [Whether we have feenableexcept()])
+fi
+
 AC_CHECK_FUNC(gettimeofday, have_gettimeofday=yes, have_gettimeofday=no)
 AC_CHECK_HEADER(sys/time.h, have_sys_time_h=yes, have_sys_time_h=no)
 if test x$have_gettimeofday = xyes && test x$have_sys_time_h = xyes; then
index f6278fe..a7c55f6 100644 (file)
@@ -1,3 +1,5 @@
+#define _GNU_SOURCE
+
 #include "utils.h"
 #include <signal.h>
 
 #include <sys/mman.h>
 #endif
 
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+#endif
+
 /* Random number seed
  */
 
@@ -469,6 +475,26 @@ fail_after (int seconds, const char *msg)
 #endif
 }
 
+void
+enable_fp_exceptions (void)
+{
+#ifdef HAVE_FENV_H
+#ifdef HAVE_FEENABLEEXCEPT
+    /* Note: we don't enable the FE_INEXACT trap because
+     * that happens quite commonly. It is possible that
+     * over- and underflow should similarly be considered
+     * okay, but for now the test suite passes with them
+     * enabled, and it's useful to know if they start
+     * occuring.
+     */
+    feenableexcept (FE_DIVBYZERO       |
+                   FE_INVALID          |
+                   FE_OVERFLOW         |
+                   FE_UNDERFLOW);
+#endif
+#endif
+}
+
 void *
 aligned_malloc (size_t align, size_t size)
 {
index 2ea4170..bac2916 100644 (file)
@@ -82,6 +82,9 @@ fuzzer_test_main (const char *test_name,
 void
 fail_after (int seconds, const char *msg);
 
+/* If possible, enable traps for floating point exceptions */
+void enable_fp_exceptions(void);
+
 /* A pair of macros which can help to detect corruption of
  * floating point registers after a function call. This may
  * happen if _mm_empty() call is forgotten in MMX/SSE2 fast