diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2017-09-12 12:20:50 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2017-09-25 10:45:08 +0100 |
commit | f5f0f5265162fe6f4f238abcd3086985f7c38d6d (patch) | |
tree | 16e04b84841c31887ba6a70d37d0eae241567361 /math | |
parent | 72aa623345ada1276ed89dbc00fdff9639cb8eaf (diff) | |
download | glibc-f5f0f5265162fe6f4f238abcd3086985f7c38d6d.zip glibc-f5f0f5265162fe6f4f238abcd3086985f7c38d6d.tar.gz glibc-f5f0f5265162fe6f4f238abcd3086985f7c38d6d.tar.bz2 |
New expf and exp2f version without SVID compat wrapper
This patch changes the expf and exp2f error handling semantics to only
set errno accoring to POSIX rules. New symbol version is introduced at
GLIBC_2.27.
The old wrappers are kept for compat symbols.
Internal calls to __expf now get the new error semantics, this seems to
only affect sysdeps/i386/fpu/s_expm1f.S where the errno-only behaviour
should be correct.
ia64 needed assembly change to have the new and compat versioned symbol
map to the same function.
All linux libm abilists are updated.
* math/Versions (expf): New libm symbol at GLIBC_2.27.
(exp2f): Likewise.
* math/w_exp2f.c: New file.
* math/w_expf.c: New file.
* math/w_exp2f_compat.c (__exp2f_compat): For compat symbol only.
* math/w_expf_compat.c (__expf_compat): Likewise.
* sysdeps/ia64/fpu/e_exp2f.S: Add versioned symbols.
* sysdeps/ia64/fpu/e_expf.S: Likewise.
* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Update.
* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
Diffstat (limited to 'math')
-rw-r--r-- | math/Versions | 3 | ||||
-rw-r--r-- | math/w_exp2f.c | 7 | ||||
-rw-r--r-- | math/w_exp2f_compat.c | 6 | ||||
-rw-r--r-- | math/w_expf.c | 7 | ||||
-rw-r--r-- | math/w_expf_compat.c | 7 |
5 files changed, 23 insertions, 7 deletions
diff --git a/math/Versions b/math/Versions index e409de0..380f6a2 100644 --- a/math/Versions +++ b/math/Versions @@ -229,4 +229,7 @@ libm { fromfp; fromfpf; fromfpl; ufromfp; ufromfpf; ufromfpl; fromfpx; fromfpxf; fromfpxl; ufromfpx; ufromfpxf; ufromfpxl; } + GLIBC_2.27 { + expf; exp2f; + } } diff --git a/math/w_exp2f.c b/math/w_exp2f.c new file mode 100644 index 0000000..948d745 --- /dev/null +++ b/math/w_exp2f.c @@ -0,0 +1,7 @@ +#include <math-type-macros-float.h> +#undef __USE_WRAPPER_TEMPLATE +#define __USE_WRAPPER_TEMPLATE 1 +#undef declare_mgen_alias +#define declare_mgen_alias(a, b) +#include <w_exp2_template.c> +versioned_symbol (libm, __exp2f, exp2f, GLIBC_2_27); diff --git a/math/w_exp2f_compat.c b/math/w_exp2f_compat.c index b058dae..6ab6f6c 100644 --- a/math/w_exp2f_compat.c +++ b/math/w_exp2f_compat.c @@ -6,9 +6,9 @@ #include <math_private.h> #include <math-svid-compat.h> -#if LIBM_SVID_COMPAT +#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_27) float -__exp2f (float x) +__exp2f_compat (float x) { float z = __ieee754_exp2f (x); if (__builtin_expect (!isfinite (z) || z == 0, 0) @@ -18,5 +18,5 @@ __exp2f (float x) return z; } -weak_alias (__exp2f, exp2f) +compat_symbol (libm, __exp2f_compat, exp2f, GLIBC_2_1); #endif diff --git a/math/w_expf.c b/math/w_expf.c new file mode 100644 index 0000000..6d5f03c --- /dev/null +++ b/math/w_expf.c @@ -0,0 +1,7 @@ +#include <math-type-macros-float.h> +#undef __USE_WRAPPER_TEMPLATE +#define __USE_WRAPPER_TEMPLATE 1 +#undef declare_mgen_alias +#define declare_mgen_alias(a, b) +#include <w_exp_template.c> +versioned_symbol (libm, __expf, expf, GLIBC_2_27); diff --git a/math/w_expf_compat.c b/math/w_expf_compat.c index a38ff40..2512498 100644 --- a/math/w_expf_compat.c +++ b/math/w_expf_compat.c @@ -20,10 +20,10 @@ #include <math_private.h> #include <math-svid-compat.h> -#if LIBM_SVID_COMPAT +#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_27) /* wrapper expf */ float -__expf (float x) +__expf_compat (float x) { float z = __ieee754_expf (x); if (__builtin_expect (!isfinite (z) || z == 0, 0) @@ -32,6 +32,5 @@ __expf (float x) return z; } -hidden_def (__expf) -weak_alias (__expf, expf) +compat_symbol (libm, __expf_compat, expf, GLIBC_2_0); #endif |