diff options
Diffstat (limited to 'libgloss')
-rw-r--r-- | libgloss/ChangeLog | 6 | ||||
-rw-r--r-- | libgloss/arm/arm.h | 9 | ||||
-rw-r--r-- | libgloss/arm/crt0.S | 24 |
3 files changed, 27 insertions, 12 deletions
diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index fcdb5f5..afea6bb 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -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 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 */ |