about summary refs log tree commit diff
path: root/sysdeps/s390
Commit message (Collapse)AuthorAgeFilesLines
* S390: Refactor stpcpy ifunc handling.Stefan Liebler2018-12-187-26/+118
| | | | | | | | | | | | | | | | | | | | | | The ifunc handling for stpcpy is adjusted in order to omit ifunc variants if those will never be used as the minimum architecture level already supports newer CPUs by default. Glibc internal calls will then also use the "newer" ifunc variant. ChangeLog: * sysdeps/s390/multiarch/Makefile (sysdep_routines): Remove stpcpy variants. * sysdeps/s390/Makefile (sysdep_routines): Add stpcpy variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Refactor ifunc handling for stpcpy. * sysdeps/s390/multiarch/stpcpy-c.c: Move to ... * sysdeps/s390/stpcpy-c.c: ... here and adjust ifunc handling. * sysdeps/s390/multiarch/stpcpy-vx.S: Move to ... * sysdeps/s390/stpcpy-vx.S: ... here and adjust ifunc handling. * sysdeps/s390/multiarch/stpcpy.c: Move to ... * sysdeps/s390/stpcpy.c: ... here and adjust ifunc handling. * sysdeps/s390/ifunc-stpcpy.h: New file.
* S390: Refactor strcpy ifunc handling.Stefan Liebler2018-12-1810-103/+123
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The ifunc handling for strcpy is adjusted in order to omit ifunc variants if those will never be used as the minimum architecture level already supports newer CPUs by default. Glibc internal calls will then also use the "newer" ifunc variant. Note: The fallback s390-32/s390-64 ifunc variants with mvst instruction are now moved to the unified strcpy-z900.S file which can be used for 31/64bit. The s390-32/s390-64 files multiarch/strcpy.c and strcpy.S are deleted. ChangeLog: * sysdeps/s390/multiarch/Makefile (sysdep_routines): Remove strcpy variants. * sysdeps/s390/Makefile (sysdep_routines): Add strcpy variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Refactor ifunc handling for strcpy. * sysdeps/s390/multiarch/strcpy-vx.S: Move to ... * sysdeps/s390/strcpy-vx.S: ... here and adjust ifunc handling. * sysdeps/s390/multiarch/strcpy.c: Move to ... * sysdeps/s390/strcpy.c: ... here and adjust ifunc handling. * sysdeps/s390/ifunc-strcpy.h: New file. * sysdeps/s390/s390-64/strcpy.S: Move to ... * sysdeps/s390/strcpy-z900.S: ... here and adjust to be usable for 31/64bit and ifunc handling. * sysdeps/s390/s390-32/multiarch/strcpy.c: Delete file. * sysdeps/s390/s390-64/multiarch/strcpy.c: Likewise. * sysdeps/s390/s390-32/strcpy.S: Likewise.
* S390: Refactor strnlen ifunc handling.Stefan Liebler2018-12-187-21/+113
| | | | | | | | | | | | | | | | | | | | | | The ifunc handling for strnlen is adjusted in order to omit ifunc variants if those will never be used as the minimum architecture level already supports newer CPUs by default. Glibc internal calls will then also use the "newer" ifunc variant. ChangeLog: * sysdeps/s390/multiarch/Makefile (sysdep_routines): Remove strnlen variants. * sysdeps/s390/Makefile (sysdep_routines): Add strnlen variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Refactor ifunc handling for strnlen. * sysdeps/s390/multiarch/strnlen-c.c: Move to ... * sysdeps/s390/strnlen-c.c: ... here and adjust ifunc handling. * sysdeps/s390/multiarch/strnlen-vx.S: Move to ... * sysdeps/s390/strnlen-vx.S: ... here and adjust ifunc handling. * sysdeps/s390/multiarch/strnlen.c: Move to ... * sysdeps/s390/strnlen.c: ... here and adjust ifunc handling. * sysdeps/s390/ifunc-strnlen.h: New file.
* S390: Refactor strlen ifunc handling.Stefan Liebler2018-12-187-20/+108
| | | | | | | | | | | | | | | | | | | | | | The ifunc handling for strlen is adjusted in order to omit ifunc variants if those will never be used as the minimum architecture level already supports newer CPUs by default. Glibc internal calls will then also use the "newer" ifunc variant. ChangeLog: * sysdeps/s390/multiarch/Makefile (sysdep_routines): Remove strlen variants. * sysdeps/s390/Makefile (sysdep_routines): Add strlen variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Refactor ifunc handling for strlen. * sysdeps/s390/multiarch/strlen-c.c: Move to ... * sysdeps/s390/strlen-c.c: ... here and adjust ifunc handling. * sysdeps/s390/multiarch/strlen-vx.S: Move to ... * sysdeps/s390/strlen-vx.S: ... here and adjust ifunc handling. * sysdeps/s390/multiarch/strlen.c: Move to ... * sysdeps/s390/strlen.c: ... here and adjust ifunc handling. * sysdeps/s390/ifunc-strlen.h: New file.
* S390: Add z13 memmem ifunc variant.Stefan Liebler2018-12-186-1/+218
| | | | | | | | | | | | | | | | The new vector variant of memmem is using the common code implementation, but instead of calling the default mem* functions, the vector variants are called. ChangeLog: * sysdeps/s390/Makefile (sysdep_routines): Add memmem variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Add ifunc variants for memmem. * sysdeps/s390/ifunc-memmem.h: New file. * sysdeps/s390/memmem.c: Likewise. * sysdeps/s390/memmem-c.c: Likewise. * sysdeps/s390/memmem-vx.c: Likewise.
* S390: Add z13 strstr ifunc variant.Stefan Liebler2018-12-186-1/+191
| | | | | | | | | | | | | | | | The new vector variant of strstr is using the common code implementation, but instead of calling the default str* / mem* functions, the vector variants are called. ChangeLog: * sysdeps/s390/Makefile (sysdep_routines): Add strstr variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Add ifunc variants for strstr. * sysdeps/s390/ifunc-strstr.h: New file. * sysdeps/s390/strstr.c: Likewise. * sysdeps/s390/strstr-c.c: Likewise. * sysdeps/s390/strstr-vx.c: Likewise.
* S390: Add z13 memmove ifunc variant.Stefan Liebler2018-12-186-1/+217
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch introduces a z13 specific ifunc variant for memmove. As the common code implementation, it checks if we can copy from the beginning to the end - with z196 memcpy implementation - or if we have to copy from the end to the beginning. The latter case is done by using vector load/store instructions. If vector instructions are not available, the common-code is used as fallback. Therefore it is implemented in memmove-c with a different name. Furthermore the ifunc logic decides if we need the common-code implementation at all. If vector instructions are supported due to the minimum architecture level set we can skip the common-code ifunc variant. ChangeLog: * sysdeps/s390/Makefile (sysdep_routines): Add memmove-c. * sysdeps/s390/ifunc-memcpy.h (HAVE_MEMMOVE_IFUNC, HAVE_MEMMOVE_IFUNC_AND_VX_SUPPORT, MEMMOVE_DEFAULT, HAVE_MEMMOVE_C, MEMMOVE_C, HAVE_MEMMOVE_Z13, MEMMOVE_Z13): New defines. * sysdeps/s390/memcpy-z900.S: Add z13 memmove implementation. * sysdeps/s390/memmove-c.c: New file. * sysdeps/s390/memmove.c: Likewise. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Add ifunc variants for memmove.
* S390: Add configure check to detect z13 as mininum architecture level set.Stefan Liebler2018-12-182-0/+66
| | | | | | | | | | Add a configure check for z13 in the same way as done for z196. ChangeLog: * config.h.in (HAVE_S390_MIN_Z13_ZARCH_ASM_SUPPORT): New undefine. * sysdeps/s390/configure.ac: Add check for z13 support. * sysdeps/s390/configure: Regenerated.
* S390: Use memcpy for forward cases in memmove.Stefan Liebler2018-12-181-0/+23
| | | | | | | | | | The s390/s390x memcpy implementations are safe to be used by memmove. Starting with this commit, memmove is using memcpy for the forward cases on s390. ChangeLog: * sysdeps/s390/memcopy.h: New file.
* S390: Remove s390 specific implementation of bcopy.Stefan Liebler2018-12-182-156/+0
| | | | | | | | | | | | | | | | | Nowadays gcc is automatically replacing a call to bcopy with a call to memmove. Thus only old binaries will call the s390 specific bcopy implementation. The s390 specific implementation is using an own implementation for memcpy in the forward case and is relying on memmove in the backward case. After removing the s390 specific bcopy, the common code bcopy is used. It just performs a tail call to memmove. ChangeLog: * sysdeps/s390/s390-32/bcopy.S: Remove. * sysdeps/s390/s390-64/bcopy.S: Likewise.
* S390: Refactor memcpy/mempcpy ifunc handling.Stefan Liebler2018-12-189-195/+265
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch moves all ifunc variants for memcpy/mempcpy to sysdeps/s390/memcpy-z900.S. The configure-check/preprocessor logic in sysdeps/s390/ifunc-memcpy.h decides if ifunc is needed at all and which ifunc variants should be available. E.g. if the compiler/assembler already supports z196 by default, the older ifunc variants are not included. If we only need the newest ifunc variant, then we can skip ifunc at all. Therefore the ifunc-resolvers and __libc_ifunc_impl_list are adjusted in order to handle only the available ifunc variants. ChangeLog: * sysdeps/s390/ifunc-memcpy.h: New File. * sysdeps/s390/memcpy.S: Move to ... * sysdeps/s390/memcpy-z900.S ... here. Move implementations from memcpy-s390x.s to here. * sysdeps/s390/multiarch/memcpy-s390x.S: Delete File. * sysdeps/s390/multiarch/Makefile (sysdep_routines): Remove memcpy/mempcpy variants. * sysdeps/s390/Makefile (sysdep_routines): Add memcpy/mempcpy variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Adjust ifunc variants for memcpy and mempcpy. * sysdeps/s390/multiarch/memcpy.c: Move ifunc resolver to ... * sysdeps/s390/memcpy.c: ... here. Adjust ifunc variants for memcpy. * sysdeps/s390/multiarch/mempcpy.c: Move to ... * sysdeps/s390/mempcpy.c: ... here. Adjust ifunc variants for mempcpy. * sysdeps/s390/mempcpy.S: Delete file.
* S390: Unify 31/64bit memcpy.Stefan Liebler2018-12-189-281/+81
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The implementation of memcpy/mempcpy for s390-32 (31bit) and s390-64 (64bit) is nearly the same. This patch unifies it for maintability reasons. __mem[p]cpy_z10 and __mem[p]cpy_z196 differs between 31 and 64bit: -31bit needs .machinemode "zarch_nohighgprs" and llgfr %r4,%r4 -lr vs lgr; lgr can be also used on 31bit as this ifunc variant is only called if we are on a zarch machine. __mem[p]cpy_default differs between 31 and 64bit: -Some 31bit vs 64bit instructions (e.g. ltr vs ltgr. Solved with 31/64 specific instruction macros). -The address of mvc instruction is setup in different ways (larl vs bras). Solved with #if defined __s390x__. __memcpy_mvcle differs between 31 and 64bit: -lr vs lgr; ahi vs aghi; Solved with 31/64bit specific instruction macros. Otherwise 31/64bit implementation has the same structure of the code. ChangeLog: * sysdeps/s390/s390-64/memcpy.S: Move to ... * sysdeps/s390/memcpy.S: ... here. Adjust to be usable for 31/64bit. * sysdeps/s390/s390-32/memcpy.S: Delete File. * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add memcpy. * sysdeps/s390/s390-32/multiarch/Makefile: Delete file. * sysdeps/s390/s390-64/multiarch/Makefile: Likewise. * sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: Move to ... * sysdeps/s390/multiarch/memcpy-s390x.S: ... here. Adjust to be usable for 31/64bit. * sysdeps/s390/s390-32/multiarch/memcpy-s390.S: Delete File. * sysdeps/s390/s390-64/multiarch/memcpy.c: Move to ... * sysdeps/s390/multiarch/memcpy.c: ... here. * sysdeps/s390/s390-32/multiarch/memcpy.c: Delete File.
* S390: Refactor memcmp ifunc handling.Stefan Liebler2018-12-187-148/+204
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch moves all ifunc variants for memcmp to sysdeps/s390/memcmp-z900.S. The configure-check/preprocessor logic in sysdeps/s390/ifunc-memcmp.h decides if ifunc is needed at all and which ifunc variants should be available. E.g. if the compiler/assembler already supports z196 by default, the older ifunc variants are not included. If we only need the newest ifunc variant, then we can skip ifunc at all. Therefore the ifunc-resolvers and __libc_ifunc_impl_list are adjusted in order to handle only the available ifunc variants. ChangeLog: * sysdeps/s390/ifunc-memcmp.h: New File. * sysdeps/s390/memcmp.S: Move to ... * sysdeps/s390/memcmp-z900.S ... here. Move implementations from memcmp-s390x.s to here. * sysdeps/s390/multiarch/memcmp-s390x.S: Delete File. * sysdeps/s390/multiarch/Makefile (sysdep_routines): Remove memcmp variants. * sysdeps/s390/Makefile (sysdep_routines): Add memcmp variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Adjust ifunc variants for memcmp. * sysdeps/s390/multiarch/memcmp.c: Move ifunc resolver to ... * sysdeps/s390/memcmp.c: ... here. Adjust ifunc variants for memcmp.
* S390: Unify 31/64bit memcmp.Stefan Liebler2018-12-189-219/+60
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The implementation of memcmp for s390-32 (31bit) and s390-64 (64bit) is nearly the same. This patch unifies it for maintability reasons. __memcmp_z10 and __memcmp_z196 differs between 31 and 64bit: -31bit needs .machinemode "zarch_nohighgprs" and llgfr %r4,%r4 -lr vs lgr and some other instructions: But lgr and co can be also used on 31bit as this ifunc variant is only called if we are on a zarch machine. __memcmp_default differs between 31 and 64bit: -Some 31bit vs 64bit instructions (e.g. ltr vs ltgr. Solved with 31/64 specific instruction macros). -The address of mvc instruction is setup in different ways (larl vs bras). Solved with #if defined __s390x__. Otherwise 31/64bit implementation has the same structure of the code. ChangeLog: * sysdeps/s390/s390-64/memcmp.S: Move to ... * sysdeps/s390/memcmp.S: ... here. Adjust to be usable for 31/64bit. * sysdeps/s390/s390-32/memcmp.S: Delete File. * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add memcmp. * sysdeps/s390/s390-32/multiarch/Makefile (sysdep_routines): Remove memcmp. * sysdeps/s390/s390-64/multiarch/Makefile: Likewise. * sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: Move to ... * sysdeps/s390/multiarch/memcmp-s390x.S: ... here. Adjust to be usable for 31/64bit. * sysdeps/s390/s390-32/multiarch/memcmp-s390.S: Delete File. * sysdeps/s390/s390-64/multiarch/memcmp.c: Move to ... * sysdeps/s390/multiarch/memcmp.c: ... here. * sysdeps/s390/s390-32/multiarch/memcmp.c: Delete File.
* S390: Implement bzero with memset.Stefan Liebler2018-12-186-68/+89
| | | | | | | | | | | | | | | | | This patch removes the bzero s390 implementation with mvcle and adds entry points for bzero in memset ifunc variants. Therefore an ifunc resolver is implemented for bzero, too. ChangeLog: * sysdeps/s390/s390-32/bzero.S: Delete file. * sysdeps/s390/s390-64/bzero.S: Likewise. * sysdeps/s390/Makefile (sysdep_routines): Add bzero. * sysdeps/s390/bzero.c: New file. * sysdeps/s390/memset-z900.S: Add bzero entry points. * sysdeps/s390/ifunc-memset.h: Add bzero function macros. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Add bzero ifunc variants.
* S390: Refactor memset ifunc handling.Stefan Liebler2018-12-187-146/+215
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch moves all ifunc variants for memset to sysdeps/s390/memset-z900.S. The configure-check/preprocessor logic in sysdeps/s390/ifunc-memset.h decides if ifunc is needed at all and which ifunc variants should be available. E.g. if the compiler/assembler already supports z196 by default, the older ifunc variants are not included. If we only need the newest ifunc variant, then we can skip ifunc at all. Therefore the ifunc-resolvers and __libc_ifunc_impl_list are adjusted in order to handle only the available ifunc variants. ChangeLog: * sysdeps/s390/ifunc-memset.h: New File. * sysdeps/s390/memset.S: Move to ... * sysdeps/s390/memset-z900.S ... here. Move implementations from memset-s390x.s to here. * sysdeps/s390/multiarch/memset-s390x.S: Delete File. * sysdeps/s390/multiarch/Makefile (sysdep_routines): Remove memset variants. * sysdeps/s390/Makefile (sysdep_routines): Add memset variants. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Adjust ifunc variants for memset. * sysdeps/s390/multiarch/memset.c: Move ifunc resolver to ... * sysdeps/s390/memset.c: ... here. Adjust ifunc variants for memset.
* S390: Unify 31/64bit memset.Stefan Liebler2018-12-189-230/+63
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The implementation of memset for s390-32 (31bit) and s390-64 (64bit) is nearly the same. This patch unifies it for maintability reasons. __memset_z10 and __memset_z196 differs between 31 and 64bit: -31bit needs .machinemode "zarch_nohighgprs" and llgfr %r4,%r4 -lr vs lgr and some other instructions: But lgr and co can be also used on 31bit as this ifunc variant is only called if we are on a zarch machine. __memset_default differs between 31 and 64bit: -Some 31bit vs 64bit instructions (e.g. ltr vs ltgr. Solved with 31/64 specific instruction macros). -The address of mvc instruction is setup in different ways (larl vs bras). Solved with #if defined __s390x__. Otherwise 31/64bit implementation has the same structure of the code. ChangeLog: * sysdeps/s390/s390-64/memset.S: Move to ... * sysdeps/s390/memset.S: ... here. Adjust to be usable for 31/64bit. * sysdeps/s390/s390-32/memset.S: Delete File. * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add memset. * sysdeps/s390/s390-32/multiarch/Makefile (sysdep_routines): Remove memset. * sysdeps/s390/s390-64/multiarch/Makefile: Likewise. * sysdeps/s390/s390-64/multiarch/memset-s390x.S: Move to ... * sysdeps/s390/multiarch/memset-s390x.S: ... here. Adjust to be usable for 31/64bit. * sysdeps/s390/s390-32/multiarch/memset-s390.S: Delete File. * sysdeps/s390/s390-64/multiarch/memset.c: Move to ... * sysdeps/s390/multiarch/memset.c: ... here. * sysdeps/s390/s390-32/multiarch/memset.c: Delete File.
* S390: Use hwcap instead of dl_hwcap in ifunc-resolvers.Stefan Liebler2018-12-181-6/+6
| | | | | | | | | | | | | | | The renaming of hwcap arguments in ifunc-resolvers is needed in order to prepare for further commits which refactors ifunc handling for memset, memcmp, and memcpy. Now you are able to use s390_libc_ifunc_init which stores the stfle bits within the expression for an ifunc-resolver generated by s390_libc_ifunc_expr. ChangeLog: * sysdeps/s390/multiarch/ifunc-resolve.h (s390_libc_ifunc_init, s390_libc_ifunc, s390_vx_libc_ifunc2_redirected): Use hwcap instead of dl_hwcap.
* S390: Add configure check to detect z10 as mininum architecture level set.Stefan Liebler2018-12-182-0/+68
| | | | | | | | | | Add a configure check for z10 in the same way as done for z196. ChangeLog: * config.h.in (HAVE_S390_MIN_Z10_ZARCH_ASM_SUPPORT): New undefine. * sysdeps/s390/configure.ac: Add check for z10 support. * sysdeps/s390/configure: Regenerated.
* S390: Regenerate ULPs.Stefan Liebler2018-11-281-12/+8
| | | | | | | | | Regenerated ulps from scratch as builds with gcc 5.5 / 6.4 resulted in +1 ulps. ChangeLog: * sysdeps/s390/fpu/libm-test-ulps: Regenerated.
* S390: Regenerate ULPs.Stefan Liebler2018-09-061-68/+64
| | | | | | | | Regenerated ulps from scratch after recent changes. ChangeLog: * sysdeps/s390/fpu/libm-test-ulps: Regenerated.
* [BZ #20271] Add newlines in __libc_fatal calls.Paul Pluzhnikov2018-08-311-1/+1
|
* math: Regenerate s390 ulpsFlorian Weimer2018-08-171-0/+18
| | | | | Based on results on a s390x 2964 machine, with -march=z196 and -mtune=zEC12, and separately with -march=z13 and -mtune=z14.
* S390: Fix unwind in 32-bit _mcountIlya Leoshkevich2018-08-101-2/+6
| | | | | | | | | | * Fix CFI offset for %r14. * Fix unwound value of %r15 being off by 128 bytes. ChangeLog: * sysdeps/s390/s390-32/s390-mcount.S (_mcount): Fix unwind.
* S390: Implement 64-bit __fentry__Ilya Leoshkevich2018-08-103-57/+124
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Since __fentry__ is almost the same as _mcount, reuse the code by #including it twice with different #defines around. * Remove LA usages - they are needed in 31-bit mode to clear the top bit, but in 64-bit they appear to do nothing. * Add CFI rule for the nonstandard return register. This rule applies to the current function (binutils generates a new CIE - see gas/dw2gencfi.c:select_cie_for_fde()), so it is not necessary to put __fentry__ into a new file. * Fix CFI offset for %r14. * Add CFI rule for %r0. * Fix unwound value of %r15 being off by 244 bytes. * Unwinding in __fentry__@plt does not work, no plan to fix it - it would require asking linker to generate CFI for return address in %r0. From functional perspective keeping it broken is fine, since the callee did not have a chance to do anything yet. From convenience perspective it would be possible to enhance GDB in the future to treat __fentry__@plt in a special way. * Fix whitespace. * Fix offsets in comments, which were copied from 32-bit code. * 32-bit version will not be implemented, since it's not compatible with the corresponding PLT stubs: they assume %r12 points to GOT, which is not the case for gcc-emitted __fentry__ stub, which runs before the prolog. This patch adds the runtime support in glibc for the -mfentry gcc feature introduced in [1] and [2]. [1] https://gcc.gnu.org/ml/gcc-patches/2018-07/msg00784.html [2] https://gcc.gnu.org/ml/gcc-patches/2018-07/msg00912.html ChangeLog: * sysdeps/s390/s390-64/Versions (__fentry__): Add. * sysdeps/s390/s390-64/s390x-mcount.S: Move the common code to s390x-mcount.h and #include it. * sysdeps/s390/s390-64/s390x-mcount.h: New file. * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist (__fentry__): Add.
* S390: Test that lazy binding does not clobber R0Ilya Leoshkevich2018-08-107-0/+220
| | | | | | | | | | | | | | | | | | | | | | The following combinations need to be tested: * 32- (g5, esa and zarch) and 64-bit * linux32 glibc/configure CC='gcc -m31 -march=g5' * linux32 glibc/configure CC='gcc -m31' * linux32 glibc/configure CC='gcc -m31 -mzarch' * With and without VX: * glibc/configure libc_cv_asm_s390_vx=no * With and without profiling (using LD_PROFILE) * With and without pltexit (using LD_AUDIT) ChangeLog: * sysdeps/s390/Makefile: Register the new tests. * sysdeps/s390/tst-dl-runtime-mod.S: New file. * sysdeps/s390/tst-dl-runtime-profile-audit.c: New file. * sysdeps/s390/tst-dl-runtime-profile-noaudit.c: New file. * sysdeps/s390/tst-dl-runtime-resolve-audit.c: New file. * sysdeps/s390/tst-dl-runtime-resolve-noaudit.c: New file. * sysdeps/s390/tst-dl-runtime.c: New file.
* S390: Do not clobber R0 in 64-bit _dl_runtime_profileIlya Leoshkevich2018-08-101-0/+6
| | | | | | | | | Preparation for the usage of R0 by __fentry__. ChangeLog: * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile): Do not clobber R0.
* S390: Do not clobber R0 in 64-bit _dl_runtime_resolveIlya Leoshkevich2018-08-101-2/+8
| | | | | | | | | Preparation for the usage of R0 by __fentry__. ChangeLog: * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_resolve): Do not clobber R0.
* S390: Do not clobber R0 in 32-bit _dl_runtime_profileIlya Leoshkevich2018-08-101-0/+6
| | | | | | | | | Preparation for the usage of R0 by __fentry__. ChangeLog: * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_profile): Do not clobber R0.
* S390: Do not clobber R0 in 32-bit _dl_runtime_resolveIlya Leoshkevich2018-08-101-2/+8
| | | | | | | | | Preparation for the usage of R0 by __fentry__. ChangeLog: * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_resolve): Do not clobber R0.
* S390: Use symbolic offsets for stack variables in 64-bit _dl_runtime_profileIlya Leoshkevich2018-08-101-84/+143
| | | | | | | | | Maintainability improvement. ChangeLog: * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile): Use symbolic offsets for stack variables.
* S390: Use symbolic offsets for stack variables in 64-bit _dl_runtime_resolveIlya Leoshkevich2018-08-101-41/+83
| | | | | | | | | Maintainability improvement. ChangeLog: * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_resolve): Use symbolic offsets for stack variables.
* S390: Use symbolic offsets for stack variables in 32-bit _dl_runtime_profileIlya Leoshkevich2018-08-101-78/+135
| | | | | | | | | Maintainability improvement. ChangeLog: * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_profile): Use symbolic offsets for stack variables.
* S390: Use symbolic offsets for stack variables in 32-bit _dl_runtime_resolveIlya Leoshkevich2018-08-101-36/+73
| | | | | | | | | Maintainability improvement. ChangeLog: * sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_resolve): Use symbolic offsets for stack variables.
* Mark _init and _fini as hidden [BZ #23145]H.J. Lu2018-06-082-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | _init and _fini are special functions provided by glibc for linker to define DT_INIT and DT_FINI in executable and shared library. They should never be put in dynamic symbol table. This patch marks them as hidden to remove them from dynamic symbol table. Tested with build-many-glibcs.py. [BZ #23145] * elf/Makefile (tests-special): Add $(objpfx)check-initfini.out. ($(all-built-dso:=.dynsym): New target. (common-generated): Add $(all-built-dso:$(common-objpfx)%=%.dynsym). ($(objpfx)check-initfini.out): New target. (generated): Add check-initfini.out. * scripts/check-initfini.awk: New file. * sysdeps/aarch64/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/alpha/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/arm/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/hppa/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/i386/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/ia64/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/m68k/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/microblaze/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/mips/mips32/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/mips/mips64/n32/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/mips/mips64/n64/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/nios2/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/powerpc/powerpc32/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/powerpc/powerpc64/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/s390/s390-32/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/s390/s390-64/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/sh/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/sparc/crti.S (_init): Mark as hidden. (_fini): Likewise. * sysdeps/x86_64/crti.S (_init): Mark as hidden. (_fini): Likewise.
* nptl: Remove __ASSUME_PRIVATE_FUTEXH.J. Lu2018-05-171-4/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since __ASSUME_PRIVATE_FUTEX is always defined, this patch removes the !__ASSUME_PRIVATE_FUTEX paths. Tested with build-many-glibcs.py. * nptl/allocatestack.c (allocate_stack): Remove the !__ASSUME_PRIVATE_FUTEX paths. * nptl/descr.h (header): Remove the !__ASSUME_PRIVATE_FUTEX path. * nptl/nptl-init.c (__pthread_initialize_minimal_internal): Likewise. * sysdeps/i386/nptl/tcb-offsets.sym (PRIVATE_FUTEX): Removed. * sysdeps/powerpc/nptl/tcb-offsets.sym (PRIVATE_FUTEX): Likewise. * sysdeps/sh/nptl/tcb-offsets.sym (PRIVATE_FUTEX): Likewise. * sysdeps/x86_64/nptl/tcb-offsets.sym (PRIVATE_FUTEX): Likewise. * sysdeps/i386/nptl/tls.h: (tcbhead_t): Remve the !__ASSUME_PRIVATE_FUTEX path. * sysdeps/s390/nptl/tls.h (tcbhead_t): Likewise. * sysdeps/sparc/nptl/tls.h (tcbhead_t): Likewise. * sysdeps/x86_64/nptl/tls.h (tcbhead_t): Likewise. * sysdeps/unix/sysv/linux/i386/lowlevellock.S: Remove the !__ASSUME_PRIVATE_FUTEX macros. * sysdeps/unix/sysv/linux/lowlevellock-futex.h: Likewise. * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_PRIVATE_FUTEX): Removed.
* S390: Regenerate ULPs.Stefan Liebler2018-04-051-0/+6
| | | | | | | | | | Updated ulps after recent commit "[PATCH 1/7] sin/cos slow paths: avoid slow paths for small inputs" (19a8b9a300f2f1f0012aff0f2b70b09430f50d9e). ChangeLog: * sysdeps/s390/fpu/libm-test-ulps: Regenerated.
* Revert "hurd: Avoid PLTs for longjmp & siglongjmp"Samuel Thibault2018-04-051-2/+0
| | | | This reverts commit e5f9508a32426b7c3948dc741d84355071ed9539.
* hurd: Avoid PLTs for longjmp & siglongjmpSamuel Thibault2018-04-041-0/+2
| | | | | | * include/setjmp.h (longjmp, siglongjmp): Add hidden protos. * setjmp/longjmp.c (longjmp, siglongjmp): Add hidden defs. * sysdeps/s390/longjmp.c (longjmp, siglongjmp): Add hidden defs.
* elf: Unify symbol address run-time calculation [BZ #19818]Maciej W. Rozycki2018-04-042-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Wrap symbol address run-time calculation into a macro and use it throughout, replacing inline calculations. There are a couple of variants, most of them different in a functionally insignificant way. Most calculations are right following RESOLVE_MAP, at which point either the map or the symbol returned can be checked for validity as the macro sets either both or neither. In some places both the symbol and the map has to be checked however. My initial implementation therefore always checked both, however that resulted in code larger by as much as 0.3%, as many places know from elsewhere that no check is needed. I have decided the size growth was unacceptable. Having looked closer I realized that it's the map that is the culprit. Therefore I have modified LOOKUP_VALUE_ADDRESS to accept an additional boolean argument telling it to access the map without checking it for validity. This in turn has brought quite nice results, with new code actually being smaller for i686, and MIPS o32, n32 and little-endian n64 targets, unchanged in size for x86-64 and, unusually, marginally larger for big-endian MIPS n64, as follows: i686: text data bss dec hex filename 152255 4052 192 156499 26353 ld-2.27.9000-base.so 152159 4052 192 156403 262f3 ld-2.27.9000-elf-symbol-value.so MIPS/o32/el: text data bss dec hex filename 142906 4396 260 147562 2406a ld-2.27.9000-base.so 142890 4396 260 147546 2405a ld-2.27.9000-elf-symbol-value.so MIPS/n32/el: text data bss dec hex filename 142267 4404 260 146931 23df3 ld-2.27.9000-base.so 142171 4404 260 146835 23d93 ld-2.27.9000-elf-symbol-value.so MIPS/n64/el: text data bss dec hex filename 149835 7376 408 157619 267b3 ld-2.27.9000-base.so 149787 7376 408 157571 26783 ld-2.27.9000-elf-symbol-value.so MIPS/o32/eb: text data bss dec hex filename 142870 4396 260 147526 24046 ld-2.27.9000-base.so 142854 4396 260 147510 24036 ld-2.27.9000-elf-symbol-value.so MIPS/n32/eb: text data bss dec hex filename 142019 4404 260 146683 23cfb ld-2.27.9000-base.so 141923 4404 260 146587 23c9b ld-2.27.9000-elf-symbol-value.so MIPS/n64/eb: text data bss dec hex filename 149763 7376 408 157547 2676b ld-2.27.9000-base.so 149779 7376 408 157563 2677b ld-2.27.9000-elf-symbol-value.so x86-64: text data bss dec hex filename 148462 6452 400 155314 25eb2 ld-2.27.9000-base.so 148462 6452 400 155314 25eb2 ld-2.27.9000-elf-symbol-value.so [BZ #19818] * sysdeps/generic/ldsodefs.h (LOOKUP_VALUE_ADDRESS): Add `set' parameter. (SYMBOL_ADDRESS): New macro. [!ELF_FUNCTION_PTR_IS_SPECIAL] (DL_SYMBOL_ADDRESS): Use SYMBOL_ADDRESS for symbol address calculation. * elf/dl-runtime.c (_dl_fixup): Likewise. (_dl_profile_fixup): Likewise. * elf/dl-symaddr.c (_dl_symbol_address): Likewise. * elf/rtld.c (dl_main): Likewise. * sysdeps/aarch64/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/alpha/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/arm/dl-machine.h (elf_machine_rel): Likewise. (elf_machine_rela): Likewise. * sysdeps/hppa/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/hppa/dl-symaddr.c (_dl_symbol_address): Likewise. * sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise. (elf_machine_rela): Likewise. * sysdeps/ia64/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/m68k/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/microblaze/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/mips/dl-machine.h (ELF_MACHINE_BEFORE_RTLD_RELOC): Likewise. (elf_machine_reloc): Likewise. (elf_machine_got_rel): Likewise. * sysdeps/mips/dl-trampoline.c (__dl_runtime_resolve): Likewise. * sysdeps/nios2/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/riscv/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/s390/s390-32/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/s390/s390-64/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/tile/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* Revert "s390x: Fix hidden aliases"Samuel Thibault2018-04-031-2/+0
| | | | This reverts commit 811836a411a1c97a0e70e7f096e57f316dc19c72.
* s390x: Fix hidden aliasesSamuel Thibault2018-04-031-0/+2
| | | | | * sysdeps/s390/longjmp.c (__libc_longjmp, __libc_siglongjmp): New hidden defs.
* Remove all target specific __ieee754_sqrt(f/l) inlinesWilco Dijkstra2018-03-151-66/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Remove the now unused target specific__ieee754_sqrt(f/l) inlines. Also remove inlines of sqrt which are for really old GCC versions. Removing these is desirable, under the general principle of leaving such inlining to the compiler rather than trying to do it in installed headers, especially when only very old compilers are affected. Note that removing inlines for __ieee754_sqrt disables inlining in the sqrt wrapper functions. Given the sqrt function will typically only be called for negative arguments, it doesn't matter whether the inlining happens or not. * sysdeps/aarch64/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. * sysdeps/alpha/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. * sysdeps/generic/math-type-macros.h (M_SQRT): Use sqrt. * sysdeps/m68k/m680x0/fpu/mathimpl.h (__ieee754_sqrt): Remove. * sysdeps/powerpc/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. * sysdeps/s390/fpu/bits/mathinline.h: Remove file. * sysdeps/sparc/fpu/bits/mathinline.h (sqrt) Remove. (sqrtf): Remove. (sqrtl): Remove. (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. (__ieee754_sqrtl): Remove. * sysdeps/m68k/m680x0/fpu/mathimpl.h (__ieee754_sqrt): Remove. * sysdeps/x86/fpu/math_private.h (__ieee754_sqrt): Remove. * sysdeps/x86_64/fpu/math_private.h (__ieee754_sqrt): Remove. (__ieee754_sqrtf): Remove. (__ieee754_sqrtl): Remove.
* hurd: add gscope supportSamuel Thibault2018-03-111-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * elf/dl-support.c [!THREAD_GSCOPE_IN_TCB] (_dl_thread_gscope_count): Define variable. * sysdeps/generic/ldsodefs.h [!THREAD_GSCOPE_IN_TCB] (struct rtld_global): Add _dl_thread_gscope_count member. * sysdeps/mach/hurd/tls.h: Include <atomic.h>. [!defined __ASSEMBLER__] (THREAD_GSCOPE_GLOBAL, THREAD_GSCOPE_SET_FLAG, THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_WAIT): Define macros. * sysdeps/generic/tls.h: Document THREAD_GSCOPE_IN_TCB. * sysdeps/aarch64/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/alpha/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/arm/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/hppa/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/i386/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/ia64/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/m68k/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/microblaze/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/mips/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/nios2/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/powerpc/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/riscv/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/s390/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/sh/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/sparc/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/tile/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/x86_64/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1.
* Remove hidden __libc_longjmpH.J. Lu2018-03-101-1/+0
| | | | | | | | | | | | | Since __libc_longjmp is a private interface for cancellation implementation in libpthread, there is no need to provide hidden __libc_longjmp in libc. Tested with build-many-glibcs.py. * include/setjmp.h (__libc_longjmp): Remove libc_hidden_proto. * setjmp/longjmp.c (__libc_longjmp): Remove libc_hidden_def. * sysdeps/s390/longjmp.c (__libc_longjmp): Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S (__libc_longjmp): Likewise.
* Fix s390 -Os iconv build.Joseph Myers2018-03-051-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Building glibc for s390 with -Os (32-bit only, with GCC 7) fails with: In file included from ../sysdeps/s390/multiarch/8bit-generic.c:370:0, from ebcdic-at-de.c:28: ../iconv/loop.c: In function '__to_generic_vx': ../iconv/loop.c:264:22: error: 'ch' may be used uninitialized in this function [-Werror=maybe-uninitialized] if (((Character) >> 7) == (0xe0000 >> 7)) \ ^~ In file included from ebcdic-at-de.c:28:0: ../sysdeps/s390/multiarch/8bit-generic.c:340:15: note: 'ch' was declared here uint32_t ch; \ ^ ../iconv/loop.c:325:7: note: in expansion of macro 'BODY' BODY ^~~~ It's fairly easy to see, looking at the (long) expansion of the BODY macro, that this is a false positive and the relevant variable 'ch' is always initialized before use, in one of two possible places. As such, disabling the warning for -Os with the DIAG_* macros is the natural approach to fix this build failure. However, because of the location at which the warning is reported, the disabling needs to go in iconv/loop.c, around the definition of UNICODE_TAG_HANDLER (not inside the definition), as that macro definition is where the uninitialized use is reported, whereas the code that needs to be reasoned about to see that the warning is a false positive is in the definition of BODY elsewhere. Thus, the patch adds such disabling in iconv/loop.c, with a comment pointing to the s390-specific code and a comment in the s390-specific code pointing to the generic file to alert people to the possible need to update one place when changing the other. It would be possible if desired to use #ifdef __s390__ around the disabling, though in general we try to avoid that sort of thing in generic files. (Or some extremely specialized macros for "disable -Wmaybe-uninitialized in this particular place" could be specified, defined to 0 in a lot of different files that include iconv/loop.c and to 1 in that particular s390 file.) Tested that this fixed -Os compilation for s390-linux-gnu with build-many-glibcs.py. * iconv/loop.c (UNICODE_TAG_HANDLER): Disable -Wmaybe-uninitialized for -Os. * sysdeps/s390/multiarch/8bit-generic.c (BODY): Add comment about this disabling.
* S390: Regenerate ULPs.Stefan Liebler2018-02-221-6/+6
| | | | | | | | | | After regenerating ULPs from scratch in commit 8e7196c8759287a3e4c882e3c7cf32ddc322df8a, I've missed to test it with multiple gcc versions. Hence, here is a further update. ChangeLog: * sysdeps/s390/fpu/libm-test-ulps: Regenerated.
* S390: Regenerate ULPs.Stefan Liebler2018-02-151-68/+20
| | | | | | | | Regenerated ulps file from scratch due to recent pow changes. ChangeLog: * sysdeps/s390/fpu/libm-test-ulps: Regenerated.
* Unify and simplify bits/byteswap.h, bits/byteswap-16.h headers (bug 14508, ↵Joseph Myers2018-02-062-199/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | bug 15512, bug 17082, bug 20530). We have a general principle of preferring optimizations for library facilities to use compiler built-in functions rather than being located in library headers, where the compiler can reasonably optimize code without needing to know glibc implementation details. This patch applies this principle to bits/byteswap.h, eliminating all the architecture-specific variants and bits/byteswap-16.h. The __bswap_16, __bswap_32 and __bswap_64 interfaces all become inline functions, never macros, using the GCC built-in functions where available and otherwise a single architecture-independent definition using shifts and masking (which compilers may well be able to detect and optimize; GCC has detection of various byte-swapping idioms). The __bswap_constant_32 macro needs to stay around because of uses in static initializers within glibc and its tests, and so for consistency all __bswap_constant_* are kept rather than just being inlined into the old-GCC-or-non-GCC parts of the __bswap_* inline function definitions. Various open bugs are addressed by this cleanup, with caveats about exactly what is covered by those bugs and when the bugs applied at all. Bug 14508 reports -Wformat warnings building glibc because __bswap_* sometimes returned the wrong types. Obviously we already don't have such warnings any more or the build would be failing, given -Werror, and I suspect that bug was originally for wrong types for x86_64, as fixed by commit d394eb742a3565d7fe7a4b02710a60b5f219ee64 (glibc 2.17). The only case I saw removed by this patch where the types would still have been wrong was the non-__GNUC__ case of __bswap_64 in the s390 header (using unsigned long long int, but uint64_t would be unsigned long int for 64-bit). In any case, the single header consistently uses __uintN_t types after this patch, thereby eliminating all such bugs. The existing string/test-endian-types.c test already suffices to verify that the types are correct with the compiler used to build glibc and its tests. Bug 15512 reports an error from __bswap_constant_16 with -Werror -Wsign-conversion. I am unable to reproduce this with any GCC version supporting -Wsign-conversion - all seem to be able to avoid warning for ((x) >> 8) & 0xffu, where x is uint16_t, which while it formally does involve an implicit conversion from int to unsigned int, is also a case where it should be easy for the compiler to see that the value converted is never negative. But in this patch __bswap_constant_16 is changed to use signed 0xff so that no such implicit conversion occurs at all, and a test with -Werror -Wsign-conversion is added. Bug 17082 objects to the use of ({}) statement expressions in these macros preventing use at file scope (in C, that's in sizeof etc.; in C++, more generally in static initializers). The particular case of these interfaces is fixed by this patch as it changes them to inline functions, eliminating all uses of ({}) in bits/byteswap.h, and a corresponding testcase is added. The bug tries to raise a more general policy question about use of ({}) in macros in installed headers, referring to "many other libc functions" (unspecified which functions are being considered). Since such policy questions belong on libc-alpha, and since there *are* macros in installed headers which can't really avoid using ({}) (where they are type-generic, so can't use an inline function, but need a temporary variable, and a few where the interface involves returning memory from alloca so can't use an inline function either), I propose to consider that bug fixed with this change. That is without prejudice to any other new bugs anyone wishes to file *for precisely defined sets of macros* requesting moving away from ({}) *where it is clearly possible for those interfaces*. Where ({}) can be avoided, typically by use of an inline function, I think that's a good idea - that inline functions are typically to be preferred to ({}) for header interfaces where such optimizations are useful but the interface is suited to being defined using an inline function. Bug 20530 requests use of __builtin_bswap16 when available (GCC 4.8 and later), which this patch implements. Tested for x86_64, and with build-many-glibcs.py. Also did an x86_64 test with the __GNUC_PREREQ conditionals changed to "#if 0" to verify the old-GCC/non-GCC case in the headers. (There are already existing tests for correctness of results of these interfaces.) [BZ #14508] [BZ #15512] [BZ #17082] [BZ #20530] * bits/byteswap.h: Update file comment. Do not include <bits/byteswap-16.h>. (__bswap_constant_16): Cast result to __uint16_t. Use signed 0xff constant. (__bswap_16): Define as inline function. (__bswap_constant_32): Reformat definition. (__bswap_32): Always define as inline function, not macro, using __uint32_t. Use __builtin_bswap32 if [__GNUC_PREREQ (4, 3)], otherwise __bswap_constant_32. (__bswap_constant_64): Reformat definition. Do not use __extension__ here. (__bswap_64): Always define as inline function, not macro. Use __extension__ on function definition. Use __builtin_bswap64 if [__GNUC_PREREQ (4, 3)], otherwise __bswap_constant_64. * string/test-endian-file-scope.c: New file. * string/test-endian-sign-conversion.c: Likewise. * string/Makefile (headers): Remove bits/byteswap-16.h. (tests): Add test-endian-file-scope and test-endian-sign-conversion. (CFLAGS-test-endian-sign-conversion.c): New variable. * bits/byteswap-16.h: Remove file. * sysdeps/ia64/bits/byteswap-16.h: Likewise. * sysdeps/ia64/bits/byteswap.h: Likewise. * sysdeps/m68k/bits/byteswap.h: Likewise. * sysdeps/s390/bits/byteswap-16.h: Likewise. * sysdeps/s390/bits/byteswap.h: Likewise. * sysdeps/tile/bits/byteswap.h: Likewise. * sysdeps/x86/bits/byteswap-16.h: Likewise. * sysdeps/x86/bits/byteswap.h: Likewise.
* Fix s390 linknamespace fallout of bug 22702 patch.Joseph Myers2018-01-121-1/+1
| | | | | | | | | | | | | | | My fix for bug 22702 introduced linknamespace test failures on s390x-linux-gnu and s390-linux-gnu because it made remainder call __feholdexcept, and the s390 __feholdexcept calls fegetenv, and remainder is in Unix98 and XPG4.2 but fegetenv isn't. This patch makes __feholdexcept call __fegetenv instead to avoid that namespace issue. Tested (compilation) with build-many-glibcs.py for s390x-linux-gnu, where it resolves the test failures. * sysdeps/s390/fpu/feholdexcpt.c (__feholdexcept): Call __fegetenv instead of fegetenv.