StgCmmPrim: Add missing write barrier.
authorPeter Trommler <ptrommler@acm.org>
Wed, 19 Oct 2016 13:02:54 +0000 (09:02 -0400)
committerBen Gamari <ben@smart-cactus.org>
Wed, 19 Oct 2016 13:03:03 +0000 (09:03 -0400)
On architectures with weak memory consistency a write barrier
is needed before the write to the pointer array.

Fixes #12469

Test Plan: rebuilt Stackage nightly twice on powerpc64le

Reviewers: hvr, rrnewton, erikd, austin, simonmar, bgamari

Reviewed By: erikd, bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2525

GHC Trac Issues: #12469

compiler/codeGen/StgCmmPrim.hs

index 2169465..34c2d06 100644 (file)
@@ -1350,6 +1350,10 @@ doWritePtrArrayOp :: CmmExpr
 doWritePtrArrayOp addr idx val
   = do dflags <- getDynFlags
        let ty = cmmExprType dflags val
+       -- This write barrier is to ensure that the heap writes to the object
+       -- referred to by val have happened before we write val into the array.
+       -- See #12469 for details.
+       emitPrimCall [] MO_WriteBarrier []
        mkBasicIndexedWrite (arrPtrsHdrSize dflags) Nothing addr ty idx val
        emit (setInfo addr (CmmLit (CmmLabel mkMAP_DIRTY_infoLabel)))
   -- the write barrier.  We must write a byte into the mark table: