aarch64: Merge __local_multiple_threads offset with memory reference
authorRichard Henderson <rth@redhat.com>
Wed, 21 May 2014 15:36:51 +0000 (11:36 -0400)
committerRichard Henderson <rth@redhat.com>
Wed, 21 May 2014 15:36:51 +0000 (11:36 -0400)
This also highlights that we'd been loading 64-bits instead of
the proper 32-bits.  Caught by the linker as a relocation error,
since the variable happened to be unaligned for 64-bits.

ChangeLog
sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h

index 4f0414e..f25bd3f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2014-05-21  Richard Henderson  <rth@redhat.com>
 
+       * sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
+       (SINGLE_THREAD_P): Use the correct width load.  Fold
+       into the ldr offset.
+
        * sysdeps/unix/sysv/linux/aarch64/sysdep.h [RTLD_PRIVATE_ERRNO]
        (SYSCALL_ERROR_HANDLER): Fold add insn into str offset.
 
index 0e9bef3..24fae7b 100644 (file)
@@ -163,9 +163,8 @@ extern int __local_multiple_threads attribute_hidden;
 #  else
 #   define SINGLE_THREAD_P                                             \
   adrp x16, __local_multiple_threads;                                  \
-  add  x16, x16, #:lo12:__local_multiple_threads;                      \
-  ldr  x16, [x16];                                                     \
-  cmp  x16, 0;
+  ldr  w16, [x16, :lo12:__local_multiple_threads];                     \
+  cmp  w16, 0;
 #  endif
 # else
 /*  There is no __local_multiple_threads for librt, so use the TCB.  */
@@ -181,12 +180,12 @@ extern int __local_multiple_threads attribute_hidden;
   cfi_rel_offset (x30, 8);                                             \
   bl   __read_tp;                                                      \
   sub  x0, x0, PTHREAD_SIZEOF;                                         \
-  ldr  x16, [x0, PTHREAD_MULTIPLE_THREADS_OFFSET];                     \
+  ldr  w16, [x0, PTHREAD_MULTIPLE_THREADS_OFFSET];                     \
   ldp  x0, x30, [sp], 16;                                              \
   cfi_restore (x0);                                                    \
   cfi_restore (x30);                                                   \
   cfi_adjust_cfa_offset (-16);                                         \
-  cmp  x16, 0
+  cmp  w16, 0
 #   define SINGLE_THREAD_P_PIC(x) SINGLE_THREAD_P
 #  endif
 # endif