diff options
| author | buzbee <buzbee@google.com> | 2011-09-27 11:47:28 -0700 |
|---|---|---|
| committer | buzbee <buzbee@google.com> | 2011-09-27 16:59:35 -0700 |
| commit | 4185972e211b0c84b9fe7d90c56b28cc15e474fa (patch) | |
| tree | 8182adea9ecc6ec9fa00a0291313340f94959e9c /vm/compiler/codegen/arm/CodegenDriver.cpp | |
| parent | 927765c9a80a730d73bd40e2ef60ccaa01652449 (diff) | |
Fix memory barriers (Issue 3338450)
Add extra memory barrier on volatile stores.
Change-Id: Id4a4750cdfc910eda2f0b44ead0af2a569b5735e
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.cpp')
| -rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.cpp b/vm/compiler/codegen/arm/CodegenDriver.cpp index 75b86a456..85ecb7892 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.cpp +++ b/vm/compiler/codegen/arm/CodegenDriver.cpp @@ -384,11 +384,14 @@ static void genIPut(CompilationUnit *cUnit, MIR *mir, OpSize size, NULL);/* null object? */ if (isVolatile) { - dvmCompilerGenMemBarrier(cUnit, kSY); + dvmCompilerGenMemBarrier(cUnit, kST); } HEAP_ACCESS_SHADOW(true); storeBaseDisp(cUnit, rlObj.lowReg, fieldOffset, rlSrc.lowReg, size); HEAP_ACCESS_SHADOW(false); + if (isVolatile) { + dvmCompilerGenMemBarrier(cUnit, kSY); + } if (isObject) { /* NOTE: marking card based on object head */ markCard(cUnit, rlSrc.lowReg, rlObj.lowReg); @@ -1757,6 +1760,9 @@ static bool handleFmt21c_Fmt31c_Fmt41c(CompilationUnit *cUnit, MIR *mir) objHead = dvmCompilerAllocTemp(cUnit); loadWordDisp(cUnit, tReg, OFFSETOF_MEMBER(Field, clazz), objHead); } + if (isVolatile) { + dvmCompilerGenMemBarrier(cUnit, kST); + } HEAP_ACCESS_SHADOW(true); storeWordDisp(cUnit, tReg, valOffset ,rlSrc.lowReg); dvmCompilerFreeTemp(cUnit, tReg); |
