diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2013-05-23 23:37:00 +0200 |
---|---|---|
committer | Thomas Schwinge <thomas@codesourcery.com> | 2013-05-23 23:37:00 +0200 |
commit | f9e888643115b4b2f28853ebd1733f4410fb8839 (patch) | |
tree | 58c69f6cef623679080e8933b6c79880bfbd7cb8 /ports/sysdeps/arm/dl-tlsdesc.S | |
parent | d78eef6ebc008f784f501ce208bef12c6eafda27 (diff) | |
parent | b934acf0e93c5a220551ed6e686bb9d45a24a8cc (diff) |
Merge branch 'baseline' into refs/top-bases/tschwinge/Roger_Whittaker
Diffstat (limited to 'ports/sysdeps/arm/dl-tlsdesc.S')
-rw-r--r-- | ports/sysdeps/arm/dl-tlsdesc.S | 77 |
1 files changed, 42 insertions, 35 deletions
diff --git a/ports/sysdeps/arm/dl-tlsdesc.S b/ports/sysdeps/arm/dl-tlsdesc.S index 0ae3abb38d..7203c06ae6 100644 --- a/ports/sysdeps/arm/dl-tlsdesc.S +++ b/ports/sysdeps/arm/dl-tlsdesc.S @@ -17,19 +17,14 @@ <http://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <arm-features.h> #include <tls.h> #include "tlsdesc.h" -#ifdef __USE_BX__ - #define BX(x) bx x -#else - #define BX(x) mov pc, x -#endif - .text @ emit debug information with cfi @ use arm-specific pseudos for unwinding itself - .cfi_sections .debug_frame + CFI_SECTIONS .hidden _dl_tlsdesc_return .global _dl_tlsdesc_return .type _dl_tlsdesc_return,#function @@ -37,7 +32,8 @@ .fnstart .align 2 _dl_tlsdesc_return: - ldr r0, [r0] + sfi_breg r0, \ + ldr r0, [\B] BX (lr) .fnend cfi_endproc @@ -50,18 +46,9 @@ _dl_tlsdesc_return: .fnstart .align 2 _dl_tlsdesc_undefweak: - @ Are we allowed a misaligned stack pointer calling read_tp? - .save {lr} - stmdb sp!, {lr} - cfi_adjust_cfa_offset (4) - cfi_rel_offset (lr,0) - bl __aeabi_read_tp + GET_TLS (r1) rsb r0, r0, #0 - ldmia sp!, {lr} - cfi_adjust_cfa_offset (-4) - cfi_restore (lr) BX (lr) - cfi_endproc .fnend .size _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak @@ -99,23 +86,35 @@ _dl_tlsdesc_dynamic: /* Our calling convention is to clobber r0, r1 and the processor flags. All others that are modified must be saved */ .save {r2,r3,r4,lr} - stmdb sp!, {r2,r3,r4,lr} + push {r2,r3,r4,lr} cfi_adjust_cfa_offset (16) cfi_rel_offset (r2,0) cfi_rel_offset (r3,4) cfi_rel_offset (r4,8) cfi_rel_offset (lr,12) - ldr r1, [r0] /* td */ - bl __aeabi_read_tp + 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] addne r3, r2, r3 rsbne r0, r4, r3 @@ -123,13 +122,19 @@ _dl_tlsdesc_dynamic: 1: mov r0, r1 bl __tls_get_addr rsb r0, r4, r0 -2: ldmia sp!, {r2,r3,r4, lr} +2: +#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) cfi_restore (r4) cfi_restore (r3) cfi_restore (r2) - BX (lr) + bx lr +#else + pop {r2,r3,r4, pc} +#endif .fnend cfi_endproc .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic @@ -154,7 +159,7 @@ _dl_tlsdesc_lazy_resolver: cfi_adjust_cfa_offset (4) cfi_rel_offset (r2, 0) .save {r0,r1,r3,ip,lr} - stmdb sp!, {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) @@ -162,17 +167,18 @@ _dl_tlsdesc_lazy_resolver: cfi_rel_offset (ip, 12) cfi_rel_offset (lr, 16) bl _dl_tlsdesc_lazy_resolver_fixup - ldmia sp!, {r0, r1, r3, ip, lr} + 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) - ldmia sp!, {r2} + 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 @@ -192,7 +198,7 @@ _dl_tlsdesc_resolve_hold: cfi_adjust_cfa_offset (4) cfi_rel_offset (r2, 0) .save {r0,r1,r3,ip,lr} - stmdb sp!, {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) @@ -201,17 +207,18 @@ _dl_tlsdesc_resolve_hold: cfi_rel_offset (lr, 16) adr r2, _dl_tlsdesc_resolve_hold bl _dl_tlsdesc_resolve_hold_fixup - ldmia sp!, {r0, r1, r3, ip, lr} + 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) - ldmia sp!, {r2} + 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 |