diff options
Diffstat (limited to 'sysdeps/arm/dl-tlsdesc.S')
-rw-r--r-- | sysdeps/arm/dl-tlsdesc.S | 110 |
1 files changed, 8 insertions, 102 deletions
diff --git a/sysdeps/arm/dl-tlsdesc.S b/sysdeps/arm/dl-tlsdesc.S index 0429b0106c..056e17d52d 100644 --- a/sysdeps/arm/dl-tlsdesc.S +++ b/sysdeps/arm/dl-tlsdesc.S @@ -1,5 +1,5 @@ /* Thread-local storage handling in the ELF dynamic linker. ARM version. - Copyright (C) 2006-2016 Free Software Foundation, Inc. + Copyright (C) 2006-2018 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 @@ -32,8 +32,7 @@ eabi_fnstart .align 2 _dl_tlsdesc_return: - sfi_breg r0, \ - ldr r0, [\B] + ldr r0, [r0] BX (lr) eabi_fnend cfi_endproc @@ -92,30 +91,23 @@ _dl_tlsdesc_dynamic: 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 @@ -140,89 +132,3 @@ _dl_tlsdesc_dynamic: 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. - - Our calling convention is to clobber r0, r1 and the processor - flags. All others that are modified must be saved */ - .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: - /* r0 is saved so its original value can be used after the call and - r1 is saved only to keep the stack aligned. (r0 points to the tls - descriptor, it is passed to _dl_tlsdesc_resolve_hold_fixup which - is a void function that may clobber r0, later r0 is used to load - the new resolver.) */ - eabi_save ({r0,r1,r2,r3,ip,lr}) - push {r0, r1, r2, r3, ip, lr} - cfi_adjust_cfa_offset (24) - cfi_rel_offset (r0, 0) - cfi_rel_offset (r1, 4) - cfi_rel_offset (r2, 8) - cfi_rel_offset (r3, 12) - cfi_rel_offset (ip, 16) - cfi_rel_offset (lr, 20) - adr r1, _dl_tlsdesc_resolve_hold - bl _dl_tlsdesc_resolve_hold_fixup - pop {r0, r1, r2, r3, ip, lr} - cfi_adjust_cfa_offset (-24) - cfi_restore (lr) - cfi_restore (ip) - cfi_restore (r3) - cfi_restore (r2) - cfi_restore (r1) - cfi_restore (r0) - sfi_breg r0, \ - ldr r1, [\B, #4] - BX (r1) - eabi_fnend - cfi_endproc - .size _dl_tlsdesc_resolve_hold, .-_dl_tlsdesc_resolve_hold |