Fix libm fegetround namespace (bug 17748).

Continuing the fixes for C90 libm functions calling C99 fe* functions,
this patch fixes the case of fegetround by making it a weak alias of
__fegetround and making the affected code call __fegetround.

Tested for x86_64 (testsuite, and that disassembly of installed shared
libraries is unchanged by the patch).  Also tested for ARM
(soft-float) that fegetround failures disappear from the linknamespace
test failures (feholdexcept, fesetenv, fesetround and feupdateenv
remain to be addressed before bug 17748 is fully fixed, although this
patch may suffice to fix the failures in some cases, when the libc_fe*
functions are implemented but there is no architecture-specific sqrt
implementation in use so there were failures from fegetround used by
sqrt but no other such failures).

	[BZ #17748]
	* include/fenv.h (__fegetround): Declare.  Use libm_hidden_proto.
	* math/fegetround.c (fegetround): Rename to __fegetround and
	define as weak alias of __fegetround.  Use libm_hidden_weak.
	* sysdeps/aarch64/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/alpha/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/arm/fegetround.c (fegetround): Likewise.
	* sysdeps/hppa/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/i386/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/ia64/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/m68k/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/mips/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/powerpc/fpu/fegetround.c (fegetround): Likewise.
	Undefine after rather than before function definition; use
	parentheses around function name in definition.
	(__fegetround): Also undefine macro after function definition.
	* sysdeps/powerpc/nofpu/fegetround.c (fegetround): Rename to
	__fegetround and define as weak alias of __fegetround.  Use
	libm_hidden_weak.  Do not undefine as macro.
	* sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c (fegetround):
	Likewise.
	* sysdeps/s390/fpu/fegetround.c (fegetround): Rename to
	__fegetround and define as weak alias of __fegetround.  Use
	libm_hidden_weak.
	* sysdeps/sh/sh4/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/sparc/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/tile/math_private.h (__fegetround): New inline function.
	* sysdeps/x86_64/fpu/fegetround.c (fegetround): Rename to
	__fegetround and define as weak alias of __fegetround.  Use
	libm_hidden_weak.
	* sysdeps/ieee754/dbl-64/e_sqrt.c (__ieee754_sqrt): Use
	__fegetround instead of fegetround.
This commit is contained in:
Joseph Myers 2015-01-02 20:44:42 +00:00
parent 253a59ccb5
commit b93c2205ec
20 changed files with 103 additions and 36 deletions

View File

@ -1,5 +1,38 @@
2015-01-02 Joseph Myers <joseph@codesourcery.com>
[BZ #17748]
* include/fenv.h (__fegetround): Declare. Use libm_hidden_proto.
* math/fegetround.c (fegetround): Rename to __fegetround and
define as weak alias of __fegetround. Use libm_hidden_weak.
* sysdeps/aarch64/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/alpha/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/arm/fegetround.c (fegetround): Likewise.
* sysdeps/hppa/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/i386/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/ia64/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/m68k/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/mips/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/powerpc/fpu/fegetround.c (fegetround): Likewise.
Undefine after rather than before function definition; use
parentheses around function name in definition.
(__fegetround): Also undefine macro after function definition.
* sysdeps/powerpc/nofpu/fegetround.c (fegetround): Rename to
__fegetround and define as weak alias of __fegetround. Use
libm_hidden_weak. Do not undefine as macro.
* sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c (fegetround):
Likewise.
* sysdeps/s390/fpu/fegetround.c (fegetround): Rename to
__fegetround and define as weak alias of __fegetround. Use
libm_hidden_weak.
* sysdeps/sh/sh4/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/sparc/fpu/fegetround.c (fegetround): Likewise.
* sysdeps/tile/math_private.h (__fegetround): New inline function.
* sysdeps/x86_64/fpu/fegetround.c (fegetround): Rename to
__fegetround and define as weak alias of __fegetround. Use
libm_hidden_weak.
* sysdeps/ieee754/dbl-64/e_sqrt.c (__ieee754_sqrt): Use
__fegetround instead of fegetround.
[BZ #17782]
* sysdeps/unix/sysv/linux/mips/bits/termios.h (TIOCSER_TEMT):
Condition macro definition on [__USE_MISC].

View File

@ -13,12 +13,14 @@ extern int __fesetexceptflag (const fexcept_t *__flagp, int __excepts);
extern int __fegetenv (fenv_t *__envp);
extern int __fesetenv (const fenv_t *__envp);
extern int __feupdateenv (const fenv_t *__envp);
extern __typeof (fegetround) __fegetround;
libm_hidden_proto (feraiseexcept)
libm_hidden_proto (__feraiseexcept)
libm_hidden_proto (fegetenv)
libm_hidden_proto (__fegetenv)
libm_hidden_proto (fegetround)
libm_hidden_proto (__fegetround)
libm_hidden_proto (fesetenv)
libm_hidden_proto (fesetround)
libm_hidden_proto (feholdexcept)

View File

@ -20,7 +20,7 @@
#include <fenv.h>
int
fegetround (void)
__fegetround (void)
{
#ifdef FE_TONEAREST
return FE_TONEAREST;
@ -28,5 +28,7 @@ fegetround (void)
return 0;
#endif
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)
stub_warning (fegetround)

View File

@ -20,8 +20,10 @@
#include <get-rounding-mode.h>
int
fegetround (void)
__fegetround (void)
{
return get_rounding_mode ();
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -20,7 +20,7 @@
#include <fenv_libc.h>
int
fegetround (void)
__fegetround (void)
{
unsigned long fpcr;
@ -28,4 +28,6 @@ fegetround (void)
return (fpcr >> FPCR_ROUND_SHIFT) & 3;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -20,8 +20,10 @@
int
fegetround (void)
__fegetround (void)
{
return get_rounding_mode ();
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -20,8 +20,10 @@
#include <get-rounding-mode.h>
int
fegetround (void)
__fegetround (void)
{
return get_rounding_mode ();
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -20,7 +20,7 @@
#include <fenv.h>
int
fegetround (void)
__fegetround (void)
{
int cw;
@ -28,4 +28,6 @@ fegetround (void)
return cw & 0xc00;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -20,8 +20,10 @@
#include <get-rounding-mode.h>
int
fegetround (void)
__fegetround (void)
{
return get_rounding_mode ();
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -66,7 +66,7 @@ __ieee754_sqrt (double x)
/*----------------- 2^-1022 <= | x |< 2^1024 -----------------*/
if (k > 0x000fffff && k < 0x7ff00000)
{
int rm = fegetround ();
int rm = __fegetround ();
fenv_t env;
libc_feholdexcept_setround (&env, FE_TONEAREST);
double ret;

View File

@ -20,7 +20,7 @@
#include <fenv.h>
int
fegetround (void)
__fegetround (void)
{
int fpcr;
@ -28,4 +28,6 @@ fegetround (void)
return fpcr & FE_UPWARD;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -21,7 +21,7 @@
#include <fpu_control.h>
int
fegetround (void)
__fegetround (void)
{
int cw;
@ -30,4 +30,6 @@ fegetround (void)
return cw & _FPU_RC_MASK;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -18,10 +18,13 @@
#include <fenv_libc.h>
#undef fegetround
int
fegetround (void)
(__fegetround) (void)
{
return __fegetround();
}
libm_hidden_def (fegetround)
#undef fegetround
#undef __fegetround
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -20,10 +20,11 @@
#include "soft-fp.h"
#include "soft-supp.h"
#undef fegetround
int
fegetround (void)
__fegetround (void)
{
return __sim_round_mode_thread;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -18,13 +18,14 @@
#include <fenv_libc.h>
#undef fegetround
int
fegetround (void)
__fegetround (void)
{
unsigned long fpescr;
fpescr = fegetenv_register ();
return fpescr & 3;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -21,7 +21,7 @@
#include <fpu_control.h>
int
fegetround (void)
__fegetround (void)
{
fexcept_t cw;
@ -29,4 +29,6 @@ fegetround (void)
return cw & FPC_RM_MASK;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -21,7 +21,7 @@
#include <fpu_control.h>
int
fegetround (void)
__fegetround (void)
{
fpu_control_t cw;
@ -30,4 +30,6 @@ fegetround (void)
return cw & 0x1;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -19,7 +19,7 @@
#include <fenv.h>
int
fegetround (void)
__fegetround (void)
{
fenv_t tmp;
@ -27,4 +27,6 @@ fegetround (void)
return tmp & __FE_ROUND_MASK;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)

View File

@ -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 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; }
#endif

View File

@ -20,7 +20,7 @@
#include <fenv.h>
int
fegetround (void)
__fegetround (void)
{
int cw;
/* We only check the x87 FPU unit. The SSE unit should be the same
@ -30,4 +30,6 @@ fegetround (void)
return cw & 0xc00;
}
libm_hidden_def (fegetround)
libm_hidden_def (__fegetround)
weak_alias (__fegetround, fegetround)
libm_hidden_weak (fegetround)