This is the mail archive of the
libc-ports@sources.redhat.com
mailing list for the libc-ports project.
[PATCH 17/26] arm: Unless arm4t, pop return address directly into pc
- From: Richard Henderson <rth at twiddle dot net>
- To: libc-ports at sourceware dot org
- Cc: Joseph Myers <joseph at codesourcery dot com>
- Date: Tue, 26 Feb 2013 19:16:17 -0800
- Subject: [PATCH 17/26] arm: Unless arm4t, pop return address directly into pc
- References: <1361934986-17018-1-git-send-email-rth@twiddle.net>
Unless we're trying old interworking, there's no point restoring to
LR first. Everthing from armv5 on handles pop as an interworking jump.
---
* sysdeps/arm/arm-mcount.S (_mcount): Use pop into pc unless
__ARM_ARCH_4T__ and __THUMB_INTERWORK__.
* sysdeps/arm/dl-tlsdesc.S (_dl_tlsdesc_undefweak): Likewise.
(_dl_tlsdesc_dynamic): Likewise.
---
ports/sysdeps/arm/arm-mcount.S | 6 +++---
ports/sysdeps/arm/dl-tlsdesc.S | 15 ++++++++++++---
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/ports/sysdeps/arm/arm-mcount.S b/ports/sysdeps/arm/arm-mcount.S
index b6e5ec7..8ad0779 100644
--- a/ports/sysdeps/arm/arm-mcount.S
+++ b/ports/sysdeps/arm/arm-mcount.S
@@ -82,9 +82,7 @@ ENTRY(_mcount)
ldrne r0, [r0, #-4]
movsne r1, lr
blne __mcount_internal
-#ifdef __thumb2__
- pop {r0, r1, r2, r3, fp, pc}
-#else
+#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
pop {r0, r1, r2, r3, fp, lr}
cfi_adjust_cfa_offset (-24)
cfi_restore (r0)
@@ -94,6 +92,8 @@ ENTRY(_mcount)
cfi_restore (fp)
cfi_restore (lr)
bx lr
+#else
+ pop {r0, r1, r2, r3, fp, pc}
#endif
END(_mcount)
diff --git a/ports/sysdeps/arm/dl-tlsdesc.S b/ports/sysdeps/arm/dl-tlsdesc.S
index 417b8b3..6c47743 100644
--- a/ports/sysdeps/arm/dl-tlsdesc.S
+++ b/ports/sysdeps/arm/dl-tlsdesc.S
@@ -51,10 +51,14 @@ _dl_tlsdesc_undefweak:
cfi_rel_offset (lr,0)
bl __aeabi_read_tp
rsb r0, r0, #0
+#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
pop {lr}
cfi_adjust_cfa_offset (-4)
cfi_restore (lr)
- BX (lr)
+ bx lr
+#else
+ pop {pc}
+#endif
cfi_endproc
.fnend
@@ -118,13 +122,18 @@ _dl_tlsdesc_dynamic:
1: mov r0, r1
bl __tls_get_addr
rsb r0, r4, r0
-2: pop {r2,r3,r4, lr}
+2:
+#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
+ 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
--
1.8.1.2