From 382438d17af9b7ccce3e4d3890cc9b1785f14d71 Mon Sep 17 00:00:00 2001
From: martynas <>
Date: Sun, 29 Dec 2013 05:46:43 +0000
Subject: - Verify that the FPU exception flags weren't clobbered as required
 by C99. - Additionally, test _setjmp and sigsetjmp as implementations are
 different.

---
 src/regress/lib/libc/setjmp-fpu/Makefile     |  4 ++--
 src/regress/lib/libc/setjmp-fpu/_setjmp.c    |  5 +++++
 src/regress/lib/libc/setjmp-fpu/main.c       | 11 +++++++++++
 src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c | 28 ++++++++++++++++++++--------
 src/regress/lib/libc/setjmp-fpu/setjmp.c     |  5 +++++
 src/regress/lib/libc/setjmp-fpu/sigsetjmp.c  |  5 +++++
 6 files changed, 48 insertions(+), 10 deletions(-)
 create mode 100644 src/regress/lib/libc/setjmp-fpu/_setjmp.c
 create mode 100644 src/regress/lib/libc/setjmp-fpu/main.c
 create mode 100644 src/regress/lib/libc/setjmp-fpu/setjmp.c
 create mode 100644 src/regress/lib/libc/setjmp-fpu/sigsetjmp.c

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 @@
-#	$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/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 @@
+#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/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 @@
+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());
+}
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 @@
 #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/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 @@
+#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/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 @@
+#define	SETJMP(env, savemask)	sigsetjmp(env, savemask)
+#define	LONGJMP(env, val)	siglongjmp(env, val)
+#define	TEST_SETJMP		test_sigsetjmp
+
+#include "setjmp-fpu.c"
-- 
cgit v1.2.3-55-g6feb