mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
S390: Use new s390_libc_ifunc_expr macro in s390 8bit-generic.c.
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.
This commit is contained in:
parent
44e4b889ab
commit
51213e2b8d
@ -1,3 +1,11 @@
|
||||
2017-04-21 Stefan Liebler <stli@linux.vnet.ibm.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2017-04-21 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #20424]
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user