From e59c94fa0e2871bdfcc363899e3be376c0def770 Mon Sep 17 00:00:00 2001 From: Chris Metcalf Date: Tue, 1 Dec 2015 14:59:38 -0500 Subject: 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. --- sysdeps/ieee754/dbl-64/s_finite.c | 10 +++++++++- sysdeps/ieee754/dbl-64/s_isinf.c | 5 ++++- sysdeps/ieee754/dbl-64/s_isnan.c | 5 ++++- sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c | 10 +++++++++- sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c | 5 ++++- sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c | 5 ++++- 6 files changed, 34 insertions(+), 6 deletions(-) (limited to 'sysdeps/ieee754') diff --git a/sysdeps/ieee754/dbl-64/s_finite.c b/sysdeps/ieee754/dbl-64/s_finite.c index 2b0ed504f9..b71ae12ea4 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 46a7266e7f..c0ad54538a 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 5d9f31be20..2174d988d8 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 a155a5e1ef..c8e2a7c421 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 163fc31efc..951fb73239 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 e80b84ca02..bcff9e3b67 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 -- cgit 1.4.1