[kaffe] CVS kaffe (hkraemer): fixes for arm-linux jit engine

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Tue Sep 30 12:53:04 2003


PatchSet 4083 
Date: 2003/09/30 19:50:52
Author: hkraemer
Branch: HEAD
Tag: (none) 
Log:
fixes for arm-linux jit engine

It compiles without warnings using gcc 3.2.2, but crashes
at runtime, hope to fix it, though.

Members: 
	ChangeLog:1.1678->1.1679 
	config/arm/common.h:1.6->1.7 
	config/arm/jit.h:1.9->1.10 
	config/arm/linux/jit-md.h:1.5->1.6 
	config/arm/linux/md.h:1.4->1.5 
	libraries/clib/math/BigInteger.c:1.19->1.20 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1678 kaffe/ChangeLog:1.1679
--- kaffe/ChangeLog:1.1678	Mon Sep 29 23:50:25 2003
+++ kaffe/ChangeLog	Tue Sep 30 19:50:52 2003
@@ -1,3 +1,25 @@
+2003-09-30  Helmer Kraemer  <hkraemer@freenet.de>
+
+	* libraries/clib/math/BigInteger.c
+	[!HAVE_GMP_H] (Java_java_math_BigInteger_assignString0): changed
+	return type to jint to match prototype of assignString0 when gmp
+	is used
+
+	* config/arm/common.h (sysdepCallMethod): changed into an inline
+	method, don't treat 'L' return type specially
+
+	* config/arm/jit.h (exceptionFrame): changed type of fields to
+	uintp to fix compilation warnings
+	(NEXTFRAME, PCFRAME, FPFRAME): remove now unnecessary casts
+
+	* config/arm/linux/jit-md.h (FIRSTFRAME): redefined using gcc's
+	__builtin_frame_address extension
+	(ARM_LINUX_HACK): removed since it's no longer necessary
+
+	* config/arm/linux/md.h (SP_OFFSET, FP_OFFSET): corrected to
+	match what current glibc does
+	(ARM_LINUX_HACK): removed since it's no longer necessary
+	
 2003-09-30  Dalibor Topic <robilad@kaffe.org>
 
 	* libraries/javalib/java/util/zip/ZipEntry.java:
Index: kaffe/config/arm/common.h
diff -u kaffe/config/arm/common.h:1.6 kaffe/config/arm/common.h:1.7
--- kaffe/config/arm/common.h:1.6	Sat Oct 19 11:04:41 2002
+++ kaffe/config/arm/common.h	Tue Sep 30 19:50:54 2003
@@ -27,83 +27,87 @@
  * have to take this into account here.  It is a convention of the
  * software floating point libraries and the build tools.
  */
-
-#define	sysdepCallMethod(CALL) do {					\
-  int extraargs[((CALL)->nrargs>4)?((CALL)->nrargs-4):0];		\
-  switch((CALL)->nrargs) {						\
-    register int r0 asm("r0");						\
-    register int r1 asm("r1");						\
-    register int r2 asm("r2");						\
-    register int r3 asm("r3");						\
-    register double f0 asm("f0");                                       \
-  default:								\
-    {									\
-      int *args = extraargs;						\
-      int argidx = 4; 							\
-      if ((CALL)->callsize[3] == 2) {					\
-	*args++ = ((CALL)->args[argidx].j) >> 32;			\
-	}								\
-      for(; argidx < (CALL)->nrargs; ++argidx) {			\
-	if ((CALL)->callsize[argidx]) { 				\
-	  *args++ = (CALL)->args[argidx].i;				\
-	  if ((CALL)->callsize[argidx] == 2) 				\
-	    *args++ = ((CALL)->args[argidx].j) >> 32;			\
-	} 								\
-      }									\
-    }									\
-  case 4:								\
-    if ((CALL)->callsize[3]) {						\
-      r3 = (CALL)->args[3].i;						\
-      if ((CALL)->callsize[3] == 2)					\
-        *extraargs = ((CALL)->args[3].j) >> 32; 			\
-    }									\
-  case 3:								\
-    if ((CALL)->callsize[2]) {						\
-      r2 = (CALL)->args[2].i;						\
-      if ((CALL)->callsize[2] == 2)					\
-        r3 = ((CALL)->args[2].j) >> 32; 				\
-    }									\
-  case 2:								\
-    if ((CALL)->callsize[1]) {						\
-      r1 = (CALL)->args[1].i;						\
-      if ((CALL)->callsize[1] == 2)					\
-        r2 = ((CALL)->args[1].j) >> 32; 				\
-    }									\
-  case 1:								\
-    if ((CALL)->callsize[0]) {						\
-      r0 = (CALL)->args[0].i;						\
-      if ((CALL)->callsize[0] == 2)					\
-        r1 = ((CALL)->args[0].j) >> 32; 				\
-    }									\
-  case 0:								\
-    asm ("mov lr, pc\n							\
-	  mov pc, %3\n"							\
-        : "=r" (r0), "=r" (r1), "=f" (f0)				\
-	: "r" ((CALL)->function),					\
-	  "0" (r0), "1" (r1), "r" (r2), "r" (r3) 			\
-	: "ip", "rfp", "sl", "fp", "lr" 				\
-	);								\
-    switch((CALL)->rettype)    						\
-    {									\
-    case 'D':								\
-        asm("stfd %1,%0" : "=m" ((CALL)->ret->d) : "f" (f0));		\
-	break;								\
-    case 'F':								\
-	asm("stfs %1,%0" : "=m" ((CALL)->ret->f) : "f" (f0));		\
-	break;								\
-    case 'L':								\
-	(CALL)->ret->l = r0;						\
-	break;								\
-    case 'J':								\
-	(&(CALL)->ret->i)[1] = r1;					\
-	/* follow through */						\
-    default:								\
-	(CALL)->ret->i = r0;						\
-    }									\
-    break;								\
-  }									\
-} while (0)
-
+#if NEED_sysdepCallMethod
+static inline void sysdepCallMethod(callMethodInfo *call) {
+  int extraargs[(call->nrargs>4)?(call->nrargs-4):0];
+  switch(call->nrargs) {
+    register int r0 asm("r0");
+    register int r1 asm("r1");
+    register int r2 asm("r2");
+    register int r3 asm("r3");
+    register double f0 asm("f0");
+  default:
+    {
+      int *args = extraargs;
+      int argidx = 4;
+      if (call->callsize[3] == 2) {
+	*args++ = (call->args[argidx].j) >> 32;
+	}
+      for(; argidx < call->nrargs; ++argidx) {
+	if (call->callsize[argidx]) {
+	  *args++ = call->args[argidx].i;
+	  if (call->callsize[argidx] == 2)
+	    *args++ = (call->args[argidx].j) >> 32;
+	}
+      }
+    }
+  case 4:
+    if (call->callsize[3]) {
+      r3 = call->args[3].i;
+      if (call->callsize[3] == 2)
+        *extraargs = (call->args[3].j) >> 32;
+    }
+  case 3:
+    if (call->callsize[2]) {
+      r2 = call->args[2].i;
+      if (call->callsize[2] == 2)
+        r3 = (call->args[2].j) >> 32;
+    }
+  case 2:
+    if (call->callsize[1]) {
+      r1 = call->args[1].i;
+      if (call->callsize[1] == 2)
+        r2 = (call->args[1].j) >> 32;
+    }
+  case 1:
+    if (call->callsize[0]) {
+      r0 = call->args[0].i;
+      if (call->callsize[0] == 2)
+        r1 = (call->args[0].j) >> 32;
+    }
+  case 0:
+    asm ("mov lr, pc\n"
+"	  mov pc, %3\n"
+        : "=r" (r0), "=r" (r1), "=f" (f0)
+	: "r" (call->function),
+	  "0" (r0), "1" (r1), "r" (r2), "r" (r3)
+	: "ip", "rfp", "sl", "fp", "lr"
+	);
+    switch(call->rettype)
+    {
+    case 'D':
+        asm("stfd %1,%0" : "=m" (call->ret->d) : "f" (f0));
+	break;
+    case 'F':
+	asm("stfs %1,%0" : "=m" (call->ret->f) : "f" (f0));
+	break;
+    /*
+     * XXX doesn't seem to be necessary to special case 'L',
+     * since its just another 32bit int, right !??!??
+    case 'L':
+	call->ret->l = r0;
+	break;
+	*/
+    case 'J':
+	(&call->ret->i)[1] = r1;
+	/* follow through */
+    default:
+	call->ret->i = r0;
+    }
+    break;
+  }									
+}
+#endif
 
 /*
  * Do an atomic exchange.  The contents of address 'A' is exchanged
Index: kaffe/config/arm/jit.h
diff -u kaffe/config/arm/jit.h:1.9 kaffe/config/arm/jit.h:1.10
--- kaffe/config/arm/jit.h:1.9	Wed Aug 27 20:07:24 2003
+++ kaffe/config/arm/jit.h	Tue Sep 30 19:50:54 2003
@@ -32,20 +32,20 @@
 
 /* Structure of exception frame on stack */
 typedef struct _exceptionFrame {
-        char*   retfp;		/* should be "addr_t" */
-        char*   retsp;
-        char*   retpc;
+        uintp   retfp;
+        uintp   retsp;
+        uintp   retpc;
 } exceptionFrame;
 
 /* Get the next frame in the chain */
 #define NEXTFRAME(f)                                                    \
-        ((uintp)((exceptionFrame*)(f))->retfp - sizeof(exceptionFrame))
+        (((exceptionFrame*)(f))->retfp - sizeof(exceptionFrame))
 
 /* Extract the PC from the given frame */
 #define PCFRAME(f)                                                      \
-        ((uintp)((f)->retpc - 4))
+        ((f)->retpc - 4)
 #define FPFRAME(f)							\
-	((uintp)((f)->retfp))
+	((f)->retfp)
 
 /* Get the first exception frame from a subroutine call */
 #define FIRSTFRAME(f, o)                                                \
Index: kaffe/config/arm/linux/jit-md.h
diff -u kaffe/config/arm/linux/jit-md.h:1.5 kaffe/config/arm/linux/jit-md.h:1.6
--- kaffe/config/arm/linux/jit-md.h:1.5	Thu Sep 18 18:29:02 2003
+++ kaffe/config/arm/linux/jit-md.h	Tue Sep 30 19:50:54 2003
@@ -17,6 +17,9 @@
 /**/
 #include "arm/jit.h"
 
+#undef FIRSTFRAME
+#define FIRSTFRAME(f, o) (f) = *(exceptionFrame *)__builtin_frame_address(0)
+
 /**/
 /* Extra exception handling information. */
 /**/
@@ -43,14 +46,6 @@
 #if defined(SA_SIGINFO)
 #undef SA_SIGINFO
 #endif
-
-/* It looks like the linux kernel sets r0 to the signal number
- * and passes a pointer to the context as the fourth argument
- * use this hack to account for that.  -- gback
- *
- * Undef when this gets fixed -- check arch/arm/kernel/signal.c
- */
-#define ARM_LINUX_HACK
 
 #define EXCEPTIONPROTO SIGNAL_ARGS(sig, ctx)
 
Index: kaffe/config/arm/linux/md.h
diff -u kaffe/config/arm/linux/md.h:1.4 kaffe/config/arm/linux/md.h:1.5
--- kaffe/config/arm/linux/md.h:1.4	Thu Sep 18 18:29:02 2003
+++ kaffe/config/arm/linux/md.h	Tue Sep 30 19:50:54 2003
@@ -16,36 +16,17 @@
 #include "arm/threads.h"
 
 
-/* It looks like the linux kernel sets r0 to the signal number
- * and passes a pointer to the context as the fourth argument
- * use this hack to account for that.  -- gback
- *
- * Undef when this gets fixed -- check arch/arm/kernel/signal.c
- */
-#define ARM_LINUX_HACK
-
 /* Function prototype for signal handlers */
 #if defined(HAVE_STRUCT_SIGCONTEXT_STRUCT) && !defined(__GLIBC__)
 /* Linux < 2.1.1 */
-#if defined(ARM_LINUX_HACK)
-#define SIGNAL_ARGS(sig, ctx) \
-        int sig, int r1, int r2, int r3, struct sigcontext_struct ctx
-#else
 #define	SIGNAL_ARGS(sig, ctx) \
 	int sig, struct sigcontext_struct ctx
-#endif /* ARM_LINUX_HACK */
-
 #elif defined(HAVE_STRUCT_SIGCONTEXT) || defined(__GLIBC__)
 /* Linux >= 2.1.1  or Linux 2.0.x with glibc2 */
-#if defined(ARM_LINUX_HACK)
-#define SIGNAL_ARGS(sig, ctx) \
-        int sig, int r1, int r2, int r3, struct sigcontext ctx
-#else
 #define	SIGNAL_ARGS(sig, ctx) \
 	int sig, struct sigcontext ctx
-#endif /* ARM_LINUX_HACK */
 #else
-#error Do not know how to define EXCEPTIONPROTO
+#error Do not know how to define SIGNAL_ARGS
 #endif
 
 #define GET_SIGNAL_CONTEXT_POINTER(ctx) (&ctx)
@@ -78,8 +59,11 @@
 #undef SP_OFFSET
 #undef FP_OFFSET
 
-/* arm/linux/elf (NetWinder) */
-#define SP_OFFSET               20
-#define FP_OFFSET               19
+/*
+ * figured by looking at sysdeps/arm/bits/setjmp.h
+ * and sysdeps/arm/setjmp.S from glibc
+ */ 
+#define SP_OFFSET	8
+#define FP_OFFSET	7
 
 #endif
Index: kaffe/libraries/clib/math/BigInteger.c
diff -u kaffe/libraries/clib/math/BigInteger.c:1.19 kaffe/libraries/clib/math/BigInteger.c:1.20
--- kaffe/libraries/clib/math/BigInteger.c:1.19	Fri Sep  5 17:35:30 2003
+++ kaffe/libraries/clib/math/BigInteger.c	Tue Sep 30 19:50:53 2003
@@ -590,7 +590,7 @@
 	gmp_not_found(env);
 }
 
-void
+jint
 Java_java_math_BigInteger_assignString0(JNIEnv* env, jobject r, jstring val, jint radix)
 {
 	gmp_not_found(env);