[roland/arm] Conditionalize test-xfail-tst-tlsalign{,-static} on ARM assembler bug.
diff mbox

Message ID 20150626163206.675CC2C3B3B@topped-with-meat.com
State New
Headers show

Commit Message

Roland McGrath June 26, 2015, 4:32 p.m. UTC
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

Joseph Myers June 26, 2015, 9 p.m. UTC | #1
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.)
Roland McGrath July 8, 2015, 10:03 p.m. UTC | #2
> 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

Patch
diff mbox

diff --git a/elf/Makefile b/elf/Makefile
index f21276c0..7fda056 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -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
 
diff --git a/sysdeps/arm/configure b/sysdeps/arm/configure
index 52f2185..f789f61 100644
--- a/sysdeps/arm/configure
+++ b/sysdeps/arm/configure
@@ -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.
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, [
+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.