]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Simplify NAN definitions.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 31 Aug 2017 16:39:25 +0000 (16:39 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 31 Aug 2017 16:39:25 +0000 (16:39 +0000)
Similar to my patches for HUGE_VAL and INFINITY. this patch eliminates
the bits/nan.h headers.  __builtin_nanf ("") is used to define NAN for
GCC 3.3 and later; the fallback is (0.0f / 0.0f), which is a constant
expression for a quiet NaN of type float, but raises a spurious
"invalid" exception outside static initializers, which seems the best
that can be done purely in standard C.  Again, if anyone actually uses
a compiler with its own incompatible extension for producing a
constant quiet NaN, we can add compiler conditionals.

Tested for x86_64.

*  math/math.h [__USE_ISOC99] (NAN): Define directly here.  Do not
include <bits/nan.h>.
* math/Makefile (headers): Remove bits/nan.h.
* bits/nan.h: Remove.
* sysdeps/ieee754/bits/nan.h: Likewise.
* sysdeps/mips/bits/nan.h: Likewise.

ChangeLog
bits/nan.h [deleted file]
math/Makefile
math/math.h
sysdeps/ieee754/bits/nan.h [deleted file]
sysdeps/mips/bits/nan.h [deleted file]

index 904d375f1c93923d30d2f1a18435a12bf6d26812..a87a9c4852cc4686a8d94c2cf53ada5b618e6996 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2017-08-31  Joseph Myers  <joseph@codesourcery.com>
 
+       *  math/math.h [__USE_ISOC99] (NAN): Define directly here.  Do not
+       include <bits/nan.h>.
+       * math/Makefile (headers): Remove bits/nan.h.
+       * bits/nan.h: Remove.
+       * sysdeps/ieee754/bits/nan.h: Likewise.
+       * sysdeps/mips/bits/nan.h: Likewise.
+
        * math/math.h [__USE_ISOC99] (INFINITY): Define directly here.  Do
        not include <bits/inf.h>.
        * math/Makefile (headers): Remove bits/inf.h.
diff --git a/bits/nan.h b/bits/nan.h
deleted file mode 100644 (file)
index ab38168..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef _MATH_H
-#error "Never use <bits/nan.h> directly; include <math.h> instead."
-#endif
-
-/* This file should define `NAN' on machines that have such things.  */
index b9a06f0ca092d222d9b041c4eea49a4cad98ca33..0601f3ac43c3de6372c48b8d9577e0b50d6852f2 100644 (file)
@@ -23,7 +23,6 @@ include ../Makeconfig
 
 # Installed header files.
 headers                := math.h bits/mathcalls.h bits/mathinline.h \
-                  bits/nan.h \
                   fpu_control.h complex.h bits/cmathcalls.h fenv.h \
                   bits/fenv.h bits/fenvinline.h bits/mathdef.h tgmath.h \
                   bits/math-finite.h bits/math-vector.h \
index 5f5a498b11008901c915569f8b295d51066ff3eb..bbc1ab9bfab12c5369b18d54c292f14f05981be0 100644 (file)
@@ -65,8 +65,15 @@ __BEGIN_DECLS
 #  define INFINITY HUGE_VALF
 # endif
 
-/* Get machine-dependent NAN value (returned for some domain errors).  */
-# include <bits/nan.h>
+/* IEEE Not A Number.  */
+# if __GNUC_PREREQ (3, 3)
+#  define NAN (__builtin_nanf (""))
+# else
+/* This will raise an "invalid" exception outside static initializers,
+   but is the best that can be done in ISO C while remaining a
+   constant expression.  */
+#  define NAN (0.0f / 0.0f)
+# endif
 #endif /* __USE_ISOC99 */
 
 #if __GLIBC_USE (IEC_60559_BFP_EXT)
diff --git a/sysdeps/ieee754/bits/nan.h b/sysdeps/ieee754/bits/nan.h
deleted file mode 100644 (file)
index b6e14f5..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/* `NAN' constant for IEEE 754 machines.
-   Copyright (C) 1992-2017 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/>.  */
-
-#ifndef _MATH_H
-# error "Never use <bits/nan.h> directly; include <math.h> instead."
-#endif
-
-
-/* IEEE Not A Number.  */
-
-#if __GNUC_PREREQ(3,3)
-
-# define NAN   (__builtin_nanf (""))
-
-#elif defined __GNUC__
-
-# define NAN \
-  (__extension__                                                             \
-   ((union { unsigned __l __attribute__ ((__mode__ (__SI__))); float __d; })  \
-    { __l: 0x7fc00000UL }).__d)
-
-#else
-
-# include <endian.h>
-
-# if __BYTE_ORDER == __BIG_ENDIAN
-#  define __qnan_bytes         { 0x7f, 0xc0, 0, 0 }
-# endif
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-#  define __qnan_bytes         { 0, 0, 0xc0, 0x7f }
-# endif
-
-static union { unsigned char __c[4]; float __d; } __qnan_union
-  __attribute__ ((__unused__)) = { __qnan_bytes };
-# define NAN   (__qnan_union.__d)
-
-#endif /* GCC.  */
diff --git a/sysdeps/mips/bits/nan.h b/sysdeps/mips/bits/nan.h
deleted file mode 100644 (file)
index a4a1ef9..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* `NAN' constant for IEEE 754 machines.  MIPS version.
-   Copyright (C) 1992-2017 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/>.  */
-
-#ifndef _MATH_H
-# error "Never use <bits/nan.h> directly; include <math.h> instead."
-#endif
-
-
-/* IEEE Not A Number.  */
-/* In legacy-NaN mode MIPS has the qNaN and sNaN patterns reversed
-   compared to most other architectures.  IEEE 754-1985 left the
-   definition of this open to implementations, and for MIPS the top bit
-   of the mantissa must be SET to indicate a sNaN.  In 2008-NaN mode
-   MIPS aligned to IEEE 754-2008.  */
-
-#if __GNUC_PREREQ(3,3)
-
-# define NAN   (__builtin_nanf (""))
-
-#elif defined __GNUC__
-
-/* No 2008-NaN mode support in any GCC version before 4.9.  */
-
-# define NAN \
-  (__extension__                                                             \
-   ((union { unsigned __l __attribute__ ((__mode__ (__SI__))); float __d; })  \
-    { __l: 0x7fbfffffUL }).__d)
-
-#else
-
-# include <endian.h>
-
-# if __BYTE_ORDER == __BIG_ENDIAN
-#  ifdef __mips_nan2008
-#   define __qnan_bytes                { 0x7f, 0xc0, 0, 0 }
-#  else
-#   define __qnan_bytes                { 0x7f, 0xbf, 0xff, 0xff }
-#  endif
-# endif
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-#  ifdef __mips_nan2008
-#   define __qnan_bytes                { 0, 0, 0xc0, 0x7f }
-#  else
-#   define __qnan_bytes                { 0xff, 0xff, 0xbf, 0x7f }
-#  endif
-# endif
-
-static union { unsigned char __c[4]; float __d; } __qnan_union
-  __attribute__ ((__unused__)) = { __qnan_bytes };
-# define NAN   (__qnan_union.__d)
-
-#endif /* GCC.  */