aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2016-11-16 17:27:04 +0000
committerSzabolcs Nagy <nsz@gcc.gnu.org>2016-11-16 17:27:04 +0000
commit0af30954688a9dc1fccdc7579807cb1f46b6ebd6 (patch)
treeaea10529cc9a78a64ef9fc70e98fc3f892d3e7ba /libgfortran
parente38f65725b06aaf41ad62f023c26cfe8b99bb640 (diff)
downloadgcc-0af30954688a9dc1fccdc7579807cb1f46b6ebd6.zip
gcc-0af30954688a9dc1fccdc7579807cb1f46b6ebd6.tar.gz
gcc-0af30954688a9dc1fccdc7579807cb1f46b6ebd6.tar.bz2
[PR libgfortran/78314] Fix ieee_support_halting
ieee_support_halting only checked the availability of status flags, not trapping support. On some targets the later can only be checked at runtime: feenableexcept reports if enabling traps failed. So check trapping support by enabling/disabling it. Updated the test that enabled trapping to check if it is supported. gcc/testsuite/ PR libgfortran/78314 * gfortran.dg/ieee/ieee_6.f90: Use ieee_support_halting. libgfortran/ PR libgfortran/78314 * config/fpu-glibc.h (support_fpu_trap): Use feenableexcept. From-SVN: r242505
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog5
-rw-r--r--libgfortran/config/fpu-glibc.h36
2 files changed, 40 insertions, 1 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 50305af..15fe663 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-16 Szabolcs Nagy <szabolcs.nagy@arm.com>
+
+ PR libgfortran/78314
+ * config/fpu-glibc.h (support_fpu_trap): Use feenableexcept.
+
2016-11-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
Thomas Koenig <tkoenig@gcc.gnu.org>
diff --git a/libgfortran/config/fpu-glibc.h b/libgfortran/config/fpu-glibc.h
index 6e505da..8b29a76 100644
--- a/libgfortran/config/fpu-glibc.h
+++ b/libgfortran/config/fpu-glibc.h
@@ -121,7 +121,41 @@ get_fpu_trap_exceptions (void)
int
support_fpu_trap (int flag)
{
- return support_fpu_flag (flag);
+ int exceptions = 0;
+ int old;
+
+ if (!support_fpu_flag (flag))
+ return 0;
+
+#ifdef FE_INVALID
+ if (flag & GFC_FPE_INVALID) exceptions |= FE_INVALID;
+#endif
+
+#ifdef FE_DIVBYZERO
+ if (flag & GFC_FPE_ZERO) exceptions |= FE_DIVBYZERO;
+#endif
+
+#ifdef FE_OVERFLOW
+ if (flag & GFC_FPE_OVERFLOW) exceptions |= FE_OVERFLOW;
+#endif
+
+#ifdef FE_UNDERFLOW
+ if (flag & GFC_FPE_UNDERFLOW) exceptions |= FE_UNDERFLOW;
+#endif
+
+#ifdef FE_DENORMAL
+ if (flag & GFC_FPE_DENORMAL) exceptions |= FE_DENORMAL;
+#endif
+
+#ifdef FE_INEXACT
+ if (flag & GFC_FPE_INEXACT) exceptions |= FE_INEXACT;
+#endif
+
+ old = feenableexcept (exceptions);
+ if (old == -1)
+ return 0;
+ fedisableexcept (exceptions & ~old);
+ return 1;
}