OSDN Git Service

* arm/arm.h (HAVE_CALL_INDIRECT): Define.
authornickc <nickc>
Thu, 29 Sep 2011 11:06:49 +0000 (11:06 +0000)
committernickc <nickc>
Thu, 29 Sep 2011 11:06:49 +0000 (11:06 +0000)
        * arm/crt0.S (indirect_call): New macro.  Encodes indirect
function calls.  Does not use blx for pre-armv5 targets.

libgloss/ChangeLog
libgloss/arm/arm.h
libgloss/arm/crt0.S

index fcdb5f5..afea6bb 100644 (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
index e8c9d25..26a1ff1 100644 (file)
 # 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 */
index c98cd2c..7489850 100644 (file)
 \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  */