+2016-08-16 Joseph Myers <joseph@codesourcery.com>
+
+ * math/fesetexcept.c: New file.
+ * sysdeps/i386/fpu/fesetexcept.c: Likewise.
+ * sysdeps/x86_64/fpu/fesetexcept.c: Likewise.
+ * math/fenv.h: Define
+ __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include
+ <bits/libc-header-start.h> instead of including <features.h>.
+ [__GLIBC_USE (IEC_60559_BFP_EXT)] (fesetexcept): New function
+ declaration.
+ * manual/arith.texi (fesetexcept): Document function.
+ * math/Versions (fesetexcept): New libm symbol at version
+ GLIBC_2.25.
+ * math/Makefile (libm-support): Add fesetexcept.
+ (tests): Add test-fesetexcept and test-fesetexcept-traps.
+ * math/test-fesetexcept.c: New file.
+ * math/test-fesetexcept-traps.c: Likewise.
+ * sysdeps/nacl/libm.abilist: Update.
+ * sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
+
2016-08-16 Florian Weimer <fweimer@redhat.com>
* nptl/tst-tls3.c (default_stack_size_in_mb, stack_size_in_mb):
presently cannot avoid being compiled under _GNU_SOURCE, exacerbating the
problem.
+* The fesetexcept function from TS 18661-1:2014 is added to libm.
+
Security related changes:
On ARM EABI (32-bit), generating a backtrace for execution contexts which
non-zero value otherwise.
@end deftypefun
+@comment fenv.h
+@comment ISO
+@deftypefun int fesetexcept (int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+This function sets the supported exception flags indicated by
+@var{excepts}, like @code{feraiseexcept}, but without causing enabled
+traps to be taken. @code{fesetexcept} is from TS 18661-1:2014.
+
+The function returns zero in case the operation was successful, a
+non-zero value otherwise.
+@end deftypefun
+
@comment fenv.h
@comment ISO
@deftypefun int fetestexcept (int @var{excepts})
fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg \
ftestexcept fegetround fesetround fegetenv feholdexcpt \
fesetenv feupdateenv t_exp fedisblxcpt feenablxcpt \
- fegetexcept
+ fegetexcept fesetexcept
libm-calls = \
e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \
test-nearbyint-except-2 test-signgam-uchar test-signgam-uchar-init \
test-signgam-uint test-signgam-uint-init test-signgam-ullong \
test-signgam-ullong-init test-nan-overflow test-nan-payload \
- test-fexcept test-fexcept-traps $(tests-static)
+ test-fexcept test-fexcept-traps test-fesetexcept \
+ test-fesetexcept-traps $(tests-static)
tests-static = test-fpucw-static test-fpucw-ieee-static \
test-signgam-uchar-static test-signgam-uchar-init-static \
test-signgam-uint-static test-signgam-uint-init-static \
nextup; nextupf; nextupl;
nextdown; nextdownf; nextdownl;
}
+ GLIBC_2.25 {
+ fesetexcept;
+ }
}
#ifndef _FENV_H
#define _FENV_H 1
-#include <features.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
/* Get the architecture dependend definitions. The following definitions
are expected to be done:
/* Raise the supported exceptions represented by EXCEPTS. */
extern int feraiseexcept (int __excepts) __THROW;
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+/* Set the supported exception flags represented by EXCEPTS, without
+ causing enabled traps to be taken. */
+extern int fesetexcept (int __excepts) __THROW;
+#endif
+
/* Set complete status for exceptions indicated by EXCEPTS according to
the representation in the object pointed to by FLAGP. */
extern int fesetexceptflag (const fexcept_t *__flagp, int __excepts) __THROW;
--- /dev/null
+/* Set given exception flags.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+ /* This always fails unless nothing needs to be done. */
+ return (excepts != 0);
+}
+stub_warning (fesetexcept)
--- /dev/null
+/* Test fesetexcept: exception traps enabled.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <fenv.h>
+#include <stdio.h>
+#include <math-tests.h>
+
+static int
+do_test (void)
+{
+ int result = 0;
+
+ fedisableexcept (FE_ALL_EXCEPT);
+ int ret = feenableexcept (FE_ALL_EXCEPT);
+ if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT) && (ret == -1))
+ {
+ puts ("feenableexcept (FE_ALL_EXCEPT) not supported, cannot test");
+ return 77;
+ }
+ else if (ret != 0)
+ {
+ puts ("feenableexcept (FE_ALL_EXCEPT) failed");
+ result = 1;
+ return result;
+ }
+
+ if (EXCEPTION_SET_FORCES_TRAP)
+ {
+ puts ("setting exceptions traps, cannot test on this architecture");
+ return 77;
+ }
+ /* Verify fesetexcept does not cause exception traps. */
+ ret = fesetexcept (FE_ALL_EXCEPT);
+ if (ret == 0)
+ puts ("fesetexcept (FE_ALL_EXCEPT) succeeded");
+ else
+ {
+ puts ("fesetexcept (FE_ALL_EXCEPT) failed");
+ if (EXCEPTION_TESTS (float))
+ {
+ puts ("failure of fesetexcept was unexpected");
+ result = 1;
+ }
+ else
+ puts ("failure of fesetexcept OK");
+ }
+ feclearexcept (FE_ALL_EXCEPT);
+
+ return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
--- /dev/null
+/* Test fesetexcept.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <fenv.h>
+#include <stdio.h>
+#include <math-tests.h>
+
+static int
+test_fesetexcept (int exc, const char *exc_name)
+{
+ int result = 0;
+
+ printf ("Testing %s\n", exc_name);
+ feclearexcept (FE_ALL_EXCEPT);
+ int ret = fesetexcept (exc);
+ if (ret == 0)
+ printf ("fesetexcept (%s) succeeded\n", exc_name);
+ else
+ {
+ printf ("fesetexcept (%s) failed\n", exc_name);
+ if (exc == 0 || EXCEPTION_TESTS (float))
+ {
+ puts ("failure of fesetexcept was unexpected");
+ result = 1;
+ }
+ else
+ puts ("failure of fesetexcept OK, skipping further tests");
+ return result;
+ }
+ ret = fetestexcept (FE_ALL_EXCEPT);
+ if (ret != exc)
+ {
+ printf ("raised exceptions %x, expected %x\n",
+ (unsigned int) ret, (unsigned int) exc);
+ result = 1;
+ }
+
+ ret = feraiseexcept (FE_ALL_EXCEPT);
+ if (ret != 0)
+ {
+ if (exc == 0 && !EXCEPTION_TESTS (float))
+ {
+ puts ("feraiseexcept (FE_ALL_EXCEPT) failed, skipping further tests");
+ return result;
+ }
+ puts ("feraiseexcept (FE_ALL_EXCEPT) unexpectedly failed");
+ result = 1;
+ }
+ ret = fesetexcept (exc);
+ if (ret != 0)
+ {
+ puts ("fesetexcept (second test) unexpectedly failed");
+ result = 1;
+ }
+ ret = fetestexcept (FE_ALL_EXCEPT);
+ if (ret != FE_ALL_EXCEPT)
+ {
+ printf ("raised exceptions (second test) %x, expected %x\n",
+ (unsigned int) ret, (unsigned int) FE_ALL_EXCEPT);
+ result = 1;
+ }
+
+ feclearexcept (FE_ALL_EXCEPT);
+ ret = feraiseexcept (FE_ALL_EXCEPT & ~exc);
+ if (ret != 0)
+ {
+ puts ("feraiseexcept (third test) unexpectedly failed");
+ result = 1;
+ }
+ ret = fesetexcept (exc);
+ if (ret != 0)
+ {
+ puts ("fesetexcept (third test) unexpectedly failed");
+ result = 1;
+ }
+ ret = fetestexcept (FE_ALL_EXCEPT);
+ if (ret != FE_ALL_EXCEPT)
+ {
+ printf ("raised exceptions (third test) %x, expected %x\n",
+ (unsigned int) ret, (unsigned int) FE_ALL_EXCEPT);
+ result = 1;
+ }
+
+ return result;
+}
+
+static int
+do_test (void)
+{
+ int result = 0;
+
+ result |= test_fesetexcept (0, "0");
+ result |= test_fesetexcept (FE_ALL_EXCEPT, "FE_ALL_EXCEPT");
+#ifdef FE_DIVBYZERO
+ result |= test_fesetexcept (FE_DIVBYZERO, "FE_DIVBYZERO");
+#endif
+#ifdef FE_INEXACT
+ result |= test_fesetexcept (FE_INEXACT, "FE_INEXACT");
+#endif
+#ifdef FE_INVALID
+ result |= test_fesetexcept (FE_INVALID, "FE_INVALID");
+#endif
+#ifdef FE_OVERFLOW
+ result |= test_fesetexcept (FE_OVERFLOW, "FE_OVERFLOW");
+#endif
+#ifdef FE_UNDERFLOW
+ result |= test_fesetexcept (FE_UNDERFLOW, "FE_UNDERFLOW");
+#endif
+
+ return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
--- /dev/null
+/* Set given exception flags. i386 version.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+ fenv_t temp;
+
+ __asm__ ("fnstenv %0" : "=m" (*&temp));
+ temp.__status_word |= excepts & FE_ALL_EXCEPT;
+ __asm__ ("fldenv %0" : : "m" (*&temp));
+
+ return 0;
+}
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.3.4 GLIBC_2.3.4 A
GLIBC_2.3.4 __c1_cabsf F
GLIBC_2.3.4 __c1_cacosf F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 _LIB_VERSION D 0x4
GLIBC_2.4 __clog10 F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 exp2l F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 _LIB_VERSION D 0x4
GLIBC_2.4 __clog10 F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 exp2l F
_gp_disp _gp_disp A
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.3 GLIBC_2.3 A
GLIBC_2.3 _LIB_VERSION D 0x4
GLIBC_2.3 __clog10 F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 exp2l F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.4 __clog10l F
GLIBC_2.4 __finitel F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
GLIBC_2.4 GLIBC_2.4 A
GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
--- /dev/null
+/* Set given exception flags. x86_64 version.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+ unsigned int mxcsr;
+
+ __asm__ ("stmxcsr %0" : "=m" (*&mxcsr));
+ mxcsr |= excepts & FE_ALL_EXCEPT;
+ __asm__ ("ldmxcsr %0" : : "m" (*&mxcsr));
+
+ return 0;
+}