Avoid localplt issues from x86 fereaiseexcept inline.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 23 Jun 2017 20:04:23 +0000 (20:04 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 23 Jun 2017 20:04:23 +0000 (20:04 +0000)
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)].

ChangeLog
sysdeps/x86/fpu/bits/fenv.h
sysdeps/x86/fpu/include/bits/fenv.h

index ced515c..fa0ac20 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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):
index fd73279..e6fcf94 100644 (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))
 {
index a39b6fa..aa61666 100644 (file)
    <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