Index: vm/include/open/rt_helpers.h =================================================================== --- vm/include/open/rt_helpers.h (revision 645798) +++ vm/include/open/rt_helpers.h (working copy) @@ -214,19 +214,10 @@ * @return None. * * Acquire the monitor associated with the object. - * Throw java/lang/NullPointerException, if the argument is null. + * Doesn't throw java/lang/NullPointerException, if the argument + * is null, it assumes that the argument is non-null. Passing a null argument + * will result in undefined behavior.. */ - VM_RT_MONITOR_ENTER_NON_NULL=304, - /** - * @param Object - * - * @return None. - * - * Acquire the monitor associated with the object. - * This function is identical to VM_RT_MONITOR_ENTER except that it - * assumes that the argument is non-null. Passing a null argument - * will result in undefined behavior. - */ VM_RT_MONITOR_EXIT=301, /** * @param Object @@ -234,24 +225,13 @@ * @return None. * * Release the monitor associated with the object. - * Throw java/lang/NullPointerException, if the argument is null. + * Doesn't throw java/lang/NullPointerException, if the argument + * is null, it assumes that the argument is non-null. Passing a null argument + * will result in undefined behavior. * Throw java/lang/IllegalMonitorStateException, if the current * thread is not the owner of the lock. */ - VM_RT_MONITOR_EXIT_NON_NULL=305, - -/** - * @param Object - * - * @return None. - * - * Release the monitor associated with the object. - * This function is identical to VM_RT_MONITOR_EXIT except that it - * assumes that the argument is non-null. Passing a null argument - * will result in undefined behavior. - * Throw java/lang/IllegalMonitorStateException, if the current thread - * is not the owner of the lock. - */ + VM_RT_MONITOR_ENTER_STATIC=302, /** * @param Class handle @@ -271,6 +251,8 @@ * is not the owner of the lock. */ + VM_RT_CLASS_2_JLC=310, + //// // Type access routines //// Index: vm/vmcore/src/jit/rt_helper_info.cpp =================================================================== --- vm/vmcore/src/jit/rt_helper_info.cpp (revision 645798) +++ vm/vmcore/src/jit/rt_helper_info.cpp (working copy) @@ -86,21 +86,11 @@ "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", "(Ljava/lang/Object;)V", NULL}, - {VM_RT_MONITOR_ENTER_NON_NULL, "VM_RT_MONITOR_ENTER_NON_NULL", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", - "(Ljava/lang/Object;)V", NULL}, - {VM_RT_MONITOR_EXIT, "VM_RT_MONITOR_EXIT", INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", "(Ljava/lang/Object;)V", NULL}, - {VM_RT_MONITOR_EXIT_NON_NULL, "VM_RT_MONITOR_EXIT_NON_NULL", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", - "(Ljava/lang/Object;)V", NULL}, - {VM_RT_MONITOR_ENTER_STATIC, "VM_RT_MONITOR_ENTER_STATIC", INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", @@ -111,6 +101,10 @@ "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", "(Ljava/lang/Object;)V", NULL}, + {VM_RT_CLASS_2_JLC, "VM_RT_CLASS_2_JLC", + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, + {VM_RT_CHECKCAST, "VM_RT_CHECKCAST", INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, "org/apache/harmony/drlvm/VMHelperFastPath", "checkCast", Index: vm/vmcore/src/jit/jit_runtime_support.cpp =================================================================== --- vm/vmcore/src/jit/jit_runtime_support.cpp (revision 645798) +++ vm/vmcore/src/jit/jit_runtime_support.cpp (working copy) @@ -1652,10 +1652,18 @@ //end of lazy resolution helpers ////////////////////////////////////////////////////////////////////////// +#if (defined PLATFORM_POSIX) && (defined _IA32_) +ManagedObject* __attribute__ ((__stdcall__)) rth_struct_Class_to_java_lang_Class(Class *clss) { +#elif defined _IA32_ +ManagedObject* __stdcall rth_struct_Class_to_java_lang_Class(Class *clss) { +#else +ManagedObject* rth_struct_Class_to_java_lang_Class(Class *clss) { +#endif + return struct_Class_to_java_lang_Class(clss); +} - NativeCodePtr rth_get_lil_helper(VM_RT_SUPPORT f) { int* dyn_count = NULL; @@ -1684,6 +1692,10 @@ return rth_wrap_exn_throw(dyn_count, "rth_throw_array_store", exn_get_rth_throw_array_store()); case VM_RT_THROW_LINKING_EXCEPTION: return rth_get_lil_throw_linking_exception(dyn_count); + + case VM_RT_CLASS_2_JLC: + return (NativeCodePtr)rth_struct_Class_to_java_lang_Class; + // Type tests case VM_RT_CHECKCAST: return rth_get_lil_checkcast(dyn_count); Index: vm/vmcore/src/util/em64t/base/jit_lock_rt_support_em64t.cpp =================================================================== --- vm/vmcore/src/util/em64t/base/jit_lock_rt_support_em64t.cpp (revision 645798) +++ vm/vmcore/src/util/em64t/base/jit_lock_rt_support_em64t.cpp (working copy) @@ -58,20 +58,12 @@ const R_Opnd & input_param1); #define INPUT_ARG_OFFSET 8 - -// patch_addr_null_arg_ptr is the address of a variable holding the -// address of a branch instruction byte to patch with the destination -// to be taken if the struct Class* argument is NULL. -static char * gen_convert_struct_class_to_object(char *ss, char **patch_addr_null_arg_ptr) +static char * gen_convert_struct_class_to_object(char *ss) { - // First make sure the struct Class* argument is non-NULL. - ss = test(ss, rdi_opnd, rdi_opnd); - ss = branch8(ss, Condition_Z, Imm_Opnd(size_8, 0)); - *patch_addr_null_arg_ptr = ((char *)ss) - 1; + static size_t offset_of_jlc_handle = Class::get_offset_of_jlc_handle(); - // Convert the struct Class* argument to the corresponding java_lang_Class reference. - ss = call(ss, (char *)struct_Class_to_java_lang_Class); - ss = mov(ss, rdi_opnd, rax_opnd); // overwrite the struct Class* with the raw java_lang_Class reference + ss = mov(ss, rdi_opnd, M_Base_Opnd(rdi_reg, offset_of_jlc_handle)); + ss = mov(ss, rdi_opnd, M_Base_Opnd(rdi_reg, 0)); return ss; } //gen_convert_struct_class_to_object @@ -87,9 +79,12 @@ // ss = inc(ss, M_Opnd((int64)incr)); #endif +#ifdef _DEBUG_CHECK_NULL_//_DEBUG + // check on the null ss = test(ss, rdi_opnd, rdi_opnd); ss = branch8(ss, Condition_Z, Imm_Opnd(size_8, 0)); char *backpatch_address__null_pointer = ((char *)ss) - 1; +#endif // skip fast path if can_generate_monitor_events capability // was requested, so all TI events will be generated @@ -117,6 +112,7 @@ ss = ret(ss); +#ifdef _DEBUG_CHECK_NULL_//_DEBUG // Handle NPE here int64 npe_offset = (int64)ss - (int64)backpatch_address__null_pointer - 1; *backpatch_address__null_pointer = (char)npe_offset; @@ -127,7 +123,7 @@ // Object is null so throw a null pointer exception ss = jump(ss, (char*)exn_get_rth_throw_null_pointer()); - +#endif return ss; } //gen_restore_monitor_enter @@ -184,8 +180,8 @@ ss = inc(ss, M_Base_Opnd(rax_reg, 0)); #endif - char *patch_addr_null_arg; - ss = gen_convert_struct_class_to_object(ss, &patch_addr_null_arg); + char *patch_addr_null_arg = NULL; + ss = gen_convert_struct_class_to_object(ss); ss = gen_restore_monitor_enter(ss, patch_addr_null_arg); addr = stub; @@ -211,9 +207,12 @@ // ss = inc(ss, M_Opnd((int64)incr)); #endif +#ifdef _DEBUG_CHECK_NULL_//_DEBUG + // check on teh null ss = test(ss, rdi_opnd, rdi_opnd); ss = branch8(ss, Condition_Z, Imm_Opnd(size_8, 0)); char *backpatch_address__null_pointer = ((char *)ss) - 1; +#endif // skip fast path if can_generate_monitor_events capability // was requested, so all TI events will be generated @@ -242,6 +241,8 @@ // Monitor illegal state happend ss = jump(ss, (char*)exn_get_rth_throw_illegal_state_exception()); +#ifdef _DEBUG_CHECK_NULL_//_DEBUG + //NPE offset = (POINTER_SIZE_SINT)ss - (POINTER_SIZE_SINT)backpatch_address__null_pointer - 1; *backpatch_address__null_pointer = (char)offset; if (patch_addr_null_arg != NULL) { @@ -251,7 +252,7 @@ // Object is null so throw a null pointer exception ss = jump(ss, (char*)exn_get_rth_throw_null_pointer()); - +#endif return ss; } //gen_restore_monitor_exit @@ -306,8 +307,8 @@ ss = inc(ss, M_Base_Opnd(rax_reg, 0)); #endif - char *patch_addr_null_arg; - ss = gen_convert_struct_class_to_object(ss, &patch_addr_null_arg); + char *patch_addr_null_arg = NULL; + ss = gen_convert_struct_class_to_object(ss); ss = gen_restore_monitor_exit(ss, patch_addr_null_arg); addr = stub; @@ -406,19 +407,27 @@ // cs = lil_parse_onto_end(cs, "inc [%0i:pint];", value); // assert(cs); #endif + +#ifdef _DEBUG_CHECK_NULL_//_DEBUG // check if object is null cs = lil_parse_onto_end(cs, - "jc i0 = %0i:ref, throw_null_pointer;" - "locals 1;" - "l0 = i0;", + "jc i0 = %0i:ref, throw_null_pointer;", (ManagedObject *) VM_Global_State::loader_env->managed_null ); assert(cs); - +#endif + + cs = lil_parse_onto_end(cs, + "locals 1;" + "l0 = i0;" + ); + assert(cs); + // append generic monitor enter code cs = rth_get_lil_monitor_enter_generic(cs); assert(cs); - + +#ifdef _DEBUG_CHECK_NULL_//_DEBUG // throw NullPointerException cs = lil_parse_onto_end(cs, ":throw_null_pointer;" @@ -427,7 +436,8 @@ lil_npc_to_fp(exn_get_rth_throw_null_pointer()) ); assert(cs && lil_is_valid(cs)); - +#endif + addr = LilCodeGenerator::get_platform()->compile(cs); DUMP_STUB((char *)addr, "monitor_enter", lil_cs_get_code_size(cs)); @@ -436,39 +446,6 @@ return addr; } -// this function doesn't throw NullPointerException in case of null object -NativeCodePtr rth_get_lil_monitor_enter_non_null() { - static NativeCodePtr addr = NULL; - - if (addr != NULL) { - return addr; - } - - LilCodeStub * cs = lil_parse_code_stub( - "entry 0:stdcall:ref:void;" - "locals 1;" - "l0 = i0;" - ); - assert(cs); - -#ifdef VM_STATS -// int * value = VM_Statistics::get_vm_stats().rt_function_calls.lookup_or_add((void*)VM_RT_MONITOR_ENTER_NON_NULL, 0, NULL); -// cs = lil_parse_onto_end(cs, "inc [%0i:pint];", value); -// assert(cs); -#endif - // append generic monitor enter code - cs = rth_get_lil_monitor_enter_generic(cs); - assert(cs && lil_is_valid(cs)); - - addr = LilCodeGenerator::get_platform()->compile(cs); - - DUMP_STUB(addr, "monitor_enter_non_null", lil_cs_get_code_size(cs)); - - lil_free_code_stub(cs); - return addr; -} - - /* MONITOR EXIT RUNTIME SUPPORT */ static LilCodeStub * rth_get_lil_monitor_exit_generic(LilCodeStub * cs) { @@ -550,19 +527,26 @@ // cs = lil_parse_onto_end(cs, "inc [%0i:pint];", value); // assert(cs); #endif + +#ifdef _DEBUG_CHECK_NULL_//_DEBUG // check if object is null cs = lil_parse_onto_end(cs, "jc i0 = %0i:ref, throw_null_pointer;" - "in2out platform:g4;", (ManagedObject *) VM_Global_State::loader_env->managed_null ); + assert(cs); +#endif + cs = lil_parse_onto_end(cs, + "in2out platform:g4;" + ); assert(cs); // append generic monitor enter code cs = rth_get_lil_monitor_exit_generic(cs); assert(cs); - + +#ifdef _DEBUG_CHECK_NULL_//_DEBUG // throw NullPointerException cs = lil_parse_onto_end(cs, ":throw_null_pointer;" @@ -571,7 +555,8 @@ lil_npc_to_fp(exn_get_rth_throw_null_pointer()) ); assert(cs && lil_is_valid(cs)); - +#endif + addr = LilCodeGenerator::get_platform()->compile(cs); DUMP_STUB(addr, "monitor_exit", lil_cs_get_code_size(cs)); @@ -580,38 +565,7 @@ return addr; } -// this function doesn't throw NullPointerException in case of null object -NativeCodePtr rth_get_lil_monitor_exit_non_null() { - static NativeCodePtr addr = NULL; - - if (addr != NULL) { - return addr; - } - LilCodeStub * cs = lil_parse_code_stub( - "entry 0:stdcall:ref:void;" - "in2out platform:g4;" - ); - assert(cs); - -#ifdef VM_STATS -// int * value = VM_Statistics::get_vm_stats().rt_function_calls.lookup_or_add((void*)VM_RT_MONITOR_EXIT_NON_NULL, 0, NULL); -// cs = lil_parse_onto_end(cs, "inc [%0i:pint];", value); -// assert(cs); -#endif - // append generic monitor enter code - cs = rth_get_lil_monitor_exit_generic(cs); - assert(cs && lil_is_valid(cs)); - - addr = LilCodeGenerator::get_platform()->compile(cs); - - DUMP_STUB(addr, "monitor_exit_non_null", lil_cs_get_code_size(cs)); - - lil_free_code_stub(cs); - return addr; -} - - Boolean jit_may_inline_object_synchronization(unsigned * UNREF thread_id_register, unsigned * UNREF sync_header_offset, unsigned * UNREF sync_header_width, Index: vm/vmcore/src/util/em64t/base/jit_runtime_support_em64t.cpp =================================================================== --- vm/vmcore/src/util/em64t/base/jit_runtime_support_em64t.cpp (revision 645798) +++ vm/vmcore/src/util/em64t/base/jit_runtime_support_em64t.cpp (working copy) @@ -316,32 +316,24 @@ return rth_get_lil_monitor_enter_static(); case VM_RT_MONITOR_ENTER: return rth_get_lil_monitor_enter(); - case VM_RT_MONITOR_ENTER_NON_NULL: - return rth_get_lil_monitor_enter_non_null(); // Monitor exit runtime helpers case VM_RT_MONITOR_EXIT_STATIC: return rth_get_lil_monitor_exit_static(); case VM_RT_MONITOR_EXIT: return rth_get_lil_monitor_exit(); - case VM_RT_MONITOR_EXIT_NON_NULL: - return rth_get_lil_monitor_exit_non_null(); #else // Monitor enter runtime helpers case VM_RT_MONITOR_ENTER_STATIC: return getaddress__vm_monitor_enter_static_naked(); case VM_RT_MONITOR_ENTER: return getaddress__vm_monitor_enter_naked(); - case VM_RT_MONITOR_ENTER_NON_NULL: - return getaddress__vm_monitor_enter_naked(); // Monitor exit runtime helpers case VM_RT_MONITOR_EXIT_STATIC: return getaddress__vm_monitor_exit_static_naked(); case VM_RT_MONITOR_EXIT: return getaddress__vm_monitor_exit_naked(); - case VM_RT_MONITOR_EXIT_NON_NULL: - return getaddress__vm_monitor_exit_naked(); #endif // Object creation helper Index: vm/vmcore/src/util/ia32/base/jit_runtime_support_ia32.cpp =================================================================== --- vm/vmcore/src/util/ia32/base/jit_runtime_support_ia32.cpp (revision 645798) +++ vm/vmcore/src/util/ia32/base/jit_runtime_support_ia32.cpp (working copy) @@ -1060,14 +1060,12 @@ return getaddress__vm_instanceof(); case VM_RT_MONITOR_ENTER: - case VM_RT_MONITOR_ENTER_NON_NULL: return getaddress__vm_monitor_enter_naked(); case VM_RT_MONITOR_ENTER_STATIC: return getaddress__vm_monitor_enter_static_naked(); case VM_RT_MONITOR_EXIT: - case VM_RT_MONITOR_EXIT_NON_NULL: return getaddress__vm_monitor_exit_naked(); case VM_RT_MONITOR_EXIT_STATIC: Index: vm/vmcore/src/util/ia32/base/jit_lock_rt_support_ia32.cpp =================================================================== --- vm/vmcore/src/util/ia32/base/jit_lock_rt_support_ia32.cpp (revision 645798) +++ vm/vmcore/src/util/ia32/base/jit_lock_rt_support_ia32.cpp (working copy) @@ -54,23 +54,15 @@ #define INPUT_ARG_OFFSET 4 - -// patch_addr_null_arg_ptr is the address of a variable holding the -// address of a branch instruction byte to patch with the destination -// to be taken if the struct Class* argument is NULL. -static char * gen_convert_struct_class_to_object(char *ss, char **patch_addr_null_arg_ptr) +static char * gen_convert_struct_class_to_object(char *ss) { - // First make sure the struct Class* argument is non-NULL. - ss = mov(ss, ecx_opnd, M_Base_Opnd(esp_reg, INPUT_ARG_OFFSET)); - ss = test(ss, ecx_opnd, ecx_opnd); - ss = branch8(ss, Condition_Z, Imm_Opnd(size_8, 0)); - *patch_addr_null_arg_ptr = ((char *)ss) - 1; + static size_t offset_of_jlc_handle = Class::get_offset_of_jlc_handle(); - // Convert the struct Class* argument to the corresponding java_lang_Class reference. - ss = push(ss, M_Base_Opnd(esp_reg, INPUT_ARG_OFFSET)); - ss = call(ss, (char *)struct_Class_to_java_lang_Class); - ss = alu(ss, add_opc, esp_opnd, Imm_Opnd(4)); - ss = mov(ss, M_Base_Opnd(esp_reg, INPUT_ARG_OFFSET), eax_opnd); // overwrite the struct Class* with the raw java_lang_Class reference + ss = mov(ss, ecx_opnd, M_Base_Opnd(esp_reg, INPUT_ARG_OFFSET)); + ss = mov(ss, ecx_opnd, M_Base_Opnd(ecx_reg, offset_of_jlc_handle)); + ss = mov(ss, ecx_opnd, M_Base_Opnd(ecx_reg, 0)); + ss = mov(ss, M_Base_Opnd(esp_reg, INPUT_ARG_OFFSET), ecx_opnd); + return ss; } //gen_convert_struct_class_to_object @@ -90,9 +82,12 @@ #endif ss = mov(ss, ecx_opnd, M_Base_Opnd(esp_reg, INPUT_ARG_OFFSET)); +#ifdef _DEBUG_CHECK_NULL_ //_DEBUG + //npe check ss = test(ss, ecx_opnd, ecx_opnd); ss = branch8(ss, Condition_Z, Imm_Opnd(size_8, 0)); char *backpatch_address__null_pointer = ((char *)ss) - 1; +#endif // skip fast path if can_generate_monitor_events capability // was requested, so all TI events will be generated @@ -117,6 +112,7 @@ ss = ret(ss, Imm_Opnd(4)); +#ifdef _DEBUG_CHECK_NULL_//_DEBUG // Handle NPE here signed npe_offset = (signed)ss - (signed)backpatch_address__null_pointer - 1; *backpatch_address__null_pointer = (char)npe_offset; @@ -126,53 +122,10 @@ } // Object is null so throw a null pointer exception ss = jump(ss, (char*)exn_get_rth_throw_null_pointer()); - +#endif return ss; } //gen_restore_monitor_enter - -void * restore__vm_monitor_enter_naked(void * code_addr) -{ - char *stub = (char *)code_addr; - -#ifdef _DEBUG - const int stub_size = 86; - memset(stub, 0xcc, stub_size); -#endif - char *ss = stub; - - ss = gen_restore_monitor_enter(ss, /*patch_addr_null_arg*/ NULL); - - assert((ss - stub) < stub_size); - - DUMP_STUB(stub, "getaddress__vm_monitor_enter_naked_mt", ss - stub); - - return code_addr; -} //restore__vm_monitor_enter_naked - - -void * restore__vm_monitor_enter_static_naked(void * code_addr) -{ - char *stub = (char *)code_addr; - -#ifdef _DEBUG - const int stub_size = 107; - memset(stub, 0xcc, stub_size); -#endif - char *ss = stub; - - char *patch_addr_null_arg; - ss = gen_convert_struct_class_to_object(ss, &patch_addr_null_arg); - ss = gen_restore_monitor_enter(ss, patch_addr_null_arg); - - assert((ss - stub) < stub_size); - - DUMP_STUB(stub, "getaddress__vm_monitor_enter_static_naked_mt", ss - stub); - - return code_addr; -} //restore__vm_monitor_enter_static_naked - - static char * gen_restore_monitor_exit(char *ss, char *patch_addr_null_arg) { @@ -182,9 +135,14 @@ #endif ss = mov(ss, ecx_opnd, M_Base_Opnd(esp_reg, INPUT_ARG_OFFSET)); + +#ifdef _DEBUG_CHECK_NULL_//_DEBUG + //check npe ss = test(ss, ecx_opnd, ecx_opnd); ss = branch8(ss, Condition_Z, Imm_Opnd(size_8, 0)); char *backpatch_address__null_pointer = ((char *)ss) - 1; +#endif + // skip fast path if can_generate_monitor_events capability // was requested, so all TI events will be generated if (!VM_Global_State::loader_env->TI->get_global_capability( @@ -210,6 +168,8 @@ // illegal state happend ss = jump(ss, (char*)exn_get_rth_throw_illegal_state_exception()); +#ifdef _DEBUG_CHECK_NULL_//_DEBUG + //NPE offset = (signed)ss - (signed)backpatch_address__null_pointer - 1; *backpatch_address__null_pointer = (char)offset; if (patch_addr_null_arg != NULL) { @@ -218,54 +178,12 @@ } // Object is null so throw a null pointer exception ss = jump(ss, (char*)exn_get_rth_throw_null_pointer()); - +#endif return ss; } //gen_restore_monitor_exit -void * restore__vm_monitor_exit_naked(void * code_addr) -{ - char *stub = (char *)code_addr; - -#ifdef _DEBUG - const int stub_size = /*106*/210; - memset(stub, 0xcc, stub_size); -#endif - char *ss = stub; - - ss = gen_restore_monitor_exit(ss, /*patch_addr_null_arg*/ NULL); - - assert((ss - stub) < stub_size); - - DUMP_STUB(stub, "getaddress__vm_monitor_exit_naked_mt", ss - stub); - - return code_addr; -} //restore__vm_monitor_exit_naked - - -void * restore__vm_monitor_exit_static_naked(void * code_addr) -{ - char *stub = (char *)code_addr; - -#ifdef _DEBUG - const int stub_size = /*106*/210; - memset(stub, 0xcc, stub_size); -#endif - char *ss = stub; - - char *patch_addr_null_arg; - ss = gen_convert_struct_class_to_object(ss, &patch_addr_null_arg); - ss = gen_restore_monitor_exit(ss, patch_addr_null_arg); - - assert((ss - stub) < stub_size); - - DUMP_STUB(stub, "getaddress__vm_monitor_exit_static_naked_mt", ss - stub); - - return code_addr; -} //restore__vm_monitor_exit_static_naked - - void * getaddress__vm_monitor_enter_naked() { static void *addr = NULL; @@ -321,8 +239,8 @@ ss = inc(ss, M_Opnd((unsigned)value)); #endif - char *patch_addr_null_arg; - ss = gen_convert_struct_class_to_object(ss, &patch_addr_null_arg); + char *patch_addr_null_arg = NULL; + ss = gen_convert_struct_class_to_object(ss); ss = gen_restore_monitor_enter(ss, patch_addr_null_arg); addr = stub; @@ -392,8 +310,8 @@ ss = inc(ss, M_Opnd((unsigned)value)); #endif - char *patch_addr_null_arg; - ss = gen_convert_struct_class_to_object(ss, &patch_addr_null_arg); + char *patch_addr_null_arg = NULL; + ss = gen_convert_struct_class_to_object(ss); ss = gen_restore_monitor_exit(ss, patch_addr_null_arg); addr = stub; Index: vm/vmcore/src/util/ipf/base/jit_runtime_support_ipf.cpp =================================================================== --- vm/vmcore/src/util/ipf/base/jit_runtime_support_ipf.cpp (revision 645798) +++ vm/vmcore/src/util/ipf/base/jit_runtime_support_ipf.cpp (working copy) @@ -1890,29 +1890,21 @@ dereference_fptr = false; break; case VM_RT_MONITOR_ENTER: - fptr = get_vm_rt_monitor_enter_address(true); + fptr = get_vm_rt_monitor_enter_address(false); dereference_fptr = false; break; case VM_RT_MONITOR_ENTER_STATIC: fptr = get_vm_rt_monitor_enter_static_address(); dereference_fptr = false; break; - case VM_RT_MONITOR_ENTER_NON_NULL: - fptr = get_vm_rt_monitor_enter_address(false); - dereference_fptr = false; - break; case VM_RT_MONITOR_EXIT: - fptr = get_vm_rt_monitor_exit_address(true); + fptr = get_vm_rt_monitor_exit_address(false); dereference_fptr = false; break; case VM_RT_MONITOR_EXIT_STATIC: fptr = get_vm_rt_monitor_exit_static_address(); dereference_fptr = false; break; - case VM_RT_MONITOR_EXIT_NON_NULL: - fptr = get_vm_rt_monitor_exit_address(false); - dereference_fptr = false; - break; case VM_RT_GET_INTERFACE_VTABLE_VER0: fptr = get_interface_vtable_compactor(); dereference_fptr = false; Index: vm/jitrino/config/em64t/server_static.emconf =================================================================== --- vm/jitrino/config/em64t/server_static.emconf (revision 645798) +++ vm/jitrino/config/em64t/server_static.emconf (working copy) @@ -71,11 +71,11 @@ -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE=off -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE_hotnessPercent=1 --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL=on --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL_hotnessPercent=1 +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER=on +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_hotnessPercent=1 --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL=on --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL_hotnessPercent=1 +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT=on +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_hotnessPercent=1 -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0=off -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0_hotnessPercent=1 Index: vm/jitrino/config/em64t/server.emconf =================================================================== --- vm/jitrino/config/em64t/server.emconf (revision 645798) +++ vm/jitrino/config/em64t/server.emconf (working copy) @@ -117,11 +117,11 @@ -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE=off -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE_hotnessPercent=1 --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL=on --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL_hotnessPercent=1 +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER=on +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_hotnessPercent=1 --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL=on --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL_hotnessPercent=1 +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT=on +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_hotnessPercent=1 -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0=off -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0_hotnessPercent=1 Index: vm/jitrino/config/ia32/server_static.emconf =================================================================== --- vm/jitrino/config/ia32/server_static.emconf (revision 645798) +++ vm/jitrino/config/ia32/server_static.emconf (working copy) @@ -71,11 +71,11 @@ -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE=on -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE_hotnessPercent=1 --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL=on --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL_hotnessPercent=1 +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER=on +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_hotnessPercent=1 --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL=on --XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL_hotnessPercent=1 +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT=on +-XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_hotnessPercent=1 -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0=on -XX:jit.SS_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0_hotnessPercent=1 Index: vm/jitrino/config/ia32/server_aggressive.emconf =================================================================== --- vm/jitrino/config/ia32/server_aggressive.emconf (revision 645798) +++ vm/jitrino/config/ia32/server_aggressive.emconf (working copy) @@ -113,11 +113,11 @@ -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE=on -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE_hotnessPercent=1 --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL=on --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL_hotnessPercent=1 +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER=on +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_hotnessPercent=1 --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL=on --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL_hotnessPercent=1 +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT=on +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_hotnessPercent=1 -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0=on -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0_hotnessPercent=1 Index: vm/jitrino/config/ia32/server.emconf =================================================================== --- vm/jitrino/config/ia32/server.emconf (revision 645798) +++ vm/jitrino/config/ia32/server.emconf (working copy) @@ -119,11 +119,11 @@ -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE=on -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_NEW_VECTOR_USING_VTABLE_hotnessPercent=1 --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL=on --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_NON_NULL_hotnessPercent=1 +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER=on +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_ENTER_hotnessPercent=1 --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL=on --XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_NON_NULL_hotnessPercent=1 +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT=on +-XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_MONITOR_EXIT_hotnessPercent=1 -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0=on -XX:jit.SD2_OPT.arg.optimizer.inline_helpers.VM_RT_GET_INTERFACE_VTABLE_VER0_hotnessPercent=1 Index: vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (revision 645798) +++ vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (working copy) @@ -2856,8 +2856,8 @@ //vmhelper slow paths case VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE: case VM_RT_NEW_VECTOR_USING_VTABLE: - case VM_RT_MONITOR_ENTER_NON_NULL: - case VM_RT_MONITOR_EXIT_NON_NULL: + case VM_RT_MONITOR_ENTER: + case VM_RT_MONITOR_EXIT: case VM_RT_GC_HEAP_WRITE_REF: case VM_RT_GET_INTERFACE_VTABLE_VER0: case VM_RT_CHECKCAST: @@ -2946,7 +2946,7 @@ void InstCodeSelector::tau_monitorEnter(CG_OpndHandle* obj, CG_OpndHandle* tauIsNonNull) { Opnd * helperOpnds[] = { (Opnd*)obj }; - CallInst * callInst=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_ENTER_NON_NULL, + CallInst * callInst=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_ENTER, 1, helperOpnds, NULL); appendInsts(callInst); } @@ -2958,7 +2958,7 @@ CG_OpndHandle* tauIsNonNull) { Opnd * helperOpnds[] = { (Opnd*)obj }; - CallInst * callInst=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_EXIT_NON_NULL, + CallInst * callInst=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_EXIT, 1, helperOpnds, NULL); appendInsts(callInst); } @@ -3023,10 +3023,16 @@ void InstCodeSelector::typeMonitorEnter(NamedType *type) { - Opnd * helperOpnds[]={irManager.newImmOpnd(getRuntimeIdType(), Opnd::RuntimeInfo::Kind_TypeRuntimeId, type)}; - CallInst * callInst=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_ENTER_STATIC, - 1, helperOpnds, NULL); - appendInsts(callInst); + Opnd * helperOpnds1[]={irManager.newImmOpnd(getRuntimeIdType(), Opnd::RuntimeInfo::Kind_TypeRuntimeId, type)}; + Opnd * retOpnd=irManager.newOpnd(type); + CallInst * callInst1=irManager.newRuntimeHelperCallInst(VM_RT_CLASS_2_JLC, + 1, helperOpnds1, retOpnd); + appendInsts(callInst1); + + Opnd * helperOpnds2[]={retOpnd}; + CallInst * callInst2=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_ENTER, + 1, helperOpnds2, NULL); + appendInsts(callInst2); } //_______________________________________________________________________________________________________________ @@ -3035,10 +3041,16 @@ void InstCodeSelector::typeMonitorExit(NamedType *type) { - Opnd * helperOpnds[]={irManager.newImmOpnd(getRuntimeIdType(), Opnd::RuntimeInfo::Kind_TypeRuntimeId, type)}; - CallInst * callInst=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_EXIT_STATIC, - 1, helperOpnds, NULL); - appendInsts(callInst); + Opnd * helperOpnds1[]={irManager.newImmOpnd(getRuntimeIdType(), Opnd::RuntimeInfo::Kind_TypeRuntimeId, type)}; + Opnd * retOpnd=irManager.newOpnd(type); + CallInst * callInst1=irManager.newRuntimeHelperCallInst(VM_RT_CLASS_2_JLC, + 1, helperOpnds1, retOpnd); + appendInsts(callInst1); + + Opnd * helperOpnds2[]={retOpnd}; + CallInst * callInst2=irManager.newRuntimeHelperCallInst(VM_RT_MONITOR_EXIT, + 1, helperOpnds2, NULL); + appendInsts(callInst2); } //_______________________________________________________________________________________________________________ Index: vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp =================================================================== --- vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp (revision 645798) +++ vm/jitrino/src/codegenerator/ipf/IpfInstCodeSelector.cpp (working copy) @@ -2025,7 +2025,7 @@ Opnd *helperArgs[] = { (Opnd *)obj }; - VM_RT_SUPPORT hId = VM_RT_MONITOR_ENTER_NON_NULL; + VM_RT_SUPPORT hId = VM_RT_MONITOR_ENTER; uint64 address = (uint64) compilationInterface.getRuntimeHelperAddress(hId); Opnd *helperAddress = opndManager->newImm(address); @@ -2042,7 +2042,7 @@ Opnd *helperArgs[] = { (Opnd *)obj }; - VM_RT_SUPPORT hId = VM_RT_MONITOR_EXIT_NON_NULL; + VM_RT_SUPPORT hId = VM_RT_MONITOR_EXIT; uint64 address = (uint64) compilationInterface.getRuntimeHelperAddress(hId); Opnd *helperAddress = opndManager->newImm(address); @@ -2057,13 +2057,24 @@ IPF_LOG << " typeMonitorEnter" << endl; uint64 typeRuntimeId = (uint64) type->getRuntimeIdentifier(); - Opnd *helperArgs[] = { opndManager->newImm(typeRuntimeId) }; + Opnd *helperArgs1[] = { opndManager->newImm(typeRuntimeId) }; - VM_RT_SUPPORT hId = VM_RT_MONITOR_ENTER_STATIC; - uint64 address = (uint64) compilationInterface.getRuntimeHelperAddress(hId); - Opnd *helperAddress = opndManager->newImm(address); + VM_RT_SUPPORT hId1 = VM_RT_CLASS_2_JLC; + uint64 address1 = (uint64) compilationInterface.getRuntimeHelperAddress(hId1); + Opnd* helperAddress1 = opndManager->newImm(address1); + OpndKind opndKind = toOpndKind(type->tag); + DataKind dataKind = toDataKind(type->tag); + RegOpnd* retOpnd = opndManager->newRegOpnd(opndKind, dataKind); - directCall(1, helperArgs, NULL, helperAddress, p0); + directCall(1, helperArgs1, retOpnd, helperAddress1, p0); + + Opnd *helperArgs2[] = { retOpnd }; + + VM_RT_SUPPORT hId2 = VM_RT_MONITOR_ENTER; + uint64 address2 = (uint64) compilationInterface.getRuntimeHelperAddress(hId2); + Opnd* helperAddress2 = opndManager->newImm(address2); + + directCall(1, helperArgs2, NULL, helperAddress2, p0); } //----------------------------------------------------------------------------// @@ -2074,13 +2085,24 @@ IPF_LOG << " typeMonitorExit" << endl; uint64 typeRuntimeId = (uint64) type->getRuntimeIdentifier(); - Opnd *helperArgs[] = { opndManager->newImm(typeRuntimeId) }; + Opnd *helperArgs1[] = { opndManager->newImm(typeRuntimeId) }; - VM_RT_SUPPORT hId = VM_RT_MONITOR_EXIT_STATIC; - uint64 address = (uint64) compilationInterface.getRuntimeHelperAddress(hId); - Opnd *helperAddress = opndManager->newImm(address); + VM_RT_SUPPORT hId1 = VM_RT_CLASS_2_JLC; + uint64 address1 = (uint64) compilationInterface.getRuntimeHelperAddress(hId1); + Opnd* helperAddress1 = opndManager->newImm(address1); + OpndKind opndKind = toOpndKind(type->tag); + DataKind dataKind = toDataKind(type->tag); + RegOpnd* retOpnd = opndManager->newRegOpnd(opndKind, dataKind); - directCall(1, helperArgs, NULL, helperAddress, p0); + directCall(1, helperArgs1, retOpnd, helperAddress1, p0); + + Opnd *helperArgs2[] = { retOpnd }; + + VM_RT_SUPPORT hId2 = VM_RT_MONITOR_EXIT; + uint64 address2 = (uint64) compilationInterface.getRuntimeHelperAddress(hId2); + Opnd* helperAddress2 = opndManager->newImm(address2); + + directCall(1, helperArgs2, NULL, helperAddress2, p0); } //----------------------------------------------------------------------------// Index: vm/jitrino/src/jet/sconsts.h =================================================================== --- vm/jitrino/src/jet/sconsts.h (revision 645798) +++ vm/jitrino/src/jet/sconsts.h (working copy) @@ -61,6 +61,7 @@ static char * rt_helper_monitor_exit; static char * rt_helper_monitor_enter_static; static char * rt_helper_monitor_exit_static; + static char * rt_helper_class_2_jlc; static char * rt_helper_ldc_string; static char * rt_helper_init_class; Index: vm/jitrino/src/jet/cg_meth.cpp =================================================================== --- vm/jitrino/src/jet/cg_meth.cpp (revision 645798) +++ vm/jitrino/src/jet/cg_meth.cpp (working copy) @@ -45,6 +45,10 @@ * CallSig for monitor_enter and monitor_exit helpers. */ static const CallSig cs_mon(CCONV_HELPERS, jvoid, jobj); +/** + * CallSig for Class* to java.lang.Class helpers. + */ +static const CallSig cs_jlc(CCONV_HELPERS, jobj, jobj); void Compiler::gen_prolog(void) { @@ -523,9 +527,13 @@ if (meth_is_sync()) { + unsigned stackFix = 0; if (is_set(DBG_TRACE_CG)) { dbg(";;>monitor_enter\n"); } if (method_is_static(m_method)) { - gen_call_vm(cs_mon, rt_helper_monitor_enter_static, 0, m_klass); + gen_call_vm(cs_jlc, rt_helper_class_2_jlc, 0, m_klass); + gen_save_ret(cs_jlc); + stackFix = gen_stack_to_args(true, cs_mon, 0); + //gen_call_vm(cs_mon, rt_helper_monitor_enter_static, 0, m_klass); } else { AR gr = gr0; @@ -542,8 +550,17 @@ ld(jobj, gr, m_base, voff(m_stack.thiz())); st(jobj, gr, sp, cs_mon.off(0)); } - gen_call_vm(cs_mon, rt_helper_monitor_enter, 1); + //gen_call_vm(cs_mon, rt_helper_monitor_enter, 1); } + gen_call_vm(cs_mon, rt_helper_monitor_enter, 1); + + if (method_is_static(m_method)) { + runlock(cs_mon); + if (stackFix != 0) { + alu(alu_sub, sp, stackFix); + } + } + if (is_set(DBG_TRACE_CG)) { dbg(";;>~monitor_enter\n"); } } @@ -572,38 +589,49 @@ } bool is_sync = meth_is_sync(); - if (is_sync && meth_is_static()) { + if (is_sync) { + unsigned stackFix = 0; + if (is_set(DBG_TRACE_CG)) { dbg(";;>monitor_exit\n"); } - gen_call_vm(cs_mon, rt_helper_monitor_exit_static, 0, m_klass); - if (is_set(DBG_TRACE_CG)) { - dbg(";;>~monitor_exit\n"); + + if (meth_is_static()) { + gen_call_vm(cs_jlc, rt_helper_class_2_jlc, 0, m_klass); + gen_save_ret(cs_jlc); + stackFix = gen_stack_to_args(true, cs_mon, 0); + //gen_call_vm(cs_mon, rt_helper_monitor_exit_static, 0, m_klass); + } else { + AR gr = valloc(jobj); + if (cs_mon.reg(0) != gr_x) { + if (cs_mon.size() != 0) { + assert(cs_mon.caller_pops()); + alu(alu_sub, sp, cs_mon.size()); + } + vpark(cs_mon.reg(0)); + ld(jobj, cs_mon.reg(0), m_base, voff(m_stack.thiz())); + } + else { + assert(cs_mon.size() != 0); + alu(alu_sub, sp, cs_mon.size()); + ld(jobj, gr, m_base, voff(m_stack.thiz())); + st(jobj, gr, sp, cs_mon.off(0)); + } + //gen_call_vm(cs_mon, rt_helper_monitor_exit, 1); } - } - else if (is_sync) { - if (is_set(DBG_TRACE_CG)) { - dbg(";;>monitor_exit\n"); + gen_call_vm(cs_mon, rt_helper_monitor_exit, 1); + + if (meth_is_static()) { + runlock(cs_mon); + if (stackFix != 0) { + alu(alu_sub, sp, stackFix); + } } - AR gr = valloc(jobj); - if (cs_mon.reg(0) != gr_x) { - if (cs_mon.size() != 0) { - assert(cs_mon.caller_pops()); - alu(alu_sub, sp, cs_mon.size()); - } - vpark(cs_mon.reg(0)); - ld(jobj, cs_mon.reg(0), m_base, voff(m_stack.thiz())); - } - else { - assert(cs_mon.size() != 0); - alu(alu_sub, sp, cs_mon.size()); - ld(jobj, gr, m_base, voff(m_stack.thiz())); - st(jobj, gr, sp, cs_mon.off(0)); - } - gen_call_vm(cs_mon, rt_helper_monitor_exit, 1); + if (is_set(DBG_TRACE_CG)) { dbg(";;>~monitor_exit\n"); } + } if (compilation_params.exe_notify_method_exit) { Index: vm/jitrino/src/jet/compiler.cpp =================================================================== --- vm/jitrino/src/jet/compiler.cpp (revision 645798) +++ vm/jitrino/src/jet/compiler.cpp (working copy) @@ -1488,6 +1488,8 @@ (char*)vm_helper_get_addr(VM_RT_MONITOR_ENTER_STATIC); rt_helper_monitor_exit_static = (char*)vm_helper_get_addr(VM_RT_MONITOR_EXIT_STATIC); + rt_helper_class_2_jlc = + (char*)vm_helper_get_addr(VM_RT_CLASS_2_JLC); rt_helper_new_array = (char*)vm_helper_get_addr(VM_RT_NEW_VECTOR_USING_VTABLE); Index: vm/jitrino/src/jet/sconsts.cpp =================================================================== --- vm/jitrino/src/jet/sconsts.cpp (revision 645798) +++ vm/jitrino/src/jet/sconsts.cpp (working copy) @@ -41,6 +41,7 @@ char * StaticConsts::rt_helper_monitor_exit = NULL; char * StaticConsts::rt_helper_monitor_enter_static = NULL; char * StaticConsts::rt_helper_monitor_exit_static = NULL; +char * StaticConsts::rt_helper_class_2_jlc = NULL; char * StaticConsts::rt_helper_ldc_string = NULL; char * StaticConsts::rt_helper_new = NULL; Index: vm/jitrino/src/optimizer/helper_inliner.cpp =================================================================== --- vm/jitrino/src/optimizer/helper_inliner.cpp (revision 645798) +++ vm/jitrino/src/optimizer/helper_inliner.cpp (working copy) @@ -66,8 +66,8 @@ registerHelper(Op_NewObj, VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE); registerHelper(Op_NewArray, VM_RT_NEW_VECTOR_USING_VTABLE); - registerHelper(Op_TauMonitorEnter, VM_RT_MONITOR_ENTER_NON_NULL); - registerHelper(Op_TauMonitorExit, VM_RT_MONITOR_EXIT_NON_NULL); + registerHelper(Op_TauMonitorEnter, VM_RT_MONITOR_ENTER); + registerHelper(Op_TauMonitorExit, VM_RT_MONITOR_EXIT); registerHelper(Op_TauStRef, VM_RT_GC_HEAP_WRITE_REF); registerHelper(Op_TauLdIntfcVTableAddr, VM_RT_GET_INTERFACE_VTABLE_VER0); registerHelper(Op_TauCheckCast, VM_RT_CHECKCAST); Index: vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp =================================================================== --- vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (revision 645798) +++ vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (working copy) @@ -2996,13 +2996,13 @@ if (!strcmp(mname,"monitorEnter")) { assert(numArgs == 1); - irBuilder.genVMHelperCall(VM_RT_MONITOR_ENTER_NON_NULL, resType, numArgs, srcOpnds); + irBuilder.genVMHelperCall(VM_RT_MONITOR_ENTER, resType, numArgs, srcOpnds); return true; } if (!strcmp(mname,"monitorExit")) { assert(numArgs == 1); - irBuilder.genVMHelperCall(VM_RT_MONITOR_EXIT_NON_NULL, resType, numArgs, srcOpnds); + irBuilder.genVMHelperCall(VM_RT_MONITOR_EXIT, resType, numArgs, srcOpnds); return true; }