8164113: AArch64: follow-up the fix for 8161598
Reviewed-by: dlong
This commit is contained in:
parent
72dcc9193e
commit
ad3fc31b3d
@ -4680,7 +4680,7 @@ encode %{
|
||||
Label retaddr;
|
||||
__ adr(rscratch2, retaddr);
|
||||
__ lea(rscratch1, RuntimeAddress(entry));
|
||||
// Leave a breadcrumb for JavaThread::pd_last_frame().
|
||||
// Leave a breadcrumb for JavaFrameAnchor::capture_last_Java_pc()
|
||||
__ stp(zr, rscratch2, Address(__ pre(sp, -2 * wordSize)));
|
||||
__ blrt(rscratch1, gpcnt, fpcnt, rtype);
|
||||
__ bind(retaddr);
|
||||
|
@ -78,7 +78,7 @@ int StubAssembler::call_RT(Register oop_result1, Register metadata_result, addre
|
||||
}
|
||||
pop(r0, sp);
|
||||
#endif
|
||||
reset_last_Java_frame(true, true);
|
||||
reset_last_Java_frame(true);
|
||||
maybe_isb();
|
||||
|
||||
// check for pending exceptions
|
||||
@ -547,7 +547,7 @@ OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) {
|
||||
__ bind(L);
|
||||
}
|
||||
#endif
|
||||
__ reset_last_Java_frame(true, false);
|
||||
__ reset_last_Java_frame(true);
|
||||
__ maybe_isb();
|
||||
|
||||
// check for pending exceptions
|
||||
|
@ -336,13 +336,16 @@ frame frame::sender_for_entry_frame(RegisterMap* map) const {
|
||||
JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor();
|
||||
assert(!entry_frame_is_first(), "next Java fp must be non zero");
|
||||
assert(jfa->last_Java_sp() > sp(), "must be above this frame on stack");
|
||||
// Since we are walking the stack now this nested anchor is obviously walkable
|
||||
// even if it wasn't when it was stacked.
|
||||
if (!jfa->walkable()) {
|
||||
// Capture _last_Java_pc (if needed) and mark anchor walkable.
|
||||
jfa->capture_last_Java_pc();
|
||||
}
|
||||
map->clear();
|
||||
assert(map->include_argument_oops(), "should be set by clear");
|
||||
if (jfa->last_Java_pc() != NULL ) {
|
||||
frame fr(jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc());
|
||||
return fr;
|
||||
}
|
||||
frame fr(jfa->last_Java_sp(), jfa->last_Java_fp());
|
||||
vmassert(jfa->last_Java_pc() != NULL, "not walkable");
|
||||
frame fr(jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc());
|
||||
return fr;
|
||||
}
|
||||
|
||||
@ -769,3 +772,21 @@ frame::frame(void* sp, void* fp, void* pc) {
|
||||
init((intptr_t*)sp, (intptr_t*)fp, (address)pc);
|
||||
}
|
||||
#endif
|
||||
|
||||
void JavaFrameAnchor::make_walkable(JavaThread* thread) {
|
||||
// last frame set?
|
||||
if (last_Java_sp() == NULL) return;
|
||||
// already walkable?
|
||||
if (walkable()) return;
|
||||
vmassert(Thread::current() == (Thread*)thread, "not current thread");
|
||||
vmassert(last_Java_sp() != NULL, "not called from Java code?");
|
||||
vmassert(last_Java_pc() == NULL, "already walkable");
|
||||
capture_last_Java_pc();
|
||||
vmassert(walkable(), "something went wrong");
|
||||
}
|
||||
|
||||
void JavaFrameAnchor::capture_last_Java_pc() {
|
||||
vmassert(_last_Java_sp != NULL, "no last frame set");
|
||||
vmassert(_last_Java_pc == NULL, "already walkable");
|
||||
_last_Java_pc = (address)_last_Java_sp[-1];
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
// #endif
|
||||
MacroAssembler::null_check(reg, offset);
|
||||
// #ifdef ASSERT
|
||||
// reset_last_Java_frame(true, false);
|
||||
// reset_last_Java_frame(true);
|
||||
// #endif
|
||||
}
|
||||
|
||||
|
@ -64,10 +64,9 @@ public:
|
||||
_last_Java_sp = src->_last_Java_sp;
|
||||
}
|
||||
|
||||
// Always walkable
|
||||
bool walkable(void) { return true; }
|
||||
// Never any thing to do since we are always walkable and can find address of return addresses
|
||||
void make_walkable(JavaThread* thread) { }
|
||||
bool walkable(void) { return _last_Java_sp != NULL && _last_Java_pc != NULL; }
|
||||
void make_walkable(JavaThread* thread);
|
||||
void capture_last_Java_pc(void);
|
||||
|
||||
intptr_t* last_Java_sp(void) const { return _last_Java_sp; }
|
||||
|
||||
|
@ -274,19 +274,18 @@ void MacroAssembler::serialize_memory(Register thread, Register tmp) {
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::reset_last_Java_frame(bool clear_fp,
|
||||
bool clear_pc) {
|
||||
void MacroAssembler::reset_last_Java_frame(bool clear_fp) {
|
||||
// we must set sp to zero to clear frame
|
||||
str(zr, Address(rthread, JavaThread::last_Java_sp_offset()));
|
||||
|
||||
// must clear fp, so that compiled frames are not confused; it is
|
||||
// possible that we need it only for debugging
|
||||
if (clear_fp) {
|
||||
str(zr, Address(rthread, JavaThread::last_Java_fp_offset()));
|
||||
}
|
||||
|
||||
if (clear_pc) {
|
||||
str(zr, Address(rthread, JavaThread::last_Java_pc_offset()));
|
||||
}
|
||||
// Always clear the pc because it could have been set by make_walkable()
|
||||
str(zr, Address(rthread, JavaThread::last_Java_pc_offset()));
|
||||
}
|
||||
|
||||
// Calls to C land
|
||||
@ -632,7 +631,7 @@ void MacroAssembler::call_VM_base(Register oop_result,
|
||||
|
||||
// reset last Java frame
|
||||
// Only interpreter should have to clear fp
|
||||
reset_last_Java_frame(true, true);
|
||||
reset_last_Java_frame(true);
|
||||
|
||||
// C++ interp handles this in the interpreter
|
||||
check_and_handle_popframe(java_thread);
|
||||
@ -875,7 +874,7 @@ void MacroAssembler:: notify(int type) {
|
||||
if (type == bytecode_start) {
|
||||
// set_last_Java_frame(esp, rfp, (address)NULL);
|
||||
Assembler:: notify(type);
|
||||
// reset_last_Java_frame(true, false);
|
||||
// reset_last_Java_frame(true);
|
||||
}
|
||||
else
|
||||
Assembler:: notify(type);
|
||||
|
@ -757,10 +757,10 @@ public:
|
||||
Register last_java_pc,
|
||||
Register scratch);
|
||||
|
||||
void reset_last_Java_frame(Register thread, bool clearfp, bool clear_pc);
|
||||
void reset_last_Java_frame(Register thread);
|
||||
|
||||
// thread in the default location (r15_thread on 64bit)
|
||||
void reset_last_Java_frame(bool clear_fp, bool clear_pc);
|
||||
// thread in the default location (rthread)
|
||||
void reset_last_Java_frame(bool clear_fp);
|
||||
|
||||
// Stores
|
||||
void store_check(Register obj); // store check for obj - register is destroyed afterwards
|
||||
|
@ -2030,7 +2030,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
__ bind(dtrace_method_exit_done);
|
||||
}
|
||||
|
||||
__ reset_last_Java_frame(false, true);
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
// Unpack oop result
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
@ -2370,7 +2370,7 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
__ bind(retaddr);
|
||||
oop_maps->add_gc_map( __ pc()-start, map->deep_copy());
|
||||
|
||||
__ reset_last_Java_frame(false, false);
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
__ b(after_fetch_unroll_info_call);
|
||||
} // EnableJVMCI
|
||||
@ -2465,7 +2465,7 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
// find any register it might need.
|
||||
oop_maps->add_gc_map(__ pc() - start, map);
|
||||
|
||||
__ reset_last_Java_frame(false, true);
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
#if INCLUDE_JVMCI
|
||||
if (EnableJVMCI) {
|
||||
@ -2606,7 +2606,7 @@ void SharedRuntime::generate_deopt_blob() {
|
||||
new OopMap( frame_size_in_words, 0 ));
|
||||
|
||||
// Clear fp AND pc
|
||||
__ reset_last_Java_frame(true, true);
|
||||
__ reset_last_Java_frame(true);
|
||||
|
||||
// Collect return values
|
||||
__ ldrd(v0, Address(sp, RegisterSaver::v0_offset_in_bytes()));
|
||||
@ -2709,7 +2709,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
|
||||
|
||||
oop_maps->add_gc_map(__ pc() - start, map);
|
||||
|
||||
__ reset_last_Java_frame(false, true);
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
// move UnrollBlock* into r4
|
||||
__ mov(r4, r0);
|
||||
@ -2828,7 +2828,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
|
||||
oop_maps->add_gc_map(the_pc - start, new OopMap(SimpleRuntimeFrame::framesize, 0));
|
||||
|
||||
// Clear fp AND pc
|
||||
__ reset_last_Java_frame(true, true);
|
||||
__ reset_last_Java_frame(true);
|
||||
|
||||
// Pop self-frame.
|
||||
__ leave(); // Epilog
|
||||
@ -2906,7 +2906,7 @@ SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_t
|
||||
|
||||
Label noException;
|
||||
|
||||
__ reset_last_Java_frame(false, true);
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
__ maybe_isb();
|
||||
__ membar(Assembler::LoadLoad | Assembler::LoadStore);
|
||||
@ -2985,7 +2985,7 @@ RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const cha
|
||||
// r0 contains the address we are going to jump to assuming no exception got installed
|
||||
|
||||
// clear last_Java_sp
|
||||
__ reset_last_Java_frame(false, true);
|
||||
__ reset_last_Java_frame(false);
|
||||
// check for pending exceptions
|
||||
Label pending;
|
||||
__ ldr(rscratch1, Address(rthread, Thread::pending_exception_offset()));
|
||||
@ -3116,7 +3116,7 @@ void OptoRuntime::generate_exception_blob() {
|
||||
|
||||
oop_maps->add_gc_map(the_pc - start, new OopMap(SimpleRuntimeFrame::framesize, 0));
|
||||
|
||||
__ reset_last_Java_frame(false, true);
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
// Restore callee-saved registers
|
||||
|
||||
|
@ -3801,7 +3801,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
oop_maps->add_gc_map(the_pc - start, map);
|
||||
|
||||
__ reset_last_Java_frame(true, true);
|
||||
__ reset_last_Java_frame(true);
|
||||
__ maybe_isb();
|
||||
|
||||
__ leave();
|
||||
|
@ -1353,7 +1353,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
__ stlrw(rscratch1, rscratch2);
|
||||
|
||||
// reset_last_Java_frame
|
||||
__ reset_last_Java_frame(true, true);
|
||||
__ reset_last_Java_frame(true);
|
||||
|
||||
// reset handle block
|
||||
__ ldr(t, Address(rthread, JavaThread::active_handles_offset()));
|
||||
|
@ -47,7 +47,7 @@ bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava)
|
||||
|
||||
// If we have a last_Java_frame, then we should use it even if
|
||||
// isInJava == true. It should be more reliable than ucontext info.
|
||||
if (jt->has_last_Java_frame()) {
|
||||
if (jt->has_last_Java_frame() && jt->frame_anchor()->walkable()) {
|
||||
*fr_addr = jt->pd_last_frame();
|
||||
return true;
|
||||
}
|
||||
|
@ -43,12 +43,7 @@
|
||||
|
||||
frame pd_last_frame() {
|
||||
assert(has_last_Java_frame(), "must have last_Java_sp() when suspended");
|
||||
if (_anchor.last_Java_pc() != NULL) {
|
||||
return frame(_anchor.last_Java_sp(), _anchor.last_Java_fp(), _anchor.last_Java_pc());
|
||||
} else {
|
||||
// This will pick up pc from sp
|
||||
return frame(_anchor.last_Java_sp(), _anchor.last_Java_fp());
|
||||
}
|
||||
return frame(_anchor.last_Java_sp(), _anchor.last_Java_fp(), _anchor.last_Java_pc());
|
||||
}
|
||||
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user