mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	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.
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Install given floating-point environment and raise exceptions.
 | 
						|
   Copyright (C) 1997-2015 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library.  If not, see
 | 
						|
   <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
#include <fenv.h>
 | 
						|
#include <fpu_control.h>
 | 
						|
#include <arm-features.h>
 | 
						|
 | 
						|
 | 
						|
int
 | 
						|
__feupdateenv (const fenv_t *envp)
 | 
						|
{
 | 
						|
  fpu_control_t fpscr, new_fpscr, updated_fpscr;
 | 
						|
  int excepts;
 | 
						|
 | 
						|
  /* Fail if a VFP unit isn't present.  */
 | 
						|
  if (!ARM_HAVE_VFP)
 | 
						|
    return 1;
 | 
						|
 | 
						|
  _FPU_GETCW (fpscr);
 | 
						|
  excepts = fpscr & FE_ALL_EXCEPT;
 | 
						|
 | 
						|
  if ((envp != FE_DFL_ENV) && (envp != FE_NOMASK_ENV))
 | 
						|
    {
 | 
						|
      /* Merge current exception flags with the saved fenv.  */
 | 
						|
      new_fpscr = envp->__cw | excepts;
 | 
						|
 | 
						|
      /* Write new FPSCR if different (ignoring NZCV flags).  */
 | 
						|
      if (((fpscr ^ new_fpscr) & ~_FPU_MASK_NZCV) != 0)
 | 
						|
	_FPU_SETCW (new_fpscr);
 | 
						|
 | 
						|
      /* Raise the exceptions if enabled in the new FP state.  */
 | 
						|
      if (excepts & (new_fpscr >> FE_EXCEPT_SHIFT))
 | 
						|
	return __feraiseexcept (excepts);
 | 
						|
 | 
						|
      return 0;
 | 
						|
    }
 | 
						|
 | 
						|
  /* Preserve the reserved FPSCR flags.  */
 | 
						|
  new_fpscr = fpscr & (_FPU_RESERVED | FE_ALL_EXCEPT);
 | 
						|
  new_fpscr |= (envp == FE_DFL_ENV) ? _FPU_DEFAULT : _FPU_IEEE;
 | 
						|
 | 
						|
  if (((new_fpscr ^ fpscr) & ~_FPU_MASK_NZCV) != 0)
 | 
						|
    {
 | 
						|
      _FPU_SETCW (new_fpscr);
 | 
						|
 | 
						|
      /* Not all VFP architectures support trapping exceptions, so
 | 
						|
	 test whether the relevant bits were set and fail if not.  */
 | 
						|
      _FPU_GETCW (updated_fpscr);
 | 
						|
 | 
						|
      if (new_fpscr & ~updated_fpscr)
 | 
						|
	return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  /* Raise the exceptions if enabled in the new FP state.  */
 | 
						|
  if (excepts & (new_fpscr >> FE_EXCEPT_SHIFT))
 | 
						|
    return __feraiseexcept (excepts);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
libm_hidden_def (__feupdateenv)
 | 
						|
weak_alias (__feupdateenv, feupdateenv)
 | 
						|
libm_hidden_weak (feupdateenv)
 |