diff options
| author | buzbee <buzbee@google.com> | 2010-09-28 15:22:48 -0700 |
|---|---|---|
| committer | buzbee <buzbee@google.com> | 2010-09-28 15:22:48 -0700 |
| commit | 453d1aed5e813adfb5225fa12a95822d6ab8c14e (patch) | |
| tree | 21143ef96ac1e98c4779285aa34677f2c5edf786 /vm/compiler/codegen/arm/CodegenDriver.c | |
| parent | 432e74e6edf67b9775d26e4811e700c4860a33a3 (diff) | |
| parent | 2e75e47d5e19d3096e0947c1a6c826efdc589826 (diff) | |
resolved conflicts for merge of 2e75e47d to master
Change-Id: I644b3cd50e3c63b209741c8b818b4c1435ee8218
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.c')
| -rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c index 177b1c6ae..481bea353 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.c +++ b/vm/compiler/codegen/arm/CodegenDriver.c @@ -1523,7 +1523,9 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir) case OP_SPUT: { int valOffset = offsetof(StaticField, value); int tReg = dvmCompilerAllocTemp(cUnit); + int objHead; bool isVolatile; + bool isSputObject; const Method *method = (mir->OptimizationFlags & MIR_CALLEE) ? mir->meta.calleeMethod : cUnit->method; void *fieldPtr = (void*) @@ -1533,6 +1535,9 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir) (mir->dalvikInsn.opCode == OP_SPUT_OBJECT_VOLATILE) || dvmIsVolatileField(fieldPtr); + isSputObject = (mir->dalvikInsn.opCode == OP_SPUT_OBJECT) || + (mir->dalvikInsn.opCode == OP_SPUT_OBJECT_VOLATILE); + if (fieldPtr == NULL) { LOGE("Unexpected null static field"); dvmAbort(); @@ -1541,18 +1546,22 @@ static bool handleFmt21c_Fmt31c(CompilationUnit *cUnit, MIR *mir) rlSrc = dvmCompilerGetSrc(cUnit, mir, 0); rlSrc = loadValue(cUnit, rlSrc, kAnyReg); loadConstant(cUnit, tReg, (int) fieldPtr + valOffset); - + if (isSputObject) { + objHead = dvmCompilerAllocTemp(cUnit); + loadConstant(cUnit, objHead, (intptr_t)method->clazz); + } HEAP_ACCESS_SHADOW(true); storeWordDisp(cUnit, tReg, 0 ,rlSrc.lowReg); + dvmCompilerFreeTemp(cUnit, tReg); HEAP_ACCESS_SHADOW(false); if (isVolatile) { dvmCompilerGenMemBarrier(cUnit); } - if (mir->dalvikInsn.opCode == OP_SPUT_OBJECT) { - /* NOTE: marking card based on field address */ - markCard(cUnit, rlSrc.lowReg, tReg); + if (isSputObject) { + /* NOTE: marking card based object head */ + markCard(cUnit, rlSrc.lowReg, objHead); + dvmCompilerFreeTemp(cUnit, objHead); } - dvmCompilerFreeTemp(cUnit, tReg); break; } |
