Avoid localplt issues from x86 fereaiseexcept inline.

Building for x86_64 with float128 support, I get a localplt test
failure from lrintf128 calling feraiseexcept.

The problem is that an inline optimized version of feraiseexcept calls
__feraiseexcept_renamed in cases where it doesn't completely expand
inline, and that in turn is redirected to feraiseexcept for a library
call, so meaning the redirection of feraiseexcept to
__GI_feraiseexcept inside libm is lost for that call.

This patch fixes the problem by moving the redirect to an internal
header in the _LIBC case, with the internal header using
__GI_feraiseexcept where appropriate.

Tested for x86_64 (in conjunction with float128 patches).

	* sysdeps/x86/fpu/bits/fenv.h [_LIBC] (__feraiseexcept_renamed):
	Do not declare.
	* sysdeps/x86/fpu/include/bits/fenv.h [_LIBC &&
	__USE_EXTERN_INLINES] (__feraiseexcept_renamed): Declare here,
	redirected to __GI_feraiseexcept if [SHARED && IS_IN (libm)].
This commit is contained in:
Joseph Myers 2017-06-23 20:04:23 +00:00
parent 049816c3be
commit 16000c8d04
3 changed files with 19 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2017-06-23 Joseph Myers <joseph@codesourcery.com>
* sysdeps/x86/fpu/bits/fenv.h [_LIBC] (__feraiseexcept_renamed):
Do not declare.
* sysdeps/x86/fpu/include/bits/fenv.h [_LIBC &&
__USE_EXTERN_INLINES] (__feraiseexcept_renamed): Declare here,
redirected to __GI_feraiseexcept if [SHARED && IS_IN (libm)].
2017-06-23 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S (between_2_3):

View File

@ -120,7 +120,9 @@ femode_t;
__BEGIN_DECLS
/* Optimized versions. */
#ifndef _LIBC
extern int __REDIRECT_NTH (__feraiseexcept_renamed, (int), feraiseexcept);
#endif
__extern_always_inline void
__NTH (__feraiseexcept_invalid_divbyzero (int __excepts))
{

View File

@ -17,6 +17,15 @@
<http://www.gnu.org/licenses/>. */
#ifndef _BITS_FENV_H
#if defined _LIBC && defined __USE_EXTERN_INLINES
# if defined SHARED && IS_IN (libm)
extern int __REDIRECT_NTH (__feraiseexcept_renamed, (int), __GI_feraiseexcept);
# else
extern int __REDIRECT_NTH (__feraiseexcept_renamed, (int), feraiseexcept);
# endif
#endif
#include_next <bits/fenv.h>
# ifndef _ISOMAC