[PATCH] ppc64le: Make shared libm routines work again for static programs

Paul E Murphy murphyp@linux.ibm.com
Wed Mar 31 15:54:48 GMT 2021



On 3/31/21 8:47 AM, Andreas Schwab wrote:
> This appears to work.
> 
> Andreas.
> 
>  From ea7654a1bf82b4bf3cd2fb6b375a043746427232 Mon Sep 17 00:00:00 2001
> From: Andreas Schwab <schwab@linux-m68k.org>
> Date: Wed, 31 Mar 2021 14:17:24 +0200
> Subject: [PATCH] powerpc64le: Use ifunc for _Float128 functions also in libc
> 
> ---
>   .../powerpc/powerpc64/le/fpu/multiarch/Makefile    | 14 +++++++++++---
>   .../powerpc64/le/fpu/multiarch/float128_private.h  |  4 ++--
>   .../le/fpu/multiarch/math-type-macros-float128.h   |  4 ++--
>   3 files changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/sysdeps/powerpc/powerpc64/le/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/le/fpu/multiarch/Makefile
> index 767805b510..fa3425fbc1 100644
> --- a/sysdeps/powerpc/powerpc64/le/fpu/multiarch/Makefile
> +++ b/sysdeps/powerpc/powerpc64/le/fpu/multiarch/Makefile
> @@ -85,6 +85,7 @@ endif
>   #
>   ifeq ($(do_f128_multiarch),yes)
> 
> +f128-ifunc-calls = s_modff128 s_scalbnf128 s_frexpf128 s_ldexpf128
>   gen-libm-f128-ifunc-routines = \
>   	e_acosf128 e_acoshf128 e_asinf128 e_atan2f128 e_atanhf128 e_coshf128 \
>   	e_expf128 e_fmodf128 e_hypotf128 e_j0f128 e_j1f128 e_jnf128 \
> @@ -96,7 +97,7 @@ gen-libm-f128-ifunc-routines = \
>   	s_tanhf128 s_truncf128 s_remquof128 e_log2f128 \
>   	s_roundf128 s_nearbyintf128 s_sincosf128 s_fmaf128 s_lrintf128 \
>   	s_llrintf128 s_lroundf128 s_llroundf128 e_exp10f128 \
> -	m_modff128 m_scalbnf128 m_frexpf128 m_ldexpf128 x2y2m1f128 \
> +	$(f128-ifunc-calls) $(f128-ifunc-calls:s_%=m_%) x2y2m1f128 \
>   	gamma_productf128 lgamma_negf128 lgamma_productf128 s_roundevenf128 \
>   	cargf128 conjf128 cimagf128 crealf128 cabsf128 e_scalbf128 s_cacosf128 \
>   	s_cacoshf128 s_ccosf128 s_ccoshf128 s_casinf128 s_csinf128 \
> @@ -118,19 +119,26 @@ f128-march-routines-ifunc = $(addsuffix -ifunc,$(gen-libm-f128-ifunc-routines))
>   f128-march-routines = $(f128-march-routines-p9) $(f128-march-routines-ifunc)
>   f128-march-cpus = power9
> 
> -libm-routines += $(f128-march-routines)
> +f128-march-calls-p9 = $(addsuffix -power9,$(f128-ifunc-calls))
> +f128-march-calls-ifunc = $(addsuffix -ifunc,$(f128-ifunc-calls))
> +f128-march-calls = $(f128-march-calls-p9) $(f128-march-calls-ifunc)
> +
> +calls += $(f128-march-calls)
> +libm-routines += $(filter-out $(f128-march-calls), $(f128-march-routines))
>   generated += $(f128-march-routines)
> 
>   CFLAGS-float128-ifunc.c += $(type-float128-CFLAGS) $(no-gnu-attribute-CFLAGS)
> 
>   # Copy special CFLAGS for some functions
> +CFLAGS-s_modff128-power9.c += -fsignaling-nans
>   CFLAGS-m_modff128-power9.c += -fsignaling-nans
> 
>   # Generate ifunc wrapper files and target specific wrappers around
>   # each routine above.  Note, m_%.c files are fixed up to include
>   # s_%.c files.  This is an artifact of the makefile rules which allow
>   # some files to be compiled for libc and libm.
> -$(objpfx)gen-float128-ifuncs.stmp: Makefile
> +$(objpfx)gen-float128-ifuncs.stmp: \
> +  Makefile $(..)sysdeps/powerpc/powerpc64/le/fpu/multiarch/Makefile
>   	$(make-target-directory)
>   	for gcall in $(gen-libm-f128-ifunc-routines); do \
>   	  ifile="$${gcall}";                             \
> diff --git a/sysdeps/powerpc/powerpc64/le/fpu/multiarch/float128_private.h b/sysdeps/powerpc/powerpc64/le/fpu/multiarch/float128_private.h
> index 08530df9a1..c613d4abae 100644
> --- a/sysdeps/powerpc/powerpc64/le/fpu/multiarch/float128_private.h
> +++ b/sysdeps/powerpc/powerpc64/le/fpu/multiarch/float128_private.h
> @@ -19,7 +19,7 @@
>   #ifndef _FLOAT128_PRIVATE_PPC64LE
>   #define _FLOAT128_PRIVATE_PPC64LE 1
> 
> -#if IS_IN(libc) || !defined(_F128_ENABLE_IFUNC)
> +#ifndef _F128_ENABLE_IFUNC
>   /* multiarch is not supported.  Do nothing and pass through.  */
>   #include_next <float128_private.h>
>   #else
> @@ -94,6 +94,6 @@ F128_REDIR (__lgamma_productf128)
>   #include <float128-ifunc-redirects-mp.h>
>   #include <float128-ifunc-redirects.h>
> 
> -#endif /* !(IS_IN(libc) && defined(_F128_ENABLE_IFUNC) */
> +#endif /* _F128_ENABLE_IFUNC */
> 
>   #endif /* _FLOAT128_PRIVATE_PPC64LE */
> diff --git a/sysdeps/powerpc/powerpc64/le/fpu/multiarch/math-type-macros-float128.h b/sysdeps/powerpc/powerpc64/le/fpu/multiarch/math-type-macros-float128.h
> index 59cfbb87d3..422ce211be 100644
> --- a/sysdeps/powerpc/powerpc64/le/fpu/multiarch/math-type-macros-float128.h
> +++ b/sysdeps/powerpc/powerpc64/le/fpu/multiarch/math-type-macros-float128.h
> @@ -21,7 +21,7 @@
> 
>   #include_next <math-type-macros-float128.h>
> 
> -#if !IS_IN(libc) && defined(_F128_ENABLE_IFUNC)
> +#ifdef _F128_ENABLE_IFUNC
> 
>   /* Include fenv.h now before turning off PLT bypass.  At
>      minimum fereaiseexcept is used today.  */
> @@ -115,6 +115,6 @@ F128_REDIR (__w_log1pf128);
>   /* Include the redirects shared with math_private.h users.  */
>   #include <float128-ifunc-redirects.h>
> 
> -#endif /* !IS_IN(libc) && defined(_F128_ENABLE_IFUNC) */
> +#endif /* _F128_ENABLE_IFUNC */
> 
>   #endif /*_MATH_TYPE_MACROS_FLOAT128_PPC64_MULTI */
> 

Thank you for fixing this.  This looks like the right way to resolve 
this.  LGTM.  Verified with no regressions on a multiarch build on P9.


More information about the Libc-alpha mailing list