Skip to content

Commit f3fef9a

Browse files
brsonalexcrichton
authored andcommitted
std: Make atomics immutable. #11583
In Rust, the strongest guarantee that `&mut` provides is that the memory pointed to is *not aliased*, whereas `&`'s guarantees are much weaker: that the value can be aliased, and may be mutated under proper precautions (interior mutability). Our atomics though use `&mut` for mutation even while creating multiple aliases, so this changes them to use 'interior mutability', mutating through immutable references.
1 parent c01e2f0 commit f3fef9a

File tree

7 files changed

+1093
-71
lines changed

7 files changed

+1093
-71
lines changed

src/librustc/middle/typeck/check/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4012,7 +4012,7 @@ pub fn check_intrinsic_type(ccx: &CrateCtxt, it: &ast::ForeignItem) {
40124012

40134013
//We only care about the operation here
40144014
match *split.get(1) {
4015-
"cxchg" => (1, vec!(ty::mk_mut_rptr(tcx,
4015+
"cxchg" => (1, vec!(ty::mk_imm_rptr(tcx,
40164016
ty::ReLateBound(it.id, ty::BrAnon(0)),
40174017
param(ccx, 0)),
40184018
param(ccx, 0),
@@ -4025,15 +4025,15 @@ pub fn check_intrinsic_type(ccx: &CrateCtxt, it: &ast::ForeignItem) {
40254025
param(ccx, 0)),
40264026
"store" => (1,
40274027
vec!(
4028-
ty::mk_mut_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
4028+
ty::mk_imm_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
40294029
param(ccx, 0)),
40304030
param(ccx, 0)
40314031
),
40324032
ty::mk_nil()),
40334033

40344034
"xchg" | "xadd" | "xsub" | "and" | "nand" | "or" | "xor" | "max" |
40354035
"min" | "umax" | "umin" => {
4036-
(1, vec!(ty::mk_mut_rptr(tcx,
4036+
(1, vec!(ty::mk_imm_rptr(tcx,
40374037
ty::ReLateBound(it.id, ty::BrAnon(0)),
40384038
param(ccx, 0)), param(ccx, 0) ),
40394039
param(ccx, 0))

src/libstd/intrinsics.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ pub trait TyVisitor {
164164
fn visit_self(&mut self) -> bool;
165165
}
166166

167+
#[cfg(stage0)]
167168
extern "rust-intrinsic" {
168169
pub fn atomic_cxchg<T>(dst: &mut T, old: T, src: T) -> T;
169170
pub fn atomic_cxchg_acq<T>(dst: &mut T, old: T, src: T) -> T;
@@ -244,6 +245,93 @@ extern "rust-intrinsic" {
244245
pub fn atomic_umax_rel<T>(dst: &mut T, src: T) -> T;
245246
pub fn atomic_umax_acqrel<T>(dst: &mut T, src: T) -> T;
246247
pub fn atomic_umax_relaxed<T>(dst: &mut T, src: T) -> T;
248+
}
249+
250+
#[cfg(not(stage0))]
251+
extern "rust-intrinsic" {
252+
253+
pub fn atomic_cxchg<T>(dst: &T, old: T, src: T) -> T;
254+
pub fn atomic_cxchg_acq<T>(dst: &T, old: T, src: T) -> T;
255+
pub fn atomic_cxchg_rel<T>(dst: &T, old: T, src: T) -> T;
256+
pub fn atomic_cxchg_acqrel<T>(dst: &T, old: T, src: T) -> T;
257+
pub fn atomic_cxchg_relaxed<T>(dst: &T, old: T, src: T) -> T;
258+
259+
pub fn atomic_load<T>(src: &T) -> T;
260+
pub fn atomic_load_acq<T>(src: &T) -> T;
261+
pub fn atomic_load_relaxed<T>(src: &T) -> T;
262+
263+
pub fn atomic_store<T>(dst: &T, val: T);
264+
pub fn atomic_store_rel<T>(dst: &T, val: T);
265+
pub fn atomic_store_relaxed<T>(dst: &T, val: T);
266+
267+
pub fn atomic_xchg<T>(dst: &T, src: T) -> T;
268+
pub fn atomic_xchg_acq<T>(dst: &T, src: T) -> T;
269+
pub fn atomic_xchg_rel<T>(dst: &T, src: T) -> T;
270+
pub fn atomic_xchg_acqrel<T>(dst: &T, src: T) -> T;
271+
pub fn atomic_xchg_relaxed<T>(dst: &T, src: T) -> T;
272+
273+
pub fn atomic_xadd<T>(dst: &T, src: T) -> T;
274+
pub fn atomic_xadd_acq<T>(dst: &T, src: T) -> T;
275+
pub fn atomic_xadd_rel<T>(dst: &T, src: T) -> T;
276+
pub fn atomic_xadd_acqrel<T>(dst: &T, src: T) -> T;
277+
pub fn atomic_xadd_relaxed<T>(dst: &T, src: T) -> T;
278+
279+
pub fn atomic_xsub<T>(dst: &T, src: T) -> T;
280+
pub fn atomic_xsub_acq<T>(dst: &T, src: T) -> T;
281+
pub fn atomic_xsub_rel<T>(dst: &T, src: T) -> T;
282+
pub fn atomic_xsub_acqrel<T>(dst: &T, src: T) -> T;
283+
pub fn atomic_xsub_relaxed<T>(dst: &T, src: T) -> T;
284+
285+
pub fn atomic_and<T>(dst: &T, src: T) -> T;
286+
pub fn atomic_and_acq<T>(dst: &T, src: T) -> T;
287+
pub fn atomic_and_rel<T>(dst: &T, src: T) -> T;
288+
pub fn atomic_and_acqrel<T>(dst: &T, src: T) -> T;
289+
pub fn atomic_and_relaxed<T>(dst: &T, src: T) -> T;
290+
291+
pub fn atomic_nand<T>(dst: &T, src: T) -> T;
292+
pub fn atomic_nand_acq<T>(dst: &T, src: T) -> T;
293+
pub fn atomic_nand_rel<T>(dst: &T, src: T) -> T;
294+
pub fn atomic_nand_acqrel<T>(dst: &T, src: T) -> T;
295+
pub fn atomic_nand_relaxed<T>(dst: &T, src: T) -> T;
296+
297+
pub fn atomic_or<T>(dst: &T, src: T) -> T;
298+
pub fn atomic_or_acq<T>(dst: &T, src: T) -> T;
299+
pub fn atomic_or_rel<T>(dst: &T, src: T) -> T;
300+
pub fn atomic_or_acqrel<T>(dst: &T, src: T) -> T;
301+
pub fn atomic_or_relaxed<T>(dst: &T, src: T) -> T;
302+
303+
pub fn atomic_xor<T>(dst: &T, src: T) -> T;
304+
pub fn atomic_xor_acq<T>(dst: &T, src: T) -> T;
305+
pub fn atomic_xor_rel<T>(dst: &T, src: T) -> T;
306+
pub fn atomic_xor_acqrel<T>(dst: &T, src: T) -> T;
307+
pub fn atomic_xor_relaxed<T>(dst: &T, src: T) -> T;
308+
309+
pub fn atomic_max<T>(dst: &T, src: T) -> T;
310+
pub fn atomic_max_acq<T>(dst: &T, src: T) -> T;
311+
pub fn atomic_max_rel<T>(dst: &T, src: T) -> T;
312+
pub fn atomic_max_acqrel<T>(dst: &T, src: T) -> T;
313+
pub fn atomic_max_relaxed<T>(dst: &T, src: T) -> T;
314+
315+
pub fn atomic_min<T>(dst: &T, src: T) -> T;
316+
pub fn atomic_min_acq<T>(dst: &T, src: T) -> T;
317+
pub fn atomic_min_rel<T>(dst: &T, src: T) -> T;
318+
pub fn atomic_min_acqrel<T>(dst: &T, src: T) -> T;
319+
pub fn atomic_min_relaxed<T>(dst: &T, src: T) -> T;
320+
321+
pub fn atomic_umin<T>(dst: &T, src: T) -> T;
322+
pub fn atomic_umin_acq<T>(dst: &T, src: T) -> T;
323+
pub fn atomic_umin_rel<T>(dst: &T, src: T) -> T;
324+
pub fn atomic_umin_acqrel<T>(dst: &T, src: T) -> T;
325+
pub fn atomic_umin_relaxed<T>(dst: &T, src: T) -> T;
326+
327+
pub fn atomic_umax<T>(dst: &T, src: T) -> T;
328+
pub fn atomic_umax_acq<T>(dst: &T, src: T) -> T;
329+
pub fn atomic_umax_rel<T>(dst: &T, src: T) -> T;
330+
pub fn atomic_umax_acqrel<T>(dst: &T, src: T) -> T;
331+
pub fn atomic_umax_relaxed<T>(dst: &T, src: T) -> T;
332+
}
333+
334+
extern "rust-intrinsic" {
247335

248336
pub fn atomic_fence();
249337
pub fn atomic_fence_acq();

0 commit comments

Comments
 (0)