PatchSet 4150 
Date: 2003/11/02 17:51:58
Author: stack
Branch: HEAD
Tag: (none) 
Log:
Fix jit bug reported by Jim

Members: 
        ChangeLog:1.1742->1.1743 
        kaffe/kaffevm/jit3/machine.c:1.43->1.44 
        kaffe/kaffevm/jit3/seq.c:1.7->1.8 
        kaffe/kaffevm/jit3/seq.h:1.8->1.9 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1742 kaffe/ChangeLog:1.1743
--- kaffe/ChangeLog:1.1742      Sun Nov  2 16:01:55 2003
+++ kaffe/ChangeLog     Sun Nov  2 17:51:58 2003
@@ -1,3 +1,17 @@
+2003-11-02  Timothy S. Stack <[EMAIL PROTECTED]>
+
+       * kaffe/kaffevm/jit3/machine.c:
+       Merge checkCaughtException stuff from jit1, so that we only
+       generate extra spill code if an instruction is actually in an
+       exception handler.  Also, be sure to spill dead slots within an
+       exception handler, otherwise subsequent basic blocks might read a
+       bogus value.
+
+       * kaffe/kaffevm/jit3/seq.h,
+       kaffe/kaffevm/jit3/seq.c:
+       Store the current willcatch flags in the sequence structure so
+       they can be referenced later.
+       
 2003-11-02  Guilhem Lavaux <[EMAIL PROTECTED]>
 
        * librairies/clib/zip/Deflater.c: Readded DBG macro.
Index: kaffe/kaffe/kaffevm/jit3/machine.c
diff -u kaffe/kaffe/kaffevm/jit3/machine.c:1.43 kaffe/kaffe/kaffevm/jit3/machine.c:1.44
--- kaffe/kaffe/kaffevm/jit3/machine.c:1.43     Sat Oct 11 20:45:50 2003
+++ kaffe/kaffe/kaffevm/jit3/machine.c  Sun Nov  2 17:51:59 2003
@@ -1,7 +1,7 @@
 /* machine.c
  * Translate the Kaffe instruction set to the native one.
  *
- * Copyright (c) 1996-1999
+ * Copyright (c) 1996-1999, 2003
  *     Transvirtual Technologies, Inc.  All rights reserved.
  *
  * Cross-language profiling changes contributed by
@@ -106,6 +106,16 @@
 } jitStats;
 
 static jboolean generateInsnSequence(errorInfo*);
+
+/**
+ * Look for exception handlers that enclose the given PC in the given method.
+ * If a match is found, it will set the appropriate willcatch flags.
+ *
+ * @param meth The method that may contain an exception handler.
+ * @param pc The location within the method to look for a handler.
+ */
+static void checkCaughtExceptions(Method* meth, int pc);
+
 static void initFakeCalls(void);
 static void makeFakeCalls(void);
 static void relinkFakeCalls(void);
@@ -245,26 +255,6 @@
        base = (bytecode*)METHOD_BYTECODE_CODE(xmeth);
        len = METHOD_BYTECODE_LEN(xmeth);
 
-       willcatch.ANY = false;
-       willcatch.BADARRAYINDEX = false;
-
-       /* Deterimine various exception conditions */
-       if (xmeth->exception_table != 0) {
-               willCatch(ANY);
-               for (i = 0; i < (int)xmeth->exception_table->length; i++) {
-                       Hjava_lang_Class* etype;
-                       etype = xmeth->exception_table->entry[i].catch_type;
-                       if (etype == 0) {
-                               willCatch(BADARRAYINDEX);
-                       }
-                       else {
-                               if (instanceof(javaLangArrayIndexOutOfBoundsException, 
etype)) {
-                                       willCatch(BADARRAYINDEX);
-                               }
-                       }
-               }
-       }
-
        /*
         * Initialise the translator.
         */
@@ -315,6 +305,9 @@
                         continue;
                 }
 
+               /* Determine various exception conditions */
+               checkCaughtExceptions(xmeth, pc);
+
                start_instruction();
 
                /* Note start of exception handling blocks */
@@ -790,6 +783,17 @@
                                if ((m & 1) != 0) {
                                        assert(!isGlobal(t->u[i].slot));
                                        slot_kill_readonce(t->u[i].slot);
+                                       /*
+                                        * If this sequence is in an exception
+                                        * handler we need to spill the slot
+                                        * in case its used in a subsequent
+                                        * basic block.
+                                        */
+                                       if( t->jflags.ANY )
+                                       {
+                                               spillAndUpdate(t->u[i].slot,
+                                                              true);
+                                       }
                                        slot_invalidate(t->u[i].slot);
                                }
                        }
@@ -803,6 +807,48 @@
 }
 
 /*
+ * check what synchronous exceptions are caught for a given instruction
+ */
+static
+void 
+checkCaughtExceptions(Method* meth, int pc)
+{
+       int i;
+
+       willcatch.ANY = false;
+       willcatch.BADARRAYINDEX = false;
+       willcatch.NULLPOINTER = false;
+
+       if (meth->exception_table == 0) 
+               return;
+
+       /* Determine various exception conditions */
+       for (i = 0; i < meth->exception_table->length; i++) {
+               Hjava_lang_Class* etype;
+
+               /* include only if exception handler range matches pc */
+               if (meth->exception_table->entry[i].start_pc > pc ||
+                   meth->exception_table->entry[i].end_pc <= pc)
+                       continue;
+
+               willCatch(ANY);
+               etype = meth->exception_table->entry[i].catch_type;
+               if (etype == 0) {
+                       willCatch(BADARRAYINDEX);
+                       willCatch(NULLPOINTER);
+               }
+               else {
+                       if (instanceof(javaLangArrayIndexOutOfBoundsException, etype)) 
{
+                               willCatch(BADARRAYINDEX);
+                       }
+                       if (instanceof(javaLangNullPointerException, etype)) {
+                               willCatch(NULLPOINTER);
+                       }
+               }
+       }
+}
+
+/*
  * Start a new instruction.
  */
 void
@@ -848,7 +894,7 @@
                                break;
 
                        case SR_FUNCTION:
-                               if (calleeSave(sd->regno) == 0 || canCatch(ANY) != 0) {
+                               if (calleeSave(sd->regno) == 0 || s->jflags.ANY != 0) {
                                        spillAndUpdate(sd, true);
                                }
                                break;
Index: kaffe/kaffe/kaffevm/jit3/seq.c
diff -u kaffe/kaffe/kaffevm/jit3/seq.c:1.7 kaffe/kaffe/kaffevm/jit3/seq.c:1.8
--- kaffe/kaffe/kaffevm/jit3/seq.c:1.7  Sun Sep 21 18:18:19 2003
+++ kaffe/kaffe/kaffevm/jit3/seq.c      Sun Nov  2 17:51:59 2003
@@ -1,7 +1,7 @@
 /* seq.c
  * Pseudo instruction sequences.
  *
- * Copyright (c) 1996, 1997
+ * Copyright (c) 1996, 1997, 2003
  *     Transvirtual Technologies, Inc.  All rights reserved.
  *
  * See the file "license.terms" for information on usage and redistribution 
@@ -81,6 +81,7 @@
        currSeq = ret->next;
        ret->lastuse = 0;
        ret->refed = 1;
+       ret->jflags = willcatch;
        activeSeq = ret;
        return (ret);
 }
Index: kaffe/kaffe/kaffevm/jit3/seq.h
diff -u kaffe/kaffe/kaffevm/jit3/seq.h:1.8 kaffe/kaffe/kaffevm/jit3/seq.h:1.9
--- kaffe/kaffe/kaffevm/jit3/seq.h:1.8  Sun Sep 21 18:18:19 2003
+++ kaffe/kaffe/kaffevm/jit3/seq.h      Sun Nov  2 17:51:59 2003
@@ -1,7 +1,7 @@
 /* seq.h
  * Pseudo instruction sequences.
  *
- * Copyright (c) 1996, 1997
+ * Copyright (c) 1996, 1997, 2003
  *     Transvirtual Technologies, Inc.  All rights reserved.
  *
  * See the file "license.terms" for information on usage and redistribution 
@@ -11,6 +11,8 @@
 #ifndef __seq_hh
 #define __seq_hh
 
+#include "machine.h"
+
 struct _sequence;
 struct _label_;
 
@@ -46,6 +48,7 @@
        uint8                   type;
        uint8                   refed;
        uint32                  lastuse;
+       jitflags                jflags;
        struct _sequence*       next;
 } sequence;
 

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

Reply via email to