From: Chris Metcalf Date: Tue, 1 Dec 2015 19:59:38 +0000 (-0500) Subject: math: add LDBL_CLASSIFY_COMPAT support X-Git-Tag: glibc-2.23~152 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e59c94fa0e2871bdfcc363899e3be376c0def770;p=thirdparty%2Fglibc.git math: add LDBL_CLASSIFY_COMPAT support If a platform does not define "long-double-fcts = yes" in its Makefiles and it does define __NO_LONG_DOUBLE_MATH in its installed headers, it will currently create exported symbols for __finitel, __isinfl, and __isnanl that can't be reached from userspace by correct use of the finite(), isinf(), or isnan() macros in . To avoid this situation, by default for such platforms we now no longer export these symbols, thus causing appropriate link-time errors. However, for platforms that previously exported these symbols, we continue to do so as compat symbols; this is enabled by adding LDBL_CLASSIFY_COMPAT to math_private.h for the platform. For tile, remove the now-unnecessary exports of those functions from libc and libm. --- diff --git a/ChangeLog b/ChangeLog index 7654fa422e0..292c4951632 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2015-12-03 Chris Metcalf + + * sysdeps/arm/math_private.h (LDBL_CLASSIFY_COMPAT): New symbol. + * sysdeps/microblaze/math_private.h (LDBL_CLASSIFY_COMPAT): + Likewise. + * sysdeps/mips/math_private.h (LDBL_CLASSIFY_COMPAT): Likewise. + * sysdeps/nios2/math_private.h (LDBL_CLASSIFY_COMPAT): Likewise. + * sysdeps/sh/math_private.h: New file. + * sysdeps/m68k/coldfire/fpu/math_private.h: Likewise. + * sysdeps/ieee754/dbl-64/s_finite.c [defined NO_LONG_DOUBLE && + defined LDBL_CLASSIFY_COMPAT]: Create compat symbol for internal + long double function name. + * sysdeps/ieee754/dbl-64/s_isinf.c: Likewise. + * sysdeps/ieee754/dbl-64/s_isnan.c: Likewise. + * sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c: Likewise. + * sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c: Likewise. + * sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c: Likewise. + * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist: + Remove __finitel, __isinfl, and __isnanl. + * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist: + Likewise. + * sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist: Likewise. + * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist: + Remove __finitel. + * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist: + Likewise. + * sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise. + 2015-12-03 Andrew Senkevich * math/Makefile ($(inst_libdir)/libm.so): Corrected path to diff --git a/sysdeps/arm/math_private.h b/sysdeps/arm/math_private.h index c175b15601f..d39e9ee24a1 100644 --- a/sysdeps/arm/math_private.h +++ b/sysdeps/arm/math_private.h @@ -1,6 +1,10 @@ #ifndef ARM_MATH_PRIVATE_H #define ARM_MATH_PRIVATE_H 1 +/* Enable __finitel, __isinfl, and __isnanl for binary compatibility + when built without long double support. */ +#define LDBL_CLASSIFY_COMPAT 1 + #include "fenv_private.h" #include_next diff --git a/sysdeps/ieee754/dbl-64/s_finite.c b/sysdeps/ieee754/dbl-64/s_finite.c index 2b0ed504f9b..b71ae12ea41 100644 --- a/sysdeps/ieee754/dbl-64/s_finite.c +++ b/sysdeps/ieee754/dbl-64/s_finite.c @@ -21,6 +21,7 @@ static char rcsid[] = "$NetBSD: s_finite.c,v 1.8 1995/05/10 20:47:17 jtc Exp $"; #include #include +#include #undef __finite @@ -37,6 +38,13 @@ int FINITE(double x) hidden_def (__finite) weak_alias (__finite, finite) #ifdef NO_LONG_DOUBLE -strong_alias (__finite, __finitel) +# ifdef LDBL_CLASSIFY_COMPAT +# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libc, __finite, __finitel, GLIBC_2_0); +# endif +# if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libm, __finite, __finitel, GLIBC_2_0); +# endif +# endif weak_alias (__finite, finitel) #endif diff --git a/sysdeps/ieee754/dbl-64/s_isinf.c b/sysdeps/ieee754/dbl-64/s_isinf.c index 46a7266e7fa..c0ad54538a1 100644 --- a/sysdeps/ieee754/dbl-64/s_isinf.c +++ b/sysdeps/ieee754/dbl-64/s_isinf.c @@ -15,6 +15,7 @@ static char rcsid[] = "$NetBSD: s_isinf.c,v 1.3 1995/05/11 23:20:14 jtc Exp $"; #include #include +#include int __isinf (double x) @@ -28,6 +29,8 @@ __isinf (double x) hidden_def (__isinf) weak_alias (__isinf, isinf) #ifdef NO_LONG_DOUBLE -strong_alias (__isinf, __isinfl) +# if defined LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); +# endif weak_alias (__isinf, isinfl) #endif diff --git a/sysdeps/ieee754/dbl-64/s_isnan.c b/sysdeps/ieee754/dbl-64/s_isnan.c index 5d9f31be209..2174d988d84 100644 --- a/sysdeps/ieee754/dbl-64/s_isnan.c +++ b/sysdeps/ieee754/dbl-64/s_isnan.c @@ -21,6 +21,7 @@ static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $"; #include #include +#include #undef __isnan int @@ -36,6 +37,8 @@ __isnan (double x) hidden_def (__isnan) weak_alias (__isnan, isnan) #ifdef NO_LONG_DOUBLE -strong_alias (__isnan, __isnanl) +# if defined LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +# endif weak_alias (__isnan, isnanl) #endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c index a155a5e1ef4..c8e2a7c4214 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c @@ -16,6 +16,7 @@ #include #include +#include #include #undef __finite @@ -29,6 +30,13 @@ __finite(double x) hidden_def (__finite) weak_alias (__finite, finite) #ifdef NO_LONG_DOUBLE -strong_alias (__finite, __finitel) +# ifdef LDBL_CLASSIFY_COMPAT +# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libc, __finite, __finitel, GLIBC_2_0); +# endif +# if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libm, __finite, __finitel, GLIBC_2_0); +# endif +# endif weak_alias (__finite, finitel) #endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c index 163fc31efc6..951fb732391 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c @@ -11,6 +11,7 @@ #include #include +#include int __isinf (double x) @@ -25,6 +26,8 @@ __isinf (double x) hidden_def (__isinf) weak_alias (__isinf, isinf) #ifdef NO_LONG_DOUBLE -strong_alias (__isinf, __isinfl) +# if defined LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libc, __isinf, __isinfl, GLIBC_2_0); +# endif weak_alias (__isinf, isinfl) #endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c index e80b84ca023..bcff9e3b67e 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c @@ -17,6 +17,7 @@ #include #include +#include #include #undef __isnan @@ -31,6 +32,8 @@ int __isnan(double x) hidden_def (__isnan) weak_alias (__isnan, isnan) #ifdef NO_LONG_DOUBLE -strong_alias (__isnan, __isnanl) +# if defined LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23) +compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0); +# endif weak_alias (__isnan, isnanl) #endif diff --git a/sysdeps/m68k/coldfire/fpu/math_private.h b/sysdeps/m68k/coldfire/fpu/math_private.h new file mode 100644 index 00000000000..d306a508b4d --- /dev/null +++ b/sysdeps/m68k/coldfire/fpu/math_private.h @@ -0,0 +1,10 @@ +#ifndef COLDFIRE_MATH_PRIVATE_H +#define COLDFIRE_MATH_PRIVATE_H 1 + +/* Enable __finitel, __isinfl, and __isnanl for binary compatibility + when built without long double support. */ +#define LDBL_CLASSIFY_COMPAT 1 + +#include_next + +#endif diff --git a/sysdeps/microblaze/math_private.h b/sysdeps/microblaze/math_private.h index 73e59df5b9d..d82e8bf820c 100644 --- a/sysdeps/microblaze/math_private.h +++ b/sysdeps/microblaze/math_private.h @@ -26,6 +26,10 @@ #define libc_feholdexcept_setround(env, exc) ({ (void) (env); 0; }) #define libc_feupdateenv_test(env, exc) ({ (void) (env); 0; }) +/* Enable __finitel, __isinfl, and __isnanl for binary compatibility + when built without long double support. */ +#define LDBL_CLASSIFY_COMPAT 1 + #include_next #define feraiseexcept(excepts) ({ 0; }) diff --git a/sysdeps/mips/math_private.h b/sysdeps/mips/math_private.h index 2f544245b7b..27de7149c2b 100644 --- a/sysdeps/mips/math_private.h +++ b/sysdeps/mips/math_private.h @@ -248,6 +248,10 @@ libc_feholdsetround_mips_ctx (struct rm_ctx *ctx, int round) #endif +/* Enable __finitel, __isinfl, and __isnanl for binary compatibility + when built without long double support. */ +#define LDBL_CLASSIFY_COMPAT 1 + #include_next #endif diff --git a/sysdeps/nios2/math_private.h b/sysdeps/nios2/math_private.h index a32579ff477..373da2a6219 100644 --- a/sysdeps/nios2/math_private.h +++ b/sysdeps/nios2/math_private.h @@ -25,6 +25,10 @@ #define libc_feholdexcept_setround(env, exc) ({ (void) (env); 0; }) #define libc_feupdateenv_test(env, exc) ({ (void) (env); 0; }) +/* Enable __finitel, __isinfl, and __isnanl for binary compatibility + when built without long double support. */ +#define LDBL_CLASSIFY_COMPAT 1 + #include_next #define feraiseexcept(excepts) ({ 0; }) diff --git a/sysdeps/sh/math_private.h b/sysdeps/sh/math_private.h new file mode 100644 index 00000000000..d13f2d49d3e --- /dev/null +++ b/sysdeps/sh/math_private.h @@ -0,0 +1,10 @@ +#ifndef SH_MATH_PRIVATE_H +#define SH_MATH_PRIVATE_H 1 + +/* Enable __finitel, __isinfl, and __isnanl for binary compatibility + when built without long double support. */ +#define LDBL_CLASSIFY_COMPAT 1 + +#include_next + +#endif diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist index 152adb0b4de..ffcc4a0a2b4 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist @@ -182,7 +182,6 @@ GLIBC_2.12 __fgetws_chk F GLIBC_2.12 __fgetws_unlocked_chk F GLIBC_2.12 __finite F GLIBC_2.12 __finitef F -GLIBC_2.12 __finitel F GLIBC_2.12 __flbf F GLIBC_2.12 __fork F GLIBC_2.12 __fpending F @@ -228,11 +227,9 @@ GLIBC_2.12 __isdigit_l F GLIBC_2.12 __isgraph_l F GLIBC_2.12 __isinf F GLIBC_2.12 __isinff F -GLIBC_2.12 __isinfl F GLIBC_2.12 __islower_l F GLIBC_2.12 __isnan F GLIBC_2.12 __isnanf F -GLIBC_2.12 __isnanl F GLIBC_2.12 __isoc99_fscanf F GLIBC_2.12 __isoc99_fwscanf F GLIBC_2.12 __isoc99_scanf F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist index 9ba58e25c37..18b8d00becc 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist @@ -5,7 +5,6 @@ GLIBC_2.12 __clog10f F GLIBC_2.12 __clog10l F GLIBC_2.12 __finite F GLIBC_2.12 __finitef F -GLIBC_2.12 __finitel F GLIBC_2.12 __fpclassify F GLIBC_2.12 __fpclassifyf F GLIBC_2.12 __signbit F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist index f8377a01c1e..a66e8ec877b 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist @@ -182,7 +182,6 @@ GLIBC_2.12 __fgetws_chk F GLIBC_2.12 __fgetws_unlocked_chk F GLIBC_2.12 __finite F GLIBC_2.12 __finitef F -GLIBC_2.12 __finitel F GLIBC_2.12 __flbf F GLIBC_2.12 __fork F GLIBC_2.12 __fpending F @@ -228,11 +227,9 @@ GLIBC_2.12 __isdigit_l F GLIBC_2.12 __isgraph_l F GLIBC_2.12 __isinf F GLIBC_2.12 __isinff F -GLIBC_2.12 __isinfl F GLIBC_2.12 __islower_l F GLIBC_2.12 __isnan F GLIBC_2.12 __isnanf F -GLIBC_2.12 __isnanl F GLIBC_2.12 __isoc99_fscanf F GLIBC_2.12 __isoc99_fwscanf F GLIBC_2.12 __isoc99_scanf F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist index 9ba58e25c37..18b8d00becc 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist @@ -5,7 +5,6 @@ GLIBC_2.12 __clog10f F GLIBC_2.12 __clog10l F GLIBC_2.12 __finite F GLIBC_2.12 __finitef F -GLIBC_2.12 __finitel F GLIBC_2.12 __fpclassify F GLIBC_2.12 __fpclassifyf F GLIBC_2.12 __signbit F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist index 152adb0b4de..ffcc4a0a2b4 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist @@ -182,7 +182,6 @@ GLIBC_2.12 __fgetws_chk F GLIBC_2.12 __fgetws_unlocked_chk F GLIBC_2.12 __finite F GLIBC_2.12 __finitef F -GLIBC_2.12 __finitel F GLIBC_2.12 __flbf F GLIBC_2.12 __fork F GLIBC_2.12 __fpending F @@ -228,11 +227,9 @@ GLIBC_2.12 __isdigit_l F GLIBC_2.12 __isgraph_l F GLIBC_2.12 __isinf F GLIBC_2.12 __isinff F -GLIBC_2.12 __isinfl F GLIBC_2.12 __islower_l F GLIBC_2.12 __isnan F GLIBC_2.12 __isnanf F -GLIBC_2.12 __isnanl F GLIBC_2.12 __isoc99_fscanf F GLIBC_2.12 __isoc99_fwscanf F GLIBC_2.12 __isoc99_scanf F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist index 9ba58e25c37..18b8d00becc 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist @@ -5,7 +5,6 @@ GLIBC_2.12 __clog10f F GLIBC_2.12 __clog10l F GLIBC_2.12 __finite F GLIBC_2.12 __finitef F -GLIBC_2.12 __finitel F GLIBC_2.12 __fpclassify F GLIBC_2.12 __fpclassifyf F GLIBC_2.12 __signbit F