ARM: Make dl-tlsdesc.S use sfi_breg, respect ARM_ALWAYS_BX and ARM_NO_INDEX_REGISTER.
authorRoland McGrath <roland@hack.frob.com>
Mon, 18 Mar 2013 22:00:44 +0000 (15:00 -0700)
committerRoland McGrath <roland@hack.frob.com>
Mon, 18 Mar 2013 22:02:44 +0000 (15:02 -0700)
ports/ChangeLog.arm
ports/sysdeps/arm/arm-features.h
ports/sysdeps/arm/dl-tlsdesc.S

index f215f02..9a6ff4b 100644 (file)
@@ -1,3 +1,13 @@
+2013-03-18  Roland McGrath  <roland@hack.frob.com>
+
+       * sysdeps/arm/dl-tlsdesc.S: Include <arm-features.h>.
+       Use sfi_breg macro throughout.
+       (_dl_tlsdesc_dynamic) [!ARM_NO_INDEX_REGISTER]: Avoid two-register
+       addressing mode.
+       (_dl_tlsdesc_dynamic) [ARM_ALWAYS_BX]: Don't pop into pc.
+
+       * sysdeps/arm/arm-features.h: Add comment for ARM_NO_INDEX_REGISTER.
+
 2013-03-15  Roland McGrath  <roland@hack.frob.com>
 
        * sysdeps/arm/sysdep.h [!ARM_SFI_MACROS] (sfi_sp): New macro.
index 5104ba3..336b690 100644 (file)
@@ -53,4 +53,7 @@
 # define ARM_BX_ALIGN_LOG2     2
 #endif
 
+/* An OS-specific arm-features.h file may define ARM_NO_INDEX_REGISTER to
+   indicate that the two-register addressing modes must never be used.  */
+
 #endif  /* arm-features.h */
index e810d0d..7203c06 100644 (file)
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <arm-features.h>
 #include <tls.h>
 #include "tlsdesc.h"
 
@@ -31,7 +32,8 @@
        .fnstart
        .align 2
 _dl_tlsdesc_return:
-       ldr     r0, [r0]
+       sfi_breg r0, \
+       ldr     r0, [\B]
        BX      (lr)
        .fnend
        cfi_endproc
@@ -90,16 +92,27 @@ _dl_tlsdesc_dynamic:
        cfi_rel_offset (r3,4)
        cfi_rel_offset (r4,8)
        cfi_rel_offset (lr,12)
-       ldr     r1, [r0] /* td */
+       sfi_breg r0, \
+       ldr     r1, [\B] /* td */
        GET_TLS (lr)
        mov     r4, r0 /* r4 = tp */
-       ldr     r0, [r0]
-       ldr     r2, [r1, #8] /* gen_count */
-       ldr     r3, [r0]
+       sfi_breg r0, \
+       ldr     r0, [\B]
+       sfi_breg r1, \
+       ldr     r2, [\B, #8] /* gen_count */
+       sfi_breg r0, \
+       ldr     r3, [\B]
        cmp     r2, r3
        bhi     1f
-       ldr     r3, [r1]
+       sfi_breg r1, \
+       ldr     r3, [\B]
+#ifndef ARM_NO_INDEX_REGISTER
        ldr     r2, [r0, r3, lsl #3]
+#else
+       add     lr, r0, r3, lsl #3
+       sfi_breg lr, \
+       ldr     r2, [\B]
+#endif
        cmn     r2, #1
        ittt    ne
        ldrne   r3, [r1, #4]
@@ -110,7 +123,8 @@ _dl_tlsdesc_dynamic:
        bl      __tls_get_addr
        rsb     r0, r4, r0
 2:
-#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
+#if ((defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)) \
+     || defined (ARM_ALWAYS_BX))
        pop     {r2,r3,r4, lr}
        cfi_adjust_cfa_offset (-16)
        cfi_restore (lr)
@@ -163,7 +177,8 @@ _dl_tlsdesc_lazy_resolver:
        pop     {r2}
        cfi_adjust_cfa_offset (-4)
        cfi_restore (r2)
-       ldr     r1, [r0, #4]
+       sfi_breg r0, \
+       ldr     r1, [\B, #4]
        BX      (r1)
        .fnend
        cfi_endproc
@@ -202,7 +217,8 @@ _dl_tlsdesc_resolve_hold:
        pop     {r2}
        cfi_adjust_cfa_offset (-4)
        cfi_restore (r2)
-       ldr     r1, [r0, #4]
+       sfi_breg r0, \
+       ldr     r1, [\B, #4]
        BX      (r1)
        .fnend
        cfi_endproc