diff options
author | Richard Henderson <rth@twiddle.net> | 2013-06-24 09:59:26 -0700 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2013-06-24 18:12:24 -0700 |
commit | 385fd0d524817f171c715c1ca0e5647741584682 (patch) | |
tree | a6ebec5461c8aec9d0178dc8d48f2cf9edcb9d11 /ports | |
parent | 17db6e8d6b12f55e312fcab46faf5d332c806fb6 (diff) | |
download | glibc-385fd0d524817f171c715c1ca0e5647741584682.zip glibc-385fd0d524817f171c715c1ca0e5647741584682.tar.gz glibc-385fd0d524817f171c715c1ca0e5647741584682.tar.bz2 |
[BZ #15666] alpha: Add __sqrt*_finite definitions
With compatibility for ev6 and non-ev6 builds, as the non-ev6 did
manage to get definitions emitted for the float and double functions.
Diffstat (limited to 'ports')
-rw-r--r-- | ports/ChangeLog.alpha | 12 | ||||
-rw-r--r-- | ports/sysdeps/alpha/Versions | 4 | ||||
-rw-r--r-- | ports/sysdeps/alpha/alphaev6/fpu/e_sqrt.S | 9 | ||||
-rw-r--r-- | ports/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S | 9 | ||||
-rw-r--r-- | ports/sysdeps/alpha/fpu/e_sqrt.c | 22 | ||||
-rw-r--r-- | ports/sysdeps/alpha/fpu/e_sqrtf.c | 14 | ||||
-rw-r--r-- | ports/sysdeps/alpha/soft-fp/e_sqrtl.c | 10 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/alpha/nptl/libm.abilist | 5 |
8 files changed, 85 insertions, 0 deletions
diff --git a/ports/ChangeLog.alpha b/ports/ChangeLog.alpha index d2e4813..59e78d1 100644 --- a/ports/ChangeLog.alpha +++ b/ports/ChangeLog.alpha @@ -1,3 +1,15 @@ +2013-06-24 Richard Henderson <rth@redhat.com> + + [BZ #15666] + * sysdeps/alpha/Versions (GLIBC_2.18): Add __sqrt_finite, + __sqrtf_finite, and __sqrtl_finite. + * sysdeps/unix/sysv/linux/alpha/nptl/libm.abilist: Likewise. + * sysdeps/alpha/alphaev6/fpu/e_sqrt.S: Add __sqrt_finite. + * sysdeps/alpha/alphaev6/fpu/e_sqrtf.S: Add __sqrtf_finite. + * sysdeps/alpha/fpu/e_sqrt.c: Add __sqrt_finite compatibility. + * sysdeps/alpha/fpu/e_sqrtf.c: New file. + * sysdeps/alpha/soft-fp/e_sqrtl.c: Add __sqrtl_finite. + 2013-06-23 Richard Henderson <rth@redhat.com> * sysdeps/alpha/fpu/libm-test-ulps: Update. diff --git a/ports/sysdeps/alpha/Versions b/ports/sysdeps/alpha/Versions index 76b67a6..ae8fde7 100644 --- a/ports/sysdeps/alpha/Versions +++ b/ports/sysdeps/alpha/Versions @@ -10,4 +10,8 @@ libm { # used in inline functions. __atan2; } + GLIBC_2.18 { + # forgotten when the symbols were added to glibc 2.15 for other targets + __sqrt_finite; __sqrtf_finite; __sqrtl_finite; + } } diff --git a/ports/sysdeps/alpha/alphaev6/fpu/e_sqrt.S b/ports/sysdeps/alpha/alphaev6/fpu/e_sqrt.S index 66be65e..2aac3d3 100644 --- a/ports/sysdeps/alpha/alphaev6/fpu/e_sqrt.S +++ b/ports/sysdeps/alpha/alphaev6/fpu/e_sqrt.S @@ -16,6 +16,7 @@ <http://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <shlib-compat.h> .arch ev6 .set noreorder @@ -42,3 +43,11 @@ ENTRY(__ieee754_sqrt) nop END(__ieee754_sqrt) + +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +strong_alias(__ieee754_sqrt, __sqrt_finite1) +compat_symbol(libm, __sqrt_finite1, __sqrt_finite, GLIBC_2_15) +versioned_symbol(libm, __ieee754_sqrt, __sqrt_finite, GLIBC_2_18) +#else +strong_alias(__ieee754_sqrt, __sqrt_finite) +#endif diff --git a/ports/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S b/ports/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S index ad89786..5aeafca 100644 --- a/ports/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S +++ b/ports/sysdeps/alpha/alphaev6/fpu/e_sqrtf.S @@ -16,6 +16,7 @@ <http://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <shlib-compat.h> .arch ev6 .set noreorder @@ -42,3 +43,11 @@ ENTRY(__ieee754_sqrtf) nop END(__ieee754_sqrtf) + +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +strong_alias(__ieee754_sqrtf, __sqrtf_finite1) +compat_symbol(libm, __sqrtf_finite1, __sqrtf_finite, GLIBC_2_15) +versioned_symbol(libm, __ieee754_sqrtf, __sqrtf_finite, GLIBC_2_18) +#else +strong_alias(__ieee754_sqrtf, __sqrtf_finite) +#endif diff --git a/ports/sysdeps/alpha/fpu/e_sqrt.c b/ports/sysdeps/alpha/fpu/e_sqrt.c index 538ff1d..6abca08 100644 --- a/ports/sysdeps/alpha/fpu/e_sqrt.c +++ b/ports/sysdeps/alpha/fpu/e_sqrt.c @@ -18,6 +18,7 @@ #include <math.h> #include <math_private.h> +#include <shlib-compat.h> #if !defined(_IEEE_FP_INEXACT) @@ -157,9 +158,30 @@ $fixup: \n\ \n\ .end __ieee754_sqrt"); +/* Avoid the __sqrt_finite alias that dbl-64/e_sqrt.c would give... */ +#undef strong_alias +#define strong_alias(a,b) + +/* ... defining our own. */ +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +asm (".global __sqrt_finite1; __sqrt_finite1 = __ieee754_sqrt"); +#else +asm (".global __sqrt_finite; __sqrt_finite = __ieee754_sqrt"); +#endif + static double __full_ieee754_sqrt(double) __attribute_used__; #define __ieee754_sqrt __full_ieee754_sqrt +#elif SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +# define __sqrt_finite __sqrt_finite1 #endif /* _IEEE_FP_INEXACT */ #include <sysdeps/ieee754/dbl-64/e_sqrt.c> + +/* Work around forgotten symbol in alphaev6 build. */ +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +# undef __sqrt_finite +# undef __ieee754_sqrt +compat_symbol (libm, __sqrt_finite1, __sqrt_finite, GLIBC_2_15); +versioned_symbol (libm, __ieee754_sqrt, __sqrt_finite, GLIBC_2_18); +#endif diff --git a/ports/sysdeps/alpha/fpu/e_sqrtf.c b/ports/sysdeps/alpha/fpu/e_sqrtf.c new file mode 100644 index 0000000..ad523f5 --- /dev/null +++ b/ports/sysdeps/alpha/fpu/e_sqrtf.c @@ -0,0 +1,14 @@ +#include <shlib-compat.h> + +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +# define __sqrtf_finite __sqrtf_finite1 +#endif + +#include <sysdeps/ieee754/flt-32/e_sqrtf.c> + +/* Work around forgotten symbol in alphaev6 build. */ +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +# undef __sqrtf_finite +compat_symbol (libm, __sqrtf_finite1, __sqrtf_finite, GLIBC_2_15); +versioned_symbol (libm, __ieee754_sqrtf, __sqrtf_finite, GLIBC_2_18); +#endif diff --git a/ports/sysdeps/alpha/soft-fp/e_sqrtl.c b/ports/sysdeps/alpha/soft-fp/e_sqrtl.c index 40e97b8..2cb076e 100644 --- a/ports/sysdeps/alpha/soft-fp/e_sqrtl.c +++ b/ports/sysdeps/alpha/soft-fp/e_sqrtl.c @@ -21,6 +21,7 @@ #include <stdlib.h> #include <soft-fp.h> #include <quad.h> +#include <shlib-compat.h> long double __ieee754_sqrtl (const long double a) @@ -37,3 +38,12 @@ __ieee754_sqrtl (const long double a) FP_HANDLE_EXCEPTIONS; return c; } + +/* ??? We forgot to add this symbol in 2.15. Getting this into 2.18 isn't as + straight-forward as just adding the alias, since a generic Versions file + includes the 2.15 version and the linker uses the first one it sees. */ +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +versioned_symbol (libm, __ieee754_sqrtl, __sqrtl_finite, GLIBC_2_18); +#else +strong_alias(__ieee754_sqrtl, __sqrtl_finite) +#endif diff --git a/ports/sysdeps/unix/sysv/linux/alpha/nptl/libm.abilist b/ports/sysdeps/unix/sysv/linux/alpha/nptl/libm.abilist index 400a851..d9b44b5 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/nptl/libm.abilist +++ b/ports/sysdeps/unix/sysv/linux/alpha/nptl/libm.abilist @@ -382,6 +382,8 @@ GLIBC_2.15 __sinh_finite F __sinhf_finite F __sinhl_finite F + __sqrt_finite F + __sqrtf_finite F __y0_finite F __y0f_finite F __y0l_finite F @@ -396,6 +398,9 @@ GLIBC_2.18 __issignaling F __issignalingf F __issignalingl F + __sqrt_finite F + __sqrtf_finite F + __sqrtl_finite F GLIBC_2.2 GLIBC_2.2 A feclearexcept F |