src/cpu/sparc/vm/frame_sparc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
6930772 Cdiff src/cpu/sparc/vm/frame_sparc.cpp
src/cpu/sparc/vm/frame_sparc.cpp
Print this page
*** 334,346 ****
assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant broken");
}
#endif // ASSERT
}
! frame::frame(intptr_t* sp, intptr_t* younger_sp, bool younger_frame_adjusted_stack) {
! _sp = sp;
! _younger_sp = younger_sp;
if (younger_sp == NULL) {
// make a deficient frame which doesn't know where its PC is
_pc = NULL;
_cb = NULL;
} else {
--- 334,348 ----
assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant broken");
}
#endif // ASSERT
}
! frame::frame(intptr_t* sp, intptr_t* younger_sp, bool younger_frame_is_interpreted) :
! _sp(sp),
! _younger_sp(younger_sp),
! _deopt_state(unknown),
! _sp_adjustment_by_callee(0) {
if (younger_sp == NULL) {
// make a deficient frame which doesn't know where its PC is
_pc = NULL;
_cb = NULL;
} else {
*** 350,373 ****
// find_blob_unsafe
// In case of native stubs, the pc retrieved here might be
// wrong. (the _last_native_pc will have the right value)
// So do not put add any asserts on the _pc here.
}
! if (younger_frame_adjusted_stack) {
! // compute adjustment to this frame's SP made by its interpreted callee
! _sp_adjustment_by_callee = (intptr_t*)((intptr_t)younger_sp[I5_savedSP->sp_offset_in_saved_window()] +
! STACK_BIAS) - sp;
! } else {
! _sp_adjustment_by_callee = 0;
}
! _deopt_state = unknown;
! // It is important that frame be fully construct when we do this lookup
! // as get_original_pc() needs correct value for unextended_sp()
if (_pc != NULL) {
- _cb = CodeCache::find_blob(_pc);
address original_pc = nmethod::get_deopt_original_pc(this);
if (original_pc != NULL) {
_pc = original_pc;
_deopt_state = is_deoptimized;
} else {
--- 352,387 ----
// find_blob_unsafe
// In case of native stubs, the pc retrieved here might be
// wrong. (the _last_native_pc will have the right value)
// So do not put add any asserts on the _pc here.
}
!
! if (_pc != NULL)
! _cb = CodeCache::find_blob(_pc);
!
! // Check for MethodHandle call sites.
! if (_cb != NULL) {
! nmethod* nm = _cb->as_nmethod_or_null();
! if (nm != NULL) {
! if (nm->is_deopt_mh_entry(_pc) || nm->is_method_handle_return(_pc)) {
! _sp_adjustment_by_callee = (intptr_t*) ((intptr_t) sp[L7->sp_offset_in_saved_window()] + STACK_BIAS) - sp;
! // The SP is already adjusted by this MH call site, don't
! // overwrite this value with the wrong interpreter value.
! younger_frame_is_interpreted = false;
! }
! }
}
! if (younger_frame_is_interpreted) {
! // compute adjustment to this frame's SP made by its interpreted callee
! _sp_adjustment_by_callee = (intptr_t*) ((intptr_t) younger_sp[I5_savedSP->sp_offset_in_saved_window()] + STACK_BIAS) - sp;
! }
! // It is important that the frame is fully constructed when we do
! // this lookup as get_deopt_original_pc() needs a correct value for
! // unextended_sp() which uses _sp_adjustment_by_callee.
if (_pc != NULL) {
address original_pc = nmethod::get_deopt_original_pc(this);
if (original_pc != NULL) {
_pc = original_pc;
_deopt_state = is_deoptimized;
} else {
*** 462,472 ****
if (is_entry_frame()) return sender_for_entry_frame(map);
intptr_t* younger_sp = sp();
intptr_t* sp = sender_sp();
- bool adjusted_stack = false;
// Note: The version of this operation on any platform with callee-save
// registers must update the register map (if not null).
// In order to do this correctly, the various subtypes of
// of frame (interpreted, compiled, glue, native),
--- 476,485 ----
*** 481,492 ****
// The constructor of the sender must know whether this frame is interpreted so it can set the
// sender's _sp_adjustment_by_callee field. An osr adapter frame was originally
// interpreted but its pc is in the code cache (for c1 -> osr_frame_return_id stub), so it must be
// explicitly recognized.
! adjusted_stack = is_interpreted_frame();
! if (adjusted_stack) {
map->make_integer_regs_unsaved();
map->shift_window(sp, younger_sp);
} else if (_cb != NULL) {
// Update the locations of implicitly saved registers to be their
// addresses in the register save area.
--- 494,505 ----
// The constructor of the sender must know whether this frame is interpreted so it can set the
// sender's _sp_adjustment_by_callee field. An osr adapter frame was originally
// interpreted but its pc is in the code cache (for c1 -> osr_frame_return_id stub), so it must be
// explicitly recognized.
! bool frame_is_interpreted = is_interpreted_frame();
! if (frame_is_interpreted) {
map->make_integer_regs_unsaved();
map->shift_window(sp, younger_sp);
} else if (_cb != NULL) {
// Update the locations of implicitly saved registers to be their
// addresses in the register save area.
*** 501,511 ****
if (_cb->oop_maps() != NULL) {
OopMapSet::update_register_map(this, map);
}
}
}
! return frame(sp, younger_sp, adjusted_stack);
}
void frame::patch_pc(Thread* thread, address pc) {
if(thread == Thread::current()) {
--- 514,524 ----
if (_cb->oop_maps() != NULL) {
OopMapSet::update_register_map(this, map);
}
}
}
! return frame(sp, younger_sp, frame_is_interpreted);
}
void frame::patch_pc(Thread* thread, address pc) {
if(thread == Thread::current()) {
src/cpu/sparc/vm/frame_sparc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File