From: Joseph Myers Date: Wed, 7 Jan 2015 19:01:20 +0000 (+0000) Subject: Fix libm feupdateenv namespace (bug 17748). X-Git-Tag: glibc-2.21~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8116321f657549e80d0167b8a790a7aa54d6379d;p=thirdparty%2Fglibc.git Fix libm feupdateenv namespace (bug 17748). Concluding the fixes for C90 libm functions calling C99 fe* functions, this patch fixes the case of feupdateenv by making it a weak alias for __feupdateenv and making the affected code call __feupdateenv. Tested for x86_64 (testsuite, and that installed stripped shared libraries are unchanged by the patch). Also tested for ARM (soft-float) that the math.h linknamespace tests now pass. [BZ #17748] * include/fenv.h (__feupdateenv): Use libm_hidden_proto. * math/feupdateenv.c (__feupdateenv): Use libm_hidden_def. * sysdeps/aarch64/fpu/feupdateenv.c (feupdateenv): Rename to __feupdateenv and define as weak alias of __feupdateenv. Use libm_hidden_weak. * sysdeps/alpha/fpu/feupdateenv.c (__feupdateenv): Use libm_hidden_def. * sysdeps/arm/feupdateenv.c (feupdateenv): Rename to __feupdateenv and define as weak alias of __feupdateenv. Use libm_hidden_weak. * sysdeps/hppa/fpu/feupdateenv.c (feupdateenv): Likewise. * sysdeps/i386/fpu/feupdateenv.c (__feupdateenv): Use libm_hidden_def. * sysdeps/ia64/fpu/feupdateenv.c (feupdateenv): Rename to __feupdateenv and define as weak alias of __feupdateenv. Use libm_hidden_weak. * sysdeps/m68k/fpu/feupdateenv.c (__feupdateenv): Use libm_hidden_def. * sysdeps/mips/fpu/feupdateenv.c (feupdateenv): Rename to __feupdateenv and define as weak alias of __feupdateenv. Use libm_hidden_weak. * sysdeps/powerpc/fpu/feupdateenv.c (__feupdateenv): Use libm_hidden_def. * sysdeps/powerpc/nofpu/feupdateenv.c (__feupdateenv): Likewise. * sysdeps/powerpc/powerpc32/e500/nofpu/feupdateenv.c (__feupdateenv): Likewise. * sysdeps/s390/fpu/feupdateenv.c (feupdateenv): Rename to __feupdateenv and define as weak alias of __feupdateenv. Use libm_hidden_weak. * sysdeps/sh/sh4/fpu/feupdateenv.c (feupdateenv): Likewise. * sysdeps/sparc/fpu/feupdateenv.c (__feupdateenv): Use libm_hidden_def. * sysdeps/tile/math_private.h (__feupdateenv): New inline function. * sysdeps/x86_64/fpu/feupdateenv.c (__feupdateenv): Use libm_hidden_def. * sysdeps/generic/math_private.h (default_libc_feupdateenv): Call __feupdateenv instead of feupdateenv. (default_libc_feupdateenv_test): Likewise. (libc_feresetround_ctx): Likewise. --- diff --git a/ChangeLog b/ChangeLog index 98d3dc2a8ce..9066946203d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,46 @@ +2015-01-07 Joseph Myers + + [BZ #17748] + * include/fenv.h (__feupdateenv): Use libm_hidden_proto. + * math/feupdateenv.c (__feupdateenv): Use libm_hidden_def. + * sysdeps/aarch64/fpu/feupdateenv.c (feupdateenv): Rename to + __feupdateenv and define as weak alias of __feupdateenv. Use + libm_hidden_weak. + * sysdeps/alpha/fpu/feupdateenv.c (__feupdateenv): Use + libm_hidden_def. + * sysdeps/arm/feupdateenv.c (feupdateenv): Rename to __feupdateenv + and define as weak alias of __feupdateenv. Use libm_hidden_weak. + * sysdeps/hppa/fpu/feupdateenv.c (feupdateenv): Likewise. + * sysdeps/i386/fpu/feupdateenv.c (__feupdateenv): Use + libm_hidden_def. + * sysdeps/ia64/fpu/feupdateenv.c (feupdateenv): Rename to + __feupdateenv and define as weak alias of __feupdateenv. Use + libm_hidden_weak. + * sysdeps/m68k/fpu/feupdateenv.c (__feupdateenv): Use + libm_hidden_def. + * sysdeps/mips/fpu/feupdateenv.c (feupdateenv): Rename to + __feupdateenv and define as weak alias of __feupdateenv. Use + libm_hidden_weak. + * sysdeps/powerpc/fpu/feupdateenv.c (__feupdateenv): Use + libm_hidden_def. + * sysdeps/powerpc/nofpu/feupdateenv.c (__feupdateenv): Likewise. + * sysdeps/powerpc/powerpc32/e500/nofpu/feupdateenv.c + (__feupdateenv): Likewise. + * sysdeps/s390/fpu/feupdateenv.c (feupdateenv): Rename to + __feupdateenv and define as weak alias of __feupdateenv. Use + libm_hidden_weak. + * sysdeps/sh/sh4/fpu/feupdateenv.c (feupdateenv): Likewise. + * sysdeps/sparc/fpu/feupdateenv.c (__feupdateenv): Use + libm_hidden_def. + * sysdeps/tile/math_private.h (__feupdateenv): New inline + function. + * sysdeps/x86_64/fpu/feupdateenv.c (__feupdateenv): Use + libm_hidden_def. + * sysdeps/generic/math_private.h (default_libc_feupdateenv): Call + __feupdateenv instead of feupdateenv. + (default_libc_feupdateenv_test): Likewise. + (libc_feresetround_ctx): Likewise. + 2015-01-07 Adhemerval Zanella * sysdeps/unix/sysv/linux/mips/pread.c (__libc_pread): Fix function diff --git a/NEWS b/NEWS index 975b67550bb..a2f93a18e33 100644 --- a/NEWS +++ b/NEWS @@ -16,8 +16,8 @@ Version 2.21 17582, 17583, 17584, 17585, 17589, 17594, 17601, 17608, 17616, 17625, 17630, 17633, 17634, 17635, 17647, 17653, 17657, 17658, 17664, 17665, 17668, 17682, 17717, 17719, 17722, 17723, 17724, 17725, 17732, 17733, - 17744, 17745, 17746, 17747, 17775, 17777, 17780, 17781, 17782, 17793, - 17796, 17797, 17806 + 17744, 17745, 17746, 17747, 17748, 17775, 17777, 17780, 17781, 17782, + 17793, 17796, 17797, 17806 * Optimized strcpy, stpcpy, strchrnul and strrchr implementations for AArch64. Contributed by ARM Ltd. diff --git a/include/fenv.h b/include/fenv.h index c496d10f48d..7070199eced 100644 --- a/include/fenv.h +++ b/include/fenv.h @@ -30,6 +30,7 @@ libm_hidden_proto (__fesetround) libm_hidden_proto (feholdexcept) libm_hidden_proto (__feholdexcept) libm_hidden_proto (feupdateenv) +libm_hidden_proto (__feupdateenv) libm_hidden_proto (fetestexcept) libm_hidden_proto (feclearexcept) diff --git a/math/feupdateenv.c b/math/feupdateenv.c index f49029fc97e..dac39c0da4e 100644 --- a/math/feupdateenv.c +++ b/math/feupdateenv.c @@ -34,6 +34,7 @@ __feupdateenv (const fenv_t *envp) strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/aarch64/fpu/feupdateenv.c b/sysdeps/aarch64/fpu/feupdateenv.c index 94958a887f9..12e799ec77b 100644 --- a/sysdeps/aarch64/fpu/feupdateenv.c +++ b/sysdeps/aarch64/fpu/feupdateenv.c @@ -20,7 +20,7 @@ #include int -feupdateenv (const fenv_t *envp) +__feupdateenv (const fenv_t *envp) { fpu_control_t fpcr; fpu_control_t fpcr_new; @@ -84,4 +84,6 @@ feupdateenv (const fenv_t *envp) return 0; } -libm_hidden_def (feupdateenv) +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/alpha/fpu/feupdateenv.c b/sysdeps/alpha/fpu/feupdateenv.c index 8b521454de3..ab63c962d2d 100644 --- a/sysdeps/alpha/fpu/feupdateenv.c +++ b/sysdeps/alpha/fpu/feupdateenv.c @@ -45,5 +45,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/arm/feupdateenv.c b/sysdeps/arm/feupdateenv.c index cc2989545ca..f7478e1bc74 100644 --- a/sysdeps/arm/feupdateenv.c +++ b/sysdeps/arm/feupdateenv.c @@ -23,7 +23,7 @@ int -feupdateenv (const fenv_t *envp) +__feupdateenv (const fenv_t *envp) { fpu_control_t fpscr, new_fpscr, updated_fpscr; int excepts; @@ -73,4 +73,6 @@ feupdateenv (const fenv_t *envp) return 0; } -libm_hidden_def (feupdateenv) +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h index 24e2babd617..0ab547d82f7 100644 --- a/sysdeps/generic/math_private.h +++ b/sysdeps/generic/math_private.h @@ -478,7 +478,7 @@ default_libc_fesetenv (fenv_t *e) static __always_inline void default_libc_feupdateenv (fenv_t *e) { - (void) feupdateenv (e); + (void) __feupdateenv (e); } #ifndef libc_feupdateenv @@ -499,7 +499,7 @@ static __always_inline int default_libc_feupdateenv_test (fenv_t *e, int ex) { int ret = fetestexcept (ex); - feupdateenv (e); + __feupdateenv (e); return ret; } @@ -608,7 +608,7 @@ libc_feresetround_ctx (struct rm_ctx *ctx) { /* Restore the rounding mode if updated. */ if (__glibc_unlikely (ctx->updated_status)) - feupdateenv (&ctx->env); + __feupdateenv (&ctx->env); } static __always_inline void diff --git a/sysdeps/hppa/fpu/feupdateenv.c b/sysdeps/hppa/fpu/feupdateenv.c index e6a07c31f40..931f7e62923 100644 --- a/sysdeps/hppa/fpu/feupdateenv.c +++ b/sysdeps/hppa/fpu/feupdateenv.c @@ -21,7 +21,7 @@ #include int -feupdateenv (const fenv_t *envp) +__feupdateenv (const fenv_t *envp) { union { unsigned long long l; unsigned int sw[2]; } s; fenv_t temp; @@ -37,4 +37,6 @@ feupdateenv (const fenv_t *envp) /* Success. */ return 0; } -libm_hidden_def (feupdateenv) +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/i386/fpu/feupdateenv.c b/sysdeps/i386/fpu/feupdateenv.c index 2f58ab39ffd..de461a4d517 100644 --- a/sysdeps/i386/fpu/feupdateenv.c +++ b/sysdeps/i386/fpu/feupdateenv.c @@ -55,5 +55,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/ia64/fpu/feupdateenv.c b/sysdeps/ia64/fpu/feupdateenv.c index c6415ed38b9..89597bef618 100644 --- a/sysdeps/ia64/fpu/feupdateenv.c +++ b/sysdeps/ia64/fpu/feupdateenv.c @@ -20,7 +20,7 @@ #include int -feupdateenv (const fenv_t *envp) +__feupdateenv (const fenv_t *envp) { fenv_t fpsr; @@ -37,4 +37,6 @@ feupdateenv (const fenv_t *envp) /* Success. */ return 0; } -libm_hidden_def (feupdateenv) +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/m68k/fpu/feupdateenv.c b/sysdeps/m68k/fpu/feupdateenv.c index 80bd59322e7..9bd34187253 100644 --- a/sysdeps/m68k/fpu/feupdateenv.c +++ b/sysdeps/m68k/fpu/feupdateenv.c @@ -46,5 +46,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/mips/fpu/feupdateenv.c b/sysdeps/mips/fpu/feupdateenv.c index 2fe8ebe60cc..899d49441bc 100644 --- a/sysdeps/mips/fpu/feupdateenv.c +++ b/sysdeps/mips/fpu/feupdateenv.c @@ -21,7 +21,7 @@ #include int -feupdateenv (const fenv_t *envp) +__feupdateenv (const fenv_t *envp) { int temp; @@ -40,4 +40,6 @@ feupdateenv (const fenv_t *envp) /* Success. */ return 0; } -libm_hidden_def (feupdateenv) +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/powerpc/fpu/feupdateenv.c b/sysdeps/powerpc/fpu/feupdateenv.c index 326efe0f8fb..1e0db9e3c10 100644 --- a/sysdeps/powerpc/fpu/feupdateenv.c +++ b/sysdeps/powerpc/fpu/feupdateenv.c @@ -63,5 +63,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/powerpc/nofpu/feupdateenv.c b/sysdeps/powerpc/nofpu/feupdateenv.c index 892e4637273..04413430ce6 100644 --- a/sysdeps/powerpc/nofpu/feupdateenv.c +++ b/sysdeps/powerpc/nofpu/feupdateenv.c @@ -48,5 +48,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/powerpc/powerpc32/e500/nofpu/feupdateenv.c b/sysdeps/powerpc/powerpc32/e500/nofpu/feupdateenv.c index cb6a1487ac7..ca88d2afea7 100644 --- a/sysdeps/powerpc/powerpc32/e500/nofpu/feupdateenv.c +++ b/sysdeps/powerpc/powerpc32/e500/nofpu/feupdateenv.c @@ -43,5 +43,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/s390/fpu/feupdateenv.c b/sysdeps/s390/fpu/feupdateenv.c index 957c8fe9add..7e2cf150793 100644 --- a/sysdeps/s390/fpu/feupdateenv.c +++ b/sysdeps/s390/fpu/feupdateenv.c @@ -22,7 +22,7 @@ #include int -feupdateenv (const fenv_t *envp) +__feupdateenv (const fenv_t *envp) { fexcept_t temp; @@ -37,4 +37,6 @@ feupdateenv (const fenv_t *envp) /* Success. */ return 0; } -libm_hidden_def (feupdateenv) +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/sh/sh4/fpu/feupdateenv.c b/sysdeps/sh/sh4/fpu/feupdateenv.c index 25729d9c1ff..b72822b0323 100644 --- a/sysdeps/sh/sh4/fpu/feupdateenv.c +++ b/sysdeps/sh/sh4/fpu/feupdateenv.c @@ -21,7 +21,7 @@ #include int -feupdateenv (const fenv_t *envp) +__feupdateenv (const fenv_t *envp) { fpu_control_t temp; @@ -36,4 +36,6 @@ feupdateenv (const fenv_t *envp) return 0; } -libm_hidden_def (feupdateenv) +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/sparc/fpu/feupdateenv.c b/sysdeps/sparc/fpu/feupdateenv.c index cb001e19c88..f46e6c65297 100644 --- a/sysdeps/sparc/fpu/feupdateenv.c +++ b/sysdeps/sparc/fpu/feupdateenv.c @@ -45,5 +45,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/sysdeps/tile/math_private.h b/sysdeps/tile/math_private.h index b06e3a321d9..9b6b68b3241 100644 --- a/sysdeps/tile/math_private.h +++ b/sysdeps/tile/math_private.h @@ -34,6 +34,7 @@ extern inline int __fegetenv (fenv_t *__e) { return 0; } extern inline int fesetenv (const fenv_t *__e) { return 0; } extern inline int __fesetenv (const fenv_t *__e) { return 0; } extern inline int feupdateenv (const fenv_t *__e) { return 0; } +extern inline int __feupdateenv (const fenv_t *__e) { return 0; } extern inline int fegetround (void) { return FE_TONEAREST; } extern inline int __fegetround (void) { return FE_TONEAREST; } extern inline int fesetround (int __d) { return 0; } diff --git a/sysdeps/x86_64/fpu/feupdateenv.c b/sysdeps/x86_64/fpu/feupdateenv.c index 7aab1ad2ca5..99dfdd8f5c5 100644 --- a/sysdeps/x86_64/fpu/feupdateenv.c +++ b/sysdeps/x86_64/fpu/feupdateenv.c @@ -47,5 +47,6 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_def (__feupdateenv) libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);