< prev index next >
src/cpu/aarch64/vm/frame_aarch64.cpp
Print this page
rev 8300 : 8079564: Use FP register as proper frame pointer in JIT compiled code on aarch64
Summary: Add support for PreserveFramePointer for debug/profile
Reviewed-by: duke
*** 221,231 ****
}
if (sender_blob->is_nmethod()) {
nmethod* nm = sender_blob->as_nmethod_or_null();
if (nm != NULL) {
! if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc)) {
return false;
}
}
}
--- 221,232 ----
}
if (sender_blob->is_nmethod()) {
nmethod* nm = sender_blob->as_nmethod_or_null();
if (nm != NULL) {
! if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc) ||
! nm->method()->is_method_handle_intrinsic()) {
return false;
}
}
}
*** 387,436 ****
//------------------------------------------------------------------------------
// frame::verify_deopt_original_pc
//
// Verifies the calculated original PC of a deoptimization PC for the
! // given unextended SP. The unextended SP might also be the saved SP
! // for MethodHandle call sites.
#ifdef ASSERT
! void frame::verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp, bool is_method_handle_return) {
frame fr;
// This is ugly but it's better than to change {get,set}_original_pc
// to take an SP value as argument. And it's only a debugging
// method anyway.
fr._unextended_sp = unextended_sp;
address original_pc = nm->get_original_pc(&fr);
assert(nm->insts_contains(original_pc), "original PC must be in nmethod");
- assert(nm->is_method_handle_return(original_pc) == is_method_handle_return, "must be");
}
#endif
//------------------------------------------------------------------------------
// frame::adjust_unextended_sp
void frame::adjust_unextended_sp() {
! // If we are returning to a compiled MethodHandle call site, the
! // saved_fp will in fact be a saved value of the unextended SP. The
! // simplest way to tell whether we are returning to such a call site
! // is as follows:
nmethod* sender_nm = (_cb == NULL) ? NULL : _cb->as_nmethod_or_null();
if (sender_nm != NULL) {
! // If the sender PC is a deoptimization point, get the original
! // PC. For MethodHandle call site the unextended_sp is stored in
! // saved_fp.
! if (sender_nm->is_deopt_mh_entry(_pc)) {
! DEBUG_ONLY(verify_deopt_mh_original_pc(sender_nm, _fp));
! _unextended_sp = _fp;
! }
! else if (sender_nm->is_deopt_entry(_pc)) {
DEBUG_ONLY(verify_deopt_original_pc(sender_nm, _unextended_sp));
}
- else if (sender_nm->is_method_handle_return(_pc)) {
- _unextended_sp = _fp;
- }
}
}
//------------------------------------------------------------------------------
// frame::update_map_with_saved_link
--- 388,426 ----
//------------------------------------------------------------------------------
// frame::verify_deopt_original_pc
//
// Verifies the calculated original PC of a deoptimization PC for the
! // given unextended SP.
#ifdef ASSERT
! void frame::verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp) {
frame fr;
// This is ugly but it's better than to change {get,set}_original_pc
// to take an SP value as argument. And it's only a debugging
// method anyway.
fr._unextended_sp = unextended_sp;
address original_pc = nm->get_original_pc(&fr);
assert(nm->insts_contains(original_pc), "original PC must be in nmethod");
}
#endif
//------------------------------------------------------------------------------
// frame::adjust_unextended_sp
void frame::adjust_unextended_sp() {
! // On aarch64, sites calling method handle intrinsics and lambda forms are treated
! // as any other call site. Therefore, no special action is needed when we are
! // returning to any of these call sites.
nmethod* sender_nm = (_cb == NULL) ? NULL : _cb->as_nmethod_or_null();
if (sender_nm != NULL) {
! // If the sender PC is a deoptimization point, get the original PC.
! if (sender_nm->is_deopt_entry(_pc) ||
! sender_nm->is_deopt_mh_entry(_pc)) {
DEBUG_ONLY(verify_deopt_original_pc(sender_nm, _unextended_sp));
}
}
}
//------------------------------------------------------------------------------
// frame::update_map_with_saved_link
< prev index next >