From: Roland McGrath Date: Mon, 18 Mar 2013 22:00:44 +0000 (-0700) Subject: ARM: Make dl-tlsdesc.S use sfi_breg, respect ARM_ALWAYS_BX and ARM_NO_INDEX_REGISTER. X-Git-Tag: upstream/2.30~9317 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6bcae14685204da833b3451e0636eb346b639d67;p=external%2Fglibc.git ARM: Make dl-tlsdesc.S use sfi_breg, respect ARM_ALWAYS_BX and ARM_NO_INDEX_REGISTER. --- diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index f215f02..9a6ff4b 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,3 +1,13 @@ +2013-03-18 Roland McGrath + + * sysdeps/arm/dl-tlsdesc.S: Include . + 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 * 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 5104ba3..336b690 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 e810d0d..7203c06 100644 --- a/ports/sysdeps/arm/dl-tlsdesc.S +++ b/ports/sysdeps/arm/dl-tlsdesc.S @@ -17,6 +17,7 @@ . */ #include +#include #include #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