From 0c4003631d011ba569e49e6d1a63b90e92db3a49 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Sat, 5 Oct 2019 06:12:37 -0300 Subject: [PATCH 1/2] Add missing atomic_fence intrinsics as nops Fixes #972 --- src/shims/intrinsics.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/shims/intrinsics.rs b/src/shims/intrinsics.rs index 06af6db76a..875a344363 100644 --- a/src/shims/intrinsics.rs +++ b/src/shims/intrinsics.rs @@ -88,7 +88,10 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx this.write_scalar(val, place.into())?; } - "atomic_fence_acq" => { + "atomic_fence_acq" | + "atomic_fence_rel" | + "atomic_fence_acqrel" | + "atomic_fence" => { // we are inherently singlethreaded and singlecored, this is a nop } From bd4a2996d1ac30e49adfcb241cb8a436730c35ac Mon Sep 17 00:00:00 2001 From: Nicolas Date: Sat, 5 Oct 2019 08:09:23 -0300 Subject: [PATCH 2/2] Add test for atomic fences --- tests/run-pass/atomic.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/run-pass/atomic.rs b/tests/run-pass/atomic.rs index f0b8ec06b9..5872a496db 100644 --- a/tests/run-pass/atomic.rs +++ b/tests/run-pass/atomic.rs @@ -1,9 +1,10 @@ -use std::sync::atomic::{AtomicBool, AtomicIsize, AtomicU64, Ordering::*}; +use std::sync::atomic::{fence, AtomicBool, AtomicIsize, AtomicU64, Ordering::*}; fn main() { atomic_bool(); atomic_isize(); atomic_u64(); + atomic_fences(); } fn atomic_bool() { @@ -57,6 +58,15 @@ fn atomic_u64() { ATOMIC.store(1, SeqCst); assert_eq!(ATOMIC.compare_exchange(0, 0x100, AcqRel, Acquire), Err(1)); - assert_eq!(ATOMIC.compare_exchange_weak(1, 0x100, AcqRel, Acquire), Ok(1)); + assert_eq!( + ATOMIC.compare_exchange_weak(1, 0x100, AcqRel, Acquire), + Ok(1) + ); assert_eq!(ATOMIC.load(Relaxed), 0x100); } + +fn atomic_fences() { + fence(SeqCst); + fence(Release); + fence(Acquire); +}