Riccardo and m68k-linux lovers,

on 4/14/04 10:10 AM, Kiyo Inaba at [EMAIL PROTECTED] wrote:
> I have slightly different behavior, but the result (kjc is not useable)
> is same. Let me investigate more...

OK, self compiling finished (after, say, 10 hours of configure/compiling)
and it started to compile javalib by using kjc. I attached a patch
against cvs-040408 (maybe ok for cvs-head also).

The problem is if you use automatic array for the argument of a function,
this function can not be inlined. I just backport macro version for
sysdepCallMethod.

Kiyo

diff -Naur kaffe-snap-040408.orig/config/m68k/linux/md.h 
kaffe-snap-040408/config/m68k/linux/md.h
--- kaffe-snap-040408.orig/config/m68k/linux/md.h       2004-03-10 00:15:35.000000000 
+0900
+++ kaffe-snap-040408/config/m68k/linux/md.h    2004-04-14 22:10:48.000000000 +0900
@@ -51,46 +51,44 @@
  *     statement below is a 'because it works' version.
  */
 //     Linux version
-static inline void sysdepCallMethod(callMethodInfo *call)
-{
-       int extraargs[(call)->nrargs];
-       register int d0 asm ("d0");
-       register int d1 asm ("d1");
-       register double f0d asm ("fp0");
-       register float f0f asm ("fp0");
-       int *res;
-       int *args = extraargs;
-       int argidx;
-       for(argidx = 0; argidx < (call)->nrargs; ++argidx) {
-               if ((call)->callsize[argidx])
-                       *args++ = (call)->args[argidx].i;
-               else
-                       *args++ = (call)->args[argidx-1].j;
-       }
-       asm volatile ("jsr      [EMAIL PROTECTED]"
-                     : "=r" (d0), "=r" (d1)
-                     : "a" ((call)->function)
-                     : "cc", "memory");
-       if ((call)->retsize != 0) {
-               res = (int *)(call)->ret;
-       switch((call)->retsize) {
-       case 2:
-         if ((call)->rettype == 'D')
-           *(double*)res = f0d;
-         else {
-               res[1] = d1;
-               res[0] = d0;
-         }
-         break;
-       case 1:
-         if ((call)->rettype == 'F')
-           *(double*)res = f0f;
-         else
-               res[0] = d0;
-         break;
-       }
-       }
-}
+#define sysdepCallMethod(CALL) do {                            \
+       int extraargs[(CALL)->nrargs];                          \
+       register int d0 asm ("d0");                             \
+       register int d1 asm ("d1");                             \
+       register double f0d asm ("fp0");                        \
+       register float f0f asm ("fp0");                         \
+       int *res;                                               \
+       int *args = extraargs;                                  \
+       int argidx;                                             \
+       for(argidx = 0; argidx < (CALL)->nrargs; ++argidx) {    \
+               if ((CALL)->callsize[argidx])                   \
+                       *args++ = (CALL)->args[argidx].i;       \
+               else                                            \
+                       *args++ = (CALL)->args[argidx-1].j;     \
+       }                                                       \
+       asm volatile ("jsr      [EMAIL PROTECTED]"                              \
+        : "=r" (d0), "=r" (d1)                                 \
+        : "a" ((CALL)->function)                               \
+        : "cc", "memory");                                     \
+       if ((CALL)->retsize != 0) {                             \
+               res = (int *)(CALL)->ret;                       \
+       switch((CALL)->retsize) {                               \
+       case 2:                                                 \
+         if ((CALL)->rettype == 'D')                           \
+           *(double*)res = f0d;                                \
+         else {                                                \
+               res[1] = d1;                                    \
+               res[0] = d0;                                    \
+         }                                                     \
+         break;                                                \
+       case 1:                                                 \
+         if ((CALL)->rettype == 'F')                           \
+           *(double*)res = f0f;                                \
+         else                                                  \
+               res[0] = d0;                                    \
+         break;                                                \
+       }                                                       \
+       }                                                       \
+} while (0)
 
 #endif /* __m68k_linux_md_h */
-



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

Reply via email to