Mercurial > hg > openjdk > aarch64-port > hotspot
changeset 6672:cc094e1af98d jdk8_b128_aarch64_rc4
Fix JCK failure in JVMTI popframe support
author | aph |
---|---|
date | Wed, 05 Mar 2014 16:51:41 +0000 |
parents | 623e2e5f003a |
children | e5b35062dee3 |
files | src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp |
diffstat | 1 files changed, 15 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp Mon Mar 03 15:38:07 2014 +0000 +++ b/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp Wed Mar 05 16:51:41 2014 +0000 @@ -1579,10 +1579,6 @@ // empty. Thus, for any VM calls at this point, GC will find a legal // oop map (with empty expression stack). - // In current activation - // tos: exception - // esi: exception bcp - // // JVMTI PopFrame support // @@ -1614,8 +1610,6 @@ InterpreterRuntime::interpreter_contains), c_rarg1); __ cbnz(r0, caller_not_deoptimized); - __ call_Unimplemented(); - // Compute size of arguments for saving when returning to // deoptimized caller __ get_method(r0); @@ -1653,30 +1647,12 @@ /* install_monitor_exception */ false, /* notify_jvmdi */ false); - // Finish with popframe handling - // A previous I2C followed by a deoptimization might have moved the - // outgoing arguments further up the stack. PopFrame expects the - // mutations to those outgoing arguments to be preserved and other - // constraints basically require this frame to look exactly as - // though it had previously invoked an interpreted activation with - // no space between the top of the expression stack (current - // last_sp) and the top of stack. Rather than force deopt to - // maintain this kind of invariant all the time we call a small - // fixup routine to move the mutated arguments onto the top of our - // expression stack if necessary. - __ mov(c_rarg1, sp); - __ ldr(c_rarg2, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); - // PC must point into interpreter here - __ set_last_Java_frame(noreg, rfp, (address)NULL, rscratch1); - __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::popframe_move_outgoing_args), rthread, c_rarg1, c_rarg2); - __ reset_last_Java_frame(true, true); // Restore the last_sp and null it out - __ ldr(rscratch1, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); - __ mov(esp, rscratch1); + __ ldr(esp, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); __ str(zr, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); - __ restore_bcp(); // XXX do we need this? - __ restore_locals(); // XXX do we need this? + __ restore_bcp(); + __ restore_locals(); __ restore_constant_pool_cache(); __ get_method(rmethod); @@ -1694,7 +1670,7 @@ if (EnableInvokeDynamic) { Label L_done; - __ ldrb(rscratch1, Address(r13, 0)); + __ ldrb(rscratch1, Address(rbcp, 0)); __ cmpw(r1, Bytecodes::_invokestatic); __ br(Assembler::EQ, L_done); @@ -1702,7 +1678,7 @@ // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL. __ ldr(c_rarg0, Address(rlocals, 0)); - __ call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), c_rarg0, rmethod, rscratch1); + __ call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), c_rarg0, rmethod, rbcp); __ cbz(r0, L_done); @@ -1711,6 +1687,16 @@ } #endif // INCLUDE_JVMTI + // Restore machine SP + __ ldr(rscratch1, Address(rmethod, Method::const_offset())); + __ ldrh(rscratch1, Address(rscratch1, ConstMethod::max_stack_offset())); + __ add(rscratch1, rscratch1, frame::interpreter_frame_monitor_size() + + (EnableInvokeDynamic ? 2 : 0)); + __ ldr(rscratch2, + Address(rfp, frame::interpreter_frame_initial_sp_offset * wordSize)); + __ sub(rscratch1, rscratch2, rscratch1, ext::uxtw, 3); + __ andr(sp, rscratch1, -16); + __ dispatch_next(vtos); // end of PopFrame support