]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix libm fegetenv namespace (bug 17748).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 31 Dec 2014 22:07:52 +0000 (22:07 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 31 Dec 2014 22:07:52 +0000 (22:07 +0000)
Some C90 libm functions call fegetenv via libc_feholdsetround*
functions in math_private.h.  This patch makes them call __fegetenv
instead, making fegetenv into a weak alias for __fegetenv as needed.

Tested for x86_64 (testsuite, and that disassembly of installed shared
libraries is unchanged by the patch).  Also tested for ARM
(soft-float) that fegetenv failures disappear from the linknamespace
test failures (however, similar fixes will also be needed for
fegetround, feholdexcept, fesetenv, fesetround and feupdateenv before
this set of namespace issues covered by bug 17748 is fully fixed and
those linknamespace tests start passing).

[BZ #17748]
* include/fenv.h (__fegetenv): Use libm_hidden_proto.
* math/fegetenv.c (__fegetenv): Use libm_hidden_def.
* sysdeps/aarch64/fpu/fegetenv.c (fegetenv): Rename to __fegetenv
and define as weak alias of __fegetenv.  Use libm_hidden_weak.
* sysdeps/alpha/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
* sysdeps/arm/fegetenv.c (fegetenv): Rename to __fegetenv and
define as weak alias of __fegetenv.  Use libm_hidden_weak.
* sysdeps/hppa/fpu/fegetenv.c (fegetenv): Likewise.
* sysdeps/i386/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
* sysdeps/ia64/fpu/fegetenv.c (fegetenv): Rename to __fegetenv and
define as weak alias of __fegetenv.  Use libm_hidden_weak.
* sysdeps/m68k/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
* sysdeps/mips/fpu/fegetenv.c (fegetenv): Rename to __fegetenv and
define as weak alias of __fegetenv.  Use libm_hidden_weak.
* sysdeps/powerpc/fpu/fegetenv.c (__fegetenv): Use
libm_hidden_def.
* sysdeps/powerpc/nofpu/fegetenv.c (__fegetenv): Likewise.
* sysdeps/powerpc/powerpc32/e500/nofpu/fegetenv.c (__fegetenv):
Likewise.
* sysdeps/s390/fpu/fegetenv.c (fegetenv): Rename to __fegetenv and
define as weak alias of __fegetenv.  Use libm_hidden_weak.
* sysdeps/sh/sh4/fpu/fegetenv.c (fegetenv): Likewise.
* sysdeps/sparc/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
* sysdeps/tile/math_private.h (__fegetenv): New inline function.
* sysdeps/x86_64/fpu/fegetenv.c (fegetenv): Rename to __fegetenv
and define as weak alias of __fegetenv.  Use libm_hidden_weak.
* sysdeps/generic/math_private.h (libc_feholdsetround_ctx): Use
__fegetenv instead of fegetenv.
(libc_feholdsetround_noex_ctx): Likewise.

20 files changed:
ChangeLog
include/fenv.h
math/fegetenv.c
sysdeps/aarch64/fpu/fegetenv.c
sysdeps/alpha/fpu/fegetenv.c
sysdeps/arm/fegetenv.c
sysdeps/generic/math_private.h
sysdeps/hppa/fpu/fegetenv.c
sysdeps/i386/fpu/fegetenv.c
sysdeps/ia64/fpu/fegetenv.c
sysdeps/m68k/fpu/fegetenv.c
sysdeps/mips/fpu/fegetenv.c
sysdeps/powerpc/fpu/fegetenv.c
sysdeps/powerpc/nofpu/fegetenv.c
sysdeps/powerpc/powerpc32/e500/nofpu/fegetenv.c
sysdeps/s390/fpu/fegetenv.c
sysdeps/sh/sh4/fpu/fegetenv.c
sysdeps/sparc/fpu/fegetenv.c
sysdeps/tile/math_private.h
sysdeps/x86_64/fpu/fegetenv.c

index d9d679041afa7c7d0c95e839b817895a69438e3e..fc7a34e350b861f692dbd7e77cfbcf745cecdd0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,36 @@
+2014-12-31  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #17748]
+       * include/fenv.h (__fegetenv): Use libm_hidden_proto.
+       * math/fegetenv.c (__fegetenv): Use libm_hidden_def.
+       * sysdeps/aarch64/fpu/fegetenv.c (fegetenv): Rename to __fegetenv
+       and define as weak alias of __fegetenv.  Use libm_hidden_weak.
+       * sysdeps/alpha/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
+       * sysdeps/arm/fegetenv.c (fegetenv): Rename to __fegetenv and
+       define as weak alias of __fegetenv.  Use libm_hidden_weak.
+       * sysdeps/hppa/fpu/fegetenv.c (fegetenv): Likewise.
+       * sysdeps/i386/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
+       * sysdeps/ia64/fpu/fegetenv.c (fegetenv): Rename to __fegetenv and
+       define as weak alias of __fegetenv.  Use libm_hidden_weak.
+       * sysdeps/m68k/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
+       * sysdeps/mips/fpu/fegetenv.c (fegetenv): Rename to __fegetenv and
+       define as weak alias of __fegetenv.  Use libm_hidden_weak.
+       * sysdeps/powerpc/fpu/fegetenv.c (__fegetenv): Use
+       libm_hidden_def.
+       * sysdeps/powerpc/nofpu/fegetenv.c (__fegetenv): Likewise.
+       * sysdeps/powerpc/powerpc32/e500/nofpu/fegetenv.c (__fegetenv):
+       Likewise.
+       * sysdeps/s390/fpu/fegetenv.c (fegetenv): Rename to __fegetenv and
+       define as weak alias of __fegetenv.  Use libm_hidden_weak.
+       * sysdeps/sh/sh4/fpu/fegetenv.c (fegetenv): Likewise.
+       * sysdeps/sparc/fpu/fegetenv.c (__fegetenv): Use libm_hidden_def.
+       * sysdeps/tile/math_private.h (__fegetenv): New inline function.
+       * sysdeps/x86_64/fpu/fegetenv.c (fegetenv): Rename to __fegetenv
+       and define as weak alias of __fegetenv.  Use libm_hidden_weak.
+       * sysdeps/generic/math_private.h (libc_feholdsetround_ctx): Use
+       __fegetenv instead of fegetenv.
+       (libc_feholdsetround_noex_ctx): Likewise.
+
 2014-12-31  Matthew Fortune  <matthew.fortune@imgtec.com>
 
        * elf/elf.h (PT_MIPS_ABIFLAGS): Define.
index 0cfbacd4ab57589fa6b9716598e2bf4bb65e78a2..bc8f759e17711be719d78bc073b0f55e98aca577 100644 (file)
@@ -17,6 +17,7 @@ extern int __feupdateenv (const fenv_t *__envp);
 libm_hidden_proto (feraiseexcept)
 libm_hidden_proto (__feraiseexcept)
 libm_hidden_proto (fegetenv)
+libm_hidden_proto (__fegetenv)
 libm_hidden_proto (fegetround)
 libm_hidden_proto (fesetenv)
 libm_hidden_proto (fesetround)
index c031488b2fab9b1ebbbe1383c4f1ea153a098e99..39b843b08c5176f7a2b0421c29b31fcb94190974 100644 (file)
@@ -30,6 +30,7 @@ __fegetenv (fenv_t *envp)
 strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
+libm_hidden_def (__fegetenv)
 libm_hidden_ver (__fegetenv, fegetenv)
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
 
index 4c88fbfa438980b416c61c07a38ac6eaf4953957..ae75f39ed7ec7009c5b73171140400d0279ae329 100644 (file)
@@ -20,7 +20,7 @@
 #include <fpu_control.h>
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   fpu_control_t fpcr;
   fpu_fpsr_t fpsr;
@@ -30,4 +30,6 @@ fegetenv (fenv_t *envp)
   envp->__fpsr = fpsr;
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
index ef688f20a351b91eb7f26bcd7a127b66eb3f81bf..36baf411be011e06540bd15ce4295423dde8eb03 100644 (file)
@@ -43,5 +43,6 @@ strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
 
+libm_hidden_def (__fegetenv)
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
 libm_hidden_ver(__fegetenv, fegetenv)
index f390c0fdf74116e62bc070e8a99d5657c6c4006d..ec38a5145d320a2f63a1d51d843d9883549c67a6 100644 (file)
@@ -22,7 +22,7 @@
 
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   fpu_control_t fpscr;
 
@@ -34,4 +34,6 @@ fegetenv (fenv_t *envp)
   envp->__cw = fpscr;
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
index 94c1e4a192f0620bb1a7f2d72026de49f46d25c9..2b07f20a6f2ebc31dcf3911060f0c18e621d2894 100644 (file)
@@ -598,7 +598,7 @@ libc_feholdsetround_ctx (struct rm_ctx *ctx, int round)
   if (__glibc_unlikely (round != get_rounding_mode ()))
     {
       ctx->updated_status = true;
-      fegetenv (&ctx->env);
+      __fegetenv (&ctx->env);
       fesetround (round);
     }
 }
@@ -615,7 +615,7 @@ static __always_inline void
 libc_feholdsetround_noex_ctx (struct rm_ctx *ctx, int round)
 {
   /* Save exception flags and rounding mode.  */
-  fegetenv (&ctx->env);
+  __fegetenv (&ctx->env);
 
   /* Update rounding mode only if different.  */
   if (__glibc_unlikely (round != get_rounding_mode ()))
index 7028fe4a226ed77c3a7cb46eb90d944ce129be29..ee7fa1677fd4b0f624eb3bdeed5acfa651cec42a 100644 (file)
@@ -21,7 +21,7 @@
 #include <string.h>
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   unsigned long long buf[4], *bufptr = buf;
 
@@ -32,4 +32,6 @@ fegetenv (fenv_t *envp)
   memcpy(envp, buf, sizeof (*envp));
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
index 8c45b6b8cb0c353b2031fba7b7342f45d2811979..b578703fdf970c1e5de6f3577df669ae9d6a755c 100644 (file)
@@ -44,5 +44,6 @@ strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
 
+libm_hidden_def (__fegetenv)
 libm_hidden_ver (__fegetenv, fegetenv)
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
index d337dda0c2d20a86963849c8059b3fccf99674e5..8d46e231514bb9cef7afdf8a44704d5d89a6e555 100644 (file)
 #include <fenv.h>
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (*envp));
 
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
index 7feac6426f2d54701bcb77dacc96e7da1d18d37b..c31a5f5ecebd4ada6f88c06b8c840e536a42fd92 100644 (file)
@@ -40,5 +40,6 @@ strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
 
+libm_hidden_def (__fegetenv)
 libm_hidden_ver (__fegetenv, fegetenv)
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
index b87d35f0dea25d6a7de8b25194e68928d584bf9a..d52c9de3dce962fcb048b7637bc43dca761e3faa 100644 (file)
 #include <fpu_control.h>
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   _FPU_GETCW (*envp);
 
   /* Success.  */
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
index 3e552bc9c5891c183c31c722e4cabc62a4a65a01..69c48de8bd25d1fb7aa60d97240051dd50e186ae 100644 (file)
@@ -33,5 +33,6 @@ strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
 
+libm_hidden_def (__fegetenv)
 libm_hidden_ver (__fegetenv, fegetenv)
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
index 8501a05b69fbb4ba01c9805033cbb3fe6c3f0739..032778a94a500cea067c244cb6dab62ab8c94146 100644 (file)
@@ -40,5 +40,6 @@ strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
 
+libm_hidden_def (__fegetenv)
 libm_hidden_ver (__fegetenv, fegetenv)
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
index 5faabe824644763413f56a44b47b950a835437b5..67b0e5483c59440ac06a0cf91651be2f19776136 100644 (file)
@@ -43,6 +43,7 @@ __fegetenv (fenv_t *envp)
 strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
+libm_hidden_def (__fegetenv)
 libm_hidden_ver (__fegetenv, fegetenv)
 
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
index 7e68ceb30ba951aa7ed8e8516d161ec0ad61772d..cfbc5ce43ae88fd355d43faff1d80b030ff830fe 100644 (file)
 #include <fpu_control.h>
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   _FPU_GETCW (envp->__fpc);
 
   /* Success.  */
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
index 2dc26967f095a4792dd8fd98ebf06a8253a22a29..c97cfbd6f88f912f00553f051b156ebc779a4998 100644 (file)
@@ -20,7 +20,7 @@
 #include <fpu_control.h>
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   fpu_control_t temp;
   _FPU_GETCW (temp);
@@ -29,4 +29,6 @@ fegetenv (fenv_t *envp)
 
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
index 55600d5beca8201dc74e2355a73ed7aaa6b844ce..b9873595a442648bdbb552596a1fa9f1899a65bb 100644 (file)
@@ -33,5 +33,6 @@ strong_alias (__fegetenv, __old_fegetenv)
 compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
 #endif
 
+libm_hidden_def (__fegetenv)
 libm_hidden_ver (__fegetenv, fegetenv)
 versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
index 035a83fd37d6e2823aa20e8514c3d1e171137c0b..70e4fb206007eb7cbe257d8cec5412ec3be3c370 100644 (file)
@@ -30,6 +30,7 @@
 #define feclearexcept(exc)                     ({ 0; })
 #define fetestexcept(exc)                      ({ 0; })
 extern inline int fegetenv (fenv_t *__e)       { return 0; }
+extern inline int __fegetenv (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 fegetround (void)            { return FE_TONEAREST; }
index 0e0c2693759c50da95341486d776edff93a3fb39..d150e8fc438dd3ad6d43d4637d79f55b9e239bd7 100644 (file)
@@ -19,7 +19,7 @@
 #include <fenv.h>
 
 int
-fegetenv (fenv_t *envp)
+__fegetenv (fenv_t *envp)
 {
   __asm__ ("fnstenv %0\n"
           /* fnstenv changes the exception mask, so load back the
@@ -30,4 +30,6 @@ fegetenv (fenv_t *envp)
   /* Success.  */
   return 0;
 }
-libm_hidden_def (fegetenv)
+libm_hidden_def (__fegetenv)
+weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)