diff options
| author | buzbee <buzbee@google.com> | 2010-09-28 12:26:06 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-09-28 12:26:06 -0700 |
| commit | b36ea7918612c81cb42ff2021443358a9f109a6d (patch) | |
| tree | ba4e18c006e28a0dd07d48eb78e62122b98570fb /vm/compiler/codegen/arm/CodegenDriver.c | |
| parent | b755f9a3caeaf65e95480ac66c2c95553bf79389 (diff) | |
| parent | d82097f6b409c5cd48568e54eb701604c3cceb18 (diff) | |
Merge "Change GC card making to use object head, bug fix for volatile sput obj" into gingerbread
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 0b6e433e6..706866252 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.c +++ b/vm/compiler/codegen/arm/CodegenDriver.c @@ -1527,7 +1527,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*) @@ -1537,6 +1539,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(); @@ -1545,18 +1550,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; } |
