summaryrefslogtreecommitdiffstats
path: root/vm/interp
diff options
context:
space:
mode:
authorBen Cheng <bccheng@android.com>2011-10-27 14:04:12 -0700
committerBen Cheng <bccheng@android.com>2011-10-28 12:18:44 -0700
commitb1e2271b51cfb1f264b8966f1151652767259751 (patch)
tree3d1d83effee648fc6aacfc16cb0741a5936fa605 /vm/interp
parent21fefbaa3874c42f8a017c4794add2d7c337643a (diff)
downloadandroid_dalvik-b1e2271b51cfb1f264b8966f1151652767259751.tar.gz
android_dalvik-b1e2271b51cfb1f264b8966f1151652767259751.tar.bz2
android_dalvik-b1e2271b51cfb1f264b8966f1151652767259751.zip
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
Diffstat (limited to 'vm/interp')
-rw-r--r--vm/interp/Interp.cpp3
-rw-r--r--vm/interp/Jit.cpp7
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);
}
}