From 16000c8d04f60a15fc0187e8719d741329501c39 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 23 Jun 2017 20:04:23 +0000 Subject: 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)]. --- sysdeps/x86/fpu/bits/fenv.h | 2 ++ sysdeps/x86/fpu/include/bits/fenv.h | 9 +++++++++ 2 files changed, 11 insertions(+) (limited to 'sysdeps') diff --git a/sysdeps/x86/fpu/bits/fenv.h b/sysdeps/x86/fpu/bits/fenv.h index fd7327902c..e6fcf9431b 100644 --- a/sysdeps/x86/fpu/bits/fenv.h +++ b/sysdeps/x86/fpu/bits/fenv.h @@ -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)) { diff --git a/sysdeps/x86/fpu/include/bits/fenv.h b/sysdeps/x86/fpu/include/bits/fenv.h index a39b6fa85d..aa61666fc3 100644 --- a/sysdeps/x86/fpu/include/bits/fenv.h +++ b/sysdeps/x86/fpu/include/bits/fenv.h @@ -17,6 +17,15 @@ . */ #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 # ifndef _ISOMAC -- cgit v1.2.3