Fix for the JIT blocking mode plus some code cleanup.
Bug: 2517606
Change-Id: I2b5aa92ceaf23d484329330ae20de5966704280b
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index 79a9fb3..11d8268 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -275,13 +275,11 @@
NULL);/* null object? */
opRegRegImm(cUnit, kOpAdd, regPtr, rlObj.lowReg, fieldOffset);
rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, true);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
loadPair(cUnit, regPtr, rlResult.lowReg, rlResult.highReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
dvmCompilerFreeTemp(cUnit, regPtr);
storeValueWide(cUnit, rlDest, rlResult);
}
@@ -299,13 +297,11 @@
NULL);/* null object? */
regPtr = dvmCompilerAllocTemp(cUnit);
opRegRegImm(cUnit, kOpAdd, regPtr, rlObj.lowReg, fieldOffset);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
storePair(cUnit, regPtr, rlSrc.lowReg, rlSrc.highReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
dvmCompilerFreeTemp(cUnit, regPtr);
}
@@ -325,14 +321,12 @@
rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, true);
genNullCheck(cUnit, rlObj.sRegLow, rlObj.lowReg, mir->offset,
NULL);/* null object? */
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
loadBaseDisp(cUnit, mir, rlObj.lowReg, fieldOffset, rlResult.lowReg,
size, rlObj.sRegLow);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
storeValue(cUnit, rlDest, rlResult);
}
@@ -351,13 +345,10 @@
int regPtr;
genNullCheck(cUnit, rlObj.sRegLow, rlObj.lowReg, mir->offset,
NULL);/* null object? */
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
storeBaseDisp(cUnit, rlObj.lowReg, fieldOffset, rlSrc.lowReg, size);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
}
@@ -408,25 +399,21 @@
opRegReg(cUnit, kOpAdd, regPtr, rlIndex.lowReg);
}
rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, true);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
loadPair(cUnit, regPtr, rlResult.lowReg, rlResult.highReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
dvmCompilerFreeTemp(cUnit, regPtr);
storeValueWide(cUnit, rlDest, rlResult);
} else {
rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, true);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
loadBaseIndexed(cUnit, regPtr, rlIndex.lowReg, rlResult.lowReg,
scale, size);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
dvmCompilerFreeTemp(cUnit, regPtr);
storeValue(cUnit, rlDest, rlResult);
}
@@ -489,24 +476,19 @@
opRegReg(cUnit, kOpAdd, regPtr, rlIndex.lowReg);
}
rlSrc = loadValueWide(cUnit, rlSrc, kAnyReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
storePair(cUnit, regPtr, rlSrc.lowReg, rlSrc.highReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
dvmCompilerFreeTemp(cUnit, regPtr);
} else {
rlSrc = loadValue(cUnit, rlSrc, kAnyReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
storeBaseIndexed(cUnit, regPtr, rlIndex.lowReg, rlSrc.lowReg,
scale, size);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
}
}
@@ -585,14 +567,10 @@
target->defMask = ENCODE_ALL;
branchOver->generic.target = (LIR *) target;
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+ HEAP_ACCESS_SHADOW(true);
storeBaseIndexed(cUnit, regPtr, regIndex, r0,
scale, kWord);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
}
static bool genShiftOpLong(CompilationUnit *cUnit, MIR *mir,
@@ -1529,13 +1507,11 @@
rlDest = dvmCompilerGetDest(cUnit, mir, 0);
rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, true);
loadConstant(cUnit, tReg, (int) fieldPtr + valOffset);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
loadWordDisp(cUnit, tReg, 0, rlResult.lowReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
storeValue(cUnit, rlDest, rlResult);
break;
}
@@ -1548,13 +1524,11 @@
rlDest = dvmCompilerGetDestWide(cUnit, mir, 0, 1);
rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, true);
loadConstant(cUnit, tReg, (int) fieldPtr + valOffset);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
loadPair(cUnit, tReg, rlResult.lowReg, rlResult.highReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
storeValueWide(cUnit, rlDest, rlResult);
break;
}
@@ -1573,13 +1547,11 @@
rlSrc = dvmCompilerGetSrc(cUnit, mir, 0);
rlSrc = loadValue(cUnit, rlSrc, kAnyReg);
loadConstant(cUnit, tReg, (int) fieldPtr + valOffset);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
storeWordDisp(cUnit, tReg, 0 ,rlSrc.lowReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
+
break;
}
case OP_SPUT_WIDE: {
@@ -1592,13 +1564,10 @@
rlSrc = dvmCompilerGetSrcWide(cUnit, mir, 0, 1);
rlSrc = loadValueWide(cUnit, rlSrc, kAnyReg);
loadConstant(cUnit, tReg, (int) fieldPtr + valOffset);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = true;
-#endif
+
+ HEAP_ACCESS_SHADOW(true);
storePair(cUnit, tReg, rlSrc.lowReg, rlSrc.highReg);
-#if defined(WITH_SELF_VERIFICATION)
- cUnit->heapMemOp = false;
-#endif
+ HEAP_ACCESS_SHADOW(false);
break;
}
case OP_NEW_INSTANCE: {
@@ -1657,7 +1626,7 @@
* so that we can tell if it happens frequently.
*/
if (classPtr == NULL) {
- LOGD("null clazz in OP_CHECK_CAST, single-stepping");
+ LOGVV("null clazz in OP_CHECK_CAST, single-stepping");
genInterpSingleStep(cUnit, mir);
return false;
}
@@ -3251,9 +3220,14 @@
static void handleNormalChainingCell(CompilationUnit *cUnit,
unsigned int offset)
{
- loadWordDisp(cUnit, rGLUE, offsetof(InterpState,
- jitToInterpEntries.dvmJitToInterpNormal), r0);
- opReg(cUnit, kOpBlx, r0);
+ /*
+ * Use raw instruction constructors to guarantee that the generated
+ * instructions fit the predefined cell size.
+ */
+ newLIR3(cUnit, kThumbLdrRRI5, r0, rGLUE,
+ offsetof(InterpState,
+ jitToInterpEntries.dvmJitToInterpNormal) >> 2);
+ newLIR1(cUnit, kThumbBlxR, r0);
addWordData(cUnit, (int) (cUnit->method->insns + offset), true);
}
@@ -3264,9 +3238,14 @@
static void handleHotChainingCell(CompilationUnit *cUnit,
unsigned int offset)
{
- loadWordDisp(cUnit, rGLUE, offsetof(InterpState,
- jitToInterpEntries.dvmJitToInterpTraceSelect), r0);
- opReg(cUnit, kOpBlx, r0);
+ /*
+ * Use raw instruction constructors to guarantee that the generated
+ * instructions fit the predefined cell size.
+ */
+ newLIR3(cUnit, kThumbLdrRRI5, r0, rGLUE,
+ offsetof(InterpState,
+ jitToInterpEntries.dvmJitToInterpTraceSelect) >> 2);
+ newLIR1(cUnit, kThumbBlxR, r0);
addWordData(cUnit, (int) (cUnit->method->insns + offset), true);
}
@@ -3275,6 +3254,10 @@
static void handleBackwardBranchChainingCell(CompilationUnit *cUnit,
unsigned int offset)
{
+ /*
+ * Use raw instruction constructors to guarantee that the generated
+ * instructions fit the predefined cell size.
+ */
#if defined(WITH_SELF_VERIFICATION)
newLIR3(cUnit, kThumbLdrRRI5, r0, rGLUE,
offsetof(InterpState,
@@ -3292,9 +3275,14 @@
static void handleInvokeSingletonChainingCell(CompilationUnit *cUnit,
const Method *callee)
{
- loadWordDisp(cUnit, rGLUE, offsetof(InterpState,
- jitToInterpEntries.dvmJitToInterpTraceSelect), r0);
- opReg(cUnit, kOpBlx, r0);
+ /*
+ * Use raw instruction constructors to guarantee that the generated
+ * instructions fit the predefined cell size.
+ */
+ newLIR3(cUnit, kThumbLdrRRI5, r0, rGLUE,
+ offsetof(InterpState,
+ jitToInterpEntries.dvmJitToInterpTraceSelect) >> 2);
+ newLIR1(cUnit, kThumbBlxR, r0);
addWordData(cUnit, (int) (callee->insns), true);
}