From b1e2271b51cfb1f264b8966f1151652767259751 Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Thu, 27 Oct 2011 14:04:12 -0700 Subject: [PATCH] Fix single-stepping resume mode in the interpreter. (cherry-picked from master) When a resume attempt is cancelled due to other pending request make sure the old native resume PC is cleared. Otherwise the JIT code cache may be re-entered with mismatching Dalvik PC. Also fix a code bloat problem where single-step count is not set properly after executing a return instruction. BUG: 5208786 Change-Id: I54775215b11eae29ccdb6111dc0fdfa99e41e08d --- vm/interp/Interp.cpp | 3 +++ vm/interp/Jit.cpp | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/vm/interp/Interp.cpp b/vm/interp/Interp.cpp index 85d06db13..f78b7a405 100644 --- a/vm/interp/Interp.cpp +++ b/vm/interp/Interp.cpp @@ -1839,6 +1839,9 @@ void dvmCheckBefore(const u2 *pc, u4 *fp, Thread* self) // Doesn't return dvmAbort(); } + // In case resume is blocked by non-zero breakFlags, clear + // jitResumeNPC here. + self->jitResumeNPC = NULL; self->jitResumeDPC = NULL; self->inJitCodeCache = NULL; #endif diff --git a/vm/interp/Jit.cpp b/vm/interp/Jit.cpp index d4c5a796e..494aae1a9 100644 --- a/vm/interp/Jit.cpp +++ b/vm/interp/Jit.cpp @@ -976,9 +976,12 @@ void dvmCheckJit(const u2* pc, Thread* self) if (allDone) { dvmDisableSubMode(self, kSubModeJitTraceBuild); if (stayOneMoreInst) { + // Clear jitResumeNPC explicitly since we know we don't need it + // here. + self->jitResumeNPC = NULL; // Keep going in single-step mode for at least one more inst - assert(self->jitResumeNPC == NULL); - self->singleStepCount = MIN(1, self->singleStepCount); + if (self->singleStepCount == 0) + self->singleStepCount = 1; dvmEnableSubMode(self, kSubModeCountedStep); } } -- 2.11.0