[1/4] S390: Use new s390_libc_ifunc_expr macro in s390 8bit-generic.c.

Message ID 1491401201-16481-1-git-send-email-stli@linux.vnet.ibm.com
State New
Headers show

Commit Message

Stefan Liebler April 5, 2017, 2:06 p.m.
This patch adds s390_libc_ifunc_expr macro which uses the __ifunc base macro
in include/libc-symbols.h and lets the user define a generic expression to
choose the correct ifunc variant.  Furthermore as the base macro is used,
the ifunc resolver functions are now also using inhibit_stack_protector.
S390 needs its own version due to the hwcap argument of the ifunc resolver.

This new macro is now used in iconv code in 8bit-generic.c instead of using
gcc attribute ifunc directly.

ChangeLog:

	* sysdeps/s390/multiarch/ifunc-resolve.h
	(s390_libc_ifunc_expr_init, s390_libc_ifunc_expr): New Define.
	* sysdeps/s390/multiarch/8bit-generic.c
	(__to_generic, __from_generic): Use s390_libc_ifunc_expr to
	define ifunc resolvers.
---
 sysdeps/s390/multiarch/8bit-generic.c  | 41 ++++++++++------------------------
 sysdeps/s390/multiarch/ifunc-resolve.h |  5 +++++
 2 files changed, 17 insertions(+), 29 deletions(-)

Comments

Stefan Liebler April 18, 2017, 1:09 p.m. | #1
On 04/05/2017 04:06 PM, Stefan Liebler wrote:
> This patch adds s390_libc_ifunc_expr macro which uses the __ifunc base macro
> in include/libc-symbols.h and lets the user define a generic expression to
> choose the correct ifunc variant.  Furthermore as the base macro is used,
> the ifunc resolver functions are now also using inhibit_stack_protector.
> S390 needs its own version due to the hwcap argument of the ifunc resolver.
>
> This new macro is now used in iconv code in 8bit-generic.c instead of using
> gcc attribute ifunc directly.
>
> ChangeLog:
>
> 	* sysdeps/s390/multiarch/ifunc-resolve.h
> 	(s390_libc_ifunc_expr_init, s390_libc_ifunc_expr): New Define.
> 	* sysdeps/s390/multiarch/8bit-generic.c
> 	(__to_generic, __from_generic): Use s390_libc_ifunc_expr to
> 	define ifunc resolvers.

Any objection?
Otherwise I'll commit these s390 specific patches at the end of the week.

Bye
Stefan
Stefan Liebler April 21, 2017, 1:32 p.m. | #2
On 04/18/2017 03:09 PM, Stefan Liebler wrote:
> On 04/05/2017 04:06 PM, Stefan Liebler wrote:
>> This patch adds s390_libc_ifunc_expr macro which uses the __ifunc base
>> macro
>> in include/libc-symbols.h and lets the user define a generic
>> expression to
>> choose the correct ifunc variant.  Furthermore as the base macro is used,
>> the ifunc resolver functions are now also using inhibit_stack_protector.
>> S390 needs its own version due to the hwcap argument of the ifunc
>> resolver.
>>
>> This new macro is now used in iconv code in 8bit-generic.c instead of
>> using
>> gcc attribute ifunc directly.
>>
>> ChangeLog:
>>
>>     * sysdeps/s390/multiarch/ifunc-resolve.h
>>     (s390_libc_ifunc_expr_init, s390_libc_ifunc_expr): New Define.
>>     * sysdeps/s390/multiarch/8bit-generic.c
>>     (__to_generic, __from_generic): Use s390_libc_ifunc_expr to
>>     define ifunc resolvers.
>
> Any objection?
> Otherwise I'll commit these s390 specific patches at the end of the week.
>
> Bye
> Stefan
>
Committed

Patch

diff --git a/sysdeps/s390/multiarch/8bit-generic.c b/sysdeps/s390/multiarch/8bit-generic.c
index 99f63e4..49f0ed8 100644
--- a/sysdeps/s390/multiarch/8bit-generic.c
+++ b/sysdeps/s390/multiarch/8bit-generic.c
@@ -40,8 +40,7 @@ 
    to translate between multiple generic characters and "1 byte UCS4"
    characters at once. The vector instructions are used to convert between
    the "1 byte UCS4" and UCS4.  */
-# include <unistd.h>
-# include <dl-procinfo.h>
+# include <ifunc-resolve.h>
 
 # undef FROM_LOOP
 # undef TO_LOOP
@@ -372,33 +371,17 @@ 
 
 
 /* Generate ifunc'ed loop function.  */
-__typeof(__from_generic_c)
-__attribute__ ((ifunc ("__from_generic_resolver")))
-__from_generic;
+s390_libc_ifunc_expr (__from_generic_c, __from_generic,
+		      (sizeof (from_ucs4) / sizeof (from_ucs4[0]) <= 256
+		       && hwcap & HWCAP_S390_VX)
+		      ? __from_generic_vx
+		      : __from_generic_c);
 
-static void *
-__from_generic_resolver (unsigned long int dl_hwcap)
-{
-  if (sizeof (from_ucs4) / sizeof (from_ucs4[0]) <= 256
-      && dl_hwcap & HWCAP_S390_VX)
-    return &__from_generic_vx;
-  else
-    return &__from_generic_c;
-}
-
-__typeof(__to_generic_c)
-__attribute__ ((ifunc ("__to_generic_resolver")))
-__to_generic;
-
-static void *
-__to_generic_resolver (unsigned long int dl_hwcap)
-{
-  if (sizeof (from_ucs4) / sizeof (from_ucs4[0]) <= 256
-      && dl_hwcap & HWCAP_S390_VX)
-    return &__to_generic_vx;
-  else
-    return &__to_generic_c;
-}
+s390_libc_ifunc_expr (__to_generic_c, __to_generic,
+		      (sizeof (from_ucs4) / sizeof (from_ucs4[0]) <= 256
+		       && hwcap & HWCAP_S390_VX)
+		      ? __to_generic_vx
+		      : __to_generic_c);
 
 strong_alias (__to_generic_c_single, __to_generic_single)
 
@@ -410,6 +393,6 @@  strong_alias (__to_generic_c_single, __to_generic_single)
 
 #else
 /* Generate this module without ifunc if build environment lacks vector
-   support. Instead the common 8bit-generic.c is used.  */
+   support.  Instead the common 8bit-generic.c is used.  */
 # include "iconvdata/8bit-generic.c"
 #endif /* !defined HAVE_S390_VX_ASM_SUPPORT */
diff --git a/sysdeps/s390/multiarch/ifunc-resolve.h b/sysdeps/s390/multiarch/ifunc-resolve.h
index c04822d..adbd08a 100644
--- a/sysdeps/s390/multiarch/ifunc-resolve.h
+++ b/sysdeps/s390/multiarch/ifunc-resolve.h
@@ -83,3 +83,8 @@ 
 	   ? RESOLVERFUNC##_vx						\
 	   : RESOLVERFUNC##_c,						\
 	   unsigned long int dl_hwcap, s390_vx_libc_ifunc_init);
+
+#define s390_libc_ifunc_expr_init()
+#define s390_libc_ifunc_expr(TYPE_FUNC, FUNC, EXPR)		\
+  __ifunc (TYPE_FUNC, FUNC, EXPR, unsigned long int hwcap,	\
+	   s390_libc_ifunc_expr_init);