bytecode rewrite and breakpoint
San Hong Li
sherrylso at gmail.com
Tue Jan 6 14:18:47 UTC 2015
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