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  <[EMAIL PROTECTED]>
+
+       * 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 <[EMAIL PROTECTED]>
 
        * 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);

_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to