diff options
author | Nick Clifton <nickc@redhat.com> | 2011-09-29 11:06:49 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2011-09-29 11:06:49 +0000 |
commit | 29deef8805ffa069090f191a22ec7538649cd70f (patch) | |
tree | 789fa8bd6cfbf6b397cfd651b8a1b6d63ac84447 /libgloss/arm | |
parent | 8a91ddb36763aab9339bba50e6da3ebc796ceaef (diff) | |
download | newlib-29deef8805ffa069090f191a22ec7538649cd70f.zip newlib-29deef8805ffa069090f191a22ec7538649cd70f.tar.gz newlib-29deef8805ffa069090f191a22ec7538649cd70f.tar.bz2 |
* 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.
Diffstat (limited to 'libgloss/arm')
-rw-r--r-- | libgloss/arm/arm.h | 9 | ||||
-rw-r--r-- | libgloss/arm/crt0.S | 24 |
2 files changed, 21 insertions, 12 deletions
diff --git a/libgloss/arm/arm.h b/libgloss/arm/arm.h index e8c9d25..26a1ff1 100644 --- a/libgloss/arm/arm.h +++ b/libgloss/arm/arm.h @@ -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 */ diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S index c98cd2c..7489850 100644 --- a/libgloss/arm/crt0.S +++ b/libgloss/arm/crt0.S @@ -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 */ |