* arm/arm.h (HAVE_CALL_INDIRECT): Define.

* arm/crt0.S (indirect_call): New macro.  Encodes indirect
	function calls.  Does not use blx for pre-armv5 targets.
This commit is contained in:
Nick Clifton 2011-09-29 11:06:49 +00:00
parent 8a91ddb367
commit 29deef8805
3 changed files with 27 additions and 12 deletions

View File

@ -1,3 +1,9 @@
2011-09-29 Bin Cheng <bin.cheng@arm.com>
* arm/arm.h (HAVE_CALL_INDIRECT): Define.
* arm/crt0.S (indirect_call): New macro. Encodes indirect
function calls. Does not use blx for pre-armv5 targets.
2011-08-19 Nick Clifton <nickc@redhat.com>
* iq2000/sim.ld (.gcc_except_table): Include .gcc_except_table.foo

View File

@ -50,4 +50,13 @@
# define THUMB_V7M_V6M
#endif
/* Defined if this target supports the BLX Rm instruction. */
#if !defined(__ARM_ARCH_2__) \
&& !defined(__ARM_ARCH_3__) \
&& !defined(__ARM_ARCH_3M__) \
&& !defined(__ARM_ARCH_4__) \
&& !defined(__ARM_ARCH_4T__)
# define HAVE_CALL_INDIRECT
#endif
#endif /* _LIBGLOSS_ARM_H */

View File

@ -34,6 +34,16 @@
\name:
.endm
#endif
.macro indirect_call reg
#ifdef HAVE_CALL_INDIRECT
blx \reg
#else
mov lr, pc
mov pc, \reg
#endif
.endm
.align 0
FUNC_START _mainCRTStartup
@ -213,22 +223,12 @@ __change_mode:
ldr r3, .Lhwinit
cmp r3, #0
beq .LC24
#if defined(__thumb__) || defined(__thumb2__)
blx r3
#else
mov lr, pc
mov pc, r3
#endif
indirect_call r3
.LC24:
ldr r3, .Lswinit
cmp r3, #0
beq .LC25
#if defined(__thumb__) || defined(__thumb2__)
blx r3
#else
mov lr, pc
mov pc, r3
#endif
indirect_call r3
.LC25:
movs r0, #0 /* no arguments */