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 @ refresh Jit's on/off status & test for exception 17 ldr r0, [rGLUE, #offGlue_ppJitProfTable] 18 ldr r1, [rGLUE, #offGlue_self] 19 ldr r0, [r0] 20 ldr r1, [r1, #offThread_exception] 21 str r0, [rGLUE, #offGlue_pJitProfTable] 22 cmp r1, #0 23 beq 1f 24 ldr r2, .LhandleException 25 sub r0, r4, #2 @ roll dPC back to this monitor instruction 26 bx r2 27 1: 28 @ Bail to interpreter - no chain [note - r4 still contains rPC] 29 #if defined(JIT_STATS) 30 mov r0, #kHeavyweightMonitor 31 #endif 32 ldr pc, .LdvmJitToInterpNoChain 33