diff options
author | Joseph Myers <joseph@codesourcery.com> | 2017-09-26 19:49:33 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2017-09-26 19:49:33 +0000 |
commit | 2d9193f2f55767c71333d425e140e22c3e15dc3d (patch) | |
tree | 48da34b9bdb8434ef714d5aa945841e8119c9af5 /sysdeps/sparc/sparc-ifunc.h | |
parent | 4c5a7a02b66af196ee17026f64b2e78fbfc0776a (diff) | |
download | glibc-2d9193f2f55767c71333d425e140e22c3e15dc3d.zip glibc-2d9193f2f55767c71333d425e140e22c3e15dc3d.tar.gz glibc-2d9193f2f55767c71333d425e140e22c3e15dc3d.tar.bz2 |
Use generic __ifunc for SPARC.
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.
Diffstat (limited to 'sysdeps/sparc/sparc-ifunc.h')
-rw-r--r-- | sysdeps/sparc/sparc-ifunc.h | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h index 8cc86ff..4b1ea00 100644 --- a/sysdeps/sparc/sparc-ifunc.h +++ b/sysdeps/sparc/sparc-ifunc.h @@ -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) |