This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[arm] libgcc interworking


The attached patch fixes building libgcc with -march=armv4t -mthumb 
-mthumb-interwork. Previously we were incorrectly using .set to create 
aliases for thumb routines.

Tested on arm-none-eabi.
Applied to mainline and 4.0-branch.

Paul

2005-04-30  Paul Brook  <paul@codesourcery.com>

	* config/arm/bpabi.h (RENAME_LIBRARY_SET): Always use .thumb_set in
	thumb mode.
	* config/arm/ieee754-df.S: Use __INTERWORKING_STUBS__.
	* config/arm/ieee754-sf.S: Ditto.
	* config/arm/lib1funcs.asm: Define and use __INTERWORKING_STUBS__.
	(FUNC_ALIAS): Use .thumb_set for thumb routines.
Index: gcc/config/arm/bpabi.h
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/arm/bpabi.h,v
retrieving revision 1.9
diff -u -p -r1.9 bpabi.h
--- gcc/config/arm/bpabi.h	29 Apr 2005 14:09:44 -0000	1.9
+++ gcc/config/arm/bpabi.h	30 Apr 2005 17:11:45 -0000
@@ -46,7 +46,7 @@
   "%{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} "	\
   "-X"
 
-#if defined (__thumb__) && !defined (__THUMB_INTERWORK__) 
+#if defined (__thumb__)
 #define RENAME_LIBRARY_SET ".thumb_set"
 #else
 #define RENAME_LIBRARY_SET ".set"
Index: gcc/config/arm/ieee754-df.S
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/arm/ieee754-df.S,v
retrieving revision 1.9
diff -u -p -r1.9 ieee754-df.S
--- gcc/config/arm/ieee754-df.S	27 Oct 2004 20:32:02 -0000	1.9
+++ gcc/config/arm/ieee754-df.S	30 Apr 2005 17:01:28 -0000
@@ -81,7 +81,7 @@ ARM_FUNC_START subdf3
 ARM_FUNC_ALIAS aeabi_dsub subdf3
 
 	eor	yh, yh, #0x80000000	@ flip sign bit of second arg
-#if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
+#if defined(__INTERWORKING_STUBS__)
 	b	1f			@ Skip Thumb-code prologue
 #endif
 
Index: gcc/config/arm/ieee754-sf.S
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/arm/ieee754-sf.S,v
retrieving revision 1.9
diff -u -p -r1.9 ieee754-sf.S
--- gcc/config/arm/ieee754-sf.S	18 Dec 2004 18:45:35 -0000	1.9
+++ gcc/config/arm/ieee754-sf.S	30 Apr 2005 17:01:28 -0000
@@ -62,7 +62,7 @@ ARM_FUNC_START subsf3
 ARM_FUNC_ALIAS aeabi_fsub subsf3
 
 	eor	r1, r1, #0x80000000	@ flip sign bit of second arg
-#if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
+#if defined(__INTERWORKING_STUBS__)
 	b	1f			@ Skip Thumb-code prologue
 #endif
 
Index: gcc/config/arm/lib1funcs.asm
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/arm/lib1funcs.asm,v
retrieving revision 1.38
diff -u -p -r1.38 lib1funcs.asm
--- gcc/config/arm/lib1funcs.asm	21 Feb 2005 14:39:52 -0000	1.38
+++ gcc/config/arm/lib1funcs.asm	30 Apr 2005 17:17:50 -0000
@@ -94,10 +94,20 @@ Boston, MA 02111-1307, USA.  */
 # define RET		bx	lr
 # define RETc(x)	bx##x	lr
 
-# if (__ARM_ARCH__ == 4) \
-	&& (defined(__thumb__) || defined(__THUMB_INTERWORK__))
-#  define __INTERWORKING__
-# endif
+/* Special precautions for interworking on armv4t.  */
+# if (__ARM_ARCH__ == 4)
+
+/* Always use bx, not ldr pc.  */
+#  if (defined(__thumb__) || defined(__THUMB_INTERWORK__))
+#    define __INTERWORKING__
+#   endif /* __THUMB__ || __THUMB_INTERWORK__ */
+
+/* Include thumb stub before arm mode code.  */
+#  if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
+#   define __INTERWORKING_STUBS__
+#  endif /* __thumb__ && !__THUMB_INTERWORK__ */
+
+#endif /* __ARM_ARCH == 4 */
 
 #else
 
@@ -192,7 +202,7 @@ SYM (__\name):
 /* Special function that will always be coded in ARM assembly, even if
    in Thumb-only compilation.  */
 
-#if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
+#if defined(__INTERWORKING_STUBS__)
 .macro	ARM_FUNC_START name
 	FUNC_START \name
 	bx	pc
@@ -225,13 +235,17 @@ SYM (__\name):
 
 .macro	FUNC_ALIAS new old
 	.globl	SYM (__\new)
-	EQUIV	SYM (__\new), SYM (__\old)
+#if defined (__thumb__)
+	.thumb_set	SYM (__\new), SYM (__\old)
+#else
+	.set	SYM (__\new), SYM (__\old)
+#endif
 .endm
 
 .macro	ARM_FUNC_ALIAS new old
 	.globl	SYM (__\new)
 	EQUIV	SYM (__\new), SYM (__\old)
-#ifdef __thumb__
+#if defined(__INTERWORKING_STUBS__)
 	.set	SYM (_L__\new), SYM (_L__\old)
 #endif
 .endm

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]