summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartynas <>2013-12-29 05:46:43 +0000
committermartynas <>2013-12-29 05:46:43 +0000
commit382438d17af9b7ccce3e4d3890cc9b1785f14d71 (patch)
tree6964000d66f90b242941948bbe0914c21628f79c
parentc057fa8b78920eb9c3f036141d89633cdb5a2626 (diff)
downloadopenbsd-382438d17af9b7ccce3e4d3890cc9b1785f14d71.tar.gz
openbsd-382438d17af9b7ccce3e4d3890cc9b1785f14d71.tar.bz2
openbsd-382438d17af9b7ccce3e4d3890cc9b1785f14d71.zip
- Verify that the FPU exception flags weren't clobbered as required by C99.
- Additionally, test _setjmp and sigsetjmp as implementations are different.
-rw-r--r--src/regress/lib/libc/setjmp-fpu/Makefile4
-rw-r--r--src/regress/lib/libc/setjmp-fpu/_setjmp.c5
-rw-r--r--src/regress/lib/libc/setjmp-fpu/main.c11
-rw-r--r--src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c28
-rw-r--r--src/regress/lib/libc/setjmp-fpu/setjmp.c5
-rw-r--r--src/regress/lib/libc/setjmp-fpu/sigsetjmp.c5
6 files changed, 48 insertions, 10 deletions
diff --git a/src/regress/lib/libc/setjmp-fpu/Makefile b/src/regress/lib/libc/setjmp-fpu/Makefile
index 471de4821c..33d0f7e88a 100644
--- a/src/regress/lib/libc/setjmp-fpu/Makefile
+++ b/src/regress/lib/libc/setjmp-fpu/Makefile
@@ -1,7 +1,7 @@
1# $OpenBSD: Makefile,v 1.1 2013/12/29 01:39:44 martynas Exp $ 1# $OpenBSD: Makefile,v 1.2 2013/12/29 05:46:43 martynas Exp $
2 2
3PROG= setjmp-fpu 3PROG= setjmp-fpu
4SRCS= setjmp-fpu.c 4SRCS= _setjmp.c main.c setjmp.c sigsetjmp.c
5 5
6LDADD= -lm 6LDADD= -lm
7 7
diff --git a/src/regress/lib/libc/setjmp-fpu/_setjmp.c b/src/regress/lib/libc/setjmp-fpu/_setjmp.c
new file mode 100644
index 0000000000..a10b582f3f
--- /dev/null
+++ b/src/regress/lib/libc/setjmp-fpu/_setjmp.c
@@ -0,0 +1,5 @@
1#define SETJMP(env, savemask) _setjmp(env)
2#define LONGJMP(env, val) _longjmp(env, val)
3#define TEST_SETJMP test__setjmp
4
5#include "setjmp-fpu.c"
diff --git a/src/regress/lib/libc/setjmp-fpu/main.c b/src/regress/lib/libc/setjmp-fpu/main.c
new file mode 100644
index 0000000000..43f9b6216c
--- /dev/null
+++ b/src/regress/lib/libc/setjmp-fpu/main.c
@@ -0,0 +1,11 @@
1int test__setjmp(void);
2int test_setjmp(void);
3int test_sigsetjmp(void);
4
5int
6main(int argc, char *argv[])
7{
8 return (test__setjmp()
9 | test_setjmp()
10 | test_sigsetjmp());
11}
diff --git a/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c b/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c
index bbc562d6bd..45b3c1ee0e 100644
--- a/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c
+++ b/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c
@@ -2,7 +2,7 @@
2#include <setjmp.h> 2#include <setjmp.h>
3 3
4int 4int
5main(int argc, char *argv[]) 5TEST_SETJMP(int argc, char *argv[])
6{ 6{
7 jmp_buf env; 7 jmp_buf env;
8 int rv; 8 int rv;
@@ -12,23 +12,35 @@ main(int argc, char *argv[])
12 fedisableexcept(FE_ALL_EXCEPT); 12 fedisableexcept(FE_ALL_EXCEPT);
13 feenableexcept(FE_DIVBYZERO); 13 feenableexcept(FE_DIVBYZERO);
14 14
15 rv = setjmp(env); 15 rv = SETJMP(env, 0);
16 16
17 /* Mess with the FPU control word. */
18 if (rv == 0) { 17 if (rv == 0) {
18 fexcept_t flag = FE_OVERFLOW;
19
20 /* Mess with the FPU control word. */
19 fesetround(FE_DOWNWARD); 21 fesetround(FE_DOWNWARD);
20 fedisableexcept(FE_DIVBYZERO); 22 fedisableexcept(FE_DIVBYZERO);
21 longjmp(env, 1); 23
22 /* Verify that the FPU control word is preserved. */ 24 /* Set the FPU exception flags. */
25 fesetexceptflag(&flag, FE_ALL_EXCEPT);
26
27 LONGJMP(env, 1);
23 } else if (rv == 1) { 28 } else if (rv == 1) {
29 fexcept_t flag = 0;
30
31 /* Verify that the FPU control word is preserved. */
24 if (fegetround() != FE_UPWARD 32 if (fegetround() != FE_UPWARD
25 || fegetexcept() != FE_DIVBYZERO) 33 || fegetexcept() != FE_DIVBYZERO)
26 return (1); 34 return (1);
35
36 /* Verify that the FPU exception flags weren't clobbered. */
37 fegetexceptflag(&flag, FE_ALL_EXCEPT);
38 if (flag != FE_OVERFLOW)
39 return (1);
40
27 return (0); 41 return (0);
28 /* This is not supposed to happen. */
29 } else {
30 return (1);
31 } 42 }
32 43
44 /* This is not supposed to happen. */
33 return (1); 45 return (1);
34} 46}
diff --git a/src/regress/lib/libc/setjmp-fpu/setjmp.c b/src/regress/lib/libc/setjmp-fpu/setjmp.c
new file mode 100644
index 0000000000..04de1df302
--- /dev/null
+++ b/src/regress/lib/libc/setjmp-fpu/setjmp.c
@@ -0,0 +1,5 @@
1#define SETJMP(env, savemask) setjmp(env)
2#define LONGJMP(env, val) longjmp(env, val)
3#define TEST_SETJMP test_setjmp
4
5#include "setjmp-fpu.c"
diff --git a/src/regress/lib/libc/setjmp-fpu/sigsetjmp.c b/src/regress/lib/libc/setjmp-fpu/sigsetjmp.c
new file mode 100644
index 0000000000..8ba80e2612
--- /dev/null
+++ b/src/regress/lib/libc/setjmp-fpu/sigsetjmp.c
@@ -0,0 +1,5 @@
1#define SETJMP(env, savemask) sigsetjmp(env, savemask)
2#define LONGJMP(env, val) siglongjmp(env, val)
3#define TEST_SETJMP test_sigsetjmp
4
5#include "setjmp-fpu.c"