Since: int _interp_only_mode;
is an int field I would prefer to actually read the value as an int instead of just a byte on x86: + __ cmpb(Address(r15_thread, JavaThread::interp_only_mode_offset()), 0); Otherwise this looks good. On May 13, 2014, at 11:30 AM, Staffan Larsen <staffan.lar...@oracle.com> wrote: > > On 13 maj 2014, at 18:53, Daniel D. Daugherty <daniel.daughe...@oracle.com> > wrote: > >> > new webrev is here: http://cr.openjdk.java.net/~sla/8041934/webrev.02/ >> >> src/share/vm/runtime/sharedRuntime.hpp >> No comments. >> >> src/share/vm/runtime/sharedRuntime.cpp >> No comments. >> >> src/cpu/sparc/vm/sharedRuntime_sparc.cpp >> No comments. >> >> src/cpu/x86/vm/sharedRuntime_x86_32.cpp >> No comments. >> >> src/cpu/x86/vm/sharedRuntime_x86_64.cpp >> No comments. >> >> On the switch from call_VM_leaf() -> call_VM(), I looked through all >> the mentions of the string call_VM in the three src/cpu files. Your >> change adds the first call_VM() use in all three files and the other >> places that mention the string "call_VM" seem to have gone through >> a great deal of trouble not to use call_VM() directly. I have no >> specific thing I think is wrong, but I find this data worrisome… > > Yes, it would be great if someone from the compiler team could review this, > too. > > Thanks, > /Staffan > >> >> Thumbs up! >> >> Dan >> >> >> On 5/13/14 3:20 AM, Staffan Larsen wrote: >>> >>> On 9 maj 2014, at 20:18, serguei.spit...@oracle.com wrote: >>> >>>> Staffan, >>>> >>>> This is important discovery, thanks! >>>> The fix looks good to me. >>>> One question below. >>>> >>>> Thanks, >>>> Serguei >>>> >>>> >>>> On 5/9/14 3:47 AM, Staffan Larsen wrote: >>>>> On 8 maj 2014, at 19:05, Daniel D. Daugherty >>>>> <daniel.daughe...@oracle.com> wrote: >>>>> >>>>>>> webrev: http://cr.openjdk.java.net/~sla/8041934/webrev.00/ >>>>>> src/share/vm/runtime/sharedRuntime.hpp >>>>>> No comments. >>>>>> >>>>>> src/share/vm/runtime/sharedRuntime.cpp >>>>>> line 994: JRT_LEAF(int, SharedRuntime::jvmti_method_exit( >>>>>> I'm not sure that JRT_LEAF is right. I would think that >>>>>> JvmtiExport::post_method_exit() would have to grab one or >>>>>> more locks with all the state checks it has to make... >>>>>> >>>>>> For reference, InterpreterRuntime::post_method_exit() >>>>>> is a wrapper around JvmtiExport::post_method_exit() >>>>>> and it is IRT_ENTRY instead of IRT_LEAF. >>>>> Good catch! >>>> >>>> Q: Is correct to use call_VM_leaf (vs call_VM ) in the >>>> sharedRuntime_<arch>.cpp ? >>>> >>>> + __ call_VM_leaf( >>>> + CAST_FROM_FN_PTR(address, SharedRuntime::jvmti_method_exit), >>>> + thread, rax); >>> >>> That is another good catch! It should probably be call_VM as you note. The >>> reason for all these leaf references is because we used the dtrace probe as >>> a template - obviously without fully understanding what we did :-/ >>> >>> I have changed to code to use call_VM instead. This also required a change >>> from jccb to jcc for the jump (which is now longer than an 8-bit offset). >>> >>> new webrev is here: http://cr.openjdk.java.net/~sla/8041934/webrev.02/ >>> >>> Thanks, >>> /Staffan >>> >>> >>>> >>>>>> src/cpu/sparc/vm/sharedRuntime_sparc.cpp >>>>>> No comments. >>>>>> >>>>>> src/cpu/x86/vm/sharedRuntime_x86_32.cpp >>>>>> No comments. >>>>>> >>>>>> src/cpu/x86/vm/sharedRuntime_x86_64.cpp >>>>>> No comments. >>>>>> >>>>>> I'm guessing that PPC has the same issue, but I'm presuming >>>>>> that someone else (Vladimir?) will handle that… >>>>> Yes, I was hoping that I could file a follow-up bug for the platforms I >>>>> didn’t know how to fix. >>>>> >>>>> Updated review: http://cr.openjdk.java.net/~sla/8041934/webrev.01/ >>>>> >>>>> Thanks, >>>>> /Staffan >>>>> >>>>>> Dan >>>>>> >>>>>> >>>>>> On 5/8/14 12:06 AM, Staffan Larsen wrote: >>>>>>> All, >>>>>>> >>>>>>> This is a fix for an assert in JVMTI that verifies that JVMTI’s >>>>>>> internal notion of the number of frames on the stack is correct. >>>>>>> >>>>>>> When running in -Xcomp mode and enable single-stepping (or >>>>>>> method_entry/exit) we will revert all frames on the stack to be run by >>>>>>> the interpreter. Only the interpreter can send single-step and >>>>>>> method_entry/exit. However, if one of the frames is a native wrapper, >>>>>>> that frame will not be reverted (presumably because we don't know how >>>>>>> to do that). This will cause us to miss a method_exit event when that >>>>>>> native frame is popped. This in turn will mess up the logic in JVMTI >>>>>>> that keeps track of the number of frames currently on the stack (see >>>>>>> JvmtiThreadState::_cur_stack_depth) and will trigger the assert. >>>>>>> >>>>>>> The proposed solution is to include a method_exit event in the native >>>>>>> wrapper frame if interpreted mode has been enabled. This needs updates >>>>>>> to SharedRuntime::generate_native_wrapper() for all platforms. >>>>>>> >>>>>>> Kudos to Rickard for helping me write the code. >>>>>>> >>>>>>> webrev: http://cr.openjdk.java.net/~sla/8041934/webrev.00/ >>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8041934 >>>>>>> >>>>>>> The fix has been verified by running the failing test in JPRT with >>>>>>> -Xcomp. >>>>>>> >>>>>>> Thanks, >>>>>>> /Staffan >>>> >>> >> >