glibc/math/bits/math-finite.h

213 lines
5.9 KiB
C
Raw Normal View History

/* Entry points to finite-math-only compiler runs.
Copyright (C) 2011-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/math-finite.h> directly; include <math.h> instead."
#endif
#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
#endif
#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_));
Complete _BSD_SOURCE / _SVID_source followup cleanup. This patch completes the headers cleanup consequent on removal of _BSD_SOURCE and _SVID_SOURCE (apart from any subsequent deprecations): * #endif conditionals that referred to BSD or SVID are updated. * Redundant __USE_* tests in cases involving __USE_MISC are removed. This includes cases such as __USE_MISC || __USE_ISOC99, where __USE_MISC is redundant (because __USE_MISC is only ever defined in the default / _DEFAULT_SOURCE / _GNU_SOURCE case, when __USE_ISOC99 is also defined; the same applies to the non-XSI-extended POSIX versions), and cases involving __USE_GNU, where __USE_GNU is redundant (because if __USE_GNU is defined, so are the other __USE_* macros). There may well be other cases of __USE_FOO || __USE_BAR tests that could be simplified because one macro implies the other; this patch only addresses cases involving __USE_MISC. Tested x86_64. * bits/fcntl.h [__USE_MISC]: Remove redundant conditionals. * bits/sigaction.h [__USE_MISC]: Likewise. * bits/waitstatus.h: Update #endif comments. * ctype/ctype.h: Likewise. * dirent/dirent.h: Likewise. [__USE_MISC]: Remove redundant conditionals. * grp/grp.h: Update #endif comments. [__USE_GNU]: Remove redundant conditionals. [__USE_MISC]: Likewise. * inet/netinet/in.h [__USE_GNU]: Likewise. * io/sys/stat.h [__USE_MISC]: Likewise. * libio/bits/stdio-ldbl.h [__USE_MISC]: Likewise. * libio/bits/stdio.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * libio/bits/stdio2.h [__USE_MISC]: Likewise. * libio/stdio.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * math/bits/math-finite.h [__USE_MISC]: Likewise. * math/bits/mathcalls.h [__USE_MISC]: Likewise. * math/math.h: Update #else and #endif comments. [__USE_MISC]: Remove redundant conditionals. * misc/sys/uio.h: Update #endif comments. * posix/bits/unistd.h [__USE_MISC]: Remove redundant conditionals. * posix/glob.h [__USE_MISC]: Likewise. * posix/sys/types.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * posix/sys/wait.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * posix/unistd.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * pwd/pwd.h [__USE_GNU]: Likewise. [__USE_MISC]: Likewise. * resolv/netdb.h [__USE_GNU]: Likewise. * signal/signal.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * stdlib/stdlib.h: Update #else and #endif comments. [__USE_MISC]: Remove redundant conditionals. [__USE_GNU]: Likewise. * string/bits/string2.h [__USE_MISC]: Likewise. * string/string.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * sysdeps/m68k/m680x0/fpu/bits/mathinline.h [__USE_MISC]: Likewise. * sysdeps/mach/hurd/bits/fcntl.h [__USE_MISC]: Likewise. * sysdeps/mach/hurd/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/alpha/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/alpha/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/bits/fcntl-linux.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * sysdeps/unix/sysv/linux/bits/in.h [__USE_GNU]: Likewise. * sysdeps/unix/sysv/linux/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/bits/socket.h [__USE_GNU]: Likewise. * sysdeps/unix/sysv/linux/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/m68k/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/mips/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/mips/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/s390/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/s390/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/x86/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/x86/bits/string.h: Update #endif comments. * sysdeps/x86/fpu/bits/mathinline.h [__USE_MISC]: Remove redundant conditionals. * time/sys/time.h: Update #endif comments. * time/time.h: Likewise. [__USE_MISC]: Remove redundant conditionals.
2014-02-21 21:45:26 +00:00
#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
/* acosh. */
__MATH_REDIRCALL (acosh, , (_Mdouble_));
#endif
/* asin. */
__MATH_REDIRCALL (asin, , (_Mdouble_));
/* atan2. */
__MATH_REDIRCALL (atan2, , (_Mdouble_, _Mdouble_));
Complete _BSD_SOURCE / _SVID_source followup cleanup. This patch completes the headers cleanup consequent on removal of _BSD_SOURCE and _SVID_SOURCE (apart from any subsequent deprecations): * #endif conditionals that referred to BSD or SVID are updated. * Redundant __USE_* tests in cases involving __USE_MISC are removed. This includes cases such as __USE_MISC || __USE_ISOC99, where __USE_MISC is redundant (because __USE_MISC is only ever defined in the default / _DEFAULT_SOURCE / _GNU_SOURCE case, when __USE_ISOC99 is also defined; the same applies to the non-XSI-extended POSIX versions), and cases involving __USE_GNU, where __USE_GNU is redundant (because if __USE_GNU is defined, so are the other __USE_* macros). There may well be other cases of __USE_FOO || __USE_BAR tests that could be simplified because one macro implies the other; this patch only addresses cases involving __USE_MISC. Tested x86_64. * bits/fcntl.h [__USE_MISC]: Remove redundant conditionals. * bits/sigaction.h [__USE_MISC]: Likewise. * bits/waitstatus.h: Update #endif comments. * ctype/ctype.h: Likewise. * dirent/dirent.h: Likewise. [__USE_MISC]: Remove redundant conditionals. * grp/grp.h: Update #endif comments. [__USE_GNU]: Remove redundant conditionals. [__USE_MISC]: Likewise. * inet/netinet/in.h [__USE_GNU]: Likewise. * io/sys/stat.h [__USE_MISC]: Likewise. * libio/bits/stdio-ldbl.h [__USE_MISC]: Likewise. * libio/bits/stdio.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * libio/bits/stdio2.h [__USE_MISC]: Likewise. * libio/stdio.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * math/bits/math-finite.h [__USE_MISC]: Likewise. * math/bits/mathcalls.h [__USE_MISC]: Likewise. * math/math.h: Update #else and #endif comments. [__USE_MISC]: Remove redundant conditionals. * misc/sys/uio.h: Update #endif comments. * posix/bits/unistd.h [__USE_MISC]: Remove redundant conditionals. * posix/glob.h [__USE_MISC]: Likewise. * posix/sys/types.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * posix/sys/wait.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * posix/unistd.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * pwd/pwd.h [__USE_GNU]: Likewise. [__USE_MISC]: Likewise. * resolv/netdb.h [__USE_GNU]: Likewise. * signal/signal.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * stdlib/stdlib.h: Update #else and #endif comments. [__USE_MISC]: Remove redundant conditionals. [__USE_GNU]: Likewise. * string/bits/string2.h [__USE_MISC]: Likewise. * string/string.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * sysdeps/m68k/m680x0/fpu/bits/mathinline.h [__USE_MISC]: Likewise. * sysdeps/mach/hurd/bits/fcntl.h [__USE_MISC]: Likewise. * sysdeps/mach/hurd/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/alpha/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/alpha/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/bits/fcntl-linux.h: Update #endif comments. [__USE_MISC]: Remove redundant conditionals. * sysdeps/unix/sysv/linux/bits/in.h [__USE_GNU]: Likewise. * sysdeps/unix/sysv/linux/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/bits/socket.h [__USE_GNU]: Likewise. * sysdeps/unix/sysv/linux/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/m68k/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/mips/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/mips/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/s390/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/s390/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/unix/sysv/linux/x86/bits/stat.h [__USE_MISC]: Likewise. * sysdeps/x86/bits/string.h: Update #endif comments. * sysdeps/x86/fpu/bits/mathinline.h [__USE_MISC]: Remove redundant conditionals. * time/sys/time.h: Update #endif comments. * time/time.h: Likewise. [__USE_MISC]: Remove redundant conditionals.
2014-02-21 21:45:26 +00:00
#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
/* atanh. */
__MATH_REDIRCALL (atanh, , (_Mdouble_));
#endif
/* cosh. */
__MATH_REDIRCALL (cosh, , (_Mdouble_));
/* exp. */
__MATH_REDIRCALL (exp, , (_Mdouble_));
#ifdef __USE_GNU
/* exp10. */
__MATH_REDIRCALL (exp10, , (_Mdouble_));
/* pow10. */
__MATH_REDIRCALL_2 (pow10, , (_Mdouble_), exp10);
#endif
#ifdef __USE_ISOC99
/* exp2. */
__MATH_REDIRCALL (exp2, , (_Mdouble_));
#endif
/* fmod. */
__MATH_REDIRCALL (fmod, , (_Mdouble_, _Mdouble_));
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
/* hypot. */
__MATH_REDIRCALL (hypot, , (_Mdouble_, _Mdouble_));
#endif
#if (__MATH_DECLARING_DOUBLE && (defined __USE_MISC || defined __USE_XOPEN)) \
|| (!__MATH_DECLARING_DOUBLE && defined __USE_MISC)
/* j0. */
__MATH_REDIRCALL (j0, , (_Mdouble_));
/* y0. */
__MATH_REDIRCALL (y0, , (_Mdouble_));
/* j1. */
__MATH_REDIRCALL (j1, , (_Mdouble_));
/* y1. */
__MATH_REDIRCALL (y1, , (_Mdouble_));
/* jn. */
__MATH_REDIRCALL (jn, , (int, _Mdouble_));
/* yn. */
__MATH_REDIRCALL (yn, , (int, _Mdouble_));
#endif
#ifdef __USE_MISC
/* lgamma_r. */
__MATH_REDIRCALL (lgamma, _r, (_Mdouble_, int *));
#endif
/* 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
Revert to defining __extern_inline only for gcc-4.3+ (BZ #17266) The check for only __GNUC_STDC_INLINE__ and __GNUC_GNU_INLINE__ may not be sufficient since those flags were added during initial support for C99 inlining semantics. There is also a problem with always defining __extern_inline and __extern_always_inline, since it enables inline wrapper functions even when GNU inlining semantics are not guaranteed. This, along with the possibility of such wrappers using redirection (btowc for example) could result in compiler generating an infinitely recusrive call to the function. In fact it was such a recursion that led to this code being written the way it was; see: https://bugzilla.redhat.com/show_bug.cgi?id=186410 The initial change was to fix bugs 14530 and 13741, but they can be resolved by checking if __fortify_function and/or __extern_always_inline are defined, as it has been done in this patch. In addition, I have audited uses of __extern_always_inline to make sure that none of the uses result in compilation errors. There is however a regression in this patch for llvm, since it reverts the llvm expectation that __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__ definition imply proper extern inline semantics. 2014-09-16 Siddhesh Poyarekar <siddhesh@redhat.com> Jakub Jelinek <jakub@redhat.com> [BZ #17266] * libio/stdio.h: Check definition of __fortify_function instead of __extern_always_inline to include bits/stdio2.h. * math/bits/math-finite.h [__USE_XOPEN || __USE_ISOC99]: Also check if __extern_always_inline is defined. [__USE_MISC || __USE_XOPEN]: Likewise. [__USE_ISOC99] Likewise. * misc/sys/cdefs.h (__fortify_function): Define only if __extern_always_inline is defined. [!__cplusplus || __GNUC_PREREQ (4,3)]: Revert to defining __extern_always_inline and __extern_inline only for g++-4.3 and newer or a compatible gcc.
2014-09-16 08:38:48 +00:00
#if ((defined __USE_XOPEN || defined __USE_ISOC99) \
&& defined __extern_always_inline)
/* lgamma. */
__extern_always_inline _Mdouble_
__NTH (__REDIRFROM (lgamma, , _MSUF_) (_Mdouble_ __d))
{
Fix finite-math-only lgamma functions signgam setting (bug 19211). The lgamma inline functions in bits/math-finite.h do not set signgam if __USE_ISOC99, even when other feature test macros mean a standard such as XSI POSIX is selected for which it should be set. (This is essentially the opposite issue to bug 15421, the out-of-line versions setting signgam even when they shouldn't.) This patch fixes those functions to use __USE_MISC || __USE_XOPEN as the condition for when to set signgam, since it's the condition for when math.h declares signgam. The legacy gamma* names are only declared at all if __USE_MISC || __USE_XOPEN, so they just set signgam unconditionally. Tests for certain standards or not using _GNU_SOURCE cannot use test-skeleton.c (this is a known issue noted on the wiki todo list). Thus, the new tests that signgam remains not set in ISO C modes do not use test-skeleton.c. They also define _ISOMAC to avoid running into declarations in the internal include/ headers that only work in _GNU_SOURCE mode. Tested for x86_64 and x86. [BZ #19211] * math/bits/math-finite.h (lgamma): Set signgam if [__USE_MISC || __USE_XOPEN], not if [!__USE_ISOC99]. (lgammaf): Likewise. (lgammal): Likewise. (gamma): Set signgam unconditionally, not if [!__USE_ISOC99]. (gammaf): Likewise. (gammal): Likewise. * math/test-signgam-finite-c11.c: New file. * math/test-signgam-finite-c99.c: Likewise. * math/test-signgam-finite.c: Likewise. * math/Makefile (tests): Add test-signgam-finite, test-signgam-finite-c99 and test-signgam-finite-c11. (CFLAGS-test-signgam-finite.c): New variable. (CFLAGS-test-signgam-finite-c99.c): Likewise. (CFLAGS-test-signgam-finite-c11.c): Likewise.
2015-11-05 21:23:07 +00:00
# if defined __USE_MISC || defined __USE_XOPEN
return __REDIRTO (lgamma, _r, _MSUF_) (__d, &signgam);
Fix finite-math-only lgamma functions signgam setting (bug 19211). The lgamma inline functions in bits/math-finite.h do not set signgam if __USE_ISOC99, even when other feature test macros mean a standard such as XSI POSIX is selected for which it should be set. (This is essentially the opposite issue to bug 15421, the out-of-line versions setting signgam even when they shouldn't.) This patch fixes those functions to use __USE_MISC || __USE_XOPEN as the condition for when to set signgam, since it's the condition for when math.h declares signgam. The legacy gamma* names are only declared at all if __USE_MISC || __USE_XOPEN, so they just set signgam unconditionally. Tests for certain standards or not using _GNU_SOURCE cannot use test-skeleton.c (this is a known issue noted on the wiki todo list). Thus, the new tests that signgam remains not set in ISO C modes do not use test-skeleton.c. They also define _ISOMAC to avoid running into declarations in the internal include/ headers that only work in _GNU_SOURCE mode. Tested for x86_64 and x86. [BZ #19211] * math/bits/math-finite.h (lgamma): Set signgam if [__USE_MISC || __USE_XOPEN], not if [!__USE_ISOC99]. (lgammaf): Likewise. (lgammal): Likewise. (gamma): Set signgam unconditionally, not if [!__USE_ISOC99]. (gammaf): Likewise. (gammal): Likewise. * math/test-signgam-finite-c11.c: New file. * math/test-signgam-finite-c99.c: Likewise. * math/test-signgam-finite.c: Likewise. * math/Makefile (tests): Add test-signgam-finite, test-signgam-finite-c99 and test-signgam-finite-c11. (CFLAGS-test-signgam-finite.c): New variable. (CFLAGS-test-signgam-finite-c99.c): Likewise. (CFLAGS-test-signgam-finite-c11.c): Likewise.
2015-11-05 21:23:07 +00:00
# else
int __local_signgam = 0;
return __REDIRTO (lgamma, _r, _MSUF_) (__d, &__local_signgam);
# 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
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)) \
Revert to defining __extern_inline only for gcc-4.3+ (BZ #17266) The check for only __GNUC_STDC_INLINE__ and __GNUC_GNU_INLINE__ may not be sufficient since those flags were added during initial support for C99 inlining semantics. There is also a problem with always defining __extern_inline and __extern_always_inline, since it enables inline wrapper functions even when GNU inlining semantics are not guaranteed. This, along with the possibility of such wrappers using redirection (btowc for example) could result in compiler generating an infinitely recusrive call to the function. In fact it was such a recursion that led to this code being written the way it was; see: https://bugzilla.redhat.com/show_bug.cgi?id=186410 The initial change was to fix bugs 14530 and 13741, but they can be resolved by checking if __fortify_function and/or __extern_always_inline are defined, as it has been done in this patch. In addition, I have audited uses of __extern_always_inline to make sure that none of the uses result in compilation errors. There is however a regression in this patch for llvm, since it reverts the llvm expectation that __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__ definition imply proper extern inline semantics. 2014-09-16 Siddhesh Poyarekar <siddhesh@redhat.com> Jakub Jelinek <jakub@redhat.com> [BZ #17266] * libio/stdio.h: Check definition of __fortify_function instead of __extern_always_inline to include bits/stdio2.h. * math/bits/math-finite.h [__USE_XOPEN || __USE_ISOC99]: Also check if __extern_always_inline is defined. [__USE_MISC || __USE_XOPEN]: Likewise. [__USE_ISOC99] Likewise. * misc/sys/cdefs.h (__fortify_function): Define only if __extern_always_inline is defined. [!__cplusplus || __GNUC_PREREQ (4,3)]: Revert to defining __extern_always_inline and __extern_inline only for g++-4.3 and newer or a compatible gcc.
2014-09-16 08:38:48 +00:00
&& defined __extern_always_inline)
/* gamma. */
__extern_always_inline _Mdouble_
__NTH (__REDIRFROM (gamma, , _MSUF_) (_Mdouble_ __d))
{
return __REDIRTO (lgamma, _r, _MSUF_) (__d, &signgam);
}
#endif
/* log. */
__MATH_REDIRCALL (log, , (_Mdouble_));
/* log10. */
__MATH_REDIRCALL (log10, , (_Mdouble_));
#ifdef __USE_ISOC99
/* log2. */
__MATH_REDIRCALL (log2, , (_Mdouble_));
#endif
/* pow. */
__MATH_REDIRCALL (pow, , (_Mdouble_, _Mdouble_));
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
/* remainder. */
__MATH_REDIRCALL (remainder, , (_Mdouble_, _Mdouble_));
#endif
#if (__MATH_DECLARING_DOUBLE \
&& (defined __USE_MISC \
|| (defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K8))) \
|| (!defined __MATH_DECLARE_LDOUBLE && defined __USE_MISC)
/* scalb. */
__MATH_REDIRCALL (scalb, , (_Mdouble_, _Mdouble_));
#endif
/* sinh. */
__MATH_REDIRCALL (sinh, , (_Mdouble_));
/* sqrt. */
__MATH_REDIRCALL (sqrt, , (_Mdouble_));
Revert to defining __extern_inline only for gcc-4.3+ (BZ #17266) The check for only __GNUC_STDC_INLINE__ and __GNUC_GNU_INLINE__ may not be sufficient since those flags were added during initial support for C99 inlining semantics. There is also a problem with always defining __extern_inline and __extern_always_inline, since it enables inline wrapper functions even when GNU inlining semantics are not guaranteed. This, along with the possibility of such wrappers using redirection (btowc for example) could result in compiler generating an infinitely recusrive call to the function. In fact it was such a recursion that led to this code being written the way it was; see: https://bugzilla.redhat.com/show_bug.cgi?id=186410 The initial change was to fix bugs 14530 and 13741, but they can be resolved by checking if __fortify_function and/or __extern_always_inline are defined, as it has been done in this patch. In addition, I have audited uses of __extern_always_inline to make sure that none of the uses result in compilation errors. There is however a regression in this patch for llvm, since it reverts the llvm expectation that __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__ definition imply proper extern inline semantics. 2014-09-16 Siddhesh Poyarekar <siddhesh@redhat.com> Jakub Jelinek <jakub@redhat.com> [BZ #17266] * libio/stdio.h: Check definition of __fortify_function instead of __extern_always_inline to include bits/stdio2.h. * math/bits/math-finite.h [__USE_XOPEN || __USE_ISOC99]: Also check if __extern_always_inline is defined. [__USE_MISC || __USE_XOPEN]: Likewise. [__USE_ISOC99] Likewise. * misc/sys/cdefs.h (__fortify_function): Define only if __extern_always_inline is defined. [!__cplusplus || __GNUC_PREREQ (4,3)]: Revert to defining __extern_always_inline and __extern_inline only for g++-4.3 and newer or a compatible gcc.
2014-09-16 08:38:48 +00:00
#if defined __USE_ISOC99 && defined __extern_always_inline
/* tgamma. */
extern _Mdouble_
__REDIRFROM (__gamma, _r_finite, _MSUF_) (_Mdouble_, int *);
__extern_always_inline _Mdouble_
__NTH (__REDIRFROM (tgamma, , _MSUF_) (_Mdouble_ __d))
{
int __local_signgam = 0;
_Mdouble_ __res = __REDIRTO (gamma, _r, _MSUF_) (__d, &__local_signgam);
return __local_signgam < 0 ? -__res : __res;
}
#endif
#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