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.
This commit is contained in:
Joseph Myers 2017-09-26 19:49:33 +00:00
parent 4c5a7a02b6
commit 2d9193f2f5
2 changed files with 7 additions and 8 deletions

View File

@ -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

View 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)