Skip to content

Commit 069cede

Browse files
committed
auto merge of #13036 : alexcrichton/rust/atomics, r=alexcrichton
Closes #11583, rebasing of #12430 now that we've got `Share` and better analysis with statics.
2 parents f5357cf + 9e66f2c commit 069cede

File tree

7 files changed

+1153
-206
lines changed

7 files changed

+1153
-206
lines changed

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

+9-21
Original file line numberDiff line numberDiff line change
@@ -4011,30 +4011,18 @@ pub fn check_intrinsic_type(ccx: &CrateCtxt, it: &ast::ForeignItem) {
40114011

40124012
//We only care about the operation here
40134013
match *split.get(1) {
4014-
"cxchg" => (1, vec!(ty::mk_mut_rptr(tcx,
4015-
ty::ReLateBound(it.id, ty::BrAnon(0)),
4016-
param(ccx, 0)),
4017-
param(ccx, 0),
4018-
param(ccx, 0)), param(ccx, 0)),
4019-
"load" => (1,
4020-
vec!(
4021-
ty::mk_imm_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
4022-
param(ccx, 0))
4023-
),
4024-
param(ccx, 0)),
4025-
"store" => (1,
4026-
vec!(
4027-
ty::mk_mut_rptr(tcx, ty::ReLateBound(it.id, ty::BrAnon(0)),
4028-
param(ccx, 0)),
4029-
param(ccx, 0)
4030-
),
4031-
ty::mk_nil()),
4014+
"cxchg" => (1, vec!(ty::mk_mut_ptr(tcx, param(ccx, 0)),
4015+
param(ccx, 0),
4016+
param(ccx, 0)),
4017+
param(ccx, 0)),
4018+
"load" => (1, vec!(ty::mk_imm_ptr(tcx, param(ccx, 0))),
4019+
param(ccx, 0)),
4020+
"store" => (1, vec!(ty::mk_mut_ptr(tcx, param(ccx, 0)), param(ccx, 0)),
4021+
ty::mk_nil()),
40324022

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

src/libstd/intrinsics.rs

+91
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,96 @@ 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+
// 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;
335+
}
336+
337+
extern "rust-intrinsic" {
247338

248339
pub fn atomic_fence();
249340
pub fn atomic_fence_acq();

0 commit comments

Comments
 (0)