math: add LDBL_CLASSIFY_COMPAT support
authorChris Metcalf <cmetcalf@ezchip.com>
Tue, 1 Dec 2015 19:59:38 +0000 (14:59 -0500)
committerChris Metcalf <cmetcalf@ezchip.com>
Thu, 3 Dec 2015 18:00:46 +0000 (13:00 -0500)
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.

19 files changed:
ChangeLog
sysdeps/arm/math_private.h
sysdeps/ieee754/dbl-64/s_finite.c
sysdeps/ieee754/dbl-64/s_isinf.c
sysdeps/ieee754/dbl-64/s_isnan.c
sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c
sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c
sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c
sysdeps/m68k/coldfire/fpu/math_private.h [new file with mode: 0644]
sysdeps/microblaze/math_private.h
sysdeps/mips/math_private.h
sysdeps/nios2/math_private.h
sysdeps/sh/math_private.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist

index 7654fa4..292c495 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2015-12-03  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/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  <andrew.senkevich@intel.com>
 
        * math/Makefile ($(inst_libdir)/libm.so): Corrected path to
index c175b15..d39e9ee 100644 (file)
@@ -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>
 
index 2b0ed50..b71ae12 100644 (file)
@@ -21,6 +21,7 @@ static char rcsid[] = "$NetBSD: s_finite.c,v 1.8 1995/05/10 20:47:17 jtc Exp $";
 
 #include <math.h>
 #include <math_private.h>
+#include <shlib-compat.h>
 
 #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
index 46a7266..c0ad545 100644 (file)
@@ -15,6 +15,7 @@ static char rcsid[] = "$NetBSD: s_isinf.c,v 1.3 1995/05/11 23:20:14 jtc Exp $";
 
 #include <math.h>
 #include <math_private.h>
+#include <shlib-compat.h>
 
 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
index 5d9f31b..2174d98 100644 (file)
@@ -21,6 +21,7 @@ static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $";
 
 #include <math.h>
 #include <math_private.h>
+#include <shlib-compat.h>
 
 #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
index a155a5e..c8e2a7c 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <math.h>
 #include <math_private.h>
+#include <shlib-compat.h>
 #include <stdint.h>
 
 #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
index 163fc31..951fb73 100644 (file)
@@ -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
index e80b84c..bcff9e3 100644 (file)
@@ -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
diff --git a/sysdeps/m68k/coldfire/fpu/math_private.h b/sysdeps/m68k/coldfire/fpu/math_private.h
new file mode 100644 (file)
index 0000000..d306a50
--- /dev/null
@@ -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 <math_private.h>
+
+#endif
index 73e59df..d82e8bf 100644 (file)
 #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; })
index 2f54424..27de714 100644 (file)
@@ -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
index a32579f..373da2a 100644 (file)
 #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; })
diff --git a/sysdeps/sh/math_private.h b/sysdeps/sh/math_private.h
new file mode 100644 (file)
index 0000000..d13f2d4
--- /dev/null
@@ -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
index 152adb0..ffcc4a0 100644 (file)
@@ -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
index 9ba58e2..18b8d00 100644 (file)
@@ -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
index f8377a0..a66e8ec 100644 (file)
@@ -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
index 9ba58e2..18b8d00 100644 (file)
@@ -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
index 152adb0..ffcc4a0 100644 (file)
@@ -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
index 9ba58e2..18b8d00 100644 (file)
@@ -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