S390: Get rid of linknamespace failures for string functions.

This commit is contained in:
Stefan Liebler 2015-01-16 09:17:32 +01:00 committed by Andreas Krebbel
parent 53fbd16918
commit 1d53248326
16 changed files with 142 additions and 80 deletions

View File

@ -1,3 +1,65 @@
2015-01-16 Stefan Liebler <stli@linux.vnet.ibm.com>
[BZ #17848]
* sysdeps/s390/s390-32/memcmp.S
(memcmp_g5): Rename to __memcmp_g5.
* sysdeps/s390/s390-32/memcpy.S
(memcpy_g5): Rename to __memcpy_g5.
Jump to __memcpy_mvcle instead of memcpy_mvcle.
(memcpy_mvcle) Rename to __memcpy_mvcle.
* sysdeps/s390/s390-32/memset.S
(memset_g5): Rename to __memset_g5.
* sysdeps/s390/s390-32/multiarch/ifunc-resolve.c
(IFUNC_RESOLVE): Prefix ifunc-resolve function
and use prefixed functions.
* sysdeps/s390/s390-32/multiarch/memcmp.S
(memcmp_z196): Rename to __memcmp_z196.
(memcmp_z10): Rename to __memcmp_z10.
(memcmp): Set alias to __memcmp_g5.
(bcmp): Set alias to __memcmp_g5.
* sysdeps/s390/s390-32/multiarch/memcpy.S
(memcpy_z196): Rename to __memcpy_z196.
Jump to __memcpy_mvcle instead of memcpy_mvcle.
(memcpy_z10): Rename to __memcpy_z10.
Jump to __memcpy_mvcle instead of memcpy_mvcle.
(memcpy): Set alias to __memcpy_g5.
* sysdeps/s390/s390-32/multiarch/memset.S
(memset_z196): Rename to __memset_z196.
Jump to __memset_mvcle instead of memset_mvcle.
(memset_z10): Rename to __memset_z10.
Jump to __memset_mvcle instead of memset_mvcle.
(memset_mvcle) Rename to __memset_mvcle.
(memset): Set alias to __memset_g5.
* sysdeps/s390/s390-64/memcmp.S
(memcmp_z900): Rename to __memcmp_z900.
* sysdeps/s390/s390-64/memcpy.S
(memcpy_z900): Rename to __memcpy_z900.
Jump to __memcpy_mvcle instead of memcpy_mvcle.
(memcpy_mvcle) Rename to __memcpy_mvcle.
* sysdeps/s390/s390-64/memset.S
(memset_z900): Rename to __memset_z900.
* sysdeps/s390/s390-64/multiarch/ifunc-resolve.c
(IFUNC_RESOLVE): Prefix ifunc-resolve function
and use prefixed functions.
* sysdeps/s390/s390-64/multiarch/memcmp.S
(memcmp_z196): Rename to __memcmp_z196.
(memcmp_z10): Rename to __memcmp_z10.
(memcmp): Set alias to __memcmp_z900.
(bcmp): Set alias to __memcmp_z900.
* sysdeps/s390/s390-64/multiarch/memcpy.S
(memcpy_z196): Rename to __memcpy_z196.
Jump to __memcpy_mvcle instead of memcpy_mvcle.
(memcpy_z10): Rename to __memcpy_z10.
Jump to __memcpy_mvcle instead of memcpy_mvcle.
(memcpy): Set alias to __memcpy_z900.
* sysdeps/s390/s390-64/multiarch/memset.S
(memset_z196): Rename to __memset_z196.
Jump to __memset_mvcle instead of memset_mvcle.
(memset_z10): Rename to __memset_z10.
Jump to __memset_mvcle instead of memset_mvcle.
(memset_mvcle) Rename to __memset_mvcle.
(memset): Set alias to __memset_z900.
2015-01-14 Joseph Myers <joseph@codesourcery.com>
[BZ #17748]

2
NEWS
View File

@ -17,7 +17,7 @@ Version 2.21
17630, 17633, 17634, 17635, 17647, 17653, 17657, 17658, 17664, 17665,
17668, 17682, 17717, 17719, 17722, 17723, 17724, 17725, 17732, 17733,
17744, 17745, 17746, 17747, 17748, 17775, 17777, 17780, 17781, 17782,
17791, 17793, 17796, 17797, 17803, 17806, 17834
17791, 17793, 17796, 17797, 17803, 17806, 17834, 17848
* Optimized strcpy, stpcpy, strncpy, stpncpy, strcmp, and strncmp
implementations for powerpc64/powerpc64le.

View File

@ -27,7 +27,7 @@
.text
#ifdef USE_MULTIARCH
ENTRY(memcmp_g5)
ENTRY(__memcmp_g5)
#else
ENTRY(memcmp)
#endif
@ -58,7 +58,7 @@ ENTRY(memcmp)
.L_G5_17:
clc 0(1,%r3),0(%r2)
#ifdef USE_MULTIARCH
END(memcmp_g5)
END(__memcmp_g5)
#else
END(memcmp)
libc_hidden_builtin_def (memcmp)

View File

@ -26,7 +26,7 @@
%r4 = number of bytes to copy. */
#ifdef USE_MULTIARCH
ENTRY(memcpy_g5)
ENTRY(__memcpy_g5)
#else
ENTRY(memcpy)
#endif
@ -49,7 +49,7 @@ ENTRY(memcpy)
br %r14
.L_G5_13:
chi %r5,4096 # Switch to mvcle for copies >1MB
jh memcpy_mvcle
jh __memcpy_mvcle
.L_G5_12:
mvc 0(256,%r1),0(%r3)
la %r1,256(%r1)
@ -60,13 +60,13 @@ ENTRY(memcpy)
.L_G5_17:
mvc 0(1,%r1),0(%r3)
#ifdef USE_MULTIARCH
END(memcpy_g5)
END(__memcpy_g5)
#else
END(memcpy)
libc_hidden_builtin_def (memcpy)
#endif
ENTRY(memcpy_mvcle)
ENTRY(__memcpy_mvcle)
# Using as standalone function will result in unexpected
# results since the length field is incremented by 1 in order to
# compensate the changes already done in the functions above.
@ -79,4 +79,4 @@ ENTRY(memcpy_mvcle)
jo .L_MVCLE_1
lr %r2,%r1 # return destination address
br %r14
END(memcpy_mvcle)
END(__memcpy_mvcle)

View File

@ -28,7 +28,7 @@
.text
#ifdef USE_MULTIARCH
ENTRY(memset_g5)
ENTRY(__memset_g5)
#else
ENTRY(memset)
#endif
@ -58,7 +58,7 @@ ENTRY(memset)
.L_G5_20:
mvc 1(1,%r1),0(%r1)
#ifdef USE_MULTIARCH
END(memset_g5)
END(__memset_g5)
#else
END(memset)
libc_hidden_builtin_def (memset)

View File

@ -28,17 +28,17 @@
#define IFUNC_RESOLVE(FUNC) \
asm (".globl " #FUNC "\n\t" \
".type " #FUNC ",@gnu_indirect_function\n\t" \
".set " #FUNC ",resolve_" #FUNC "\n\t" \
".set " #FUNC ",__resolve_" #FUNC "\n\t" \
".globl __GI_" #FUNC "\n\t" \
".set __GI_" #FUNC "," #FUNC "\n"); \
\
/* Make the declarations of the optimized functions hidden in order
to prevent GOT slots being generated for them. */ \
extern void *FUNC##_z196 attribute_hidden; \
extern void *FUNC##_z10 attribute_hidden; \
extern void *FUNC##_g5 attribute_hidden; \
extern void *__##FUNC##_z196 attribute_hidden; \
extern void *__##FUNC##_z10 attribute_hidden; \
extern void *__##FUNC##_g5 attribute_hidden; \
\
void *resolve_##FUNC (unsigned long int dl_hwcap) \
void *__resolve_##FUNC (unsigned long int dl_hwcap) \
{ \
if ((dl_hwcap & HWCAP_S390_STFLE) \
&& (dl_hwcap & HWCAP_S390_ZARCH) \
@ -53,11 +53,11 @@
: : "cc"); \
\
if ((stfle_bits & (1ULL << (63 - STFLE_BITS_Z196))) != 0) \
return &FUNC##_z196; \
return &__##FUNC##_z196; \
else if ((stfle_bits & (1ULL << (63 - STFLE_BITS_Z10))) != 0) \
return &FUNC##_z10; \
return &__##FUNC##_z10; \
} \
return &FUNC##_g5; \
return &__##FUNC##_g5; \
}
IFUNC_RESOLVE(memset)

View File

@ -29,7 +29,7 @@
#if IS_IN (libc)
ENTRY(memcmp_z196)
ENTRY(__memcmp_z196)
.machine "z196"
.machinemode "zarch_nohighgprs"
ltr %r4,%r4
@ -61,9 +61,9 @@ ENTRY(memcmp_z196)
br %r14
.L_Z196_14:
clc 0(1,%r3),0(%r2)
END(memcmp_z196)
END(__memcmp_z196)
ENTRY(memcmp_z10)
ENTRY(__memcmp_z10)
.machine "z10"
.machinemode "zarch_nohighgprs"
ltr %r4,%r4
@ -90,7 +90,7 @@ ENTRY(memcmp_z10)
j .L_Z10_3
.L_Z10_15:
clc 0(1,%r3),0(%r2)
END(memcmp_z10)
END(__memcmp_z10)
#endif
@ -98,7 +98,7 @@ END(memcmp_z10)
#if !IS_IN (libc)
.globl memcmp
.set memcmp,memcmp_g5
.set memcmp,__memcmp_g5
.weak bcmp
.set bcmp,memcmp_g5
.set bcmp,__memcmp_g5
#endif

View File

@ -29,7 +29,7 @@
#if defined SHARED && IS_IN (libc)
ENTRY(memcpy_z196)
ENTRY(__memcpy_z196)
.machine "z196"
.machinemode "zarch_nohighgprs"
llgfr %r4,%r4
@ -46,7 +46,7 @@ ENTRY(memcpy_z196)
br %r14
.L_Z196_5:
cgfi %r5,262144 # Switch to mvcle for copies >64MB
jh memcpy_mvcle
jh __memcpy_mvcle
.L_Z196_2:
pfd 1,768(%r3)
pfd 2,768(%r1)
@ -58,9 +58,9 @@ ENTRY(memcpy_z196)
j .L_Z196_3
.L_Z196_14:
mvc 0(1,%r1),0(%r3)
END(memcpy_z196)
END(__memcpy_z196)
ENTRY(memcpy_z10)
ENTRY(__memcpy_z10)
.machine "z10"
.machinemode "zarch_nohighgprs"
llgfr %r4,%r4
@ -75,7 +75,7 @@ ENTRY(memcpy_z10)
br %r14
.L_Z10_13:
cgfi %r5,65535 # Switch to mvcle for copies >16MB
jh memcpy_mvcle
jh __memcpy_mvcle
.L_Z10_12:
pfd 1,768(%r3)
pfd 2,768(%r1)
@ -86,7 +86,7 @@ ENTRY(memcpy_z10)
j .L_Z10_3
.L_Z10_15:
mvc 0(1,%r1),0(%r3)
END(memcpy_z10)
END(__memcpy_z10)
#endif
@ -94,5 +94,5 @@ END(memcpy_z10)
#if !defined SHARED || !IS_IN (libc)
.globl memcpy
.set memcpy,memcpy_g5
.set memcpy,__memcpy_g5
#endif

View File

@ -29,7 +29,7 @@
#if IS_IN (libc)
ENTRY(memset_z196)
ENTRY(__memset_z196)
.machine "z196"
.machinemode "zarch_nohighgprs"
llgfr %r4,%r4
@ -49,7 +49,7 @@ ENTRY(memset_z196)
br %r14
.L_Z196_1:
cgfi %r5,1048576
jh memset_mvcle # Switch to mvcle for >256MB
jh __memset_mvcle # Switch to mvcle for >256MB
.L_Z196_2:
pfd 2,1024(%r1)
mvc 1(256,%r1),0(%r1)
@ -59,9 +59,9 @@ ENTRY(memset_z196)
j .L_Z196_3
.L_Z196_17:
mvc 1(1,%r1),0(%r1)
END(memset_z196)
END(__memset_z196)
ENTRY(memset_z10)
ENTRY(__memset_z10)
.machine "z10"
.machinemode "zarch_nohighgprs"
llgfr %r4,%r4
@ -78,7 +78,7 @@ ENTRY(memset_z10)
br %r14
.L_Z10_15:
cgfi %r5,163840 # Switch to mvcle for >40MB
jh memset_mvcle
jh __memset_mvcle
.L_Z10_14:
pfd 2,1024(%r1)
mvc 1(256,%r1),0(%r1)
@ -87,9 +87,9 @@ ENTRY(memset_z10)
j .L_Z10_3
.L_Z10_18:
mvc 1(1,%r1),0(%r1)
END(memset_z10)
END(__memset_z10)
ENTRY(memset_mvcle)
ENTRY(__memset_mvcle)
ahi %r4,2 # take back the change done by the caller
lr %r0,%r2 # save source address
lr %r1,%r3 # move pad byte to R1
@ -101,7 +101,7 @@ ENTRY(memset_mvcle)
lr %r2,%r0 # return value is source address
.L1:
br %r14
END(memset_mvcle)
END(__memset_mvcle)
#endif
@ -109,5 +109,5 @@ END(memset_mvcle)
#if !IS_IN (libc)
.globl memset
.set memset,memset_g5
.set memset,__memset_g5
#endif

View File

@ -27,7 +27,7 @@
.text
#ifdef USE_MULTIARCH
ENTRY(memcmp_z900)
ENTRY(__memcmp_z900)
#else
ENTRY(memcmp)
#endif
@ -56,7 +56,7 @@ ENTRY(memcmp)
.L_Z900_15:
clc 0(1,%r3),0(%r2)
#ifdef USE_MULTIARCH
END(memcmp_z900)
END(__memcmp_z900)
#else
END(memcmp)
libc_hidden_builtin_def (memcmp)

View File

@ -29,7 +29,7 @@
.text
#ifdef USE_MULTIARCH
ENTRY(memcpy_z900)
ENTRY(__memcpy_z900)
#else
ENTRY(memcpy)
#endif
@ -48,7 +48,7 @@ ENTRY(memcpy)
br %r14
.L_Z900_13:
chi %r5,4096 # Switch to mvcle for copies >1MB
jh memcpy_mvcle
jh __memcpy_mvcle
.L_Z900_12:
mvc 0(256,%r1),0(%r3)
la %r1,256(%r1)
@ -59,13 +59,13 @@ ENTRY(memcpy)
mvc 0(1,%r1),0(%r3)
#ifdef USE_MULTIARCH
END(memcpy_z900)
END(__memcpy_z900)
#else
END(memcpy)
libc_hidden_builtin_def (memcpy)
#endif
ENTRY(memcpy_mvcle)
ENTRY(__memcpy_mvcle)
# Using as standalone function will result in unexpected
# results since the length field is incremented by 1 in order to
# compensate the changes already done in the functions above.
@ -78,4 +78,4 @@ ENTRY(memcpy_mvcle)
jo .L_MVCLE_1
lgr %r2,%r1 # return destination address
br %r14
END(memcpy_mvcle)
END(__memcpy_mvcle)

View File

@ -29,7 +29,7 @@
.text
#ifdef USE_MULTIARCH
ENTRY(memset_z900)
ENTRY(__memset_z900)
#else
ENTRY(memset)
#endif
@ -57,7 +57,7 @@ ENTRY(memset)
.L_Z900_18:
mvc 1(1,%r1),0(%r1)
#ifdef USE_MULTIARCH
END(memset_z900)
END(__memset_z900)
#else
END(memset)
libc_hidden_builtin_def (memset)

View File

@ -28,17 +28,17 @@
#define IFUNC_RESOLVE(FUNC) \
asm (".globl " #FUNC "\n\t" \
".type " #FUNC ",@gnu_indirect_function\n\t" \
".set " #FUNC ",resolve_" #FUNC "\n\t" \
".set " #FUNC ",__resolve_" #FUNC "\n\t" \
".globl __GI_" #FUNC "\n\t" \
".set __GI_" #FUNC "," #FUNC "\n"); \
\
/* Make the declarations of the optimized functions hidden in order
to prevent GOT slots being generated for them. */ \
extern void *FUNC##_z196 attribute_hidden; \
extern void *FUNC##_z10 attribute_hidden; \
extern void *FUNC##_z900 attribute_hidden; \
extern void *__##FUNC##_z196 attribute_hidden; \
extern void *__##FUNC##_z10 attribute_hidden; \
extern void *__##FUNC##_z900 attribute_hidden; \
\
void *resolve_##FUNC (unsigned long int dl_hwcap) \
void *__resolve_##FUNC (unsigned long int dl_hwcap) \
{ \
if (dl_hwcap & HWCAP_S390_STFLE) \
{ \
@ -54,14 +54,14 @@
: : "cc"); \
\
if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z196))) != 0) \
return &FUNC##_z196; \
return &__##FUNC##_z196; \
else if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z10))) != 0) \
return &FUNC##_z10; \
return &__##FUNC##_z10; \
else \
return &FUNC##_z900; \
return &__##FUNC##_z900; \
} \
else \
return &FUNC##_z900; \
return &__##FUNC##_z900; \
}
IFUNC_RESOLVE(memset)

View File

@ -29,7 +29,7 @@
#if IS_IN (libc)
ENTRY(memcmp_z196)
ENTRY(__memcmp_z196)
.machine "z196"
ltgr %r4,%r4
je .L_Z196_4
@ -60,9 +60,9 @@ ENTRY(memcmp_z196)
br %r14
.L_Z196_14:
clc 0(1,%r3),0(%r2)
END(memcmp_z196)
END(__memcmp_z196)
ENTRY(memcmp_z10)
ENTRY(__memcmp_z10)
.machine "z10"
ltgr %r4,%r4
je .L_Z10_4
@ -87,7 +87,7 @@ ENTRY(memcmp_z10)
j .L_Z10_3
.L_Z10_15:
clc 0(1,%r3),0(%r2)
END(memcmp_z10)
END(__memcmp_z10)
#endif
@ -95,7 +95,7 @@ END(memcmp_z10)
#if !IS_IN (libc)
.globl memcmp
.set memcmp,memcmp_z900
.set memcmp,__memcmp_z900
.weak bcmp
.set bcmp,memcmp_z900
.set bcmp,__memcmp_z900
#endif

View File

@ -29,7 +29,7 @@
#if defined SHARED && IS_IN (libc)
ENTRY(memcpy_z196)
ENTRY(__memcpy_z196)
.machine "z196"
ltgr %r4,%r4
je .L_Z196_4
@ -44,7 +44,7 @@ ENTRY(memcpy_z196)
br %r14
.L_Z196_5:
cgfi %r5,262144 # Switch to mvcle for copies >64MB
jh memcpy_mvcle
jh __memcpy_mvcle
.L_Z196_2:
pfd 1,768(%r3)
pfd 2,768(%r1)
@ -56,9 +56,9 @@ ENTRY(memcpy_z196)
j .L_Z196_3
.L_Z196_14:
mvc 0(1,%r1),0(%r3)
END(memcpy_z196)
END(__memcpy_z196)
ENTRY(memcpy_z10)
ENTRY(__memcpy_z10)
.machine "z10"
cgije %r4,0,.L_Z10_4
aghi %r4,-1
@ -71,7 +71,7 @@ ENTRY(memcpy_z10)
br %r14
.L_Z10_13:
cgfi %r5,65535 # Switch to mvcle for copies >16MB
jh memcpy_mvcle
jh __memcpy_mvcle
.L_Z10_12:
pfd 1,768(%r3)
pfd 2,768(%r1)
@ -82,7 +82,7 @@ ENTRY(memcpy_z10)
j .L_Z10_3
.L_Z10_15:
mvc 0(1,%r1),0(%r3)
END(memcpy_z10)
END(__memcpy_z10)
#endif
@ -90,5 +90,5 @@ END(memcpy_z10)
#if !defined SHARED || !IS_IN (libc)
.globl memcpy
.set memcpy,memcpy_z900
.set memcpy,__memcpy_z900
#endif

View File

@ -29,7 +29,7 @@
#if IS_IN (libc)
ENTRY(memset_z196)
ENTRY(__memset_z196)
.machine "z196"
ltgr %r4,%r4
je .L_Z196_4
@ -47,7 +47,7 @@ ENTRY(memset_z196)
br %r14
.L_Z196_1:
cgfi %r5,1048576
jh memset_mvcle # Switch to mvcle for >256MB
jh __memset_mvcle # Switch to mvcle for >256MB
.L_Z196_2:
pfd 2,1024(%r1)
mvc 1(256,%r1),0(%r1)
@ -57,9 +57,9 @@ ENTRY(memset_z196)
j .L_Z196_3
.L_Z196_17:
mvc 1(1,%r1),0(%r1)
END(memset_z196)
END(__memset_z196)
ENTRY(memset_z10)
ENTRY(__memset_z10)
.machine "z10"
cgije %r4,0,.L_Z10_4
stc %r3,0(%r2)
@ -74,7 +74,7 @@ ENTRY(memset_z10)
br %r14
.L_Z10_15:
cgfi %r5,163840 # Switch to mvcle for >40MB
jh memset_mvcle
jh __memset_mvcle
.L_Z10_14:
pfd 2,1024(%r1)
mvc 1(256,%r1),0(%r1)
@ -83,9 +83,9 @@ ENTRY(memset_z10)
j .L_Z10_3
.L_Z10_18:
mvc 1(1,%r1),0(%r1)
END(memset_z10)
END(__memset_z10)
ENTRY(memset_mvcle)
ENTRY(__memset_mvcle)
aghi %r4,2 # take back the change done by the caller
lgr %r0,%r2 # save source address
lgr %r1,%r3 # move pad byte to R1
@ -97,7 +97,7 @@ ENTRY(memset_mvcle)
lgr %r2,%r0 # return value is source address
.L1:
br %r14
END(memset_mvcle)
END(__memset_mvcle)
#endif
@ -105,5 +105,5 @@ END(memset_mvcle)
#if !IS_IN (libc)
.globl memset
.set memset,memset_z900
.set memset,__memset_z900
#endif