]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Use generic __ifunc for SPARC.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 26 Sep 2017 19:49:33 +0000 (19:49 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 26 Sep 2017 19:49:33 +0000 (19:49 +0000)
glibc fails to build with GCC mainline for SPARC because of the use of
manually-created IFUNCs, which fail the tests of compatibility of
function alias types.  This patch changes sparc-ifunc.h to use the
generic __ifunc in defining sparc_libm_ifunc.  The generic __ifunc can
use the GCC ifunc attribute when available, so ensuring
type-correctness as well as better debug info than when setting symbol
types in asm statements.

Note that for this to fix the build with GCC mainline the GCC patch
<https://gcc.gnu.org/ml/gcc-patches/2017-09/msg01779.html>, or
building GCC with --enable-gnu-indirect-function, is also needed.

Tested (compilation only) with build-many-glibcs.py (sparc64-linux-gnu
and sparcv9-linux-gnu, with GCC 8 with the above patch, and also with
GCC 7).

* sysdeps/sparc/sparc-ifunc.h [!__ASSEMBLER__] (sparc_libm_ifunc):
Define using __ifunc.

ChangeLog
sysdeps/sparc/sparc-ifunc.h

index 87e4067b3a61476333f1c929e9124628f93ad519..f8e097e17fa846c35afab502a25ad67f666a617f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-26  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/sparc/sparc-ifunc.h [!__ASSEMBLER__] (sparc_libm_ifunc):
+       Define using __ifunc.
+
 2017-09-26  Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
 
        * sysdeps/powerpc/fpu/libm-test-ulps: Regenerate expf() and
index 8cc86ff5e1efbd6a1e96d306449e53bac099ccf1..4b1ea00bded60f2ee3f866d90baae87b2c18559d 100644 (file)
@@ -162,14 +162,8 @@ END (__##name)
 
 #else  /* __ASSEMBLER__ */
 
-# define sparc_libm_ifunc(name, expr)                                  \
-  extern void *name##_ifunc (int) __asm__ (#name);                     \
-  void *name##_ifunc (int hwcap)                                       \
-  {                                                                    \
-    __typeof (name) *res = expr;                                       \
-    return res;                                                                \
-  }                                                                    \
-  __asm__ (".type " #name ", %gnu_indirect_function");
+# define sparc_libm_ifunc(name, expr)                          \
+  __ifunc (name, name, expr, int hwcap, libm_ifunc_init)
 
 # define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)