8342409: [s390x] C1 unwind_handler fails to unlock synchronized methods with LM_MONITOR
Reviewed-by: rrich, lucy
This commit is contained in:
parent
0963b9e891
commit
9201e9fcc2
@ -216,7 +216,11 @@ int LIR_Assembler::emit_unwind_handler() {
|
|||||||
LIR_Opr lock = FrameMap::as_opr(Z_R1_scratch);
|
LIR_Opr lock = FrameMap::as_opr(Z_R1_scratch);
|
||||||
monitor_address(0, lock);
|
monitor_address(0, lock);
|
||||||
stub = new MonitorExitStub(lock, true, 0);
|
stub = new MonitorExitStub(lock, true, 0);
|
||||||
__ unlock_object(Rtmp1, Rtmp2, lock->as_register(), *stub->entry());
|
if (LockingMode == LM_MONITOR) {
|
||||||
|
__ branch_optimized(Assembler::bcondAlways, *stub->entry());
|
||||||
|
} else {
|
||||||
|
__ unlock_object(Rtmp1, Rtmp2, lock->as_register(), *stub->entry());
|
||||||
|
}
|
||||||
__ bind(*stub->continuation());
|
__ bind(*stub->continuation());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,6 +120,8 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox
|
|||||||
branch_optimized(Assembler::bcondNotZero, slow_case);
|
branch_optimized(Assembler::bcondNotZero, slow_case);
|
||||||
// done
|
// done
|
||||||
bind(done);
|
bind(done);
|
||||||
|
} else {
|
||||||
|
assert(false, "Unhandled LockingMode:%d", LockingMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,6 +153,8 @@ void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rb
|
|||||||
// If the object header was not pointing to the displaced header,
|
// If the object header was not pointing to the displaced header,
|
||||||
// we do unlocking via runtime call.
|
// we do unlocking via runtime call.
|
||||||
branch_optimized(Assembler::bcondNotEqual, slow_case);
|
branch_optimized(Assembler::bcondNotEqual, slow_case);
|
||||||
|
} else {
|
||||||
|
assert(false, "Unhandled LockingMode:%d", LockingMode);
|
||||||
}
|
}
|
||||||
// done
|
// done
|
||||||
bind(done);
|
bind(done);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user