src/cpu/x86/vm/sharedRuntime_x86_64.cpp
Print this page
rev 3150 : 7148486: At a method handle call returning with an exception may call the runtime with misaligned stack (x64)
Summary: stack must be realigned when calling the runtime for exception propagation at a call.
Reviewed-by:
@@ -3618,25 +3618,29 @@
// If not, it prepares for stack-unwinding, restoring the callee-save
// registers of the frame being removed.
//
// address OptoRuntime::handle_exception_C(JavaThread* thread)
- __ set_last_Java_frame(noreg, noreg, NULL);
+ // At a method handle call, the stack may not be properly aligned
+ // when returning with an exception.
+ address the_pc = __ pc();
+ __ set_last_Java_frame(noreg, noreg, the_pc);
__ mov(c_rarg0, r15_thread);
+ __ andptr(rsp, -(StackAlignmentInBytes)); // Align stack
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, OptoRuntime::handle_exception_C)));
// Set an oopmap for the call site. This oopmap will only be used if we
// are unwinding the stack. Hence, all locations will be dead.
// Callee-saved registers will be the same as the frame above (i.e.,
// handle_exception_stub), since they were restored when we got the
// exception.
OopMapSet* oop_maps = new OopMapSet();
- oop_maps->add_gc_map( __ pc()-start, new OopMap(SimpleRuntimeFrame::framesize, 0));
+ oop_maps->add_gc_map(the_pc - start, new OopMap(SimpleRuntimeFrame::framesize, 0));
- __ reset_last_Java_frame(false, false);
+ __ reset_last_Java_frame(false, true);
// Restore callee-saved registers
// rbp is an implicitly saved callee saved register (i.e. the calling
// convention will save restore it in prolog/epilog) Other than that