summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-11-16 09:36:26 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-12-15 03:55:15 -0500
commit552b7908d8703e9478cee418721b311e033391dc (patch)
tree997a7ea7e757fe7bf96c060a4bddae936f544902
parent2eb0fb87b921efc8f107eb39a3d34dae08082a3c (diff)
downloadhaskell-552b7908d8703e9478cee418721b311e033391dc.tar.gz
compiler: Ensure that MutVar operations have necessary barriers
Here we add acquire and release barriers in readMutVar# and writeMutVar#, which are necessary for soundness. Fixes #22468.
-rw-r--r--compiler/GHC/StgToCmm/Prim.hs9
1 files changed, 5 insertions, 4 deletions
diff --git a/compiler/GHC/StgToCmm/Prim.hs b/compiler/GHC/StgToCmm/Prim.hs
index 93fdd3f5e2..e17a937a9e 100644
--- a/compiler/GHC/StgToCmm/Prim.hs
+++ b/compiler/GHC/StgToCmm/Prim.hs
@@ -283,9 +283,10 @@ emitPrimOp cfg primop =
emitAssign (CmmLocal res) currentTSOExpr
ReadMutVarOp -> \[mutv] -> opIntoRegs $ \[res] ->
- emitAssign (CmmLocal res) (cmmLoadIndexW platform mutv (fixedHdrSizeW profile) (gcWord platform))
+ emitPrimCall [res] (MO_AtomicRead (wordWidth platform) MemOrderAcquire)
+ [ cmmOffsetW platform mutv (fixedHdrSizeW profile) ]
- WriteMutVarOp -> \[mutv, var] -> opIntoRegs $ \res@[] -> do
+ WriteMutVarOp -> \[mutv, var] -> opIntoRegs $ \[] -> do
old_val <- CmmLocal <$> newTemp (cmmExprType platform var)
emitAssign old_val (cmmLoadIndexW platform mutv (fixedHdrSizeW profile) (gcWord platform))
@@ -294,8 +295,8 @@ emitPrimOp cfg primop =
-- Note that this also must come after we read the old value to ensure
-- that the read of old_val comes before another core's write to the
-- MutVar's value.
- emitPrimCall res MO_WriteBarrier []
- emitStore (cmmOffsetW platform mutv (fixedHdrSizeW profile)) var
+ emitPrimCall [] (MO_AtomicWrite (wordWidth platform) MemOrderRelease)
+ [ cmmOffsetW platform mutv (fixedHdrSizeW profile), var ]
platform <- getPlatform
mkdirtyMutVarCCall <- getCode $! emitCCall