From 16b541414ff612aa5c71fb2cd91f1f1d172da7d0 Mon Sep 17 00:00:00 2001 From: twisti Date: Tue, 12 Jul 2005 20:58:01 +0000 Subject: [PATCH] * show_icmd_method: use a monitor since the binutils disassembler is not reentrantable and it would be unreadable if 2 or more thread write assembler * stack_init: added --- src/vm/jit/helper.c | 35 +------ src/vm/jit/jit.c | 224 +++++++++++++++++++++++--------------------- src/vm/jit/stack.c | 49 +++++++++- src/vm/jit/stack.h | 4 +- 4 files changed, 168 insertions(+), 144 deletions(-) diff --git a/src/vm/jit/helper.c b/src/vm/jit/helper.c index 61c83bdab..17e98aeeb 100644 --- a/src/vm/jit/helper.c +++ b/src/vm/jit/helper.c @@ -28,7 +28,7 @@ Changes: - $Id: helper.c 2955 2005-07-09 13:55:06Z twisti $ + $Id: helper.c 3007 2005-07-12 20:58:01Z twisti $ */ @@ -61,39 +61,8 @@ classinfo *helper_resolve_classinfo(constant_classref *cr) /* resolve and load the class */ - if (!resolve_classref(NULL, cr, resolveEager, true, true, &c)) { - java_objectheader *xptr; - java_objectheader *cause; - - /* get the cause */ - - cause = *exceptionptr; - - /* convert ClassNotFoundException's to NoClassDefFoundError's */ - - if (builtin_instanceof(cause, class_java_lang_ClassNotFoundException)) { - /* clear exception, because we are calling jit code again */ - - *exceptionptr = NULL; - - /* create new error */ - - xptr = - new_exception_javastring(string_java_lang_NoClassDefFoundError, - ((java_lang_Throwable *) cause)->detailMessage); - - /* we had an exception while creating the error */ - - if (*exceptionptr) - return NULL; - - /* set new exception */ - - *exceptionptr = xptr; - } - + if (!resolve_classref(NULL, cr, resolveEager, true, true, &c)) return NULL; - } /* return the classinfo pointer */ diff --git a/src/vm/jit/jit.c b/src/vm/jit/jit.c index f06de7d24..a0505b0fd 100644 --- a/src/vm/jit/jit.c +++ b/src/vm/jit/jit.c @@ -30,7 +30,7 @@ Changes: Edwin Steiner Christian Thalinger - $Id: jit.c 2953 2005-07-09 13:38:42Z twisti $ + $Id: jit.c 3007 2005-07-12 20:58:01Z twisti $ */ @@ -1174,7 +1174,122 @@ char *opcode_names[256] = { }; -/* include compiler subsystems ************************************************/ +/* jit_init ******************************************************************** + + Initializes the JIT subsystem. + +*******************************************************************************/ + +void jit_init(void) +{ + s4 i; + +#if defined(__ALPHA__) + has_ext_instr_set = ! has_no_x_instr_set(); +#endif + + for (i = 0; i < 256; i++) + stackreq[i] = 1; + + stackreq[JAVA_NOP] = 0; + stackreq[JAVA_ISTORE] = 0; + stackreq[JAVA_LSTORE] = 0; + stackreq[JAVA_FSTORE] = 0; + stackreq[JAVA_DSTORE] = 0; + stackreq[JAVA_ASTORE] = 0; + stackreq[JAVA_ISTORE_0] = 0; + stackreq[JAVA_ISTORE_1] = 0; + stackreq[JAVA_ISTORE_2] = 0; + stackreq[JAVA_ISTORE_3] = 0; + stackreq[JAVA_LSTORE_0] = 0; + stackreq[JAVA_LSTORE_1] = 0; + stackreq[JAVA_LSTORE_2] = 0; + stackreq[JAVA_LSTORE_3] = 0; + stackreq[JAVA_FSTORE_0] = 0; + stackreq[JAVA_FSTORE_1] = 0; + stackreq[JAVA_FSTORE_2] = 0; + stackreq[JAVA_FSTORE_3] = 0; + stackreq[JAVA_DSTORE_0] = 0; + stackreq[JAVA_DSTORE_1] = 0; + stackreq[JAVA_DSTORE_2] = 0; + stackreq[JAVA_DSTORE_3] = 0; + stackreq[JAVA_ASTORE_0] = 0; + stackreq[JAVA_ASTORE_1] = 0; + stackreq[JAVA_ASTORE_2] = 0; + stackreq[JAVA_ASTORE_3] = 0; + stackreq[JAVA_IASTORE] = 0; + stackreq[JAVA_LASTORE] = 0; + stackreq[JAVA_FASTORE] = 0; + stackreq[JAVA_DASTORE] = 0; + stackreq[JAVA_AASTORE] = 0; + stackreq[JAVA_BASTORE] = 0; + stackreq[JAVA_CASTORE] = 0; + stackreq[JAVA_SASTORE] = 0; + stackreq[JAVA_POP] = 0; + stackreq[JAVA_POP2] = 0; + stackreq[JAVA_IINC] = 0; + stackreq[JAVA_IFEQ] = 0; + stackreq[JAVA_IFNE] = 0; + stackreq[JAVA_IFLT] = 0; + stackreq[JAVA_IFGE] = 0; + stackreq[JAVA_IFGT] = 0; + stackreq[JAVA_IFLE] = 0; + stackreq[JAVA_IF_ICMPEQ] = 0; + stackreq[JAVA_IF_ICMPNE] = 0; + stackreq[JAVA_IF_ICMPLT] = 0; + stackreq[JAVA_IF_ICMPGE] = 0; + stackreq[JAVA_IF_ICMPGT] = 0; + stackreq[JAVA_IF_ICMPLE] = 0; + stackreq[JAVA_IF_ACMPEQ] = 0; + stackreq[JAVA_IF_ACMPNE] = 0; + stackreq[JAVA_GOTO] = 0; + stackreq[JAVA_RET] = 0; + stackreq[JAVA_TABLESWITCH] = 0; + stackreq[JAVA_LOOKUPSWITCH] = 0; + stackreq[JAVA_IRETURN] = 0; + stackreq[JAVA_LRETURN] = 0; + stackreq[JAVA_FRETURN] = 0; + stackreq[JAVA_DRETURN] = 0; + stackreq[JAVA_ARETURN] = 0; + stackreq[JAVA_RETURN] = 0; + stackreq[JAVA_PUTSTATIC] = 0; + stackreq[JAVA_PUTFIELD] = 0; + stackreq[JAVA_MONITORENTER] = 0; + stackreq[JAVA_MONITOREXIT] = 0; + stackreq[JAVA_WIDE] = 0; + stackreq[JAVA_IFNULL] = 0; + stackreq[JAVA_IFNONNULL] = 0; + stackreq[JAVA_GOTO_W] = 0; + stackreq[JAVA_BREAKPOINT] = 0; + + stackreq[JAVA_SWAP] = 2; + stackreq[JAVA_DUP2] = 2; + stackreq[JAVA_DUP_X1] = 3; + stackreq[JAVA_DUP_X2] = 4; + stackreq[JAVA_DUP2_X1] = 3; + stackreq[JAVA_DUP2_X2] = 4; + + /* initialize stack analysis subsystem */ + + (void) stack_init(); + + /* initialize codegen subsystem */ + + codegen_init(); +} + + +/* jit_close ******************************************************************* + + Close the JIT subsystem. + +*******************************************************************************/ + +void jit_close(void) +{ + /* do nothing */ +} + /* dummy function, used when there is no JavaVM code available */ @@ -1520,111 +1635,6 @@ void compile_all_class_methods(classinfo *c) } -/* jit_init ******************************************************************** - - XXX - -*******************************************************************************/ - -void jit_init(void) -{ - s4 i; - -#if defined(__ALPHA__) - has_ext_instr_set = ! has_no_x_instr_set(); -#endif - - for (i = 0; i < 256; i++) - stackreq[i] = 1; - - stackreq[JAVA_NOP] = 0; - stackreq[JAVA_ISTORE] = 0; - stackreq[JAVA_LSTORE] = 0; - stackreq[JAVA_FSTORE] = 0; - stackreq[JAVA_DSTORE] = 0; - stackreq[JAVA_ASTORE] = 0; - stackreq[JAVA_ISTORE_0] = 0; - stackreq[JAVA_ISTORE_1] = 0; - stackreq[JAVA_ISTORE_2] = 0; - stackreq[JAVA_ISTORE_3] = 0; - stackreq[JAVA_LSTORE_0] = 0; - stackreq[JAVA_LSTORE_1] = 0; - stackreq[JAVA_LSTORE_2] = 0; - stackreq[JAVA_LSTORE_3] = 0; - stackreq[JAVA_FSTORE_0] = 0; - stackreq[JAVA_FSTORE_1] = 0; - stackreq[JAVA_FSTORE_2] = 0; - stackreq[JAVA_FSTORE_3] = 0; - stackreq[JAVA_DSTORE_0] = 0; - stackreq[JAVA_DSTORE_1] = 0; - stackreq[JAVA_DSTORE_2] = 0; - stackreq[JAVA_DSTORE_3] = 0; - stackreq[JAVA_ASTORE_0] = 0; - stackreq[JAVA_ASTORE_1] = 0; - stackreq[JAVA_ASTORE_2] = 0; - stackreq[JAVA_ASTORE_3] = 0; - stackreq[JAVA_IASTORE] = 0; - stackreq[JAVA_LASTORE] = 0; - stackreq[JAVA_FASTORE] = 0; - stackreq[JAVA_DASTORE] = 0; - stackreq[JAVA_AASTORE] = 0; - stackreq[JAVA_BASTORE] = 0; - stackreq[JAVA_CASTORE] = 0; - stackreq[JAVA_SASTORE] = 0; - stackreq[JAVA_POP] = 0; - stackreq[JAVA_POP2] = 0; - stackreq[JAVA_IINC] = 0; - stackreq[JAVA_IFEQ] = 0; - stackreq[JAVA_IFNE] = 0; - stackreq[JAVA_IFLT] = 0; - stackreq[JAVA_IFGE] = 0; - stackreq[JAVA_IFGT] = 0; - stackreq[JAVA_IFLE] = 0; - stackreq[JAVA_IF_ICMPEQ] = 0; - stackreq[JAVA_IF_ICMPNE] = 0; - stackreq[JAVA_IF_ICMPLT] = 0; - stackreq[JAVA_IF_ICMPGE] = 0; - stackreq[JAVA_IF_ICMPGT] = 0; - stackreq[JAVA_IF_ICMPLE] = 0; - stackreq[JAVA_IF_ACMPEQ] = 0; - stackreq[JAVA_IF_ACMPNE] = 0; - stackreq[JAVA_GOTO] = 0; - stackreq[JAVA_RET] = 0; - stackreq[JAVA_TABLESWITCH] = 0; - stackreq[JAVA_LOOKUPSWITCH] = 0; - stackreq[JAVA_IRETURN] = 0; - stackreq[JAVA_LRETURN] = 0; - stackreq[JAVA_FRETURN] = 0; - stackreq[JAVA_DRETURN] = 0; - stackreq[JAVA_ARETURN] = 0; - stackreq[JAVA_RETURN] = 0; - stackreq[JAVA_PUTSTATIC] = 0; - stackreq[JAVA_PUTFIELD] = 0; - stackreq[JAVA_MONITORENTER] = 0; - stackreq[JAVA_MONITOREXIT] = 0; - stackreq[JAVA_WIDE] = 0; - stackreq[JAVA_IFNULL] = 0; - stackreq[JAVA_IFNONNULL] = 0; - stackreq[JAVA_GOTO_W] = 0; - stackreq[JAVA_BREAKPOINT] = 0; - - stackreq[JAVA_SWAP] = 2; - stackreq[JAVA_DUP2] = 2; - stackreq[JAVA_DUP_X1] = 3; - stackreq[JAVA_DUP_X2] = 4; - stackreq[JAVA_DUP2_X1] = 3; - stackreq[JAVA_DUP2_X2] = 4; - - /* initialize the codegen stuff */ - codegen_init(); -} - - -void jit_close() -{ -} - - /* * These are local overrides for various environment variables in Emacs. * Please do not remove this and leave it at the end of the file, where diff --git a/src/vm/jit/stack.c b/src/vm/jit/stack.c index 03d985654..e556801d9 100644 --- a/src/vm/jit/stack.c +++ b/src/vm/jit/stack.c @@ -30,7 +30,7 @@ Christian Thalinger Christian Ullrich - $Id: stack.c 3001 2005-07-12 16:01:56Z twisti $ + $Id: stack.c 3007 2005-07-12 20:58:01Z twisti $ */ @@ -61,6 +61,29 @@ #include "vm/jit/lsra.h" +/* global variables ***********************************************************/ + +static java_objectheader show_icmd_lock; + + +/* stack_init ****************************************************************** + + Initialized the stack analysis subsystem (called by jit_init). + +*******************************************************************************/ + +bool stack_init(void) +{ + /* initialize the show lock */ + + show_icmd_lock.monitorPtr = get_dummyLR(); + + /* everything's ok */ + + return true; +} + + /**********************************************************************/ /* analyse_stack */ /**********************************************************************/ @@ -2322,11 +2345,25 @@ static char *jit_type[] = { }; +/* show_icmd_method ************************************************************ + + XXX + +*******************************************************************************/ + void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) { - int i, j; - basicblock *bptr; + basicblock *bptr; exceptiontable *ex; + s4 i, j; + +#if defined(USE_THREADS) + /* We need to enter a lock here, since the binutils disassembler is not */ + /* reentrant-able and we could not read functions printed at the same */ + /* time. */ + + builtin_monitorenter(&show_icmd_lock); +#endif printf("\n"); utf_fprint_classname(stdout, m->class->name); @@ -2382,6 +2419,7 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) printf("\n"); } printf("\n"); + #ifdef LSRA if (!opt_lsra) { #endif @@ -2441,6 +2479,7 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) } } printf("\n"); + #ifdef LSRA } #endif @@ -2539,6 +2578,10 @@ void show_icmd_method(methodinfo *m, codegendata *cd, registerdata *rd) printf("\n"); } + +#if defined(USE_THREADS) + builtin_monitorexit(&show_icmd_lock); +#endif } diff --git a/src/vm/jit/stack.h b/src/vm/jit/stack.h index 92a263de9..a49b2e40a 100644 --- a/src/vm/jit/stack.h +++ b/src/vm/jit/stack.h @@ -26,7 +26,7 @@ Authors: Christian Thalinger - $Id: stack.h 2935 2005-07-08 15:06:55Z twisti $ + $Id: stack.h 3007 2005-07-12 20:58:01Z twisti $ */ @@ -389,6 +389,8 @@ /* function prototypes ********************************************************/ +bool stack_init(void); + methodinfo *analyse_stack(methodinfo *m, codegendata *cd, registerdata *rd); void icmd_print_stack(codegendata *cd, stackptr s); -- 2.25.1