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