bytecode rewrite and breakpoint

Coleen Phillimore coleen.phillimore at oracle.com
Fri Jan 9 13:39:51 UTC 2015


Sorry, I was going to answer, but I'm still not sure what your question is.
We can safepoint at any bytecode, if that helps.

Coleen

On 1/8/15, 10:35 PM, San Hong Li wrote:
> Hmmm, finally I got the answer for this question.
> The  at_bcp(0) would be the Bytecodes::_breakpoint if the patch_code
> happened after the  break point is set.
> The following example shows this:
>
>     33:  getstatic       #8; //Field
> java/lang/System.in:Ljava/io/InputStream;
>     36:  invokevirtual   #9; //Method java/io/InputStream.read:()I
>     39:  pop
>     40:  aload_0                  <---------------------- set break point
> here.
>     41:  getfield        #2; //Field myInt:I
>     44:  istore  6
>     46:  iload   6
>
> If we  set the breakpoint at 40 , when the  patch_code  in aload  happened
> later, the interpreter will see the  Bytecodes::_breakpoint  at bcp(0).
>
> hmmm, actually i just missed the info present in TemplateTable::_breakpoint
> - the breakpoint  used the same index with the original bytecode.
>
> Anyway, thanks every one.
>
>
> On Tue, Jan 6, 2015 at 10:18 PM, San Hong Li <sherrylso at gmail.com> wrote:
>
>> Hi All:
>>
>> For the bytecode patch path, the  interpreter does have some special
>> handling for breakpoint bytecode, that is,  if a breakpoint is present
>> at_bcp(0),   the bytecode patching will be skipped and  handled by
>> breakpoint table later.
>>
>> The related implementation is in  TemplateTable::patch_bytecode:
>>
>>    if (JvmtiExport::can_post_breakpoint()) {
>>      Label L_fast_patch;
>>      // if a breakpoint is present we can't rewrite the stream directly
>>      __ movzbl(temp_reg, at_bcp(0));
>>      __ cmpl(temp_reg, Bytecodes::_breakpoint);
>>      __ jcc(Assembler::notEqual, L_fast_patch);
>>      __ get_method(temp_reg);
>>      // Let breakpoint table handling rewrite to quicker bytecode
>>      __ call_VM(noreg, CAST_FROM_FN_PTR(address,
>> InterpreterRuntime::set_original_bytecode_at), temp_reg, r13, bc_reg);
>> #ifndef ASSERT
>>      __ jmpb(L_patch_done);
>> #else
>>      __ jmp(L_patch_done);
>> #endif
>>      __ bind(L_fast_patch);
>>    }
>>
>> My understanding is the breakpoint can only be set in safepoint,
>> when the interpreter thread resumes from safepoint, because it will
>> retrieve the next bytecode for executing again,the breakpoint bytecode
>> which is set in safepoint before will get chance to be executed. I can not
>> imagine when the bcp(0) could be changed as breakpoint in above code?
>>
>> So I am curious whether the above code is already dead?
>> If not,  anyone can help to me to clarify that  how the bytecode which is
>> currently executed by interpreter could be replaced with breakpoint?
>> which case could trigger  the
>> "InterpreterRuntime::set_original_bytecode_at" to be called?
>>
>> Appreciated for your help in advance.
>>



More information about the hotspot-runtime-dev mailing list