Skip to content

Commit

Permalink
math: add LDBL_CLASSIFY_COMPAT support
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Chris Metcalf committed Dec 3, 2015
1 parent b3f6040 commit e59c94f
Show file tree
Hide file tree
Showing 19 changed files with 98 additions and 18 deletions.
28 changes: 28 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 4 additions & 0 deletions sysdeps/arm/math_private.h
Original file line number Diff line number Diff line change
@@ -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>

Expand Down
10 changes: 9 additions & 1 deletion sysdeps/ieee754/dbl-64/s_finite.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
5 changes: 4 additions & 1 deletion sysdeps/ieee754/dbl-64/s_isinf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
5 changes: 4 additions & 1 deletion sysdeps/ieee754/dbl-64/s_isnan.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
10 changes: 9 additions & 1 deletion sysdeps/ieee754/dbl-64/wordsize-64/s_finite.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include <math.h>
#include <math_private.h>
#include <shlib-compat.h>
#include <stdint.h>

#undef __finite
Expand All @@ -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
5 changes: 4 additions & 1 deletion sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include <math.h>
#include <math_private.h>
#include <shlib-compat.h>

int
__isinf (double x)
Expand All @@ -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
5 changes: 4 additions & 1 deletion sysdeps/ieee754/dbl-64/wordsize-64/s_isnan.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#include <math.h>
#include <math_private.h>
#include <shlib-compat.h>
#include <stdint.h>

#undef __isnan
Expand All @@ -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
10 changes: 10 additions & 0 deletions sysdeps/m68k/coldfire/fpu/math_private.h
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions sysdeps/microblaze/math_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; })
Expand Down
4 changes: 4 additions & 0 deletions sysdeps/mips/math_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions sysdeps/nios2/math_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; })
Expand Down
10 changes: 10 additions & 0 deletions sysdeps/sh/math_private.h
Original file line number Diff line number Diff line change
@@ -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
3 changes: 0 additions & 3 deletions sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 0 additions & 3 deletions sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 0 additions & 3 deletions sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit e59c94f

Please sign in to comment.