]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix lgamma setting signgam for ISO C (bug 15421).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 20 Nov 2015 22:49:59 +0000 (22:49 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 20 Nov 2015 22:49:59 +0000 (22:49 +0000)
The lgamma (and likewise lgammaf, lgammal) function wrongly sets the
signgam variable even when building for strict ISO C conformance
(-std=c99 / -std=c11), although the user may define such a variable
and it's only in the implementation namespace for POSIX with XSI
extensions enabled.

Following discussions starting at
<https://sourceware.org/ml/libc-alpha/2013-04/msg00767.html> and
<https://sourceware.org/ml/libc-alpha/2015-10/msg00844.html>, it seems
that the safest approach for fixing this particular issue is for
signgam to become a weak alias for a newly exported symbol __signgam,
with the library functions only setting __signgam, at which point
static linker magic will preserve the alias for newly linked binaries
that refer to the library's signgam rather than defining their own,
while breaking the alias for programs that define their own signgam,
with new symbol versions for lgamma functions and with compat symbols
for existing binaries that set both signgam and __signgam.

This patch implements that approach for the fix.  signgam is made into
a weak alias.  The four symbols __signgam, lgamma, lgammaf, lgammal
get new symbol versions at version GLIBC_2.23, with the existing
versions of lgamma, lgammaf and lgammal becoming compat symbols.

When the compat versions are built, gamma, gammaf and gammal are
aliases for the compat versions (i.e. always set signgam); this is OK
as they are not ISO C functions, and avoids adding new symbol versions
for them unnecessarily.  When the compat versions are not built
(i.e. for static linking and for future glibc ports), gamma, gammaf
and gammal are aliases for the new versions that set __signgam.  The
ldbl-opt versions are updated accordingly.

The lgamma wrappers are adjusted so that the same source files,
included from different files with different definitions of
USE_AS_COMPAT, can build either the new versions or the compat
versions.  Similar changes are made to the ia64 versions (untested).

Tests are added that the lgamma functions do not interfere with a user
variable called signgam for ISO C, with various choices for the size
of that variable, whether it is initialized, and for static and
dynamic linking.  The conformtest whitelist entry is removed as well.

Tested for x86_64, x86, mips64 and powerpc, including looking at
objdump --dynamic-syms output to make sure the expected sets of
symbols were aliases.  Also spot-tested that a binary built with old
glibc works properly (i.e. gets signgam set) when run with new glibc.

[BZ #15421]
* sysdeps/ieee754/s_signgam.c (signgam): Rename to __signgam,
initialize with 0 and define as weak alias of __signgam.
* include/math.h [!_ISOMAC] (__signgam): Declare.
* math/Makefile (libm-calls): Add w_lgamma_compat.
(tests): Add test-signgam-uchar, test-signgam-uchar-init,
test-signgam-uint, test-signgam-uint-init, test-signgam-ullong and
test-signgam-ullong-init.
(tests-static): Add test-signgam-uchar-static,
test-signgam-uchar-init-static, test-signgam-uint-static,
test-signgam-uint-init-static, test-signgam-ullong-static and
test-signgam-ullong-init-static.
(CFLAGS-test-signgam-uchar.c): New variable.
(CFLAGS-test-signgam-uchar-init.c): Likewise.
(CFLAGS-test-signgam-uchar-static.c): Likewise.
(CFLAGS-test-signgam-uchar-init-static.c): Likewise.
(CFLAGS-test-signgam-uint.c): Likewise.
(CFLAGS-test-signgam-uint-init.c): Likewise.
(CFLAGS-test-signgam-uint-static.c): Likewise.
(CFLAGS-test-signgam-uint-init-static.c): Likewise.
(CFLAGS-test-signgam-ullong.c): Likewise.
(CFLAGS-test-signgam-ullong-init.c): Likewise.
(CFLAGS-test-signgam-ullong-static.c): Likewise.
(CFLAGS-test-signgam-ullong-init-static.c): Likewise.
* math/Versions (libm): Add GLIBC_2.23.
* math/lgamma-compat.h: New file.
* math/test-signgam-main.c: Likewise.
* math/test-signgam-uchar-init-static.c: Likewise.
* math/test-signgam-uchar-init.c: Likewise.
* math/test-signgam-uchar-static.c: Likewise.
* math/test-signgam-uchar.c: Likewise.
* math/test-signgam-uint-init-static.c: Likewise.
* math/test-signgam-uint-init.c: Likewise.
* math/test-signgam-uint-static.c: Likewise.
* math/test-signgam-uint.c: Likewise.
* math/test-signgam-ullong-init-static.c: Likewise.
* math/test-signgam-ullong-init.c: Likewise.
* math/test-signgam-ullong-static.c: Likewise.
* math/test-signgam-ullong.c: Likewise.
* math/w_lgamma.c: Rename to w_lgamma_main.c and replace by
wrapper of w_lgamma_main.c.
* math/w_lgamma_compat.c: New file.
* math/w_lgamma_compatf.c: Likewise.
* math/w_lgamma_compatl.c: Likewise.
* math/w_lgamma_main.c: New file.  Based on w_lgamma.c.  Include
<lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
defining compatibility symbols.
(__lgamma): Change to LGFUNC (__lgamma).  Use CALL_LGAMMA.
* math/w_lgammaf.c: Rename to w_lgammaf_main.c and replace by
wrapper of w_lgammaf_main.c.
* math/w_lgammaf_main.c: New file.  Based on w_lgammaf.c.  Include
<lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
defining compatibility symbols.
(__lgammaf): Change to LGFUNC (__lgammaf).  Use CALL_LGAMMA.
* math/w_lgammal.c: Rename to w_lgammal_main.c and replace by
wrapper of w_lgammal_main.c.
* math/w_lgammal_main.c: New file.  Based on w_lgammal.c.  Include
<lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
defining compatibility symbols.
(__lgammal): Change to LGFUNC (__lgammal).  Use CALL_LGAMMA.
* sysdeps/ia64/fpu/lgamma-compat.h: New file.
* sysdeps/ia64/fpu/w_lgamma.c: Move to ....
* sysdeps/ia64/fpu/w_lgamma_main.c: ...here.  Include
<lgamma-compat.h>.
(__ieee754_lgamma): Change to LGFUNC (lgamma).  Use CALL_LGAMMA.
(__ieee754_gamma): Define as alias.
* sysdeps/ia64/fpu/w_lgammaf.c: Move to ....
* sysdeps/ia64/fpu/w_lgammaf_main.c: ...here.  Include
<lgamma-compat.h>.
(__ieee754_lgammaf): Change to LGFUNC (lgammaf).  Use CALL_LGAMMA.
(__ieee754_gammaf): Define as alias.
* sysdeps/ia64/fpu/w_lgammal.c: Move to ....
* sysdeps/ia64/fpu/w_lgammal_main.c: ...here.  Include
<lgamma-compat.h>.
(__ieee754_lgammal): Change to LGFUNC (lgammal).  Use CALL_LGAMMA.
(__ieee754_gammal): Define as alias.
* sysdeps/ieee754/ldbl-opt/w_lgamma.c: Move to ....
* sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c: ...here.  Include
<math/w_lgamma_compat.c>.
[LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)] (__lgammal_dbl_compat):
Define as alias of __lgamma_compat and use in defining lgammal.
* sysdeps/ieee754/ldbl-opt/w_lgammal.c: Move to ....
* sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c: ...here.  Include
<math/lgamma-compat.h> and <math/w_lgamma_compatl.c>.
(USE_AS_COMPAT): New macro.
(LGAMMA_OLD_VER): Undefine and redefine.
(lgammal): Do not define here.
(gammal): Only define here if [GAMMA_ALIAS].
* conform/linknamespace.pl (@whitelist): Remove signgam.
* sysdeps/nacl/libm.abilist: Update.
* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.

65 files changed:
ChangeLog
NEWS
conform/linknamespace.pl
include/math.h
math/Makefile
math/Versions
math/lgamma-compat.h [new file with mode: 0644]
math/test-signgam-main.c [new file with mode: 0644]
math/test-signgam-uchar-init-static.c [new file with mode: 0644]
math/test-signgam-uchar-init.c [new file with mode: 0644]
math/test-signgam-uchar-static.c [new file with mode: 0644]
math/test-signgam-uchar.c [new file with mode: 0644]
math/test-signgam-uint-init-static.c [new file with mode: 0644]
math/test-signgam-uint-init.c [new file with mode: 0644]
math/test-signgam-uint-static.c [new file with mode: 0644]
math/test-signgam-uint.c [new file with mode: 0644]
math/test-signgam-ullong-init-static.c [new file with mode: 0644]
math/test-signgam-ullong-init.c [new file with mode: 0644]
math/test-signgam-ullong-static.c [new file with mode: 0644]
math/test-signgam-ullong.c [new file with mode: 0644]
math/w_lgamma.c
math/w_lgamma_compat.c [new file with mode: 0644]
math/w_lgamma_compatf.c [new file with mode: 0644]
math/w_lgamma_compatl.c [new file with mode: 0644]
math/w_lgamma_main.c [new file with mode: 0644]
math/w_lgammaf.c
math/w_lgammaf_main.c [new file with mode: 0644]
math/w_lgammal.c
math/w_lgammal_main.c [new file with mode: 0644]
sysdeps/ia64/fpu/lgamma-compat.h [new file with mode: 0644]
sysdeps/ia64/fpu/w_lgamma_main.c [moved from sysdeps/ia64/fpu/w_lgamma.c with 85% similarity]
sysdeps/ia64/fpu/w_lgammaf_main.c [moved from sysdeps/ia64/fpu/w_lgammaf.c with 86% similarity]
sysdeps/ia64/fpu/w_lgammal_main.c [moved from sysdeps/ia64/fpu/w_lgammal.c with 85% similarity]
sysdeps/ieee754/ldbl-opt/w_lgamma.c [deleted file]
sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c [new file with mode: 0644]
sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c [new file with mode: 0644]
sysdeps/ieee754/ldbl-opt/w_lgammal.c [deleted file]
sysdeps/ieee754/s_signgam.c
sysdeps/nacl/libm.abilist
sysdeps/unix/sysv/linux/aarch64/libm.abilist
sysdeps/unix/sysv/linux/alpha/libm.abilist
sysdeps/unix/sysv/linux/arm/libm.abilist
sysdeps/unix/sysv/linux/hppa/libm.abilist
sysdeps/unix/sysv/linux/i386/libm.abilist
sysdeps/unix/sysv/linux/ia64/libm.abilist
sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
sysdeps/unix/sysv/linux/microblaze/libm.abilist
sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
sysdeps/unix/sysv/linux/nios2/libm.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
sysdeps/unix/sysv/linux/sh/libm.abilist
sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist

index 4e12f20963bd8920330d071b37284dd786e7276d..51818799ead8096ab07353787ec43de842f20fe5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,128 @@
+2015-11-20  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #15421]
+       * sysdeps/ieee754/s_signgam.c (signgam): Rename to __signgam,
+       initialize with 0 and define as weak alias of __signgam.
+       * include/math.h [!_ISOMAC] (__signgam): Declare.
+       * math/Makefile (libm-calls): Add w_lgamma_compat.
+       (tests): Add test-signgam-uchar, test-signgam-uchar-init,
+       test-signgam-uint, test-signgam-uint-init, test-signgam-ullong and
+       test-signgam-ullong-init.
+       (tests-static): Add test-signgam-uchar-static,
+       test-signgam-uchar-init-static, test-signgam-uint-static,
+       test-signgam-uint-init-static, test-signgam-ullong-static and
+       test-signgam-ullong-init-static.
+       (CFLAGS-test-signgam-uchar.c): New variable.
+       (CFLAGS-test-signgam-uchar-init.c): Likewise.
+       (CFLAGS-test-signgam-uchar-static.c): Likewise.
+       (CFLAGS-test-signgam-uchar-init-static.c): Likewise.
+       (CFLAGS-test-signgam-uint.c): Likewise.
+       (CFLAGS-test-signgam-uint-init.c): Likewise.
+       (CFLAGS-test-signgam-uint-static.c): Likewise.
+       (CFLAGS-test-signgam-uint-init-static.c): Likewise.
+       (CFLAGS-test-signgam-ullong.c): Likewise.
+       (CFLAGS-test-signgam-ullong-init.c): Likewise.
+       (CFLAGS-test-signgam-ullong-static.c): Likewise.
+       (CFLAGS-test-signgam-ullong-init-static.c): Likewise.
+       * math/Versions (libm): Add GLIBC_2.23.
+       * math/lgamma-compat.h: New file.
+       * math/test-signgam-main.c: Likewise.
+       * math/test-signgam-uchar-init-static.c: Likewise.
+       * math/test-signgam-uchar-init.c: Likewise.
+       * math/test-signgam-uchar-static.c: Likewise.
+       * math/test-signgam-uchar.c: Likewise.
+       * math/test-signgam-uint-init-static.c: Likewise.
+       * math/test-signgam-uint-init.c: Likewise.
+       * math/test-signgam-uint-static.c: Likewise.
+       * math/test-signgam-uint.c: Likewise.
+       * math/test-signgam-ullong-init-static.c: Likewise.
+       * math/test-signgam-ullong-init.c: Likewise.
+       * math/test-signgam-ullong-static.c: Likewise.
+       * math/test-signgam-ullong.c: Likewise.
+       * math/w_lgamma.c: Rename to w_lgamma_main.c and replace by
+       wrapper of w_lgamma_main.c.
+       * math/w_lgamma_compat.c: New file.
+       * math/w_lgamma_compatf.c: Likewise.
+       * math/w_lgamma_compatl.c: Likewise.
+       * math/w_lgamma_main.c: New file.  Based on w_lgamma.c.  Include
+       <lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
+       defining compatibility symbols.
+       (__lgamma): Change to LGFUNC (__lgamma).  Use CALL_LGAMMA.
+       * math/w_lgammaf.c: Rename to w_lgammaf_main.c and replace by
+       wrapper of w_lgammaf_main.c.
+       * math/w_lgammaf_main.c: New file.  Based on w_lgammaf.c.  Include
+       <lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
+       defining compatibility symbols.
+       (__lgammaf): Change to LGFUNC (__lgammaf).  Use CALL_LGAMMA.
+       * math/w_lgammal.c: Rename to w_lgammal_main.c and replace by
+       wrapper of w_lgammal_main.c.
+       * math/w_lgammal_main.c: New file.  Based on w_lgammal.c.  Include
+       <lgamma-compat.h>.  Condition contents on [BUILD_LGAMMA].  Support
+       defining compatibility symbols.
+       (__lgammal): Change to LGFUNC (__lgammal).  Use CALL_LGAMMA.
+       * sysdeps/ia64/fpu/lgamma-compat.h: New file.
+       * sysdeps/ia64/fpu/w_lgamma.c: Move to ....
+       * sysdeps/ia64/fpu/w_lgamma_main.c: ...here.  Include
+       <lgamma-compat.h>.
+       (__ieee754_lgamma): Change to LGFUNC (lgamma).  Use CALL_LGAMMA.
+       (__ieee754_gamma): Define as alias.
+       * sysdeps/ia64/fpu/w_lgammaf.c: Move to ....
+       * sysdeps/ia64/fpu/w_lgammaf_main.c: ...here.  Include
+       <lgamma-compat.h>.
+       (__ieee754_lgammaf): Change to LGFUNC (lgammaf).  Use CALL_LGAMMA.
+       (__ieee754_gammaf): Define as alias.
+       * sysdeps/ia64/fpu/w_lgammal.c: Move to ....
+       * sysdeps/ia64/fpu/w_lgammal_main.c: ...here.  Include
+       <lgamma-compat.h>.
+       (__ieee754_lgammal): Change to LGFUNC (lgammal).  Use CALL_LGAMMA.
+       (__ieee754_gammal): Define as alias.
+       * sysdeps/ieee754/ldbl-opt/w_lgamma.c: Move to ....
+       * sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c: ...here.  Include
+       <math/w_lgamma_compat.c>.
+       [LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)] (__lgammal_dbl_compat):
+       Define as alias of __lgamma_compat and use in defining lgammal.
+       * sysdeps/ieee754/ldbl-opt/w_lgammal.c: Move to ....
+       * sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c: ...here.  Include
+       <math/lgamma-compat.h> and <math/w_lgamma_compatl.c>.
+       (USE_AS_COMPAT): New macro.
+       (LGAMMA_OLD_VER): Undefine and redefine.
+       (lgammal): Do not define here.
+       (gammal): Only define here if [GAMMA_ALIAS].
+       * conform/linknamespace.pl (@whitelist): Remove signgam.
+       * sysdeps/nacl/libm.abilist: Update.
+       * sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
+
 2015-11-20  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
        [BZ #16364]
diff --git a/NEWS b/NEWS
index 4c00e1474c49bd599dfc7100f5f249141ea07000..df8ad62a8243cbbdb0b0367487f1c50d0b109470 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -42,6 +42,12 @@ Version 2.23
 * Optimized string, wcsmbs and memory functions for IBM z13.
   Implemented by Stefan Liebler.
 
+* Newly linked programs that define a variable called signgam will no longer
+  have it set by the lgamma, lgammaf and lgammal functions.  Programs that
+  require signgam to be set by those functions must ensure that they use the
+  variable provided by the GNU C Library and declared in <math.h>, without
+  defining their own copy.
+
 * The minimum GCC version that can be used to build this version of the GNU
   C Library is GCC 4.7.  Older GCC versions, and non-GNU compilers, can
   still be used to compile programs using the GNU C Library.
index 94ebfd469b5c607b3f9e8536093e285cfb354772..d4b3142a078c55bcc78956eafc83b74be01bf066 100644 (file)
@@ -40,8 +40,6 @@ close (STDSYMS) || die ("close $stdsyms_file: $!\n");
 
 # The following whitelisted symbols are also allowed for now.
 #
-# * Bug 15421: lgamma wrongly sets signgam for ISO C.
-#
 # * Bug 17576: stdin, stdout, stderr only reserved with external
 # linkage when stdio.h included (and possibly not then), not
 # generally.
@@ -52,7 +50,7 @@ close (STDSYMS) || die ("close $stdsyms_file: $!\n");
 # * False positive: matherr only used conditionally.  matherrf/matherrl are used
 # by IA64 too for the same reason.
 #
-@whitelist = qw(signgam stdin stdout stderr re_syntax_options matherr matherrf
+@whitelist = qw(stdin stdout stderr re_syntax_options matherr matherrf
                matherrl);
 foreach my $sym (@whitelist) {
   $stdsyms{$sym} = 1;
index b28c4412e20dd5d9c321e9e7b73be78038334275..ba7bba018a34db70c934f1767aa5fb9e35acb961 100644 (file)
@@ -6,6 +6,8 @@
 /* Now define the internal interfaces.  */
 extern int __matherr (struct exception *__exc);
 
+extern int __signgam;
+
 # if IS_IN (libc) || IS_IN (libm)
 hidden_proto (__finite)
 hidden_proto (__isinf)
index 06412f3980664d85b919b1ee9832647081955145..0ff3baa19e290b96b5b6247d62850692fb6211e8 100644 (file)
@@ -62,7 +62,8 @@ libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod        \
             s_casinh s_cacosh s_catanh s_csqrt s_cpow s_cproj s_clog10 \
             s_fma s_lrint s_llrint s_lround s_llround e_exp10 w_log2   \
             s_issignaling $(calls:s_%=m_%) x2y2m1 k_casinh     \
-            gamma_product k_standard lgamma_neg lgamma_product
+            gamma_product k_standard lgamma_neg lgamma_product         \
+            w_lgamma_compat
 
 dbl-only-routines := branred doasin dosincos halfulp mpa mpatan2       \
                     mpatan mpexp mplog mpsqrt mptan sincos32 slowexp   \
@@ -110,8 +111,13 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
        test-fenv-tls test-fenv-preserve test-fenv-return test-fenvinline \
        test-nearbyint-except test-fenv-clear test-signgam-finite \
        test-signgam-finite-c99 test-signgam-finite-c11 \
-       test-nearbyint-except-2 $(tests-static)
-tests-static = test-fpucw-static test-fpucw-ieee-static
+       test-nearbyint-except-2 test-signgam-uchar test-signgam-uchar-init \
+       test-signgam-uint test-signgam-uint-init test-signgam-ullong \
+       test-signgam-ullong-init $(tests-static)
+tests-static = test-fpucw-static test-fpucw-ieee-static \
+              test-signgam-uchar-static test-signgam-uchar-init-static \
+              test-signgam-uint-static test-signgam-uint-init-static \
+              test-signgam-ullong-static test-signgam-ullong-init-static
 # We do the `long double' tests only if this data type is available and
 # distinct from `double'.
 test-longdouble-yes = test-ldouble test-ildoubl test-ldouble-finite
@@ -200,6 +206,18 @@ CPPFLAGS-test-ildoubl.c = -U__LIBC_INTERNAL_MATH_INLINES \
 CFLAGS-test-signgam-finite.c = -ffinite-math-only
 CFLAGS-test-signgam-finite-c99.c = -ffinite-math-only -std=c99
 CFLAGS-test-signgam-finite-c11.c = -ffinite-math-only -std=c11
+CFLAGS-test-signgam-uchar.c = -std=c99
+CFLAGS-test-signgam-uchar-init.c = -std=c99
+CFLAGS-test-signgam-uchar-static.c = -std=c99
+CFLAGS-test-signgam-uchar-init-static.c = -std=c99
+CFLAGS-test-signgam-uint.c = -std=c99
+CFLAGS-test-signgam-uint-init.c = -std=c99
+CFLAGS-test-signgam-uint-static.c = -std=c99
+CFLAGS-test-signgam-uint-init-static.c = -std=c99
+CFLAGS-test-signgam-ullong.c = -std=c99
+CFLAGS-test-signgam-ullong-init.c = -std=c99
+CFLAGS-test-signgam-ullong-static.c = -std=c99
+CFLAGS-test-signgam-ullong-init-static.c = -std=c99
 
 # The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
 # for error handling in the -lm functions.
index 551abec02070b8c575b05211d2f0d19482b91e92..e6a597cf237a90c8db3740c0d4336a0105493793 100644 (file)
@@ -203,4 +203,11 @@ libm {
   GLIBC_2.18 {
     __issignaling; __issignalingf; __issignalingl;
   }
+  GLIBC_2.23 {
+    # The __signgam name must be exported for the signgam weak alias
+    # to work.  New symbol versions of lgamma* that set __signgam are
+    # needed to preserve compatibility with old binaries that have a
+    # dynamic symbol for signgam but not __signgam.
+    lgamma; lgammaf; lgammal; __signgam;
+  }
 }
diff --git a/math/lgamma-compat.h b/math/lgamma-compat.h
new file mode 100644 (file)
index 0000000..1393f0e
--- /dev/null
@@ -0,0 +1,73 @@
+/* ABI compatibility for lgamma functions.
+   Copyright (C) 2015 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 LGAMMA_COMPAT_H
+#define LGAMMA_COMPAT_H 1
+
+#include <shlib-compat.h>
+
+/* XSI POSIX requires lgamma to set signgam, but ISO C does not permit
+   this.  Namespace issues can be avoided if the functions set
+   __signgam and signgam is a weak alias, but this only works if both
+   signgam and __signgam were exported from the glibc version the
+   program was linked against.  Before glibc 2.23, lgamma functions
+   set signgam which was not a weak alias for __signgam, so old
+   binaries have dynamic symbols for signgam only and the versions of
+   lgamma used for old binaries must set both signgam and __signgam.
+   Those versions also do a check of _LIB_VERSION != _ISOC_ to match
+   old glibc.
+
+   Users of this file define USE_AS_COMPAT to 0 when building the main
+   version of lgamma, 1 when building the compatibility version.  */
+
+#define LGAMMA_OLD_VER GLIBC_2_0
+#define LGAMMA_NEW_VER GLIBC_2_23
+#define HAVE_LGAMMA_COMPAT SHLIB_COMPAT (libm, LGAMMA_OLD_VER, LGAMMA_NEW_VER)
+
+/* Whether to build this version at all.  */
+#define BUILD_LGAMMA (HAVE_LGAMMA_COMPAT || !USE_AS_COMPAT)
+
+/* The name to use for this version.  */
+#if USE_AS_COMPAT
+# define LGFUNC(FUNC) FUNC ## _compat
+#else
+# define LGFUNC(FUNC) FUNC
+#endif
+
+/* If there is a compatibility version, gamma (not an ISO C function,
+   so never a problem for it to set signgam) points directly to it
+   rather than having separate versions.  */
+#define GAMMA_ALIAS (USE_AS_COMPAT ? HAVE_LGAMMA_COMPAT : !HAVE_LGAMMA_COMPAT)
+
+/* How to call the underlying lgamma_r function.  */
+#define CALL_LGAMMA(TYPE, FUNC, ARG)                   \
+  ({                                                   \
+    TYPE lgamma_tmp;                                   \
+    int local_signgam;                                 \
+    if (USE_AS_COMPAT)                                 \
+      {                                                        \
+       lgamma_tmp = FUNC ((ARG), &local_signgam);      \
+       if (_LIB_VERSION != _ISOC_)                     \
+         signgam = __signgam = local_signgam;          \
+      }                                                        \
+    else                                               \
+      lgamma_tmp = FUNC ((ARG), &__signgam);           \
+    lgamma_tmp;                                                \
+  })
+
+#endif /* lgamma-compat.h.  */
diff --git a/math/test-signgam-main.c b/math/test-signgam-main.c
new file mode 100644 (file)
index 0000000..6aed7f4
--- /dev/null
@@ -0,0 +1,71 @@
+/* Test lgamma functions do not set signgam for ISO C.
+   Copyright (C) 2015 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/>.  */
+
+#undef _LIBC
+#undef _GNU_SOURCE
+#define _ISOMAC
+
+#include <math.h>
+#include <stdio.h>
+
+#define INITVAL ((TYPE) -1 / 3)
+
+#if DO_INIT
+TYPE signgam = INITVAL;
+#else
+TYPE signgam;
+#endif
+
+#define RUN_TESTS(FUNC, TYPE)                                  \
+  do                                                           \
+    {                                                          \
+      volatile TYPE a, b, c __attribute__ ((unused));          \
+      a = 0.5;                                                 \
+      b = -0.5;                                                        \
+      signgam = INITVAL;                                       \
+      c = FUNC (a);                                            \
+      if (signgam == INITVAL)                                  \
+       puts ("PASS: " #FUNC " (0.5) setting signgam");         \
+      else                                                     \
+       {                                                       \
+         puts ("FAIL: " #FUNC " (0.5) setting signgam");       \
+         result = 1;                                           \
+       }                                                       \
+      signgam = INITVAL;                                       \
+      c = FUNC (b);                                            \
+      if (signgam == INITVAL)                                  \
+       puts ("PASS: " #FUNC " (-0.5) setting signgam");        \
+      else                                                     \
+       {                                                       \
+         puts ("FAIL: " #FUNC " (-0.5) setting signgam");      \
+         result = 1;                                           \
+       }                                                       \
+    }                                                          \
+  while (0)
+
+int
+main (void)
+{
+  int result = 0;
+  RUN_TESTS (lgammaf, float);
+  RUN_TESTS (lgamma, double);
+#ifndef NO_LONG_DOUBLE
+  RUN_TESTS (lgammal, long double);
+#endif
+  return result;
+}
diff --git a/math/test-signgam-uchar-init-static.c b/math/test-signgam-uchar-init-static.c
new file mode 100644 (file)
index 0000000..43ac502
--- /dev/null
@@ -0,0 +1 @@
+#include "test-signgam-uchar-init.c"
diff --git a/math/test-signgam-uchar-init.c b/math/test-signgam-uchar-init.c
new file mode 100644 (file)
index 0000000..4eea51e
--- /dev/null
@@ -0,0 +1,3 @@
+#define TYPE unsigned char
+#define DO_INIT 1
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-uchar-static.c b/math/test-signgam-uchar-static.c
new file mode 100644 (file)
index 0000000..a1e655d
--- /dev/null
@@ -0,0 +1 @@
+#include "test-signgam-uchar.c"
diff --git a/math/test-signgam-uchar.c b/math/test-signgam-uchar.c
new file mode 100644 (file)
index 0000000..b613fd2
--- /dev/null
@@ -0,0 +1,3 @@
+#define TYPE unsigned char
+#define DO_INIT 0
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-uint-init-static.c b/math/test-signgam-uint-init-static.c
new file mode 100644 (file)
index 0000000..1afb205
--- /dev/null
@@ -0,0 +1 @@
+#include "test-signgam-uint-init.c"
diff --git a/math/test-signgam-uint-init.c b/math/test-signgam-uint-init.c
new file mode 100644 (file)
index 0000000..e3d064f
--- /dev/null
@@ -0,0 +1,3 @@
+#define TYPE unsigned int
+#define DO_INIT 1
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-uint-static.c b/math/test-signgam-uint-static.c
new file mode 100644 (file)
index 0000000..0aa0c24
--- /dev/null
@@ -0,0 +1 @@
+#include "test-signgam-uint.c"
diff --git a/math/test-signgam-uint.c b/math/test-signgam-uint.c
new file mode 100644 (file)
index 0000000..4ab783f
--- /dev/null
@@ -0,0 +1,3 @@
+#define TYPE unsigned int
+#define DO_INIT 0
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-ullong-init-static.c b/math/test-signgam-ullong-init-static.c
new file mode 100644 (file)
index 0000000..84e0a19
--- /dev/null
@@ -0,0 +1 @@
+#include "test-signgam-ullong-init.c"
diff --git a/math/test-signgam-ullong-init.c b/math/test-signgam-ullong-init.c
new file mode 100644 (file)
index 0000000..f32957f
--- /dev/null
@@ -0,0 +1,3 @@
+#define TYPE unsigned long long int
+#define DO_INIT 1
+#include "test-signgam-main.c"
diff --git a/math/test-signgam-ullong-static.c b/math/test-signgam-ullong-static.c
new file mode 100644 (file)
index 0000000..13e4385
--- /dev/null
@@ -0,0 +1 @@
+#include "test-signgam-ullong.c"
diff --git a/math/test-signgam-ullong.c b/math/test-signgam-ullong.c
new file mode 100644 (file)
index 0000000..5d4f27e
--- /dev/null
@@ -0,0 +1,3 @@
+#define TYPE unsigned long long int
+#define DO_INIT 0
+#include "test-signgam-main.c"
index a82b5e397c0cd295cd142429e334015535bd1556..8bb33e0472b313d2df05b5879535924c5a967c07 100644 (file)
@@ -1,49 +1,2 @@
-/* @(#)w_lgamma.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* double lgamma(double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call __ieee754_lgamma_r
- */
-
-#include <math.h>
-#include <math_private.h>
-
-double
-__lgamma(double x)
-{
-       int local_signgam = 0;
-       double y = __ieee754_lgamma_r(x,
-                                     _LIB_VERSION != _ISOC_
-                                     /* ISO C99 does not define the
-                                        global variable.  */
-                                     ? &signgam
-                                     : &local_signgam);
-       if(__builtin_expect(!isfinite(y), 0)
-          && isfinite(x) && _LIB_VERSION != _IEEE_)
-               return __kernel_standard(x, x,
-                                        __floor(x)==x&&x<=0.0
-                                        ? 15 /* lgamma pole */
-                                        : 14); /* lgamma overflow */
-
-       return y;
-}
-weak_alias (__lgamma, lgamma)
-strong_alias (__lgamma, __gamma)
-weak_alias (__gamma, gamma)
-#ifdef NO_LONG_DOUBLE
-strong_alias (__lgamma, __lgammal)
-weak_alias (__lgamma, lgammal)
-strong_alias (__gamma, __gammal)
-weak_alias (__gamma, gammal)
-#endif
+#define USE_AS_COMPAT 0
+#include <w_lgamma_main.c>
diff --git a/math/w_lgamma_compat.c b/math/w_lgamma_compat.c
new file mode 100644 (file)
index 0000000..30510a5
--- /dev/null
@@ -0,0 +1,2 @@
+#define USE_AS_COMPAT 1
+#include <w_lgamma_main.c>
diff --git a/math/w_lgamma_compatf.c b/math/w_lgamma_compatf.c
new file mode 100644 (file)
index 0000000..e59586f
--- /dev/null
@@ -0,0 +1,2 @@
+#define USE_AS_COMPAT 1
+#include <w_lgammaf_main.c>
diff --git a/math/w_lgamma_compatl.c b/math/w_lgamma_compatl.c
new file mode 100644 (file)
index 0000000..55ca364
--- /dev/null
@@ -0,0 +1,2 @@
+#define USE_AS_COMPAT 1
+#include <w_lgammal_main.c>
diff --git a/math/w_lgamma_main.c b/math/w_lgamma_main.c
new file mode 100644 (file)
index 0000000..cdea331
--- /dev/null
@@ -0,0 +1,59 @@
+/* @(#)w_lgamma.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/* double lgamma(double x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_lgamma_r
+ */
+
+#include <math.h>
+#include <math_private.h>
+
+#include <lgamma-compat.h>
+
+#if BUILD_LGAMMA
+double
+LGFUNC (__lgamma) (double x)
+{
+       double y = CALL_LGAMMA (double, __ieee754_lgamma_r, x);
+       if(__builtin_expect(!isfinite(y), 0)
+          && isfinite(x) && _LIB_VERSION != _IEEE_)
+               return __kernel_standard(x, x,
+                                        __floor(x)==x&&x<=0.0
+                                        ? 15 /* lgamma pole */
+                                        : 14); /* lgamma overflow */
+
+       return y;
+}
+# if USE_AS_COMPAT
+compat_symbol (libm, __lgamma_compat, lgamma, LGAMMA_OLD_VER);
+#  ifdef NO_LONG_DOUBLE
+strong_alias (__lgamma_compat, __lgammal_compat)
+compat_symbol (libm, __lgammal_compat, lgammal, LGAMMA_OLD_VER);
+#  endif
+# else
+versioned_symbol (libm, __lgamma, lgamma, LGAMMA_NEW_VER);
+#  ifdef NO_LONG_DOUBLE
+strong_alias (__lgamma, __lgammal)
+versioned_symbol (libm, __lgammal, lgammal, LGAMMA_NEW_VER);
+#  endif
+# endif
+# if GAMMA_ALIAS
+strong_alias (LGFUNC (__lgamma), __gamma)
+weak_alias (__gamma, gamma)
+#  ifdef NO_LONG_DOUBLE
+strong_alias (__gamma, __gammal)
+weak_alias (__gamma, gammal)
+#  endif
+# endif
+#endif
index dac69dd32a3c642f059d76696b7d1d318b23458f..5fc402260c2f76caf73337fe1df625d5344dd3b7 100644 (file)
@@ -1,40 +1,2 @@
-/* w_lgammaf.c -- float version of w_lgamma.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#include <math.h>
-#include <math_private.h>
-
-float
-__lgammaf(float x)
-{
-       int local_signgam = 0;
-       float y = __ieee754_lgammaf_r(x,
-                                     _LIB_VERSION != _ISOC_
-                                     /* ISO C99 does not define the
-                                        global variable.  */
-                                     ? &signgam
-                                     : &local_signgam);
-       if(__builtin_expect(!isfinite(y), 0)
-          && isfinite(x) && _LIB_VERSION != _IEEE_)
-               return __kernel_standard_f(x, x,
-                                          __floorf(x)==x&&x<=0.0f
-                                          ? 115 /* lgamma pole */
-                                          : 114); /* lgamma overflow */
-
-       return y;
-}
-weak_alias (__lgammaf, lgammaf)
-strong_alias (__lgammaf, __gammaf)
-weak_alias (__gammaf, gammaf)
+#define USE_AS_COMPAT 0
+#include <w_lgammaf_main.c>
diff --git a/math/w_lgammaf_main.c b/math/w_lgammaf_main.c
new file mode 100644 (file)
index 0000000..ba7ff0e
--- /dev/null
@@ -0,0 +1,44 @@
+/* w_lgammaf.c -- float version of w_lgamma.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <math.h>
+#include <math_private.h>
+
+#include <lgamma-compat.h>
+
+#if BUILD_LGAMMA
+float
+LGFUNC (__lgammaf) (float x)
+{
+       float y = CALL_LGAMMA (float, __ieee754_lgammaf_r, x);
+       if(__builtin_expect(!isfinite(y), 0)
+          && isfinite(x) && _LIB_VERSION != _IEEE_)
+               return __kernel_standard_f(x, x,
+                                          __floorf(x)==x&&x<=0.0f
+                                          ? 115 /* lgamma pole */
+                                          : 114); /* lgamma overflow */
+
+       return y;
+}
+# if USE_AS_COMPAT
+compat_symbol (libm, __lgammaf_compat, lgammaf, LGAMMA_OLD_VER);
+# else
+versioned_symbol (libm, __lgammaf, lgammaf, LGAMMA_NEW_VER);
+# endif
+# if GAMMA_ALIAS
+strong_alias (LGFUNC (__lgammaf), __gammaf)
+weak_alias (__gammaf, gammaf)
+# endif
+#endif
index 8abe6a018fe2a7c8f7ac585ca34b6428c54380c2..78dd9c5808136230397464f03e99f19f4a08096f 100644 (file)
@@ -1,47 +1,2 @@
-/* w_lgammal.c -- long double version of w_lgamma.c.
- * Conversion to long double by Ulrich Drepper,
- * Cygnus Support, drepper@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* long double lgammal(long double x)
- * Return the logarithm of the Gamma function of x.
- *
- * Method: call __ieee754_lgammal_r
- */
-
-#include <math.h>
-#include <math_private.h>
-
-long double
-__lgammal(long double x)
-{
-       int local_signgam = 0;
-       long double y = __ieee754_lgammal_r(x,
-                                           _LIB_VERSION != _ISOC_
-                                           /* ISO C99 does not define the
-                                              global variable.  */
-                                           ? &signgam
-                                           : &local_signgam);
-       if(__builtin_expect(!isfinite(y), 0)
-          && isfinite(x) && _LIB_VERSION != _IEEE_)
-               return __kernel_standard_l(x, x,
-                                          __floorl(x)==x&&x<=0.0L
-                                          ? 215 /* lgamma pole */
-                                          : 214); /* lgamma overflow */
-
-       return y;
-}
-weak_alias (__lgammal, lgammal)
-strong_alias (__lgammal, __gammal)
-weak_alias (__gammal, gammal)
+#define USE_AS_COMPAT 0
+#include <w_lgammal_main.c>
diff --git a/math/w_lgammal_main.c b/math/w_lgammal_main.c
new file mode 100644 (file)
index 0000000..c3c41f6
--- /dev/null
@@ -0,0 +1,51 @@
+/* w_lgammal.c -- long double version of w_lgamma.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/* long double lgammal(long double x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_lgammal_r
+ */
+
+#include <math.h>
+#include <math_private.h>
+
+#include <lgamma-compat.h>
+
+#if BUILD_LGAMMA
+long double
+LGFUNC (__lgammal) (long double x)
+{
+       long double y = CALL_LGAMMA (long double, __ieee754_lgammal_r, x);
+       if(__builtin_expect(!isfinite(y), 0)
+          && isfinite(x) && _LIB_VERSION != _IEEE_)
+               return __kernel_standard_l(x, x,
+                                          __floorl(x)==x&&x<=0.0L
+                                          ? 215 /* lgamma pole */
+                                          : 214); /* lgamma overflow */
+
+       return y;
+}
+# if USE_AS_COMPAT
+compat_symbol (libm, __lgammal_compat, lgammal, LGAMMA_OLD_VER);
+# else
+versioned_symbol (libm, __lgammal, lgammal, LGAMMA_NEW_VER);
+# endif
+# if GAMMA_ALIAS
+strong_alias (LGFUNC (__lgammal), __gammal)
+weak_alias (__gammal, gammal)
+# endif
+#endif
diff --git a/sysdeps/ia64/fpu/lgamma-compat.h b/sysdeps/ia64/fpu/lgamma-compat.h
new file mode 100644 (file)
index 0000000..f974839
--- /dev/null
@@ -0,0 +1,42 @@
+/* ABI compatibility for lgamma functions.  ia64 version.
+   Copyright (C) 2015 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 IA64_LGAMMA_COMPAT_H
+#define IA64_LGAMMA_COMPAT_H 1
+
+#include <math/lgamma-compat.h>
+
+#undef LGFUNC
+#if USE_AS_COMPAT
+# define LGFUNC(FUNC) __ ## FUNC ## _compat
+#else
+# define LGFUNC(FUNC) __ieee754_ ## FUNC
+#endif
+
+#undef CALL_LGAMMA
+#define CALL_LGAMMA(TYPE, FUNC, ARG)                           \
+  ({                                                           \
+    TYPE lgamma_tmp;                                           \
+    extern int __signgam, signgam;                             \
+    lgamma_tmp = FUNC ((ARG), &__signgam, sizeof (__signgam)); \
+    if (USE_AS_COMPAT)                                         \
+      signgam = __signgam;                                     \
+    lgamma_tmp;                                                        \
+  })
+
+#endif /* lgamma-compat.h.  */
similarity index 85%
rename from sysdeps/ia64/fpu/w_lgamma.c
rename to sysdeps/ia64/fpu/w_lgamma_main.c
index 2006d3e806e4f3145531316e800519e1f149ea6c..6deffad987f05c7848b0b4bd79da802664097027 100644 (file)
 
 #include "libm_support.h"
 
+#include <lgamma-compat.h>
 
 extern double __libm_lgamma(double /*x*/, int* /*signgam*/, int /*signgamsz*/);
 
 
-double __ieee754_lgamma(double x)
+double LGFUNC (lgamma) (double x)
 {
-#ifdef __POSIX__
-    extern int    signgam;
-#else
-    int    signgam;
-#endif
-    return __libm_lgamma(x, &signgam, sizeof(signgam));
+    return CALL_LGAMMA (double, __libm_lgamma, x);
 }
-weak_alias (__ieee754_lgamma, lgamma)
-
-double __ieee754_gamma(double x)
-{
-#ifdef __POSIX__
-    extern int    signgam;
+#if USE_AS_COMPAT
+compat_symbol (libm, __lgammaf_compat, lgammaf, LGAMMA_OLD_VER);
 #else
-    int    signgam;
+versioned_symbol (libm, __ieee754_lgammaf, lgammaf, LGAMMA_NEW_VER);
+#endif
+#if GAMMA_ALIAS
+strong_alias (LGFUNC (lgammaf), __ieee754_gammaf)
+weak_alias (__ieee754_gammaf, gammaf)
 #endif
-    return __libm_lgamma(x, &signgam, sizeof(signgam));
-}
-weak_alias (__ieee754_gamma, gamma)
similarity index 86%
rename from sysdeps/ia64/fpu/w_lgammaf.c
rename to sysdeps/ia64/fpu/w_lgammaf_main.c
index cd0b4f666605d9628d5769788d5de8f52eea3974..d8e86a6f257544cbce7e5e8938b2c36cdfff6b5c 100644 (file)
 
 #include "libm_support.h"
 
+#include <lgamma-compat.h>
 
 extern float  __libm_lgammaf(float /*x*/, int* /*signgam*/, int /*signgamsz*/);
 
 
-float __ieee754_lgammaf(float x)
+float LGFUNC (lgammaf) (float x)
 {
-#ifdef __POSIX__
-    extern int    signgam;
-#else
-    int    signgam;
-#endif
-    return __libm_lgammaf(x, &signgam, sizeof(signgam));
+    return CALL_LGAMMA (float, __libm_lgammaf, x);
 }
-weak_alias (__ieee754_lgammaf, lgammaf)
-
-float __ieee754_gammaf(float x)
-{
-#ifdef __POSIX__
-    extern int    signgam;
+#if USE_AS_COMPAT
+compat_symbol (libm, __lgammaf_compat, lgammaf, LGAMMA_OLD_VER);
 #else
-    int    signgam;
+versioned_symbol (libm, __ieee754_lgammaf, lgammaf, LGAMMA_NEW_VER);
 #endif
-    return __libm_lgammaf(x, &signgam, sizeof(signgam));
-}
+#if GAMMA_ALIAS
+strong_alias (LGFUNC (lgammaf), __ieee754_gammaf)
 weak_alias (__ieee754_gammaf, gammaf)
+#endif
similarity index 85%
rename from sysdeps/ia64/fpu/w_lgammal.c
rename to sysdeps/ia64/fpu/w_lgammal_main.c
index e3885296eb473d4a3d18302d1074a4d31aad26a0..5c73f33430bc6dfb45ce70e7588cb338cf6d0228 100644 (file)
 
 extern double __libm_lgammal(long double /*x*/, int* /*signgam*/, int /*signgamsz*/);
 
+#include <lgamma-compat.h>
 
-long double __ieee754_lgammal(long double x)
+long double LGFUNC (lgammal) (long double x)
 {
-#ifdef __POSIX__
-    extern int    signgam;
-#else
-    int    signgam;
-#endif
-    return __libm_lgammal(x, &signgam, sizeof(signgam));
+    return CALL_LGAMMA (long double, __libm_lgammal, x);
 }
-weak_alias (__ieee754_lgammal, lgammal)
-
-long double __ieee754_gammal(long double x)
-{
-#ifdef __POSIX__
-    extern int    signgam;
+#if USE_AS_COMPAT
+compat_symbol (libm, __lgammal_compat, lgammal, LGAMMA_OLD_VER);
 #else
-    int    signgam;
+versioned_symbol (libm, __ieee754_lgammal, lgammal, LGAMMA_NEW_VER);
 #endif
-    return __libm_lgammal(x, &signgam, sizeof(signgam));
-}
+#if GAMMA_ALIAS
+strong_alias (LGFUNC (lgammal), __ieee754_gammal)
 weak_alias (__ieee754_gammal, gammal)
+#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgamma.c b/sysdeps/ieee754/ldbl-opt/w_lgamma.c
deleted file mode 100644 (file)
index ef801c5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <math_ldbl_opt.h>
-#include <math/w_lgamma.c>
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __lgamma, lgammal, GLIBC_2_0);
-compat_symbol (libm, __gamma, gammal, GLIBC_2_0);
-#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c b/sysdeps/ieee754/ldbl-opt/w_lgamma_compat.c
new file mode 100644 (file)
index 0000000..f268e65
--- /dev/null
@@ -0,0 +1,7 @@
+#include <math_ldbl_opt.h>
+#include <math/w_lgamma_compat.c>
+#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
+strong_alias (__lgamma_compat, __lgammal_dbl_compat)
+compat_symbol (libm, __lgammal_dbl_compat, lgammal, GLIBC_2_0);
+compat_symbol (libm, __gamma, gammal, GLIBC_2_0);
+#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c b/sysdeps/ieee754/ldbl-opt/w_lgamma_compatl.c
new file mode 100644 (file)
index 0000000..f60b3d7
--- /dev/null
@@ -0,0 +1,11 @@
+#include <math_ldbl_opt.h>
+#undef weak_alias
+#define weak_alias(n,a)
+#define USE_AS_COMPAT 1
+#include <math/lgamma-compat.h>
+#undef LGAMMA_OLD_VER
+#define LGAMMA_OLD_VER LONG_DOUBLE_COMPAT_VERSION
+#include <math/w_lgamma_compatl.c>
+#if GAMMA_ALIAS
+long_double_symbol (libm, __gammal, gammal);
+#endif
diff --git a/sysdeps/ieee754/ldbl-opt/w_lgammal.c b/sysdeps/ieee754/ldbl-opt/w_lgammal.c
deleted file mode 100644 (file)
index 9de7ec8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <math_ldbl_opt.h>
-#undef weak_alias
-#define weak_alias(n,a)
-#include <math/w_lgammal.c>
-long_double_symbol (libm, __lgammal, lgammal);
-long_double_symbol (libm, __gammal, gammal);
index ee207d6505a9ab250b8ce8aa15eb79cbafef6c43..9af3a75f1eac72572267d16b0ec1fe62ead13a96 100644 (file)
@@ -1,3 +1,4 @@
 #include <math.h>
 #include <math_private.h>
-int signgam;
+int __signgam = 0;
+weak_alias (__signgam, signgam)
index d1fd77ab7f9859d118b488f49758d64b20abda47..055b0b25ba6cdba7099ff007f29b6a6bab0edc51 100644 (file)
@@ -367,3 +367,8 @@ GLIBC_2.22 y1l F
 GLIBC_2.22 yn F
 GLIBC_2.22 ynf F
 GLIBC_2.22 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index ead20e1c6d1da30aa617dbe78ac05da46f88b7ee..2123113e254a18c243e1ad4a2560873473aa76ff 100644 (file)
@@ -398,3 +398,8 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index 80838d31964c0b4476ad1353aa5d2fda91055405..611dfe1aa50b85af57edc76e90d5251dbef81539 100644 (file)
@@ -408,6 +408,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.3.4 GLIBC_2.3.4 A
 GLIBC_2.3.4 __c1_cabsf F
 GLIBC_2.3.4 __c1_cacosf F
index be96e9594b0d80bf99087444c797241f5d0b22df..e65e2309cd7f0418770ad055c23a291578220057 100644 (file)
@@ -56,6 +56,11 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
index 3304e6ec8c2f097f71e60b1be80f74b9634b71c5..9b7f40a4c9a4364525ccb02d93f4c7fc3f4dcb03 100644 (file)
@@ -368,5 +368,10 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
index e049a678cdf4e709fb71e984b192e7de8e7acb93..78b542e935a7a4f7da44c8ca711046015ecab522 100644 (file)
@@ -410,4 +410,9 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
index 39eafb8ab071800d55895656ad9f9ea209260edb..6d4cc72e0ee22896d534ec3f7d6367dafda1bca4 100644 (file)
@@ -339,4 +339,9 @@ GLIBC_2.2 ynl F
 GLIBC_2.2.3 GLIBC_2.2.3 A
 GLIBC_2.2.3 matherrf F
 GLIBC_2.2.3 matherrl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
index be96e9594b0d80bf99087444c797241f5d0b22df..e65e2309cd7f0418770ad055c23a291578220057 100644 (file)
@@ -56,6 +56,11 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
index 48ce23e978555780c73656558a8bc7c32f06f77f..2d319359162ab3743d802647e8921663641d6993 100644 (file)
@@ -408,4 +408,9 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
index 15193f203981a5315f28df353f33ca1269296cae..149fd4f2be4fc6c6b6a553dc81fe06c015eb95ab 100644 (file)
@@ -367,3 +367,8 @@ GLIBC_2.18 y1l F
 GLIBC_2.18 yn F
 GLIBC_2.18 ynf F
 GLIBC_2.18 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index b285c9b733c23af179ff536a999ff454ae5186bd..e599e82d6ec68795b5c5930637882d93b9903da4 100644 (file)
@@ -369,6 +369,11 @@ GLIBC_2.2 tgammal F
 GLIBC_2.2 trunc F
 GLIBC_2.2 truncf F
 GLIBC_2.2 truncl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
 _gp_disp _gp_disp A
index ff42af1f9e82d2cfc02be871575a27072cb2204c..164ba55263b266ae510afe2ba758f1df099231d7 100644 (file)
@@ -400,4 +400,9 @@ GLIBC_2.2 tgammal F
 GLIBC_2.2 trunc F
 GLIBC_2.2 truncf F
 GLIBC_2.2 truncl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
index dae4f5e4bd332a5ef51da0329de374edffea0ca7..ad02eff997e8a2a0c1290d772c01c34a40087bff 100644 (file)
@@ -367,3 +367,8 @@ GLIBC_2.21 y1l F
 GLIBC_2.21 yn F
 GLIBC_2.21 ynf F
 GLIBC_2.21 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index e18a51a5b7b0dd12383e53be2f4db18e9797a789..5d2f2636450600db80b3fe26cd419d8cfd4129f1 100644 (file)
@@ -409,6 +409,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
index 90bfd19e7da043d60010e067ec081fe79b60f53a..8b5edb52a0034598a59762f4d21a07c24b80494a 100644 (file)
@@ -408,6 +408,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
index df3457a70bdb38ed612382b3eae1e0b6432cb60b..ee066837af87302517aa3004c5e4f0e0ccf0345d 100644 (file)
@@ -403,3 +403,8 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index ee01f69a129db22c752bc41c617e8aecd4bcbf5f..6c7fc9b4fc586b605163de25375ab47bde544326 100644 (file)
@@ -84,6 +84,11 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 _LIB_VERSION D 0x4
 GLIBC_2.3 __clog10 F
index e14605bbe7e42565cfc568a4912dbf30587d5a1e..039ed5c5218d89bd6cea477a4b8a11be41af414b 100644 (file)
@@ -398,6 +398,11 @@ GLIBC_2.2 GLIBC_2.2 A
 GLIBC_2.2 fedisableexcept F
 GLIBC_2.2 feenableexcept F
 GLIBC_2.2 fegetexcept F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
index b5abd132f90391e61070913fc7f6af2fe7a5f9cd..66c625daeb833086dea37bde7ca63e12879ae18d 100644 (file)
@@ -396,6 +396,11 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
index 6fabd47dbb5ea57a52810b43db496f72d8e87683..93b84713d88d101b4f1ea76bf820131121443954 100644 (file)
@@ -368,5 +368,10 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
index 2a5f5c7c910cef0e6566e3658b8ad96044686df3..d50ef4a9202b91c45d4746be75cbfd94ee4c4705 100644 (file)
@@ -400,6 +400,11 @@ GLIBC_2.2 feraiseexcept F
 GLIBC_2.2 fesetenv F
 GLIBC_2.2 fesetexceptflag F
 GLIBC_2.2 feupdateenv F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
index 80784c941ae097e8f3ce1a7fd9d0d83e7c8e02d9..b56add357b5e1da3f22498fd32a6fd40ad49be54 100644 (file)
@@ -399,4 +399,9 @@ GLIBC_2.2 y1l F
 GLIBC_2.2 yn F
 GLIBC_2.2 ynf F
 GLIBC_2.2 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
index df50da5464cce6b88d17720a48992d69d5dbb9d6..18b8d00becc6a30a2da4b924809b9f1548bedb60 100644 (file)
@@ -368,3 +368,8 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index df50da5464cce6b88d17720a48992d69d5dbb9d6..18b8d00becc6a30a2da4b924809b9f1548bedb60 100644 (file)
@@ -368,3 +368,8 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index df50da5464cce6b88d17720a48992d69d5dbb9d6..18b8d00becc6a30a2da4b924809b9f1548bedb60 100644 (file)
@@ -368,3 +368,8 @@ GLIBC_2.15 __ynf_finite F
 GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
index a2cb7421f4043862d329d15bd4cdc999c473e2cd..b911aff114ad1bf28524578b84ded9eeb656ffe9 100644 (file)
@@ -399,4 +399,9 @@ GLIBC_2.2.5 y1l F
 GLIBC_2.2.5 yn F
 GLIBC_2.2.5 ynf F
 GLIBC_2.2.5 ynl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F
 GLIBC_2.4 GLIBC_2.4 A
index 4d37717671b5d89cb16f33511adc176f5bb46b58..168c0d87cfa1c30b3dce15246ce8d16f29005f5a 100644 (file)
@@ -398,3 +398,8 @@ GLIBC_2.18 GLIBC_2.18 A
 GLIBC_2.18 __issignaling F
 GLIBC_2.18 __issignalingf F
 GLIBC_2.18 __issignalingl F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 __signgam D 0x4
+GLIBC_2.23 lgamma F
+GLIBC_2.23 lgammaf F
+GLIBC_2.23 lgammal F