]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Move some fenv.h override macros to generic math_private.h.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 1 Feb 2018 20:52:59 +0000 (20:52 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 1 Feb 2018 20:52:59 +0000 (20:52 +0000)
Various configurations lacking support for floating-point exceptions
and rounding modes have a math_private.h that overrides certain
functions and macros, internal and external, to avoid references to
FE_* constants that are undefined in those configurations.  For
example, there are unconditional feraiseexcept (FE_INVALID) calls in
generic libm code, and these macro definitions duly define
feraiseexcept to ignore its argument to avoid an error from FE_INVALID
being undefined.

In fact it is easy to tell in an architecture-independent way whether
this is needed, by testing whether FE_ALL_EXCEPT == 0.  Thus, this
patch puts such a test, and feraiseexcept and __feraiseexcept macros,
in the generic math_private.h, so reducing the duplication between
architecture versions of this header.  The feclearexcept macro present
in several versions of this header, and fetestexcept in the tile
version, are not needed; they would have been needed before there were
proper soft-fp fma implementations (when generic versions, that depend
on FE_TOWARDZERO and FE_INEXACT, were being used for configurations
not supporting those features), but aren't needed any more, and so are
removed.

The tile version of this header has several inline functions for
fenv.h functions to optimize calls to them away in such configurations
where they do nothing useful, and all these header versions also have
definitions of some of the libc_fe* internal macros.  I intend to make
those generic in subsequent patches.

Tested with build-many-glibcs.py that installed stripped shared
libraries are unchanged by this patch.

* sysdeps/generic/math_private.h [FE_ALL_EXCEPT == 0]
(feraiseexcept): New macro.
[FE_ALL_EXCEPT == 0] (__feraiseexcept): Likewise.
* sysdeps/m68k/coldfire/nofpu/math_private.h (feraiseexcept):
Remove macro.
(__feraiseexcept): Likewise.
(feclearexcept): Likewise.
* sysdeps/microblaze/math_private.h (feraiseexcept): Likewise.
(__feraiseexcept): Likewise.
(feclearexcept): Likewise.
* sysdeps/nios2/math_private.h (feraiseexcept): Likewise.
(__feraiseexcept): Likewise.
(feclearexcept): Likewise.
* sysdeps/tile/math_private.h (feraiseexcept): Likewise.
(__feraiseexcept): Likewise.
(feclearexcept): Likewise.
(fetestexcept): Likewise.

ChangeLog
sysdeps/generic/math_private.h
sysdeps/m68k/coldfire/nofpu/math_private.h
sysdeps/microblaze/math_private.h
sysdeps/nios2/math_private.h
sysdeps/tile/math_private.h

index e1262c65f1dcbed3d591a3ee257d7717e30901de..4a574f52c3e2239d62435288e59c8eb9340791d3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
 2018-02-01  Joseph Myers  <joseph@codesourcery.com>
 
+       * sysdeps/generic/math_private.h [FE_ALL_EXCEPT == 0]
+       (feraiseexcept): New macro.
+       [FE_ALL_EXCEPT == 0] (__feraiseexcept): Likewise.
+       * sysdeps/m68k/coldfire/nofpu/math_private.h (feraiseexcept):
+       Remove macro.
+       (__feraiseexcept): Likewise.
+       (feclearexcept): Likewise.
+       * sysdeps/microblaze/math_private.h (feraiseexcept): Likewise.
+       (__feraiseexcept): Likewise.
+       (feclearexcept): Likewise.
+       * sysdeps/nios2/math_private.h (feraiseexcept): Likewise.
+       (__feraiseexcept): Likewise.
+       (feclearexcept): Likewise.
+       * sysdeps/tile/math_private.h (feraiseexcept): Likewise.
+       (__feraiseexcept): Likewise.
+       (feclearexcept): Likewise.
+       (fetestexcept): Likewise.
+
        * sysdeps/m68k/coldfire/math-tests.h: New file.
 
        * sysdeps/m68k/fpu/bits/fenv.h: Move to ....
index e4b9d8697f2129095cee68773bc620cb239754ef..acfbd9b6ccf49a9799d3195e4807c06d34a9275c 100644 (file)
@@ -644,4 +644,14 @@ libc_feresetround_noex_ctx (struct rm_ctx *ctx)
   SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround_53bit,          \
                             libc_feresetround_53bit)
 
+/* When no floating-point exceptions are defined in <fenv.h>, make
+   feraiseexcept ignore its argument so that unconditional
+   feraiseexcept calls do not cause errors for undefined exceptions.
+   Define it to expand to a void expression so that any calls testing
+   the result of feraiseexcept do produce errors.  */
+#if FE_ALL_EXCEPT == 0
+# define feraiseexcept(excepts) ((void) 0)
+# define __feraiseexcept(excepts) ((void) 0)
+#endif
+
 #endif /* _MATH_PRIVATE_H_ */
index 879577b5518870dde91ba3f2782a18c0425dcf47..951f026eac9c8e14235fcb385e1aeaefbea93ec5 100644 (file)
@@ -30,9 +30,7 @@
    success in every case.
 
    The overrides for libc_ functions must happen before we include
-   the generic math_private.h, and the overrides for regular
-   <fenv.h> functions must happen afterwards, to avoid clashing with
-   the declarations of those functions.  */
+   the generic math_private.h.  */
 
 #define libc_fesetround(rnd)                   ({ 0; })
 #define libc_fetestexcept(exc)                 ({ 0; })
@@ -45,8 +43,4 @@
 
 #include_next <math_private.h>
 
-#define feraiseexcept(excepts)                 ({ 0; })
-#define __feraiseexcept(excepts)               ({ 0; })
-#define feclearexcept(exc)                     ({ 0; })
-
 #endif
index d82e8bf820c15cf1bf02f1fa3f702fa1d25ff335..1a2c521c07e8241d8495e3ed63d90bc36fe658a9 100644 (file)
@@ -17,9 +17,7 @@
    success in every case.
 
    The overrides for libc_ functions must happen before we include
-   the generic math_private.h, and the overrides for regular
-   <fenv.h> functions must happen afterwards, to avoid clashing with
-   the declarations of those functions.  */
+   the generic math_private.h.  */
 
 #define libc_fesetround(rnd)                   ({ 0; })
 #define libc_fetestexcept(exc)                 ({ 0; })
@@ -32,8 +30,4 @@
 
 #include_next <math_private.h>
 
-#define feraiseexcept(excepts)                 ({ 0; })
-#define __feraiseexcept(excepts)               ({ 0; })
-#define feclearexcept(exc)                     ({ 0; })
-
 #endif
index 373da2a6219a7ff48f0f43df4b992aa49647c204..25140416a8b9929aca830fb9e88080f836d6d7c1 100644 (file)
@@ -16,9 +16,7 @@
    success in every case.
 
    The overrides for libc_ functions must happen before we include
-   the generic math_private.h, and the overrides for regular
-   <fenv.h> functions must happen afterwards, to avoid clashing with
-   the declarations of those functions.  */
+   the generic math_private.h.  */
 
 #define libc_fesetround(rnd)                   ({ 0; })
 #define libc_fetestexcept(exc)                 ({ 0; })
@@ -31,8 +29,4 @@
 
 #include_next <math_private.h>
 
-#define feraiseexcept(excepts)                 ({ 0; })
-#define __feraiseexcept(excepts)               ({ 0; })
-#define feclearexcept(exc)                     ({ 0; })
-
 #endif
index 99daec4093d15fb092f86fe8fa7a1c75c3c465a3..6dc43f4228460bbf3a42b55cf0832ef59b06ac79 100644 (file)
 
 #include_next <math_private.h>
 
-#define feraiseexcept(excepts)                 ({ 0; })
-#define __feraiseexcept(excepts)               ({ 0; })
-#define feclearexcept(exc)                     ({ 0; })
-#define fetestexcept(exc)                      ({ 0; })
 extern inline int fegetenv (fenv_t *__e)       { return 0; }
 extern inline int __fegetenv (fenv_t *__e)     { return 0; }
 extern inline int fesetenv (const fenv_t *__e) { return 0; }