Looks good.

On May 13, 2014, at 11:58 PM, Staffan Larsen <staffan.lar...@oracle.com> wrote:

> Thanks Christian,
> 
> I will make the change below before I push.
> 
> /Staffan
> 
> 
> diff --git a/src/cpu/x86/vm/sharedRuntime_x86_32.cpp 
> b/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
> --- a/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
> +++ b/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
> @@ -2248,7 +2248,7 @@
>      // if we are now in interp_only_mode and in that case we do the jvmti
>      // callback.
>      Label skip_jvmti_method_exit;
> -    __ cmpb(Address(thread, JavaThread::interp_only_mode_offset()), 0);
> +    __ cmpl(Address(thread, JavaThread::interp_only_mode_offset()), 0);
>      __ jcc(Assembler::zero, skip_jvmti_method_exit, true);
> 
>      save_native_result(masm, ret_type, stack_slots);
> diff --git a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp 
> b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
> --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
> +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
> @@ -2495,7 +2495,7 @@
>      // if we are now in interp_only_mode and in that case we do the jvmti
>      // callback.
>      Label skip_jvmti_method_exit;
> -    __ cmpb(Address(r15_thread, JavaThread::interp_only_mode_offset()), 0);
> +    __ cmpl(Address(r15_thread, JavaThread::interp_only_mode_offset()), 0);
>      __ jcc(Assembler::zero, skip_jvmti_method_exit, true);
> 
>      save_native_result(masm, ret_type, stack_slots);
> 
> 
> On 14 maj 2014, at 00:21, Christian Thalinger 
> <christian.thalin...@oracle.com> wrote:
> 
>> 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
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to