This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 3/4] S390: Do not call memcpy, memcmp, memset within libc.so via ifunc-plt.
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Tue, 26 Apr 2016 10:35:28 -0300
- Subject: Re: [PATCH 3/4] S390: Do not call memcpy, memcmp, memset within libc.so via ifunc-plt.
- Authentication-results: sourceware.org; auth=none
- References: <1461672469-2107-1-git-send-email-stli at linux dot vnet dot ibm dot com> <1461672469-2107-3-git-send-email-stli at linux dot vnet dot ibm dot com>
On 26/04/2016 09:07, Stefan Liebler wrote:
> On s390, the memcpy, memcmp, memset functions are IFUNC symbols,
> which are created with s390_libc_ifunc-macro.
> This macro creates a __GI_ symbol which is set to the
> ifunced symbol. Thus calls within libc.so to e.g. memcpy
> result in a call to *ABS*+0x954c0@plt stub and afterwards
> to the resolved memcpy-ifunc-variant.
>
> This patch sets the __GI_ symbol to the default-ifunc-variant
> to avoid the plt call. The __GI_ symbols are now created at the
> default variant of ifunced function.
Is the internal ifunc plt usage leading to a failure in s390/s390x
(as for powerpc32 and i686) or is it an optimization fix?
>
> ChangeLog:
>
> * sysdeps/s390/multiarch/ifunc-resolve.h (s390_libc_ifunc):
> Remove __GI_ symbol.
> * sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Add __GI_memcmp symbol.
> * sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: Likewise.
> * sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Add __GI_memcpy symbol.
> * sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Likewise.
> * sysdeps/s390/s390-32/multiarch/memset-s390.S: Add __GI_memset symbol.
> * sysdeps/s390/s390-64/multiarch/memset-s390x.S: Likewise.
> ---
> sysdeps/s390/multiarch/ifunc-resolve.h | 4 +---
> sysdeps/s390/s390-32/multiarch/memcmp-s390.S | 3 +++
> sysdeps/s390/s390-32/multiarch/memcpy-s390.S | 5 ++++-
> sysdeps/s390/s390-32/multiarch/memset-s390.S | 3 +++
> sysdeps/s390/s390-64/multiarch/memcmp-s390x.S | 3 +++
> sysdeps/s390/s390-64/multiarch/memcpy-s390x.S | 5 ++++-
> sysdeps/s390/s390-64/multiarch/memset-s390x.S | 3 +++
> 7 files changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/sysdeps/s390/multiarch/ifunc-resolve.h b/sysdeps/s390/multiarch/ifunc-resolve.h
> index 744a0d8..26e097a 100644
> --- a/sysdeps/s390/multiarch/ifunc-resolve.h
> +++ b/sysdeps/s390/multiarch/ifunc-resolve.h
> @@ -44,9 +44,7 @@
> #define s390_libc_ifunc(FUNC) \
> __asm__ (".globl " #FUNC "\n\t" \
> ".type " #FUNC ",@gnu_indirect_function\n\t" \
> - ".set " #FUNC ",__resolve_" #FUNC "\n\t" \
> - ".globl __GI_" #FUNC "\n\t" \
> - ".set __GI_" #FUNC "," #FUNC "\n"); \
> + ".set " #FUNC ",__resolve_" #FUNC "\n\t"); \
> \
> /* Make the declarations of the optimized functions hidden in order
> to prevent GOT slots being generated for them. */ \
> diff --git a/sysdeps/s390/s390-32/multiarch/memcmp-s390.S b/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
> index e9ee6d2..a01f3b7 100644
> --- a/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
> +++ b/sysdeps/s390/s390-32/multiarch/memcmp-s390.S
> @@ -101,4 +101,7 @@ END(__memcmp_z10)
> .set memcmp,__memcmp_default
> .weak bcmp
> .set bcmp,__memcmp_default
> +#elif defined SHARED && IS_IN (libc)
> +.globl __GI_memcmp
> +.set __GI_memcmp,__memcmp_default
> #endif
> diff --git a/sysdeps/s390/s390-32/multiarch/memcpy-s390.S b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
> index 4e30cdf..92ffaea 100644
> --- a/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
> +++ b/sysdeps/s390/s390-32/multiarch/memcpy-s390.S
> @@ -92,7 +92,10 @@ END(__memcpy_z10)
>
> #include "../memcpy.S"
>
> -#if !defined SHARED || !IS_IN (libc)
> +#if defined SHARED && IS_IN (libc)
> +.globl __GI_memcpy
> +.set __GI_memcpy,__memcpy_default
> +#else
> .globl memcpy
> .set memcpy,__memcpy_default
> #endif
> diff --git a/sysdeps/s390/s390-32/multiarch/memset-s390.S b/sysdeps/s390/s390-32/multiarch/memset-s390.S
> index 47277c1..a2ddd98 100644
> --- a/sysdeps/s390/s390-32/multiarch/memset-s390.S
> +++ b/sysdeps/s390/s390-32/multiarch/memset-s390.S
> @@ -110,4 +110,7 @@ END(__memset_mvcle)
> #if !IS_IN (libc)
> .globl memset
> .set memset,__memset_default
> +#elif defined SHARED && IS_IN (libc)
> +.globl __GI_memset
> +.set __GI_memset,__memset_default
> #endif
> diff --git a/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S b/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S
> index 2a4c0ae..b28ccaf 100644
> --- a/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S
> +++ b/sysdeps/s390/s390-64/multiarch/memcmp-s390x.S
> @@ -98,4 +98,7 @@ END(__memcmp_z10)
> .set memcmp,__memcmp_default
> .weak bcmp
> .set bcmp,__memcmp_default
> +#elif defined SHARED && IS_IN (libc)
> +.globl __GI_memcmp
> +.set __GI_memcmp,__memcmp_default
> #endif
> diff --git a/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
> index 69fa562..8f54526 100644
> --- a/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
> +++ b/sysdeps/s390/s390-64/multiarch/memcpy-s390x.S
> @@ -88,7 +88,10 @@ END(__memcpy_z10)
>
> #include "../memcpy.S"
>
> -#if !defined SHARED || !IS_IN (libc)
> +#if defined SHARED && IS_IN (libc)
> +.globl __GI_memcpy
> +.set __GI_memcpy,__memcpy_default
> +#else
> .globl memcpy
> .set memcpy,__memcpy_default
> #endif
> diff --git a/sysdeps/s390/s390-64/multiarch/memset-s390x.S b/sysdeps/s390/s390-64/multiarch/memset-s390x.S
> index 05e0682..a77e798 100644
> --- a/sysdeps/s390/s390-64/multiarch/memset-s390x.S
> +++ b/sysdeps/s390/s390-64/multiarch/memset-s390x.S
> @@ -106,4 +106,7 @@ END(__memset_mvcle)
> #if !IS_IN (libc)
> .globl memset
> .set memset,__memset_default
> +#elif defined SHARED && IS_IN (libc)
> +.globl __GI_memset
> +.set __GI_memset,__memset_default
> #endif
>