2011-10-12 15:27:51 +00:00
|
|
|
/* Entry points to finite-math-only compiler runs.
|
2017-01-01 00:14:16 +00:00
|
|
|
Copyright (C) 2011-2017 Free Software Foundation, Inc.
|
2011-10-12 15:27:51 +00:00
|
|
|
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
|
2012-02-09 23:18:22 +00:00
|
|
|
License along with the GNU C Library; if not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
#ifndef _MATH_H
|
|
|
|
# error "Never use <bits/math-finite.h> directly; include <math.h> instead."
|
|
|
|
#endif
|
|
|
|
|
2017-03-10 12:47:18 +00:00
|
|
|
#define __REDIRFROM_X(function, reentrant, suffix) \
|
|
|
|
function ## suffix ## reentrant
|
|
|
|
#define __REDIRFROM(...) __REDIRFROM_X(__VA_ARGS__)
|
|
|
|
|
|
|
|
/* Redirect long double versions of the functions to the corresponding
|
|
|
|
double version if __NO_LONG_DOUBLE_MATH is defined. */
|
|
|
|
#if __MATH_DECLARING_LDOUBLE && defined __NO_LONG_DOUBLE_MATH
|
|
|
|
# define __REDIRTO_X(function, reentrant, suffix) \
|
|
|
|
__ ## function ## reentrant ## _finite
|
|
|
|
#else
|
|
|
|
# define __REDIRTO_X(function, reentrant, suffix) \
|
|
|
|
__ ## function ## suffix ## reentrant ## _finite
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
2017-03-10 12:47:18 +00:00
|
|
|
#define __REDIRTO(...) __REDIRTO_X(__VA_ARGS__)
|
|
|
|
|
|
|
|
#define __MATH_REDIRCALL_X(from, args, to) \
|
|
|
|
extern _Mdouble_ __REDIRECT_NTH (from, args, to)
|
|
|
|
#define __MATH_REDIRCALL(function, reentrant, args) \
|
|
|
|
__MATH_REDIRCALL_X \
|
|
|
|
(__REDIRFROM (function, reentrant, _MSUF_), args, \
|
|
|
|
__REDIRTO (function, reentrant, _MSUF_))
|
|
|
|
#define __MATH_REDIRCALL_2(from, reentrant, args, to) \
|
|
|
|
__MATH_REDIRCALL_X \
|
|
|
|
(__REDIRFROM (from, reentrant, _MSUF_), args, \
|
|
|
|
__REDIRTO (to, reentrant, _MSUF_))
|
|
|
|
|
|
|
|
#define __MATH_REDIRCALL_INTERNAL(function, reentrant, args) \
|
|
|
|
__MATH_REDIRCALL_X \
|
|
|
|
(__REDIRFROM (__CONCAT (__, function), \
|
|
|
|
__CONCAT (reentrant, _finite), _MSUF_), \
|
|
|
|
args, __REDIRTO (function, _r, _MSUF_))
|
|
|
|
|
|
|
|
|
|
|
|
/* acos. */
|
|
|
|
__MATH_REDIRCALL (acos, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
2014-02-21 21:45:26 +00:00
|
|
|
#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
|
2011-10-12 15:27:51 +00:00
|
|
|
/* acosh. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (acosh, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* asin. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (asin, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* atan2. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (atan2, , (_Mdouble_, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
2014-02-21 21:45:26 +00:00
|
|
|
#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
|
2011-10-12 15:27:51 +00:00
|
|
|
/* atanh. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (atanh, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* cosh. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (cosh, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
2011-10-16 00:22:59 +00:00
|
|
|
/* exp. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (exp, , (_Mdouble_));
|
2011-10-16 00:22:59 +00:00
|
|
|
|
2011-10-12 15:27:51 +00:00
|
|
|
#ifdef __USE_GNU
|
|
|
|
/* exp10. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (exp10, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* pow10. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL_2 (pow10, , (_Mdouble_), exp10);
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __USE_ISOC99
|
|
|
|
/* exp2. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (exp2, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* fmod. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (fmod, , (_Mdouble_, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
Make bits/math-finite.h conditions match other headers (bug 19205).
bits/math-finite.h declares -ffinite-math-only variants of various
functions under conditions not matching those under which the normal
versions are declared.
* math.h only ever includes bits/mathcalls.h to declare float and long
double functions if __USE_ISOC99, but bits/math-finite.h declares
some float functions regardless (long double ones are conditioned on
__MATH_DECLARE_LDOUBLE). (For C90 functions this isn't a
conformance bug because C90 reserves the float and long double
names, but is still contrary to good glibc practice. For some other
functions in older XSI standards it *is* a conformance bug.)
* Some functions are defined as inlines using lgamma_r functions under
conditions where those lgamma_r functions are not themselves
declared.
* hypot is declared under __USE_XOPEN || __USE_ISOC99 in
bits/mathcalls.h, __USE_ISOC99 only in bits/math-finite.h.
* float and long double versions of Bessel functions should be limited
to __USE_MISC (as in bug 18977).
* gamma should not be declared for __USE_XOPEN2K (as in bug 18967).
* remainder should be restricted to __USE_XOPEN_EXTENDED ||
__USE_ISOC99, not unconditional.
* scalb should not be declared for __USE_XOPEN2K8, and scalbf and
scalbl are non-POSIX (as in bug 18967).
This patch fixes all these issues (it doesn't seem worth splitting
them into separate patches or bugs). I put __USE_ISOC99 conditionals,
where needed, around both float and long double declarations, even
though formally redundant around the long double declarations because
__MATH_DECLARE_LDOUBLE isn't defined without __USE_ISOC99; it seemed
clearer that way. The missing declarations of lgamma_r functions are
dealt with by directly using declarations of __lgamma*_r_finite, in
the implementation namespace, rather than having the inlines rely on
asm redirection of lgamma*_r.
After this patch, there are some apparently redundant nested
__USE_ISOC99 conditionals in lgamma / gamma definitions. These
actually reflect a separate bug (the correct condition for the lgamma
inline functions to set signgam is __USE_MISC || __USE_XOPEN, the
condition under which signgam is declared, rather than disabling
setting it if __USE_ISOC99, which includes XSI POSIX versions for
which signgam *should* be set). They'll be fixed as part of a fix for
that bug, which will also add tests for these inlines. I've put a
note about more general conform/ test coverage for -ffinite-math-only
on
<https://sourceware.org/glibc/wiki/Development_Todo/Master#conformtest_improvements>,
alongside other options for which this is also relevant (some of which
have also had such bugs in the past relating to mismatched
conditionals).
I also intend to enable the main libm-test.inc tests for the
math-finite.h functions, but some other bugs in __*_finite need fixing
first.
[BZ #19205]
* math/bits/math-finite.h (acosf): Condition declaration on
[__USE_ISOC99].
(acosl): Likewise.
(acoshf): Likewise.
(acoshl): Likewise.
(asinf): Likewise.
(asinl): Likewise.
(atan2f): Likewise.
(atan2l): Likewise.
(atanhf): Likewise.
(atanhl): Likewise.
(coshf): Likewise.
(coshl): Likewise.
(expf): Likewise.
(expl): Likewise.
(fmodf): Likewise.
(fmodl): Likewise.
(hypot): Change condition to [__USE_XOPEN || __USE_ISOC99].
(j0f): Change condition to [__USE_MISC && __USE_ISOC99].
(j0l): Likewise.
(y0f): Likewise.
(y0l): Likewise.
(j1f): Likewise.
(j1l): Likewise.
(y1f): Likewise.
(y1l): Likewise.
(jnf): Likewise.
(jnl): Likewise.
(ynf): Likewise.
(ynl): Likewise.
(lgammaf_r): Condition declaration on [__USE_ISOC99].
(lgammal_r): Likewise.
(__lgamma_r_finite): New declaration.
(__lgammaf_r_finite): Likewise.
(__lgammal_r_finite): Likewise.
(lgamma): Use __lgamma_r_finite.
(lgammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(lgammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(gamma): Do not define for [!__USE_MISC && __USE_XOPEN2K]. Use
__lgamma_r_finite.
(gammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(gammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(logf): Condition declaration on [__USE_ISOC99].
(logl): Likewise.
(log10f): Likewise.
(log10l): Likewise.
(ldexpf): Likewise.
(ldexpl): Likewise.
(powf): Likewise.
(powl): Likewise.
(remainder): Condition declaration on [__USE_XOPEN_EXTENDED ||
__USE_ISOC99].
(remainderf): Condition declaration on [__USE_ISOC99].
(remainderl): Likewise.
(scalb): Do not declare for [!__USE_MISC && __USE_XOPEN2K8].
(scalbf): Change condition to [__USE_MISC && __USE_ISOC99].
(scalbl): Likewise.
(sinhf): Condition declaration on [__USE_ISOC99].
(sinhl): Likewise.
(sqrtf): Likewise.
(sqrtl): Likewise.
2015-11-05 00:48:57 +00:00
|
|
|
#if defined __USE_XOPEN || defined __USE_ISOC99
|
2011-10-12 15:27:51 +00:00
|
|
|
/* hypot. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (hypot, , (_Mdouble_, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
2017-03-10 12:47:18 +00:00
|
|
|
#if (__MATH_DECLARING_DOUBLE && (defined __USE_MISC || defined __USE_XOPEN)) \
|
|
|
|
|| (!__MATH_DECLARING_DOUBLE && defined __USE_MISC)
|
2011-10-12 15:27:51 +00:00
|
|
|
/* j0. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (j0, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* y0. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (y0, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* j1. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (j1, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* y1. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (y1, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* jn. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (jn, , (int, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* yn. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (yn, , (int, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __USE_MISC
|
|
|
|
/* lgamma_r. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (lgamma, _r, (_Mdouble_, int *));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
2017-03-10 12:47:18 +00:00
|
|
|
/* Redirect __lgammal_r_finite to __lgamma_r_finite when __NO_LONG_DOUBLE_MATH
|
|
|
|
is set and to itself otherwise. It also redirects __lgamma_r_finite and
|
|
|
|
__lgammaf_r_finite to themselves. */
|
|
|
|
__MATH_REDIRCALL_INTERNAL (lgamma, _r, (_Mdouble_, int *));
|
Make bits/math-finite.h conditions match other headers (bug 19205).
bits/math-finite.h declares -ffinite-math-only variants of various
functions under conditions not matching those under which the normal
versions are declared.
* math.h only ever includes bits/mathcalls.h to declare float and long
double functions if __USE_ISOC99, but bits/math-finite.h declares
some float functions regardless (long double ones are conditioned on
__MATH_DECLARE_LDOUBLE). (For C90 functions this isn't a
conformance bug because C90 reserves the float and long double
names, but is still contrary to good glibc practice. For some other
functions in older XSI standards it *is* a conformance bug.)
* Some functions are defined as inlines using lgamma_r functions under
conditions where those lgamma_r functions are not themselves
declared.
* hypot is declared under __USE_XOPEN || __USE_ISOC99 in
bits/mathcalls.h, __USE_ISOC99 only in bits/math-finite.h.
* float and long double versions of Bessel functions should be limited
to __USE_MISC (as in bug 18977).
* gamma should not be declared for __USE_XOPEN2K (as in bug 18967).
* remainder should be restricted to __USE_XOPEN_EXTENDED ||
__USE_ISOC99, not unconditional.
* scalb should not be declared for __USE_XOPEN2K8, and scalbf and
scalbl are non-POSIX (as in bug 18967).
This patch fixes all these issues (it doesn't seem worth splitting
them into separate patches or bugs). I put __USE_ISOC99 conditionals,
where needed, around both float and long double declarations, even
though formally redundant around the long double declarations because
__MATH_DECLARE_LDOUBLE isn't defined without __USE_ISOC99; it seemed
clearer that way. The missing declarations of lgamma_r functions are
dealt with by directly using declarations of __lgamma*_r_finite, in
the implementation namespace, rather than having the inlines rely on
asm redirection of lgamma*_r.
After this patch, there are some apparently redundant nested
__USE_ISOC99 conditionals in lgamma / gamma definitions. These
actually reflect a separate bug (the correct condition for the lgamma
inline functions to set signgam is __USE_MISC || __USE_XOPEN, the
condition under which signgam is declared, rather than disabling
setting it if __USE_ISOC99, which includes XSI POSIX versions for
which signgam *should* be set). They'll be fixed as part of a fix for
that bug, which will also add tests for these inlines. I've put a
note about more general conform/ test coverage for -ffinite-math-only
on
<https://sourceware.org/glibc/wiki/Development_Todo/Master#conformtest_improvements>,
alongside other options for which this is also relevant (some of which
have also had such bugs in the past relating to mismatched
conditionals).
I also intend to enable the main libm-test.inc tests for the
math-finite.h functions, but some other bugs in __*_finite need fixing
first.
[BZ #19205]
* math/bits/math-finite.h (acosf): Condition declaration on
[__USE_ISOC99].
(acosl): Likewise.
(acoshf): Likewise.
(acoshl): Likewise.
(asinf): Likewise.
(asinl): Likewise.
(atan2f): Likewise.
(atan2l): Likewise.
(atanhf): Likewise.
(atanhl): Likewise.
(coshf): Likewise.
(coshl): Likewise.
(expf): Likewise.
(expl): Likewise.
(fmodf): Likewise.
(fmodl): Likewise.
(hypot): Change condition to [__USE_XOPEN || __USE_ISOC99].
(j0f): Change condition to [__USE_MISC && __USE_ISOC99].
(j0l): Likewise.
(y0f): Likewise.
(y0l): Likewise.
(j1f): Likewise.
(j1l): Likewise.
(y1f): Likewise.
(y1l): Likewise.
(jnf): Likewise.
(jnl): Likewise.
(ynf): Likewise.
(ynl): Likewise.
(lgammaf_r): Condition declaration on [__USE_ISOC99].
(lgammal_r): Likewise.
(__lgamma_r_finite): New declaration.
(__lgammaf_r_finite): Likewise.
(__lgammal_r_finite): Likewise.
(lgamma): Use __lgamma_r_finite.
(lgammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(lgammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(gamma): Do not define for [!__USE_MISC && __USE_XOPEN2K]. Use
__lgamma_r_finite.
(gammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(gammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(logf): Condition declaration on [__USE_ISOC99].
(logl): Likewise.
(log10f): Likewise.
(log10l): Likewise.
(ldexpf): Likewise.
(ldexpl): Likewise.
(powf): Likewise.
(powl): Likewise.
(remainder): Condition declaration on [__USE_XOPEN_EXTENDED ||
__USE_ISOC99].
(remainderf): Condition declaration on [__USE_ISOC99].
(remainderl): Likewise.
(scalb): Do not declare for [!__USE_MISC && __USE_XOPEN2K8].
(scalbf): Change condition to [__USE_MISC && __USE_ISOC99].
(scalbl): Likewise.
(sinhf): Condition declaration on [__USE_ISOC99].
(sinhl): Likewise.
(sqrtf): Likewise.
(sqrtl): Likewise.
2015-11-05 00:48:57 +00:00
|
|
|
|
2014-09-16 08:38:48 +00:00
|
|
|
#if ((defined __USE_XOPEN || defined __USE_ISOC99) \
|
|
|
|
&& defined __extern_always_inline)
|
2011-10-12 15:27:51 +00:00
|
|
|
/* lgamma. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__extern_always_inline _Mdouble_
|
|
|
|
__NTH (__REDIRFROM (lgamma, , _MSUF_) (_Mdouble_ __d))
|
2011-10-12 15:27:51 +00:00
|
|
|
{
|
2015-11-05 21:23:07 +00:00
|
|
|
# if defined __USE_MISC || defined __USE_XOPEN
|
2017-03-10 12:47:18 +00:00
|
|
|
return __REDIRTO (lgamma, _r, _MSUF_) (__d, &signgam);
|
2015-11-05 21:23:07 +00:00
|
|
|
# else
|
2011-10-12 15:27:51 +00:00
|
|
|
int __local_signgam = 0;
|
2017-03-10 12:47:18 +00:00
|
|
|
return __REDIRTO (lgamma, _r, _MSUF_) (__d, &__local_signgam);
|
2011-10-12 15:27:51 +00:00
|
|
|
# endif
|
|
|
|
}
|
Make bits/math-finite.h conditions match other headers (bug 19205).
bits/math-finite.h declares -ffinite-math-only variants of various
functions under conditions not matching those under which the normal
versions are declared.
* math.h only ever includes bits/mathcalls.h to declare float and long
double functions if __USE_ISOC99, but bits/math-finite.h declares
some float functions regardless (long double ones are conditioned on
__MATH_DECLARE_LDOUBLE). (For C90 functions this isn't a
conformance bug because C90 reserves the float and long double
names, but is still contrary to good glibc practice. For some other
functions in older XSI standards it *is* a conformance bug.)
* Some functions are defined as inlines using lgamma_r functions under
conditions where those lgamma_r functions are not themselves
declared.
* hypot is declared under __USE_XOPEN || __USE_ISOC99 in
bits/mathcalls.h, __USE_ISOC99 only in bits/math-finite.h.
* float and long double versions of Bessel functions should be limited
to __USE_MISC (as in bug 18977).
* gamma should not be declared for __USE_XOPEN2K (as in bug 18967).
* remainder should be restricted to __USE_XOPEN_EXTENDED ||
__USE_ISOC99, not unconditional.
* scalb should not be declared for __USE_XOPEN2K8, and scalbf and
scalbl are non-POSIX (as in bug 18967).
This patch fixes all these issues (it doesn't seem worth splitting
them into separate patches or bugs). I put __USE_ISOC99 conditionals,
where needed, around both float and long double declarations, even
though formally redundant around the long double declarations because
__MATH_DECLARE_LDOUBLE isn't defined without __USE_ISOC99; it seemed
clearer that way. The missing declarations of lgamma_r functions are
dealt with by directly using declarations of __lgamma*_r_finite, in
the implementation namespace, rather than having the inlines rely on
asm redirection of lgamma*_r.
After this patch, there are some apparently redundant nested
__USE_ISOC99 conditionals in lgamma / gamma definitions. These
actually reflect a separate bug (the correct condition for the lgamma
inline functions to set signgam is __USE_MISC || __USE_XOPEN, the
condition under which signgam is declared, rather than disabling
setting it if __USE_ISOC99, which includes XSI POSIX versions for
which signgam *should* be set). They'll be fixed as part of a fix for
that bug, which will also add tests for these inlines. I've put a
note about more general conform/ test coverage for -ffinite-math-only
on
<https://sourceware.org/glibc/wiki/Development_Todo/Master#conformtest_improvements>,
alongside other options for which this is also relevant (some of which
have also had such bugs in the past relating to mismatched
conditionals).
I also intend to enable the main libm-test.inc tests for the
math-finite.h functions, but some other bugs in __*_finite need fixing
first.
[BZ #19205]
* math/bits/math-finite.h (acosf): Condition declaration on
[__USE_ISOC99].
(acosl): Likewise.
(acoshf): Likewise.
(acoshl): Likewise.
(asinf): Likewise.
(asinl): Likewise.
(atan2f): Likewise.
(atan2l): Likewise.
(atanhf): Likewise.
(atanhl): Likewise.
(coshf): Likewise.
(coshl): Likewise.
(expf): Likewise.
(expl): Likewise.
(fmodf): Likewise.
(fmodl): Likewise.
(hypot): Change condition to [__USE_XOPEN || __USE_ISOC99].
(j0f): Change condition to [__USE_MISC && __USE_ISOC99].
(j0l): Likewise.
(y0f): Likewise.
(y0l): Likewise.
(j1f): Likewise.
(j1l): Likewise.
(y1f): Likewise.
(y1l): Likewise.
(jnf): Likewise.
(jnl): Likewise.
(ynf): Likewise.
(ynl): Likewise.
(lgammaf_r): Condition declaration on [__USE_ISOC99].
(lgammal_r): Likewise.
(__lgamma_r_finite): New declaration.
(__lgammaf_r_finite): Likewise.
(__lgammal_r_finite): Likewise.
(lgamma): Use __lgamma_r_finite.
(lgammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(lgammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(gamma): Do not define for [!__USE_MISC && __USE_XOPEN2K]. Use
__lgamma_r_finite.
(gammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(gammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(logf): Condition declaration on [__USE_ISOC99].
(logl): Likewise.
(log10f): Likewise.
(log10l): Likewise.
(ldexpf): Likewise.
(ldexpl): Likewise.
(powf): Likewise.
(powl): Likewise.
(remainder): Condition declaration on [__USE_XOPEN_EXTENDED ||
__USE_ISOC99].
(remainderf): Condition declaration on [__USE_ISOC99].
(remainderl): Likewise.
(scalb): Do not declare for [!__USE_MISC && __USE_XOPEN2K8].
(scalbf): Change condition to [__USE_MISC && __USE_ISOC99].
(scalbl): Likewise.
(sinhf): Condition declaration on [__USE_ISOC99].
(sinhl): Likewise.
(sqrtf): Likewise.
(sqrtl): Likewise.
2015-11-05 00:48:57 +00:00
|
|
|
#endif
|
2011-10-12 15:27:51 +00:00
|
|
|
|
Make bits/math-finite.h conditions match other headers (bug 19205).
bits/math-finite.h declares -ffinite-math-only variants of various
functions under conditions not matching those under which the normal
versions are declared.
* math.h only ever includes bits/mathcalls.h to declare float and long
double functions if __USE_ISOC99, but bits/math-finite.h declares
some float functions regardless (long double ones are conditioned on
__MATH_DECLARE_LDOUBLE). (For C90 functions this isn't a
conformance bug because C90 reserves the float and long double
names, but is still contrary to good glibc practice. For some other
functions in older XSI standards it *is* a conformance bug.)
* Some functions are defined as inlines using lgamma_r functions under
conditions where those lgamma_r functions are not themselves
declared.
* hypot is declared under __USE_XOPEN || __USE_ISOC99 in
bits/mathcalls.h, __USE_ISOC99 only in bits/math-finite.h.
* float and long double versions of Bessel functions should be limited
to __USE_MISC (as in bug 18977).
* gamma should not be declared for __USE_XOPEN2K (as in bug 18967).
* remainder should be restricted to __USE_XOPEN_EXTENDED ||
__USE_ISOC99, not unconditional.
* scalb should not be declared for __USE_XOPEN2K8, and scalbf and
scalbl are non-POSIX (as in bug 18967).
This patch fixes all these issues (it doesn't seem worth splitting
them into separate patches or bugs). I put __USE_ISOC99 conditionals,
where needed, around both float and long double declarations, even
though formally redundant around the long double declarations because
__MATH_DECLARE_LDOUBLE isn't defined without __USE_ISOC99; it seemed
clearer that way. The missing declarations of lgamma_r functions are
dealt with by directly using declarations of __lgamma*_r_finite, in
the implementation namespace, rather than having the inlines rely on
asm redirection of lgamma*_r.
After this patch, there are some apparently redundant nested
__USE_ISOC99 conditionals in lgamma / gamma definitions. These
actually reflect a separate bug (the correct condition for the lgamma
inline functions to set signgam is __USE_MISC || __USE_XOPEN, the
condition under which signgam is declared, rather than disabling
setting it if __USE_ISOC99, which includes XSI POSIX versions for
which signgam *should* be set). They'll be fixed as part of a fix for
that bug, which will also add tests for these inlines. I've put a
note about more general conform/ test coverage for -ffinite-math-only
on
<https://sourceware.org/glibc/wiki/Development_Todo/Master#conformtest_improvements>,
alongside other options for which this is also relevant (some of which
have also had such bugs in the past relating to mismatched
conditionals).
I also intend to enable the main libm-test.inc tests for the
math-finite.h functions, but some other bugs in __*_finite need fixing
first.
[BZ #19205]
* math/bits/math-finite.h (acosf): Condition declaration on
[__USE_ISOC99].
(acosl): Likewise.
(acoshf): Likewise.
(acoshl): Likewise.
(asinf): Likewise.
(asinl): Likewise.
(atan2f): Likewise.
(atan2l): Likewise.
(atanhf): Likewise.
(atanhl): Likewise.
(coshf): Likewise.
(coshl): Likewise.
(expf): Likewise.
(expl): Likewise.
(fmodf): Likewise.
(fmodl): Likewise.
(hypot): Change condition to [__USE_XOPEN || __USE_ISOC99].
(j0f): Change condition to [__USE_MISC && __USE_ISOC99].
(j0l): Likewise.
(y0f): Likewise.
(y0l): Likewise.
(j1f): Likewise.
(j1l): Likewise.
(y1f): Likewise.
(y1l): Likewise.
(jnf): Likewise.
(jnl): Likewise.
(ynf): Likewise.
(ynl): Likewise.
(lgammaf_r): Condition declaration on [__USE_ISOC99].
(lgammal_r): Likewise.
(__lgamma_r_finite): New declaration.
(__lgammaf_r_finite): Likewise.
(__lgammal_r_finite): Likewise.
(lgamma): Use __lgamma_r_finite.
(lgammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(lgammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(gamma): Do not define for [!__USE_MISC && __USE_XOPEN2K]. Use
__lgamma_r_finite.
(gammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(gammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(logf): Condition declaration on [__USE_ISOC99].
(logl): Likewise.
(log10f): Likewise.
(log10l): Likewise.
(ldexpf): Likewise.
(ldexpl): Likewise.
(powf): Likewise.
(powl): Likewise.
(remainder): Condition declaration on [__USE_XOPEN_EXTENDED ||
__USE_ISOC99].
(remainderf): Condition declaration on [__USE_ISOC99].
(remainderl): Likewise.
(scalb): Do not declare for [!__USE_MISC && __USE_XOPEN2K8].
(scalbf): Change condition to [__USE_MISC && __USE_ISOC99].
(scalbl): Likewise.
(sinhf): Condition declaration on [__USE_ISOC99].
(sinhl): Likewise.
(sqrtf): Likewise.
(sqrtl): Likewise.
2015-11-05 00:48:57 +00:00
|
|
|
#if ((defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K)) \
|
2014-09-16 08:38:48 +00:00
|
|
|
&& defined __extern_always_inline)
|
2011-10-12 15:27:51 +00:00
|
|
|
/* gamma. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__extern_always_inline _Mdouble_
|
|
|
|
__NTH (__REDIRFROM (gamma, , _MSUF_) (_Mdouble_ __d))
|
2011-10-12 15:27:51 +00:00
|
|
|
{
|
2017-03-10 12:47:18 +00:00
|
|
|
return __REDIRTO (lgamma, _r, _MSUF_) (__d, &signgam);
|
2011-10-12 15:27:51 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* log. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (log, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* log10. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (log10, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
#ifdef __USE_ISOC99
|
|
|
|
/* log2. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (log2, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* pow. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (pow, , (_Mdouble_, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
Make bits/math-finite.h conditions match other headers (bug 19205).
bits/math-finite.h declares -ffinite-math-only variants of various
functions under conditions not matching those under which the normal
versions are declared.
* math.h only ever includes bits/mathcalls.h to declare float and long
double functions if __USE_ISOC99, but bits/math-finite.h declares
some float functions regardless (long double ones are conditioned on
__MATH_DECLARE_LDOUBLE). (For C90 functions this isn't a
conformance bug because C90 reserves the float and long double
names, but is still contrary to good glibc practice. For some other
functions in older XSI standards it *is* a conformance bug.)
* Some functions are defined as inlines using lgamma_r functions under
conditions where those lgamma_r functions are not themselves
declared.
* hypot is declared under __USE_XOPEN || __USE_ISOC99 in
bits/mathcalls.h, __USE_ISOC99 only in bits/math-finite.h.
* float and long double versions of Bessel functions should be limited
to __USE_MISC (as in bug 18977).
* gamma should not be declared for __USE_XOPEN2K (as in bug 18967).
* remainder should be restricted to __USE_XOPEN_EXTENDED ||
__USE_ISOC99, not unconditional.
* scalb should not be declared for __USE_XOPEN2K8, and scalbf and
scalbl are non-POSIX (as in bug 18967).
This patch fixes all these issues (it doesn't seem worth splitting
them into separate patches or bugs). I put __USE_ISOC99 conditionals,
where needed, around both float and long double declarations, even
though formally redundant around the long double declarations because
__MATH_DECLARE_LDOUBLE isn't defined without __USE_ISOC99; it seemed
clearer that way. The missing declarations of lgamma_r functions are
dealt with by directly using declarations of __lgamma*_r_finite, in
the implementation namespace, rather than having the inlines rely on
asm redirection of lgamma*_r.
After this patch, there are some apparently redundant nested
__USE_ISOC99 conditionals in lgamma / gamma definitions. These
actually reflect a separate bug (the correct condition for the lgamma
inline functions to set signgam is __USE_MISC || __USE_XOPEN, the
condition under which signgam is declared, rather than disabling
setting it if __USE_ISOC99, which includes XSI POSIX versions for
which signgam *should* be set). They'll be fixed as part of a fix for
that bug, which will also add tests for these inlines. I've put a
note about more general conform/ test coverage for -ffinite-math-only
on
<https://sourceware.org/glibc/wiki/Development_Todo/Master#conformtest_improvements>,
alongside other options for which this is also relevant (some of which
have also had such bugs in the past relating to mismatched
conditionals).
I also intend to enable the main libm-test.inc tests for the
math-finite.h functions, but some other bugs in __*_finite need fixing
first.
[BZ #19205]
* math/bits/math-finite.h (acosf): Condition declaration on
[__USE_ISOC99].
(acosl): Likewise.
(acoshf): Likewise.
(acoshl): Likewise.
(asinf): Likewise.
(asinl): Likewise.
(atan2f): Likewise.
(atan2l): Likewise.
(atanhf): Likewise.
(atanhl): Likewise.
(coshf): Likewise.
(coshl): Likewise.
(expf): Likewise.
(expl): Likewise.
(fmodf): Likewise.
(fmodl): Likewise.
(hypot): Change condition to [__USE_XOPEN || __USE_ISOC99].
(j0f): Change condition to [__USE_MISC && __USE_ISOC99].
(j0l): Likewise.
(y0f): Likewise.
(y0l): Likewise.
(j1f): Likewise.
(j1l): Likewise.
(y1f): Likewise.
(y1l): Likewise.
(jnf): Likewise.
(jnl): Likewise.
(ynf): Likewise.
(ynl): Likewise.
(lgammaf_r): Condition declaration on [__USE_ISOC99].
(lgammal_r): Likewise.
(__lgamma_r_finite): New declaration.
(__lgammaf_r_finite): Likewise.
(__lgammal_r_finite): Likewise.
(lgamma): Use __lgamma_r_finite.
(lgammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(lgammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(gamma): Do not define for [!__USE_MISC && __USE_XOPEN2K]. Use
__lgamma_r_finite.
(gammaf): Condition definition on [__USE_ISOC99]. Use
__lgammaf_r_finite.
(gammal): Condition definition on [__USE_ISOC99]. Use
__lgammal_r_finite.
(logf): Condition declaration on [__USE_ISOC99].
(logl): Likewise.
(log10f): Likewise.
(log10l): Likewise.
(ldexpf): Likewise.
(ldexpl): Likewise.
(powf): Likewise.
(powl): Likewise.
(remainder): Condition declaration on [__USE_XOPEN_EXTENDED ||
__USE_ISOC99].
(remainderf): Condition declaration on [__USE_ISOC99].
(remainderl): Likewise.
(scalb): Do not declare for [!__USE_MISC && __USE_XOPEN2K8].
(scalbf): Change condition to [__USE_MISC && __USE_ISOC99].
(scalbl): Likewise.
(sinhf): Condition declaration on [__USE_ISOC99].
(sinhl): Likewise.
(sqrtf): Likewise.
(sqrtl): Likewise.
2015-11-05 00:48:57 +00:00
|
|
|
#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
|
2011-10-12 15:27:51 +00:00
|
|
|
/* remainder. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (remainder, , (_Mdouble_, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
2017-03-10 12:47:18 +00:00
|
|
|
#if (__MATH_DECLARING_DOUBLE \
|
|
|
|
&& (defined __USE_MISC \
|
|
|
|
|| (defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K8))) \
|
2017-03-31 12:31:10 +00:00
|
|
|
|| (!defined __MATH_DECLARE_LDOUBLE && defined __USE_MISC)
|
2011-10-12 15:27:51 +00:00
|
|
|
/* scalb. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (scalb, , (_Mdouble_, _Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* sinh. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (sinh, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
|
|
|
/* sqrt. */
|
2017-03-10 12:47:18 +00:00
|
|
|
__MATH_REDIRCALL (sqrt, , (_Mdouble_));
|
2011-10-12 15:27:51 +00:00
|
|
|
|
2014-09-16 08:38:48 +00:00
|
|
|
#if defined __USE_ISOC99 && defined __extern_always_inline
|
2011-10-12 15:27:51 +00:00
|
|
|
/* tgamma. */
|
2017-03-10 12:47:18 +00:00
|
|
|
extern _Mdouble_
|
|
|
|
__REDIRFROM (__gamma, _r_finite, _MSUF_) (_Mdouble_, int *);
|
|
|
|
|
|
|
|
__extern_always_inline _Mdouble_
|
|
|
|
__NTH (__REDIRFROM (tgamma, , _MSUF_) (_Mdouble_ __d))
|
2011-10-12 15:27:51 +00:00
|
|
|
{
|
|
|
|
int __local_signgam = 0;
|
2017-03-10 12:47:18 +00:00
|
|
|
_Mdouble_ __res = __REDIRTO (gamma, _r, _MSUF_) (__d, &__local_signgam);
|
2011-10-12 15:27:51 +00:00
|
|
|
return __local_signgam < 0 ? -__res : __res;
|
|
|
|
}
|
|
|
|
#endif
|
2017-03-10 12:47:18 +00:00
|
|
|
|
|
|
|
#undef __REDIRFROM
|
|
|
|
#undef __REDIRFROM_X
|
|
|
|
#undef __REDIRTO
|
|
|
|
#undef __REDIRTO_X
|
|
|
|
#undef __MATH_REDIRCALL
|
|
|
|
#undef __MATH_REDIRCALL_2
|
|
|
|
#undef __MATH_REDIRCALL_INTERNAL
|
|
|
|
#undef __MATH_REDIRCALL_X
|