math: add LDBL_CLASSIFY_COMPAT support
Commit Message
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 <math.h>.
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.
---
Joseph, is that what you had in mind? Passes tests on tilegx, and
I confirmed that enabling LDBL_CLASSIFY_COMPAT for tilegx generated
plausible compat symbols.
2015-12-02 Chris Metcalf <cmetcalf@ezchip.com>
* 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/wordsize-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/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.
ChangeLog | 25 ++++++++++++++++++++++
sysdeps/arm/math_private.h | 4 ++++
sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c | 6 +++++-
sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c | 5 ++++-
sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c | 5 ++++-
sysdeps/m68k/coldfire/fpu/math_private.h | 10 +++++++++
sysdeps/microblaze/math_private.h | 4 ++++
sysdeps/mips/math_private.h | 4 ++++
sysdeps/nios2/math_private.h | 4 ++++
sysdeps/sh/math_private.h | 10 +++++++++
.../sysv/linux/tile/tilegx/tilegx32/libc.abilist | 3 ---
.../sysv/linux/tile/tilegx/tilegx32/libm.abilist | 1 -
.../sysv/linux/tile/tilegx/tilegx64/libc.abilist | 3 ---
.../sysv/linux/tile/tilegx/tilegx64/libm.abilist | 1 -
sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist | 3 ---
sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist | 1 -
16 files changed, 74 insertions(+), 15 deletions(-)
create mode 100644 sysdeps/m68k/coldfire/fpu/math_private.h
create mode 100644 sysdeps/sh/math_private.h
Comments
On Thu, 3 Dec 2015, Chris Metcalf wrote:
> Joseph, is that what you had in mind? Passes tests on tilegx, and
> I confirmed that enabling LDBL_CLASSIFY_COMPAT for tilegx generated
> plausible compat symbols.
Yes, this is what I had in mind. OK with changes as noted. This should
also allow the hppa patch
<https://sourceware.org/ml/libc-alpha/2015-11/msg00520.html> to work
without introducing bogus exports, though that patch needs review by an
hppa person.
> sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c | 6 +++++-
> sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c | 5 ++++-
> sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c | 5 ++++-
You need to change both the wordsize-64 and non-wordsize-64 files.
> #ifdef NO_LONG_DOUBLE
> -strong_alias (__finite, __finitel)
> +# if defined LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23)
> +compat_symbol (libc, __finite, __finitel, GLIBC_2_0);
> +compat_symbol (libm, __finite, __finitel, GLIBC_2_0);
> +# endif
Here and in the other s_finite.c, you should have separate SHLIB_COMPAT
conditionals around the libc and libm compat_symbol calls (each one having
a SHLIB_COMPAT conditional for the right library).
> diff --git a/sysdeps/m68k/coldfire/fpu/math_private.h b/sysdeps/m68k/coldfire/fpu/math_private.h
> new file mode 100644
> index 000000000000..d13f2d49d3ee
> --- /dev/null
> +++ b/sysdeps/m68k/coldfire/fpu/math_private.h
> @@ -0,0 +1,10 @@
> +#ifndef SH_MATH_PRIVATE_H
> +#define SH_MATH_PRIVATE_H 1
This of course should be COLDFIRE_MATH_PRIVATE_H.
On 12/03/2015 12:38 PM, Joseph Myers wrote:
> On Thu, 3 Dec 2015, Chris Metcalf wrote:
>
>> Joseph, is that what you had in mind? Passes tests on tilegx, and
>> I confirmed that enabling LDBL_CLASSIFY_COMPAT for tilegx generated
>> plausible compat symbols.
> Yes, this is what I had in mind. OK with changes as noted. This should
> also allow the hppa patch
> <https://sourceware.org/ml/libc-alpha/2015-11/msg00520.html> to work
> without introducing bogus exports, though that patch needs review by an
> hppa person.
>
>> sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c | 6 +++++-
>> sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c | 5 ++++-
>> sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c | 5 ++++-
> You need to change both the wordsize-64 and non-wordsize-64 files.
>
>> #ifdef NO_LONG_DOUBLE
>> -strong_alias (__finite, __finitel)
>> +# if defined LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23)
>> +compat_symbol (libc, __finite, __finitel, GLIBC_2_0);
>> +compat_symbol (libm, __finite, __finitel, GLIBC_2_0);
>> +# endif
> Here and in the other s_finite.c, you should have separate SHLIB_COMPAT
> conditionals around the libc and libm compat_symbol calls (each one having
> a SHLIB_COMPAT conditional for the right library).
>
>> diff --git a/sysdeps/m68k/coldfire/fpu/math_private.h b/sysdeps/m68k/coldfire/fpu/math_private.h
>> new file mode 100644
>> index 000000000000..d13f2d49d3ee
>> --- /dev/null
>> +++ b/sysdeps/m68k/coldfire/fpu/math_private.h
>> @@ -0,0 +1,10 @@
>> +#ifndef SH_MATH_PRIVATE_H
>> +#define SH_MATH_PRIVATE_H 1
> This of course should be COLDFIRE_MATH_PRIVATE_H.
Thanks for the quick review - pushed with those changes.
@@ -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 <math_private.h>
@@ -16,6 +16,7 @@
#include <math.h>
#include <math_private.h>
+#include <shlib-compat.h>
#include <stdint.h>
#undef __finite
@@ -29,6 +30,9 @@ __finite(double x)
hidden_def (__finite)
weak_alias (__finite, finite)
#ifdef NO_LONG_DOUBLE
-strong_alias (__finite, __finitel)
+# if defined LDBL_CLASSIFY_COMPAT && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_23)
+compat_symbol (libc, __finite, __finitel, GLIBC_2_0);
+compat_symbol (libm, __finite, __finitel, GLIBC_2_0);
+# endif
weak_alias (__finite, finitel)
#endif
@@ -11,6 +11,7 @@
#include <math.h>
#include <math_private.h>
+#include <shlib-compat.h>
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
@@ -17,6 +17,7 @@
#include <math.h>
#include <math_private.h>
+#include <shlib-compat.h>
#include <stdint.h>
#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
new file mode 100644
@@ -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 <math_private.h>
+
+#endif
@@ -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 <math_private.h>
#define feraiseexcept(excepts) ({ 0; })
@@ -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 <math_private.h>
#endif
@@ -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 <math_private.h>
#define feraiseexcept(excepts) ({ 0; })
new file mode 100644
@@ -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 <math_private.h>
+
+#endif
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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