X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libjava%2Finterpret.cc;h=3f690d7b27c0b95e66868fb63aefde0ff5c283a1;hb=5da6fa05fce074f0fb238921383ba76838835c4d;hp=b078676365b2477d1c03995e6360bc971d158633;hpb=e51141364148bd97ff910aa6bac4b74bb3936b13;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libjava/interpret.cc b/libjava/interpret.cc index b078676365b..3f690d7b27c 100644 --- a/libjava/interpret.cc +++ b/libjava/interpret.cc @@ -43,8 +43,6 @@ details. */ #include #include -#ifdef INTERPRETER - // Execution engine for interpreted code. _Jv_InterpreterEngine _Jv_soleInterpreterEngine; @@ -80,10 +78,15 @@ static void find_catch_location (jthrowable, jthread, jmethodID *, jlong *); // the Class monitor as user code in another thread could hold it. static _Jv_Mutex_t compile_mutex; +// See class ThreadCountAdjuster and REWRITE_INSN for how this is +// used. +_Jv_Mutex_t _Jv_InterpMethod::rewrite_insn_mutex; + void _Jv_InitInterpreter() { _Jv_MutexInit (&compile_mutex); + _Jv_MutexInit (&_Jv_InterpMethod::rewrite_insn_mutex); } #else void _Jv_InitInterpreter() {} @@ -348,7 +351,7 @@ get4 (unsigned char* loc) void _Jv_InterpMethod::run_normal (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -358,7 +361,7 @@ _Jv_InterpMethod::run_normal (ffi_cif *, void _Jv_InterpMethod::run_normal_debug (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -368,7 +371,7 @@ _Jv_InterpMethod::run_normal_debug (ffi_cif *, void _Jv_InterpMethod::run_synch_object (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -382,7 +385,7 @@ _Jv_InterpMethod::run_synch_object (ffi_cif *, void _Jv_InterpMethod::run_synch_object_debug (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -396,7 +399,7 @@ _Jv_InterpMethod::run_synch_object_debug (ffi_cif *, void _Jv_InterpMethod::run_class (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -407,7 +410,7 @@ _Jv_InterpMethod::run_class (ffi_cif *, void _Jv_InterpMethod::run_class_debug (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -418,7 +421,7 @@ _Jv_InterpMethod::run_class_debug (ffi_cif *, void _Jv_InterpMethod::run_synch_class (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -433,7 +436,7 @@ _Jv_InterpMethod::run_synch_class (ffi_cif *, void _Jv_InterpMethod::run_synch_class_debug (ffi_cif *, void *ret, - ffi_raw *args, + INTERP_FFI_RAW_TYPE *args, void *__this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -947,6 +950,25 @@ _Jv_InterpMethod::compile (const void * const *insn_targets) prepared = insns; + // Now remap the variable table for this method. + for (int i = 0; i < local_var_table_len; ++i) + { + int start_byte = local_var_table[i].bytecode_pc; + if (start_byte < 0 || start_byte >= code_length) + start_byte = 0; + jlocation start = pc_mapping[start_byte]; + + int end_byte = start_byte + local_var_table[i].length; + if (end_byte < 0) + end_byte = 0; + jlocation end = ((end_byte >= code_length) + ? number_insn_slots + : pc_mapping[end_byte]); + + local_var_table[i].pc = &insns[start]; + local_var_table[i].length = end - start + 1; + } + if (breakpoint_insn == NULL) { bp_insn_slot.insn = const_cast (insn_targets[op_breakpoint]); @@ -958,9 +980,10 @@ _Jv_InterpMethod::compile (const void * const *insn_targets) /* Run the given method. When args is NULL, don't run anything -- just compile it. */ void -_Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth) +_Jv_InterpMethod::run (void *retp, INTERP_FFI_RAW_TYPE *args, + _Jv_InterpMethod *meth) { -#undef DEBUG +#undef __GCJ_DEBUG #undef DEBUG_LOCALS_INSN #define DEBUG_LOCALS_INSN(s, t) do {} while (0) @@ -968,9 +991,10 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth) } void -_Jv_InterpMethod::run_debug (void *retp, ffi_raw *args, _Jv_InterpMethod *meth) +_Jv_InterpMethod::run_debug (void *retp, INTERP_FFI_RAW_TYPE *args, + _Jv_InterpMethod *meth) { -#define DEBUG +#define __GCJ_DEBUG #undef DEBUG_LOCALS_INSN #define DEBUG_LOCALS_INSN(s, t) \ do \ @@ -1289,27 +1313,32 @@ _Jv_init_cif (_Jv_Utf8Const* signature, return item_count; } -#if FFI_NATIVE_RAW_API -# define FFI_PREP_RAW_CLOSURE ffi_prep_raw_closure_loc -# define FFI_RAW_SIZE ffi_raw_size -#else -# define FFI_PREP_RAW_CLOSURE ffi_prep_java_raw_closure_loc -# define FFI_RAW_SIZE ffi_java_raw_size -#endif - /* we put this one here, and not in interpret.cc because it * calls the utility routines _Jv_count_arguments * which are static to this module. The following struct defines the * layout we use for the stubs, it's only used in the ncode method. */ +#if FFI_NATIVE_RAW_API +# define FFI_PREP_RAW_CLOSURE ffi_prep_raw_closure_loc +# define FFI_RAW_SIZE ffi_raw_size typedef struct { ffi_raw_closure closure; _Jv_ClosureList list; ffi_cif cif; ffi_type *arg_types[0]; } ncode_closure; - -typedef void (*ffi_closure_fun) (ffi_cif*,void*,ffi_raw*,void*); +typedef void (*ffi_closure_fun) (ffi_cif*,void*,INTERP_FFI_RAW_TYPE*,void*); +#else +# define FFI_PREP_RAW_CLOSURE ffi_prep_java_raw_closure_loc +# define FFI_RAW_SIZE ffi_java_raw_size +typedef struct { + ffi_java_raw_closure closure; + _Jv_ClosureList list; + ffi_cif cif; + ffi_type *arg_types[0]; +} ncode_closure; +typedef void (*ffi_closure_fun) (ffi_cif*,void*,ffi_java_raw*,void*); +#endif void * _Jv_InterpMethod::ncode (jclass klass) @@ -1515,7 +1544,11 @@ _Jv_InterpMethod::get_local_var_table (char **name, char **sig, char **generic_sig, jlong *startloc, jint *length, jint *slot, int table_slot) -{ +{ +#ifdef DIRECT_THREADED + _Jv_CompileMethod (this); +#endif + if (local_var_table == NULL) return -2; if (table_slot >= local_var_table_len) @@ -1526,12 +1559,15 @@ _Jv_InterpMethod::get_local_var_table (char **name, char **sig, *sig = local_var_table[table_slot].descriptor; *generic_sig = local_var_table[table_slot].descriptor; - *startloc = static_cast - (local_var_table[table_slot].bytecode_start_pc); +#ifdef DIRECT_THREADED + *startloc = insn_index (local_var_table[table_slot].pc); +#else + *startloc = static_cast (local_var_table[table_slot].bytecode_pc); +#endif *length = static_cast (local_var_table[table_slot].length); *slot = static_cast (local_var_table[table_slot].slot); } - return local_var_table_len - table_slot -1; + return local_var_table_len - table_slot - 1; } pc_t @@ -1580,6 +1616,23 @@ _Jv_InterpMethod::set_insn (jlong index, pc_t insn) return &code[index]; } +bool +_Jv_InterpMethod::breakpoint_at (jlong index) +{ + pc_t insn = get_insn (index); + if (insn != NULL) + { +#ifdef DIRECT_THREADED + return (insn->insn == breakpoint_insn->insn); +#else + pc_t code = reinterpret_cast (bytecode ()); + return (code[index] == breakpoint_insn); +#endif + } + + return false; +} + void * _Jv_JNIMethod::ncode (jclass klass) { @@ -1666,7 +1719,7 @@ throw_class_format_error (const char *msg) CATCH_LOCATION with the method and location where the catch will occur. If the exception is not caught, these are set to 0. - This function should only be used with the DEBUG interpreter. */ + This function should only be used with the __GCJ_DEBUG interpreter. */ static void find_catch_location (::java::lang::Throwable *exc, jthread thread, jmethodID *catch_method, jlong *catch_loc) @@ -1698,7 +1751,7 @@ find_catch_location (::java::lang::Throwable *exc, jthread thread, caught (if it is caught). Like find_catch_location, this should only be called with the - DEBUG interpreter. Since a few exceptions occur outside the + __GCJ_DEBUG interpreter. Since a few exceptions occur outside the interpreter proper, it is important to not call this function without checking JVMTI_REQUESTED_EVENT(Exception) first. */ void @@ -1889,5 +1942,3 @@ _Jv_CompileMethod (_Jv_InterpMethod* method) } } #endif // DIRECT_THREADED - -#endif // INTERPRETER