diff options
author | Roland McGrath <roland@hack.frob.com> | 2013-03-18 15:00:44 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2013-03-18 15:02:44 -0700 |
commit | 6bcae14685204da833b3451e0636eb346b639d67 (patch) | |
tree | 1143569a92773f1fe9da9c43711badef23442252 | |
parent | 0e2b9cdde7def82bc7c2df5b0fae323825b222a3 (diff) | |
download | glibc-6bcae14685204da833b3451e0636eb346b639d67.tar.gz glibc-6bcae14685204da833b3451e0636eb346b639d67.tar.xz glibc-6bcae14685204da833b3451e0636eb346b639d67.zip |
ARM: Make dl-tlsdesc.S use sfi_breg, respect ARM_ALWAYS_BX and ARM_NO_INDEX_REGISTER.
-rw-r--r-- | ports/ChangeLog.arm | 10 | ||||
-rw-r--r-- | ports/sysdeps/arm/arm-features.h | 3 | ||||
-rw-r--r-- | ports/sysdeps/arm/dl-tlsdesc.S | 34 |
3 files changed, 38 insertions, 9 deletions
diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index f215f023dc..9a6ff4bc66 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -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. diff --git a/ports/sysdeps/arm/arm-features.h b/ports/sysdeps/arm/arm-features.h index 5104ba3329..336b6905af 100644 --- a/ports/sysdeps/arm/arm-features.h +++ b/ports/sysdeps/arm/arm-features.h @@ -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 */ diff --git a/ports/sysdeps/arm/dl-tlsdesc.S b/ports/sysdeps/arm/dl-tlsdesc.S index e810d0db37..7203c06ae6 100644 --- a/ports/sysdeps/arm/dl-tlsdesc.S +++ b/ports/sysdeps/arm/dl-tlsdesc.S @@ -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 |