Skip to content

Commit eb25c42

Browse files
brsonalexcrichton
authored andcommitted
std: Make the generic atomics take unsafe pointers
These mutate values behind references that are Freeze, which is not allowed.
1 parent f3fef9a commit eb25c42

File tree

5 files changed

+170
-193
lines changed

5 files changed

+170
-193
lines changed

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

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4012,30 +4012,18 @@ 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_imm_rptr(tcx,
4016-
ty::ReLateBound(it.id, ty::BrAnon(0)),
4017-
param(ccx, 0)),
4018-
param(ccx, 0),
4019-
param(ccx, 0)), param(ccx, 0)),
4020-
"load" => (1,
4021-
vec!(
4022-
ty::mk_imm_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
4023-
param(ccx, 0))
4024-
),
4025-
param(ccx, 0)),
4026-
"store" => (1,
4027-
vec!(
4028-
ty::mk_imm_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
4029-
param(ccx, 0)),
4030-
param(ccx, 0)
4031-
),
4032-
ty::mk_nil()),
4015+
"cxchg" => (1, vec!(ty::mk_mut_ptr(tcx, param(ccx, 0)),
4016+
param(ccx, 0),
4017+
param(ccx, 0)),
4018+
param(ccx, 0)),
4019+
"load" => (1, vec!(ty::mk_imm_ptr(tcx, param(ccx, 0))),
4020+
param(ccx, 0)),
4021+
"store" => (1, vec!(ty::mk_mut_ptr(tcx, param(ccx, 0)), param(ccx, 0)),
4022+
ty::mk_nil()),
40334023

40344024
"xchg" | "xadd" | "xsub" | "and" | "nand" | "or" | "xor" | "max" |
40354025
"min" | "umax" | "umin" => {
4036-
(1, vec!(ty::mk_imm_rptr(tcx,
4037-
ty::ReLateBound(it.id, ty::BrAnon(0)),
4038-
param(ccx, 0)), param(ccx, 0) ),
4026+
(1, vec!(ty::mk_mut_ptr(tcx, param(ccx, 0)), param(ccx, 0)),
40394027
param(ccx, 0))
40404028
}
40414029
"fence" => {

src/libstd/intrinsics.rs

Lines changed: 82 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -250,85 +250,88 @@ extern "rust-intrinsic" {
250250
#[cfg(not(stage0))]
251251
extern "rust-intrinsic" {
252252

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;
253+
// NB: These intrinsics take unsafe pointers because they mutate aliased
254+
// memory, which is not valid for either `&` or `&mut`.
255+
256+
pub fn atomic_cxchg<T>(dst: *mut T, old: T, src: T) -> T;
257+
pub fn atomic_cxchg_acq<T>(dst: *mut T, old: T, src: T) -> T;
258+
pub fn atomic_cxchg_rel<T>(dst: *mut T, old: T, src: T) -> T;
259+
pub fn atomic_cxchg_acqrel<T>(dst: *mut T, old: T, src: T) -> T;
260+
pub fn atomic_cxchg_relaxed<T>(dst: *mut T, old: T, src: T) -> T;
261+
262+
pub fn atomic_load<T>(src: *T) -> T;
263+
pub fn atomic_load_acq<T>(src: *T) -> T;
264+
pub fn atomic_load_relaxed<T>(src: *T) -> T;
265+
266+
pub fn atomic_store<T>(dst: *mut T, val: T);
267+
pub fn atomic_store_rel<T>(dst: *mut T, val: T);
268+
pub fn atomic_store_relaxed<T>(dst: *mut T, val: T);
269+
270+
pub fn atomic_xchg<T>(dst: *mut T, src: T) -> T;
271+
pub fn atomic_xchg_acq<T>(dst: *mut T, src: T) -> T;
272+
pub fn atomic_xchg_rel<T>(dst: *mut T, src: T) -> T;
273+
pub fn atomic_xchg_acqrel<T>(dst: *mut T, src: T) -> T;
274+
pub fn atomic_xchg_relaxed<T>(dst: *mut T, src: T) -> T;
275+
276+
pub fn atomic_xadd<T>(dst: *mut T, src: T) -> T;
277+
pub fn atomic_xadd_acq<T>(dst: *mut T, src: T) -> T;
278+
pub fn atomic_xadd_rel<T>(dst: *mut T, src: T) -> T;
279+
pub fn atomic_xadd_acqrel<T>(dst: *mut T, src: T) -> T;
280+
pub fn atomic_xadd_relaxed<T>(dst: *mut T, src: T) -> T;
281+
282+
pub fn atomic_xsub<T>(dst: *mut T, src: T) -> T;
283+
pub fn atomic_xsub_acq<T>(dst: *mut T, src: T) -> T;
284+
pub fn atomic_xsub_rel<T>(dst: *mut T, src: T) -> T;
285+
pub fn atomic_xsub_acqrel<T>(dst: *mut T, src: T) -> T;
286+
pub fn atomic_xsub_relaxed<T>(dst: *mut T, src: T) -> T;
287+
288+
pub fn atomic_and<T>(dst: *mut T, src: T) -> T;
289+
pub fn atomic_and_acq<T>(dst: *mut T, src: T) -> T;
290+
pub fn atomic_and_rel<T>(dst: *mut T, src: T) -> T;
291+
pub fn atomic_and_acqrel<T>(dst: *mut T, src: T) -> T;
292+
pub fn atomic_and_relaxed<T>(dst: *mut T, src: T) -> T;
293+
294+
pub fn atomic_nand<T>(dst: *mut T, src: T) -> T;
295+
pub fn atomic_nand_acq<T>(dst: *mut T, src: T) -> T;
296+
pub fn atomic_nand_rel<T>(dst: *mut T, src: T) -> T;
297+
pub fn atomic_nand_acqrel<T>(dst: *mut T, src: T) -> T;
298+
pub fn atomic_nand_relaxed<T>(dst: *mut T, src: T) -> T;
299+
300+
pub fn atomic_or<T>(dst: *mut T, src: T) -> T;
301+
pub fn atomic_or_acq<T>(dst: *mut T, src: T) -> T;
302+
pub fn atomic_or_rel<T>(dst: *mut T, src: T) -> T;
303+
pub fn atomic_or_acqrel<T>(dst: *mut T, src: T) -> T;
304+
pub fn atomic_or_relaxed<T>(dst: *mut T, src: T) -> T;
305+
306+
pub fn atomic_xor<T>(dst: *mut T, src: T) -> T;
307+
pub fn atomic_xor_acq<T>(dst: *mut T, src: T) -> T;
308+
pub fn atomic_xor_rel<T>(dst: *mut T, src: T) -> T;
309+
pub fn atomic_xor_acqrel<T>(dst: *mut T, src: T) -> T;
310+
pub fn atomic_xor_relaxed<T>(dst: *mut T, src: T) -> T;
311+
312+
pub fn atomic_max<T>(dst: *mut T, src: T) -> T;
313+
pub fn atomic_max_acq<T>(dst: *mut T, src: T) -> T;
314+
pub fn atomic_max_rel<T>(dst: *mut T, src: T) -> T;
315+
pub fn atomic_max_acqrel<T>(dst: *mut T, src: T) -> T;
316+
pub fn atomic_max_relaxed<T>(dst: *mut T, src: T) -> T;
317+
318+
pub fn atomic_min<T>(dst: *mut T, src: T) -> T;
319+
pub fn atomic_min_acq<T>(dst: *mut T, src: T) -> T;
320+
pub fn atomic_min_rel<T>(dst: *mut T, src: T) -> T;
321+
pub fn atomic_min_acqrel<T>(dst: *mut T, src: T) -> T;
322+
pub fn atomic_min_relaxed<T>(dst: *mut T, src: T) -> T;
323+
324+
pub fn atomic_umin<T>(dst: *mut T, src: T) -> T;
325+
pub fn atomic_umin_acq<T>(dst: *mut T, src: T) -> T;
326+
pub fn atomic_umin_rel<T>(dst: *mut T, src: T) -> T;
327+
pub fn atomic_umin_acqrel<T>(dst: *mut T, src: T) -> T;
328+
pub fn atomic_umin_relaxed<T>(dst: *mut T, src: T) -> T;
329+
330+
pub fn atomic_umax<T>(dst: *mut T, src: T) -> T;
331+
pub fn atomic_umax_acq<T>(dst: *mut T, src: T) -> T;
332+
pub fn atomic_umax_rel<T>(dst: *mut T, src: T) -> T;
333+
pub fn atomic_umax_acqrel<T>(dst: *mut T, src: T) -> T;
334+
pub fn atomic_umax_relaxed<T>(dst: *mut T, src: T) -> T;
332335
}
333336

334337
extern "rust-intrinsic" {

0 commit comments

Comments
 (0)