- Verify that the FPU exception flags weren't clobbered as required by C99.
authormartynas <martynas@openbsd.org>
Sun, 29 Dec 2013 05:46:43 +0000 (05:46 +0000)
committermartynas <martynas@openbsd.org>
Sun, 29 Dec 2013 05:46:43 +0000 (05:46 +0000)
- Additionally, test _setjmp and sigsetjmp as implementations are different.

regress/lib/libc/setjmp-fpu/Makefile
regress/lib/libc/setjmp-fpu/_setjmp.c [new file with mode: 0644]
regress/lib/libc/setjmp-fpu/main.c [new file with mode: 0644]
regress/lib/libc/setjmp-fpu/setjmp-fpu.c
regress/lib/libc/setjmp-fpu/setjmp.c [new file with mode: 0644]
regress/lib/libc/setjmp-fpu/sigsetjmp.c [new file with mode: 0644]

index 471de48..33d0f7e 100644 (file)
@@ -1,7 +1,7 @@
-#      $OpenBSD: Makefile,v 1.1 2013/12/29 01:39:44 martynas Exp $
+#      $OpenBSD: Makefile,v 1.2 2013/12/29 05:46:43 martynas Exp $
 
 PROG=  setjmp-fpu
-SRCS=  setjmp-fpu.c
+SRCS=  _setjmp.c main.c setjmp.c sigsetjmp.c
 
 LDADD= -lm
 
diff --git a/regress/lib/libc/setjmp-fpu/_setjmp.c b/regress/lib/libc/setjmp-fpu/_setjmp.c
new file mode 100644 (file)
index 0000000..a10b582
--- /dev/null
@@ -0,0 +1,5 @@
+#define        SETJMP(env, savemask)   _setjmp(env)
+#define        LONGJMP(env, val)       _longjmp(env, val)
+#define        TEST_SETJMP             test__setjmp
+
+#include "setjmp-fpu.c"
diff --git a/regress/lib/libc/setjmp-fpu/main.c b/regress/lib/libc/setjmp-fpu/main.c
new file mode 100644 (file)
index 0000000..43f9b62
--- /dev/null
@@ -0,0 +1,11 @@
+int    test__setjmp(void);
+int    test_setjmp(void);
+int    test_sigsetjmp(void);
+
+int
+main(int argc, char *argv[])
+{
+       return (test__setjmp()
+               | test_setjmp()
+               | test_sigsetjmp());
+}
index bbc562d..45b3c1e 100644 (file)
@@ -2,7 +2,7 @@
 #include <setjmp.h>
 
 int
-main(int argc, char *argv[])
+TEST_SETJMP(int argc, char *argv[])
 {
        jmp_buf env;
        int rv;
@@ -12,23 +12,35 @@ main(int argc, char *argv[])
        fedisableexcept(FE_ALL_EXCEPT);
        feenableexcept(FE_DIVBYZERO);
 
-       rv = setjmp(env);
+       rv = SETJMP(env, 0);
 
-       /* Mess with the FPU control word. */
        if (rv == 0) {
+               fexcept_t flag = FE_OVERFLOW;
+
+               /* Mess with the FPU control word. */
                fesetround(FE_DOWNWARD);
                fedisableexcept(FE_DIVBYZERO);
-               longjmp(env, 1);
-       /* Verify that the FPU control word is preserved. */
+
+               /* Set the FPU exception flags. */
+               fesetexceptflag(&flag, FE_ALL_EXCEPT);
+
+               LONGJMP(env, 1);
        } else if (rv == 1) {
+               fexcept_t flag = 0;
+
+               /* Verify that the FPU control word is preserved. */
                if (fegetround() != FE_UPWARD
                    || fegetexcept() != FE_DIVBYZERO)
                        return (1);
+
+               /* Verify that the FPU exception flags weren't clobbered. */
+               fegetexceptflag(&flag, FE_ALL_EXCEPT);
+               if (flag != FE_OVERFLOW)
+                       return (1);
+
                return (0);
-       /* This is not supposed to happen. */
-       } else {
-               return (1);
        }
 
+       /* This is not supposed to happen. */
        return (1);
 }
diff --git a/regress/lib/libc/setjmp-fpu/setjmp.c b/regress/lib/libc/setjmp-fpu/setjmp.c
new file mode 100644 (file)
index 0000000..04de1df
--- /dev/null
@@ -0,0 +1,5 @@
+#define        SETJMP(env, savemask)   setjmp(env)
+#define        LONGJMP(env, val)       longjmp(env, val)
+#define        TEST_SETJMP             test_setjmp
+
+#include "setjmp-fpu.c"
diff --git a/regress/lib/libc/setjmp-fpu/sigsetjmp.c b/regress/lib/libc/setjmp-fpu/sigsetjmp.c
new file mode 100644 (file)
index 0000000..8ba80e2
--- /dev/null
@@ -0,0 +1,5 @@
+#define        SETJMP(env, savemask)   sigsetjmp(env, savemask)
+#define        LONGJMP(env, val)       siglongjmp(env, val)
+#define        TEST_SETJMP             test_sigsetjmp
+
+#include "setjmp-fpu.c"