mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-11 20:00:07 +00:00
ARM: Make dl-tlsdesc.S use sfi_breg, respect ARM_ALWAYS_BX and ARM_NO_INDEX_REGISTER.
This commit is contained in:
parent
0e2b9cdde7
commit
6bcae14685
@ -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>
|
2013-03-15 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
* sysdeps/arm/sysdep.h [!ARM_SFI_MACROS] (sfi_sp): New macro.
|
* sysdeps/arm/sysdep.h [!ARM_SFI_MACROS] (sfi_sp): New macro.
|
||||||
|
@ -53,4 +53,7 @@
|
|||||||
# define ARM_BX_ALIGN_LOG2 2
|
# define ARM_BX_ALIGN_LOG2 2
|
||||||
#endif
|
#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 */
|
#endif /* arm-features.h */
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
#include <arm-features.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
#include "tlsdesc.h"
|
#include "tlsdesc.h"
|
||||||
|
|
||||||
@ -31,7 +32,8 @@
|
|||||||
.fnstart
|
.fnstart
|
||||||
.align 2
|
.align 2
|
||||||
_dl_tlsdesc_return:
|
_dl_tlsdesc_return:
|
||||||
ldr r0, [r0]
|
sfi_breg r0, \
|
||||||
|
ldr r0, [\B]
|
||||||
BX (lr)
|
BX (lr)
|
||||||
.fnend
|
.fnend
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
@ -90,16 +92,27 @@ _dl_tlsdesc_dynamic:
|
|||||||
cfi_rel_offset (r3,4)
|
cfi_rel_offset (r3,4)
|
||||||
cfi_rel_offset (r4,8)
|
cfi_rel_offset (r4,8)
|
||||||
cfi_rel_offset (lr,12)
|
cfi_rel_offset (lr,12)
|
||||||
ldr r1, [r0] /* td */
|
sfi_breg r0, \
|
||||||
|
ldr r1, [\B] /* td */
|
||||||
GET_TLS (lr)
|
GET_TLS (lr)
|
||||||
mov r4, r0 /* r4 = tp */
|
mov r4, r0 /* r4 = tp */
|
||||||
ldr r0, [r0]
|
sfi_breg r0, \
|
||||||
ldr r2, [r1, #8] /* gen_count */
|
ldr r0, [\B]
|
||||||
ldr r3, [r0]
|
sfi_breg r1, \
|
||||||
|
ldr r2, [\B, #8] /* gen_count */
|
||||||
|
sfi_breg r0, \
|
||||||
|
ldr r3, [\B]
|
||||||
cmp r2, r3
|
cmp r2, r3
|
||||||
bhi 1f
|
bhi 1f
|
||||||
ldr r3, [r1]
|
sfi_breg r1, \
|
||||||
|
ldr r3, [\B]
|
||||||
|
#ifndef ARM_NO_INDEX_REGISTER
|
||||||
ldr r2, [r0, r3, lsl #3]
|
ldr r2, [r0, r3, lsl #3]
|
||||||
|
#else
|
||||||
|
add lr, r0, r3, lsl #3
|
||||||
|
sfi_breg lr, \
|
||||||
|
ldr r2, [\B]
|
||||||
|
#endif
|
||||||
cmn r2, #1
|
cmn r2, #1
|
||||||
ittt ne
|
ittt ne
|
||||||
ldrne r3, [r1, #4]
|
ldrne r3, [r1, #4]
|
||||||
@ -110,7 +123,8 @@ _dl_tlsdesc_dynamic:
|
|||||||
bl __tls_get_addr
|
bl __tls_get_addr
|
||||||
rsb r0, r4, r0
|
rsb r0, r4, r0
|
||||||
2:
|
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}
|
pop {r2,r3,r4, lr}
|
||||||
cfi_adjust_cfa_offset (-16)
|
cfi_adjust_cfa_offset (-16)
|
||||||
cfi_restore (lr)
|
cfi_restore (lr)
|
||||||
@ -163,7 +177,8 @@ _dl_tlsdesc_lazy_resolver:
|
|||||||
pop {r2}
|
pop {r2}
|
||||||
cfi_adjust_cfa_offset (-4)
|
cfi_adjust_cfa_offset (-4)
|
||||||
cfi_restore (r2)
|
cfi_restore (r2)
|
||||||
ldr r1, [r0, #4]
|
sfi_breg r0, \
|
||||||
|
ldr r1, [\B, #4]
|
||||||
BX (r1)
|
BX (r1)
|
||||||
.fnend
|
.fnend
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
@ -202,7 +217,8 @@ _dl_tlsdesc_resolve_hold:
|
|||||||
pop {r2}
|
pop {r2}
|
||||||
cfi_adjust_cfa_offset (-4)
|
cfi_adjust_cfa_offset (-4)
|
||||||
cfi_restore (r2)
|
cfi_restore (r2)
|
||||||
ldr r1, [r0, #4]
|
sfi_breg r0, \
|
||||||
|
ldr r1, [\B, #4]
|
||||||
BX (r1)
|
BX (r1)
|
||||||
.fnend
|
.fnend
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
|
Loading…
Reference in New Issue
Block a user