This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Improve math_errhandling
- From: Wilco Dijkstra <Wilco dot Dijkstra at arm dot com>
- To: Joseph Myers <joseph at codesourcery dot com>
- Cc: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>, nd <nd at arm dot com>
- Date: Thu, 21 Dec 2017 19:53:41 +0000
- Subject: Re: [PATCH] Improve math_errhandling
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=Wilco dot Dijkstra at arm dot com;
- Nodisclaimer: True
- References: <HE1PR0801MB2058FC670374E87D486379C783560@HE1PR0801MB2058.eurprd08.prod.outlook.com>,<alpine.DEB.2.20.1711081643590.11470@digraph.polyomino.org.uk>
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
Joseph Myers wrote:
>
> The header definitely needs to check for __FAST_MATH__. There is a case
> for defining math_errhandling to 0 in the __FAST_MATH__ case (a
> nonconforming value, but -ffast-math is a nonconforming mode, and 0
> accurately reflects the situation that neither errno nor exceptions can be
> relied upon in that case) rather than the existing state of being
> undefined (also nonconforming). Note that GCC versions before GCC 5 don't
> define __NO_MATH_ERRNO__ at all.
OK, setting to 0 for __FAST_MATH__ seems reasonable. Here is the revised patch:
Currently math_errhandling is always set to MATH_ERRNO | MATH_ERREXCEPT
even if -fno-math-errno is used. It is not defined at all when fast-math
is used. Set it to 0 with fast-math - this is noncomforming but more
useful than not define math_errhandling at all. Also take __NO_MATH_ERRNO__
into account and update comment.
ChangeLog:
2017-12-21 Wilco Dijkstra <wdijkstr@arm.com>
* math/math.h (math_errhandling): Add __NO_MATH_ERRNO__ check.
--
diff --git a/math/math.h b/math/math.h
index 72d7dc59391af71c4db9634998463b4f947b9f09..9bf0c66e862d15277f8e4f31f3b35b9d4a3ad958 100644
--- a/math/math.h
+++ b/math/math.h
@@ -665,10 +665,16 @@ enum
# define MATH_ERRNO 1 /* errno set by math functions. */
# define MATH_ERREXCEPT 2 /* Exceptions raised by math functions. */
-/* By default all functions support both errno and exception handling.
- In gcc's fast math mode and if inline functions are defined this
- might not be true. */
-# ifndef __FAST_MATH__
+/* By default all math functions support both errno and exception handling
+ (except for soft floating point implementations which may only support
+ errno handling). If errno handling is disabled, exceptions are still
+ supported by GLIBC. Set math_errhandling to 0 with -ffast-math (this is
+ nonconforming but it is more useful than leaving it undefined). */
+# ifdef __FAST_MATH__
+# define math_errhandling 0
+# elif defined __NO_MATH_ERRNO__
+# define math_errhandling (MATH_ERREXCEPT)
+# else
# define math_errhandling (MATH_ERRNO | MATH_ERREXCEPT)
# endif