RFR 8217223 [lworld][c1] monitorenter on value object should throw IllegalMonitorStateException
Ioi Lam
ioi.lam at oracle.com
Wed Jan 16 06:32:29 UTC 2019
https://bugs.openjdk.java.net/browse/JDK-8217223
http://cr.openjdk.java.net/~iklam/valhalla/8217223-c1-monitorenter-throw-imse.v01/
Here's a fix for C1 to properly throw IllegalMonitorStateException
when synchronizing on value objects.
Ideally, we should just call into Runtime1::monitorenter(), which
handles the IMSE throwing. However, due to C1's limitation, when
an exception happens inside Runtime1::monitorenter(), there's no
way for the current method to catch this exception, so for code
like this:
try {
synchronized(vt) {}
} catch (Throwable t) {
foo();
}
foo() is never called and the exception is thrown to the method's
caller.
As a work around, I added an explicit check in MonitorEnterStub to
call a SimpleExceptionStub to throw the IMSE.
Here's what the generated code looks like. The instructions marked
by "+" are added by this patch.
+UseBiasedLocking case:
======================
;; MonitorEnterStub slow case
0x00007fe788e285f0: mov (%rsi),%rdi
+ 0x00007fe788e285f3: test $0x405,%edi
;; 0x405 = markOopDesc::always_locked_pattern
+ 0x00007fe788e285f9: jne 0x00007fe788e28612
0x00007fe788e285ff: mov %rsi,0x8(%rsp)
0x00007fe788e28604: mov %rdx,(%rsp)
0x00007fe788e28608: callq 0x00007fe7889d8840
;;{runtime_call monitorenter_nofpu}
0x00007fe788e2860d: jmpq 0x00007fe788e28381
;; SimpleExceptionStub slow case
+ 0x00007fe788e28612: callq 0x00007fe7889d7e40
;;{runtime_call throw_illegal_monitor_state_exception}
-UseBiasedLocking case:
======================
0x00007fe1e8e2828c: lea 0x20(%rsp),%rdx
0x00007fe1e8e28291: mov %rsi,0x8(%rdx)
0x00007fe1e8e28295: mov (%rsi),%rax
+ 0x00007fe1e8e28298: test $0x405,%eax
+ 0x00007fe1e8e2829d: jne 0x00007fe1e8e28528 ;; MonitorEnterStub
0x00007fe1e8e282a3: or $0x1,%rax
0x00007fe1e8e282a7: mov %rax,(%rdx)
0x00007fe1e8e282aa: lock cmpxchg %rdx,(%rsi)
(the MonitorEnterStub looks identical to the +UseBiasedLocking case).
Thanks
- Ioi
More information about the valhalla-dev
mailing list