This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.19-228-g9be36fb


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  9be36fb8cb5bcdab5bbbc7a36388dc9a3d1cc397 (commit)
      from  60a2f3c166cebf56048d00cee47b9ed1969844d6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=9be36fb8cb5bcdab5bbbc7a36388dc9a3d1cc397

commit 9be36fb8cb5bcdab5bbbc7a36388dc9a3d1cc397
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Wed Mar 26 18:59:08 2014 +0000

    Make x86_64 fegetenv preserve exception mask (bug 16198).
    
    Bug 16198 is x86_64 fegetenv wrongly masking exceptions for which
    traps are enabled, because that's a side-effect of the fnstenv
    instruction.  This patch fixes it to use fldenv immediately after
    fnstenv, like the i386 version.  Tested x86_64 and x86.
    
    	[BZ #16198]
    	* sysdeps/x86_64/fpu/fegetenv.c (fegetenv): Use fldenv after
    	fnstenv.
    	* math/test-fenv-preserve.c: New file.
    	* math/Makefile (tests): Add test-fenv-preserve.

diff --git a/ChangeLog b/ChangeLog
index c3d2ada..20af1be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-03-26  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #16198]
+	* sysdeps/x86_64/fpu/fegetenv.c (fegetenv): Use fldenv after
+	fnstenv.
+	* math/test-fenv-preserve.c: New file.
+	* math/Makefile (tests): Add test-fenv-preserve.
+
 2014-03-26  Will Newton <will.newton@linaro.org>
 
 	* benchtests/bench-strtod.c (TIMEOUT): Define to 10.
diff --git a/NEWS b/NEWS
index 1dbce87..6f16584 100644
--- a/NEWS
+++ b/NEWS
@@ -9,10 +9,10 @@ Version 2.20
 
 * The following bugs are resolved with this release:
 
-  15347, 15804, 15894, 16002, 16284, 16357, 16447, 16532, 16545, 16574,
-  16599, 16600, 16609, 16610, 16611, 16613, 16623, 16632, 16634, 16639,
-  16642, 16649, 16670, 16674, 16677, 16680, 16683, 16689, 16695, 16701,
-  16706, 16707, 16712, 16713, 16714, 16731, 16743.
+  15347, 15804, 15894, 16002, 16198, 16284, 16357, 16447, 16532, 16545,
+  16574, 16599, 16600, 16609, 16610, 16611, 16613, 16623, 16632, 16634,
+  16639, 16642, 16649, 16670, 16674, 16677, 16680, 16683, 16689, 16695,
+  16701, 16706, 16707, 16712, 16713, 16714, 16731, 16743.
 
 * Running the testsuite no longer terminates as soon as a test fails.
   Instead, a file tests.sum (xtests.sum from "make xcheck") is generated,
diff --git a/math/Makefile b/math/Makefile
index 09d14a0..c13ca80 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -90,7 +90,7 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
 	test-misc test-fpucw test-fpucw-ieee tst-definitions test-tgmath \
 	test-tgmath-ret bug-nextafter bug-nexttoward bug-tgmath1 \
 	test-tgmath-int test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan \
-	test-fenv-tls $(tests-static)
+	test-fenv-tls test-fenv-preserve $(tests-static)
 tests-static = test-fpucw-static test-fpucw-ieee-static
 # We do the `long double' tests only if this data type is available and
 # distinct from `double'.
diff --git a/sysdeps/x86_64/fpu/fegetenv.c b/math/test-fenv-preserve.c
similarity index 51%
copy from sysdeps/x86_64/fpu/fegetenv.c
copy to math/test-fenv-preserve.c
index 364f917..8288b2c 100644
--- a/sysdeps/x86_64/fpu/fegetenv.c
+++ b/math/test-fenv-preserve.c
@@ -1,5 +1,5 @@
-/* Store current floating-point environment.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
+/* Test fegetenv preserves exception mask (bug 16198).
+   Copyright (C) 2014 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
@@ -17,14 +17,37 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <fenv.h>
+#include <stdio.h>
 
-int
-fegetenv (fenv_t *envp)
+static int
+do_test (void)
 {
-  __asm__ ("fnstenv %0\n"
-	   "stmxcsr %1" : "=m" (*envp), "=m" (envp->__mxcsr));
+  fenv_t env;
 
-  /* Success.  */
-  return 0;
+  if (feenableexcept (FE_INVALID) != 0)
+    {
+      puts ("feenableexcept (FE_INVALID) failed, cannot test");
+      return 0;
+    }
+
+  if (fegetenv (&env) != 0)
+    {
+      puts ("fegetenv failed, cannot test");
+      return 0;
+    }
+
+  int ret = fegetexcept ();
+  if (ret == FE_INVALID)
+    {
+      puts ("fegetenv preserved exception mask, OK");
+      return 0;
+    }
+  else
+    {
+      printf ("fegetexcept returned %d, expected %d\n", ret, FE_INVALID);
+      return 1;
+    }
 }
-libm_hidden_def (fegetenv)
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/sysdeps/x86_64/fpu/fegetenv.c b/sysdeps/x86_64/fpu/fegetenv.c
index 364f917..0e0c269 100644
--- a/sysdeps/x86_64/fpu/fegetenv.c
+++ b/sysdeps/x86_64/fpu/fegetenv.c
@@ -22,6 +22,9 @@ int
 fegetenv (fenv_t *envp)
 {
   __asm__ ("fnstenv %0\n"
+	   /* fnstenv changes the exception mask, so load back the
+	      stored environment.  */
+	   "fldenv %0\n"
 	   "stmxcsr %1" : "=m" (*envp), "=m" (envp->__mxcsr));
 
   /* Success.  */

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                     |    8 +++++
 NEWS                                          |    8 +++---
 math/Makefile                                 |    2 +-
 nptl/tst-spin1.c => math/test-fenv-preserve.c |   35 +++++++++++-------------
 sysdeps/x86_64/fpu/fegetenv.c                 |    3 ++
 5 files changed, 32 insertions(+), 24 deletions(-)
 copy nptl/tst-spin1.c => math/test-fenv-preserve.c (62%)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]