/* Thread-local storage handling in the ELF dynamic linker. ARM version.
- Copyright (C) 2006-2014 Free Software Foundation, Inc.
+ Copyright (C) 2006-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
eabi_fnstart
.align 2
_dl_tlsdesc_return:
- sfi_breg r0, \
- ldr r0, [\B]
+ ldr r0, [r0]
BX (lr)
eabi_fnend
cfi_endproc
cfi_rel_offset (r3,4)
cfi_rel_offset (r4,8)
cfi_rel_offset (lr,12)
- sfi_breg r0, \
- ldr r1, [\B] /* td */
+ ldr r1, [r0] /* td */
GET_TLS (lr)
mov r4, r0 /* r4 = tp */
- sfi_breg r0, \
- ldr r0, [\B]
- sfi_breg r1, \
- ldr r2, [\B, #8] /* gen_count */
- sfi_breg r0, \
- ldr r3, [\B]
+ ldr r0, [r0]
+ ldr r2, [r1, #8] /* gen_count */
+ ldr r3, [r0]
cmp r2, r3
bhi 1f
- sfi_breg r1, \
- ldr r3, [\B]
+ ldr r3, [r1]
#ifndef ARM_NO_INDEX_REGISTER
ldr r2, [r0, r3, lsl #3]
#else
add lr, r0, r3, lsl #3
- sfi_breg lr, \
- ldr r2, [\B]
+ ldr r2, [lr]
#endif
cmn r2, #1
ittt ne
- sfi_breg r1, \
ldrne r3, [r1, #4]
addne r3, r2, r3
rsbne r0, r4, r3
cfi_endproc
.size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
#endif /* SHARED */
-
-/* lazy resolved for tls descriptors. */
- .hidden _dl_tlsdesc_lazy_resolver
- .global _dl_tlsdesc_lazy_resolver
- .type _dl_tlsdesc_lazy_resolver,#function
- cfi_startproc
- eabi_fnstart
- .align 2
-_dl_tlsdesc_lazy_resolver:
- /* r0 points at the tlsdesc,
- r1 points at the GOT
- r2 was pushed by the trampoline and used as a temp,
- we need to pop it here.
- We push the remaining call-clobbered registers here, and also
- R1 -- to keep the stack correctly aligned. */
- /* Tell the unwinder that r2 has already been pushed. */
- eabi_save ({r2})
- cfi_adjust_cfa_offset (4)
- cfi_rel_offset (r2, 0)
- eabi_save ({r0,r1,r3,ip,lr})
- push {r0, r1, r3, ip, lr}
- cfi_adjust_cfa_offset (20)
- cfi_rel_offset (r0, 0)
- cfi_rel_offset (r1, 4)
- cfi_rel_offset (r3, 8)
- cfi_rel_offset (ip, 12)
- cfi_rel_offset (lr, 16)
- bl _dl_tlsdesc_lazy_resolver_fixup
- pop {r0, r1, r3, ip, lr}
- cfi_adjust_cfa_offset (-20)
- cfi_restore (lr)
- cfi_restore (ip)
- cfi_restore (r3)
- cfi_restore (r1)
- cfi_restore (r0)
- pop {r2}
- cfi_adjust_cfa_offset (-4)
- cfi_restore (r2)
- sfi_breg r0, \
- ldr r1, [\B, #4]
- BX (r1)
- eabi_fnend
- cfi_endproc
- .size _dl_tlsdesc_lazy_resolver, .-_dl_tlsdesc_lazy_resolver
-
-/* Holder for lazy tls descriptors being resolve in another thread.
- Same ABI as the lazy resolver itself. */
- .hidden _dl_tlsdesc_resolve_hold
- .global _dl_tlsdesc_resolve_hold
- .type _dl_tlsdesc_resolve_hold,#function
- cfi_startproc
- eabi_fnstart
- .align 2
-_dl_tlsdesc_resolve_hold:
- /* Tell the unwinder that r2 has already been pushed. */
- eabi_save ({r2})
- cfi_adjust_cfa_offset (4)
- cfi_rel_offset (r2, 0)
- eabi_save ({r0,r1,r3,ip,lr})
- push {r0, r1, r3, ip, lr}
- cfi_adjust_cfa_offset (20)
- cfi_rel_offset (r0, 0)
- cfi_rel_offset (r1, 4)
- cfi_rel_offset (r3, 8)
- cfi_rel_offset (ip, 12)
- cfi_rel_offset (lr, 16)
- adr r2, _dl_tlsdesc_resolve_hold
- bl _dl_tlsdesc_resolve_hold_fixup
- pop {r0, r1, r3, ip, lr}
- cfi_adjust_cfa_offset (-20)
- cfi_restore (lr)
- cfi_restore (ip)
- cfi_restore (r3)
- cfi_restore (r1)
- cfi_restore (r0)
- pop {r2}
- cfi_adjust_cfa_offset (-4)
- cfi_restore (r2)
- sfi_breg r0, \
- ldr r1, [\B, #4]
- BX (r1)
- eabi_fnend
- cfi_endproc
- .size _dl_tlsdesc_resolve_hold, .-_dl_tlsdesc_resolve_hold