You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/08/28 21:42:54 UTC
svn commit: r570541 - in /harmony/enhanced/drlvm/trunk/vm: include/open/
jitrino/src/jet/ vmcore/include/ vmcore/src/class_support/ vmcore/src/jvmti/
Author: gshimansky
Date: Tue Aug 28 12:42:53 2007
New Revision: 570541
URL: http://svn.apache.org/viewvc?rev=570541&view=rev
Log:
Applied patches from HARMONY-4661
[drlvm][jvmti] MethodEntry and MethodExit event callbacks could be called only when needed
Modified:
harmony/enhanced/drlvm/trunk/vm/include/open/vm.h
harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/compiler.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.h
harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h
harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/include/open/vm.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/vm.h?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/vm.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/vm.h Tue Aug 28 12:42:53 2007
@@ -1101,6 +1101,20 @@
// Numbers can include 'm' or 'M' for megabytes, 'k' or 'K' for kilobytes, and 'g' or 'G' for gigabytes (for example, 32k is the same as 32768).
VMEXPORT int64 get_numerical_property(const char *property_name, int64 default_value, PropertyTable table_number);
+/**
+ * Returns the address of the global flag that specifies whether
+ * MethodEntry event is enabled. JIT should call this function in case
+ * a method is compiled with exe_notify_method_entry flag set.
+ */
+VMEXPORT char *get_method_entry_flag_address();
+
+/**
+ * Returns the address of the global flag that specifies whether
+ * MethodExit event is enabled. JIT should call this function in case
+ * a method is compiled with exe_notify_method_entry flag set.
+ */
+VMEXPORT char *get_method_exit_flag_address();
+
////
// end miscellaneous functions.
////
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp Tue Aug 28 12:42:53 2007
@@ -511,8 +511,17 @@
// JVMTI method_enter notification
//
if (compilation_params.exe_notify_method_entry) {
+ AR ar = valloc(iplatf);
+ Opnd flag_addr(iplatf, ar);
+ mov(flag_addr,Opnd(iplatf,(int_ptr)rt_method_entry_flag_address));
+ Opnd mem(i16, ar, 0);
+ alu(alu_cmp, mem, Opnd(0));
+ unsigned br_off = br(z, 0, 0, taken);
+
static const CallSig cs_ti_menter(CCONV_HELPERS, jobj);
gen_call_vm(cs_ti_menter, rt_helper_ti_method_enter, 0, m_method);
+
+ patch(br_off, ip());
}
@@ -592,6 +601,7 @@
}
if (compilation_params.exe_notify_method_exit) {
+
// JVMTI helper takes pointer to return value and method handle
const CallSig cs_ti_mexit(CCONV_STDCALL, jobj, jobj);
// The call is a bit unusual, and is processed as follows:
@@ -618,10 +628,20 @@
lea(retValPtr.as_opnd(), stackTop);
}
runlock(retValPtr);
+
+ AR ar = valloc(iplatf);
+ Opnd flag_addr(iplatf, ar);
+ mov(flag_addr,Opnd(iplatf,(int_ptr)rt_method_exit_flag_address));
+ Opnd mem(i16, ar, 0);
+ alu(alu_cmp, mem, Opnd(0));
+ unsigned br_off = br(z, 0, 0, taken);
+
Val vmeth(jobj, m_method);
gen_args(cs_ti_mexit, 0, &vmeth, &retValPtr);
gen_call_vm(cs_ti_mexit, rt_helper_ti_method_exit, cs_ti_mexit.count());
runlock(cs_ti_mexit);
+
+ patch(br_off, ip());
}
if (is_f(retType)) {
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/compiler.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/compiler.cpp?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/compiler.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/compiler.cpp Tue Aug 28 12:42:53 2007
@@ -1532,6 +1532,8 @@
//
rt_array_length_offset = vector_length_offset();
rt_suspend_req_flag_offset = (unsigned)hythread_tls_get_request_offset();
+ rt_method_entry_flag_address = get_method_entry_flag_address();
+ rt_method_exit_flag_address = get_method_exit_flag_address();
rt_vtable_offset = object_get_vtable_offset();
Class_Handle clss;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.cpp?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.cpp Tue Aug 28 12:42:53 2007
@@ -78,6 +78,8 @@
unsigned StaticConsts::rt_array_length_offset = NOTHING;
unsigned StaticConsts::rt_suspend_req_flag_offset = NOTHING;
+char* StaticConsts::rt_method_entry_flag_address = NULL;
+char* StaticConsts::rt_method_exit_flag_address = NULL;
int StaticConsts::rt_vtable_offset = 0;
bool StaticConsts::g_jvmtiMode = false;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.h?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/sconsts.h Tue Aug 28 12:42:53 2007
@@ -98,6 +98,18 @@
static unsigned rt_suspend_req_flag_offset;
/**
+ * @brief An address of 'method entry flag'.
+ * @see exe_notify_method_enter
+ */
+ static char* rt_method_entry_flag_address;
+
+ /**
+ * @brief An address of 'method exit flag'.
+ * @see exe_notify_method_exit
+ */
+ static char* rt_method_exit_flag_address;
+
+ /**
* @brief Address of helper that returns a pointer to
thread local struct.
* @param none
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/jvmti_internal.h Tue Aug 28 12:42:53 2007
@@ -338,6 +338,36 @@
cml_report_inlined = value;
}
+ char *get_method_entry_flag_address()
+ {
+ return &method_entry_enabled_flag;
+ }
+
+ char *get_method_exit_flag_address()
+ {
+ return &method_exit_enabled_flag;
+ }
+
+ char get_method_entry_flag()
+ {
+ return method_entry_enabled_flag;
+ }
+
+ char get_method_exit_flag()
+ {
+ return method_exit_enabled_flag;
+ }
+
+ void set_method_entry_flag(char value)
+ {
+ method_entry_enabled_flag = value;
+ }
+
+ void get_method_exit_flag(char value)
+ {
+ method_exit_enabled_flag = value;
+ }
+
private:
protected:
@@ -357,6 +387,7 @@
unsigned global_capabilities;
bool single_step_enabled;
bool cml_report_inlined;
+ char method_entry_enabled_flag, method_exit_enabled_flag;
}; /* end of class DebugUtilsTI */
jvmtiError add_event_to_thread(jvmtiEnv *env, jvmtiEvent event_type, jthread event_thread);
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp Tue Aug 28 12:42:53 2007
@@ -2928,3 +2928,13 @@
}
return false;
}
+
+char * get_method_entry_flag_address()
+{
+ return VM_Global_State::loader_env->TI->get_method_entry_flag_address();
+}
+
+char * get_method_exit_flag_address()
+{
+ return VM_Global_State::loader_env->TI->get_method_exit_flag_address();
+}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti.cpp Tue Aug 28 12:42:53 2007
@@ -325,7 +325,9 @@
prepareListNumber(0),
global_capabilities(0),
single_step_enabled(false),
- cml_report_inlined(false)
+ cml_report_inlined(false),
+ method_entry_enabled_flag(0),
+ method_exit_enabled_flag(0)
{
jvmtiError UNUSED res = _allocate( MAX_NOTIFY_LIST * sizeof(Class**),
(unsigned char**)¬ifyLoadList );
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp?rev=570541&r1=570540&r2=570541&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp Tue Aug 28 12:42:53 2007
@@ -383,6 +383,41 @@
}
}
}
+ else if(JVMTI_EVENT_METHOD_ENTRY == event_type)
+ {
+ if (JVMTI_ENABLE == mode)
+ {
+ TRACE2("jvmti.event.method.entry", "ENABLED global method entry flag");
+ ti->set_method_entry_flag(1);
+ }
+ else if (JVMTI_DISABLE == mode && ti->get_method_entry_flag() != 0)
+ {
+ LMAutoUnlock lock(&ti->TIenvs_lock);
+ bool disable = check_event_is_disable(JVMTI_EVENT_METHOD_ENTRY, ti);
+ if (disable) {
+ TRACE2("jvmti.event.method.entry", "DISABLED global method entry flag");
+ ti->set_method_entry_flag(0);
+ }
+ }
+ }
+ else if(JVMTI_EVENT_METHOD_EXIT == event_type || JVMTI_EVENT_FRAME_POP == event_type)
+ {
+ if (JVMTI_ENABLE == mode)
+ {
+ TRACE2("jvmti.event.method.exit", "ENABLED global method exit flag");
+ ti->set_method_entry_flag(1);
+ }
+ else if (JVMTI_DISABLE == mode && ti->get_method_entry_flag() != 0)
+ {
+ LMAutoUnlock lock(&ti->TIenvs_lock);
+ bool disable = check_event_is_disable(JVMTI_EVENT_METHOD_EXIT, ti) ||
+ check_event_is_disable(JVMTI_EVENT_FRAME_POP, ti);
+ if (disable) {
+ TRACE2("jvmti.event.method.entry", "DISABLED global method entry flag");
+ ti->set_method_entry_flag(0);
+ }
+ }
+ }
}
if( JVMTI_EVENT_DATA_DUMP_REQUEST == event_type ) {
if(JVMTI_ENABLE == mode) {