diff options
| author | buzbee <buzbee@google.com> | 2010-09-28 12:28:21 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-09-28 12:28:21 -0700 |
| commit | 2e75e47d5e19d3096e0947c1a6c826efdc589826 (patch) | |
| tree | 3492a3b5df30ad7f1983fd3b528a0eacf706a4ce /vm/compiler/codegen/arm/CodegenDriver.c | |
| parent | 252dfcbbc8ab27ba7f86908fbf8c13425d166a70 (diff) | |
| parent | b36ea7918612c81cb42ff2021443358a9f109a6d (diff) | |
am b36ea791: Merge "Change GC card making to use object head, bug fix for volatile sput obj" into gingerbread
Merge commit 'b36ea7918612c81cb42ff2021443358a9f109a6d' into gingerbread-plus-aosp
* commit 'b36ea7918612c81cb42ff2021443358a9f109a6d':
Change GC card making to use object head, bug fix for volatile sput obj
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; } |
