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;
}