[roland/arm] Conditionalize test-xfail-tst-tlsalign{,-static} on ARM assembler bug.
Commit Message
With HJ's x86 fix, the only known failures for tst-tlsalign (18383)
are due to the ARM assembler bug, which is fixed in current binutils
trunk and 2.25 branch (but broken in all released versions).
This adds a configure check for the bug, and makes the tests XFAIL only if
the assembler bug is there.
Tested on arm-linux-gnueabihf that the configure check fails with
binutils-2.24 and that it (and the no-longer-XFAIL tests) succeed
with binutils-2_25-branch.
OK?
Thanks,
Roland
2015-06-26 Roland McGrath <roland@hack.frob.com>
[BZ #18383]
* sysdeps/arm/configure.ac (libc_cv_arm_tpoff_addend): New check.
Emit test-xfail-tst-tlsalign{,-static}=yes if it fails.
* sysdeps/arm/configure: Regenerated.
* elf/Makefile (test-xfail-tst-tlsalign): Variable removed.
(test-xfail-tst-tlsalign-static): Variable removed.
Comments
On Fri, 26 Jun 2015, Roland McGrath wrote:
> diff --git a/sysdeps/arm/configure.ac b/sysdeps/arm/configure.ac
> index 168f2e7..d7b6a7a 100644
> --- a/sysdeps/arm/configure.ac
> +++ b/sysdeps/arm/configure.ac
> @@ -79,6 +79,43 @@ if test $libc_cv_arm_pcrel_movw = yes; then
> AC_DEFINE([ARM_PCREL_MOVW_OK])
> fi
>
> +AC_CACHE_CHECK([whether TPOFF relocs with addends are assembled correctly],
> + libc_cv_arm_tpoff_addend, [
This should have a comment referencing the binutils bug and the versions
in which it is fixed. OK with such a comment added. (I think the glibc
bug should be closed as fixed and listed as fixed in NEWS since the only
remaining cases are a problem in binutils not glibc.)
> This should have a comment referencing the binutils bug and the versions
> in which it is fixed. OK with such a comment added.
Right. I'd intended to have such a comment, but forgot.
> (I think the glibc bug should be closed as fixed and listed as fixed in
> NEWS since the only remaining cases are a problem in binutils not glibc.)
Yes, I'd intended to do that on commit.
I've now committed it (unchanged from posting but for comment and NEWS) and
closed the bug.
Thanks,
Roland
@@ -524,10 +524,6 @@ $(objpfx)tst-initorder: $(objpfx)tst-initordera4.so $(objpfx)tst-initordera1.so
$(objpfx)tst-null-argv: $(objpfx)tst-null-argv-lib.so
$(objpfx)tst-tlsalign: $(objpfx)tst-tlsalign-lib.so
-# BZ#18383: broken on at least ARM (both).
-test-xfail-tst-tlsalign = yes
-test-xfail-tst-tlsalign-static = yes
-
$(objpfx)tst-tlsalign-extern: $(objpfx)tst-tlsalign-vars.o
$(objpfx)tst-tlsalign-extern-static: $(objpfx)tst-tlsalign-vars.o
@@ -260,6 +260,52 @@ if test $libc_cv_arm_pcrel_movw = yes; then
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether TPOFF relocs with addends are assembled correctly" >&5
+$as_echo_n "checking whether TPOFF relocs with addends are assembled correctly... " >&6; }
+if ${libc_cv_arm_tpoff_addend+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+cat > conftest.s <<\EOF
+ .syntax unified
+ .arm
+ .arch armv7-a
+
+ .text
+foo:
+ .word tbase(tpoff)+4
+
+ .section .tdata,"awT",%progbits
+ .word -4
+tbase: .word 0
+ .word 4
+EOF
+libc_cv_arm_tpoff_addend=no
+${CC-cc} -c $CFLAGS $CPPFLAGS \
+ -o conftest.o conftest.s 1>&5 2>&5 &&
+LC_ALL=C $READELF -x.text conftest.o > conftest.x 2>&5 &&
+{
+ cat conftest.x 1>&5
+ $AWK 'BEGIN { result = 2 }
+$1 ~ /0x0+/ && $2 ~ /[0-9a-f]+/ {
+# Check for little-endian or big-endian encoding of 4 in the in-place addend.
+ result = ($2 == "04000000" || $2 == "00000004") ? 0 : 1
+}
+END { exit(result) }
+' conftest.x 2>&5 && libc_cv_arm_tpoff_addend=yes
+}
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_arm_tpoff_addend" >&5
+$as_echo "$libc_cv_arm_tpoff_addend" >&6; }
+if test $libc_cv_arm_tpoff_addend = no; then
+ config_vars="$config_vars
+test-xfail-tst-tlsalign = yes"
+ config_vars="$config_vars
+test-xfail-tst-tlsalign-static = yes"
+fi
+
+
libc_cv_gcc_unwind_find_fde=no
# Remove -fno-unwind-tables that was added in sysdeps/arm/preconfigure.ac.
@@ -79,6 +79,43 @@ if test $libc_cv_arm_pcrel_movw = yes; then
AC_DEFINE([ARM_PCREL_MOVW_OK])
fi
+AC_CACHE_CHECK([whether TPOFF relocs with addends are assembled correctly],
+ libc_cv_arm_tpoff_addend, [
+cat > conftest.s <<\EOF
+ .syntax unified
+ .arm
+ .arch armv7-a
+
+ .text
+foo:
+ .word tbase(tpoff)+4
+
+ .section .tdata,"awT",%progbits
+ .word -4
+tbase: .word 0
+ .word 4
+EOF
+libc_cv_arm_tpoff_addend=no
+${CC-cc} -c $CFLAGS $CPPFLAGS \
+ -o conftest.o conftest.s 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD &&
+LC_ALL=C $READELF -x.text conftest.o > conftest.x 2>&AS_MESSAGE_LOG_FD &&
+{
+ cat conftest.x 1>&AS_MESSAGE_LOG_FD
+ $AWK 'BEGIN { result = 2 }
+$1 ~ /0x0+/ && $2 ~ /[[0-9a-f]]+/ {
+# Check for little-endian or big-endian encoding of 4 in the in-place addend.
+ result = ($2 == "04000000" || $2 == "00000004") ? 0 : 1
+}
+END { exit(result) }
+' conftest.x 2>&AS_MESSAGE_LOG_FD && libc_cv_arm_tpoff_addend=yes
+}
+rm -f conftest*])
+if test $libc_cv_arm_tpoff_addend = no; then
+ LIBC_CONFIG_VAR([test-xfail-tst-tlsalign], [yes])
+ LIBC_CONFIG_VAR([test-xfail-tst-tlsalign-static], [yes])
+fi
+
+
libc_cv_gcc_unwind_find_fde=no
# Remove -fno-unwind-tables that was added in sysdeps/arm/preconfigure.ac.