diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-09-16 21:11:00 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-09-16 21:11:00 +0000 |
commit | da2f4f2dd5c07e1949f81a5ee23f880e891e3a82 (patch) | |
tree | a3c0c8d9b8a6730fe907f1a331cafc9afb0d3413 /sysdeps/ieee754 | |
parent | bb95a72318e747ce8854e161cc590e67ac17f4f9 (diff) | |
download | glibc-da2f4f2dd5c07e1949f81a5ee23f880e891e3a82.tar.gz glibc-da2f4f2dd5c07e1949f81a5ee23f880e891e3a82.tar.xz glibc-da2f4f2dd5c07e1949f81a5ee23f880e891e3a82.zip |
Make scalbn set errno (bug 6803).
As noted in bug 6803, scalbn fails to set errno on overflow and underflow. This patch fixes this by making scalbn an alias of ldexp, which has exactly the same semantics (for floating-point types with radix 2) and already has wrappers that deal with setting errno, instead of an alias of the internal __scalbn (which ldexp calls). Notes: * Where compat symbols were defined for scalbn functions, I didn't change what they point to (to keep the patch minimal), so such compat symbols continue to go directly to the non-errno-setting functions. * Mike, I didn't do anything with the IA64 versions of these functions, where I think both the ldexp and scalbn functions already deal with setting errno. As a cleanup (not needed to fix this bug) however you might want to make those functions into aliases for IA64; there is no need for them to be separate function implementations at all. * This concludes the fix for bug 6803 since the scalb and scalbln cases of that bug were fixed some time ago. Tested for x86_64, x86, mips64 and powerpc. [BZ #6803] * math/s_ldexp.c (scalbn): Define as weak alias of __ldexp. [NO_LONG_DOUBLE] (scalbnl): Define as weak alias of __ldexp. * math/s_ldexpf.c (scalbnf): Define as weak alias of __ldexpf. * math/s_ldexpl.c (scalbnl): Define as weak alias of __ldexpl. * sysdeps/i386/fpu/s_scalbn.S (scalbn): Remove alias. * sysdeps/i386/fpu/s_scalbnf.S (scalbnf): Likewise. * sysdeps/i386/fpu/s_scalbnl.S (scalbnl): Likewise. * sysdeps/ieee754/dbl-64/s_scalbn.c (scalbn): Likewise. [NO_LONG_DOUBLE] (scalbnl): Likewise. * sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c (scalbn): Likewise. [NO_LONG_DOUBLE] (scalbnl): Likewise. * sysdeps/ieee754/flt-32/s_scalbnf.c (scalbnf): Likewise. * sysdeps/ieee754/ldbl-128/s_scalbnl.c (scalbnl): Likewise. * sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c (scalbnl): Remove long_double_symbol calls. * sysdeps/ieee754/ldbl-64-128/s_scalbnl.c (scalbnl): Likewise. * sysdeps/ieee754/ldbl-opt/s_ldexpl.c (__ldexpl_2): Define as strong alias of __ldexpl. (scalbnl): Define using long_double_symbol. * sysdeps/m68k/m680x0/fpu/s_scalbn.c (__CONCATX(scalbn,suffix)): Remove alias. * sysdeps/sparc/sparc64/soft-fp/s_scalbnl.c (scalbnl): Likewise. * sysdeps/x86_64/fpu/s_scalbnl.S (scalbnl): Likewise. * math/libm-test.inc (scalbn_test_data): Add errno expectations. (scalbln_test_data): Add more errno expectations.
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_scalbn.c | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_scalbnf.c | 1 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_scalbnl.c | 1 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c | 5 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-64-128/s_scalbnl.c | 5 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/s_ldexpl.c | 3 |
7 files changed, 3 insertions, 16 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_scalbn.c b/sysdeps/ieee754/dbl-64/s_scalbn.c index 0f58034df5..58c7e1b33a 100644 --- a/sysdeps/ieee754/dbl-64/s_scalbn.c +++ b/sysdeps/ieee754/dbl-64/s_scalbn.c @@ -58,8 +58,6 @@ __scalbn (double x, int n) SET_HIGH_WORD (x, (hx & 0x800fffff) | (k << 20)); return x * twom54; } -weak_alias (__scalbn, scalbn) #ifdef NO_LONG_DOUBLE strong_alias (__scalbn, __scalbnl) -weak_alias (__scalbn, scalbnl) #endif diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c index 3822e1737d..d517a919c8 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_scalbn.c @@ -55,8 +55,6 @@ __scalbn (double x, int n) INSERT_WORDS64(x,(ix&INT64_C(0x800fffffffffffff))|(k<<52)); return x*twom54; } -weak_alias (__scalbn, scalbn) #ifdef NO_LONG_DOUBLE strong_alias (__scalbn, __scalbnl) -weak_alias (__scalbn, scalbnl) #endif diff --git a/sysdeps/ieee754/flt-32/s_scalbnf.c b/sysdeps/ieee754/flt-32/s_scalbnf.c index 5d9bdd647b..f36ae241b2 100644 --- a/sysdeps/ieee754/flt-32/s_scalbnf.c +++ b/sysdeps/ieee754/flt-32/s_scalbnf.c @@ -50,4 +50,3 @@ __scalbnf (float x, int n) SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x*twom25; } -weak_alias (__scalbnf, scalbnf) diff --git a/sysdeps/ieee754/ldbl-128/s_scalbnl.c b/sysdeps/ieee754/ldbl-128/s_scalbnl.c index 8916dcbfdd..a5cbd0d9d2 100644 --- a/sysdeps/ieee754/ldbl-128/s_scalbnl.c +++ b/sysdeps/ieee754/ldbl-128/s_scalbnl.c @@ -60,4 +60,3 @@ long double __scalbnl (long double x, int n) SET_LDOUBLE_MSW64(x,(hx&0x8000ffffffffffffULL)|(k<<48)); return x*twom114; } -weak_alias (__scalbnl, scalbnl) diff --git a/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c b/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c index a0d7aa9d63..0c4508835e 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_scalbnl.c @@ -102,8 +102,3 @@ long double __scalbnl (long double x, int n) x = ldbl_pack (xhi, xlo); return x*twolm54; } -#if IS_IN (libm) -long_double_symbol (libm, __scalbnl, scalbnl); -#else -long_double_symbol (libc, __scalbnl, scalbnl); -#endif diff --git a/sysdeps/ieee754/ldbl-64-128/s_scalbnl.c b/sysdeps/ieee754/ldbl-64-128/s_scalbnl.c index fe2412b97a..15af1b2849 100644 --- a/sysdeps/ieee754/ldbl-64-128/s_scalbnl.c +++ b/sysdeps/ieee754/ldbl-64-128/s_scalbnl.c @@ -2,8 +2,3 @@ #undef weak_alias #define weak_alias(n,a) #include <sysdeps/ieee754/ldbl-128/s_scalbnl.c> -#if IS_IN (libm) -long_double_symbol (libm, __scalbnl, scalbnl); -#else -long_double_symbol (libc, __scalbnl, scalbnl); -#endif diff --git a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c index 0dce1b1620..ed87a92b96 100644 --- a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c +++ b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c @@ -2,8 +2,11 @@ #undef weak_alias #define weak_alias(n,a) #include <math/s_ldexpl.c> +strong_alias (__ldexpl, __ldexpl_2) #if IS_IN (libm) long_double_symbol (libm, __ldexpl, ldexpl); +long_double_symbol (libm, __ldexpl_2, scalbnl); #else long_double_symbol (libc, __ldexpl, ldexpl); +long_double_symbol (libc, __ldexpl_2, scalbnl); #endif |