1    /*
2     * To support deadlock prediction, this version of MONITOR_ENTER
3     * will always call the heavyweight dvmLockObject, check for an
4     * exception and then bail out to the interpreter.
5     *
6     * On entry:
7     *    r0 - self pointer
8     *    r1 - the object (which has already been null-checked by the caller
9     *    r4 - the Dalvik PC of the following instruction.
10     *
11     */
12    ldr     r2, .LdvmLockObject
13    mov     r3, #0                       @ Record that we're not returning
14    str     r3, [r0, #offThread_inJitCodeCache]
15    blx     r2             @ dvmLockObject(self, obj)
16    @ test for exception
17    ldr     r1, [rSELF, #offThread_exception]
18    cmp     r1, #0
19    beq     1f
20    ldr     r2, .LhandleException
21    sub     r0, r4, #2     @ roll dPC back to this monitor instruction
22    bx      r2
231:
24    @ Bail to interpreter - no chain [note - r4 still contains rPC]
25#if defined(WITH_JIT_TUNING)
26    mov     r0, #kHeavyweightMonitor
27#endif
28    ldr     pc, .LdvmJitToInterpNoChain
29