Skip to content

Commit 328e89c

Browse files
authored
Rollup merge of #80236 - tmiasko:atomic-swap, r=oli-obk
Use pointer type in AtomicPtr::swap implementation Closes #80234.
2 parents 2528acb + 4ad53dc commit 328e89c

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

compiler/rustc_codegen_ssa/src/mir/intrinsic.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -524,8 +524,19 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
524524
};
525525

526526
let ty = substs.type_at(0);
527-
if int_type_width_signed(ty, bx.tcx()).is_some() {
528-
bx.atomic_rmw(atom_op, args[0].immediate(), args[1].immediate(), order)
527+
if int_type_width_signed(ty, bx.tcx()).is_some()
528+
|| (ty.is_unsafe_ptr() && op == "xchg")
529+
{
530+
let mut ptr = args[0].immediate();
531+
let mut val = args[1].immediate();
532+
if ty.is_unsafe_ptr() {
533+
// Some platforms do not support atomic operations on pointers,
534+
// so we cast to integer first.
535+
let ptr_llty = bx.type_ptr_to(bx.type_isize());
536+
ptr = bx.pointercast(ptr, ptr_llty);
537+
val = bx.ptrtoint(val, bx.type_isize());
538+
}
539+
bx.atomic_rmw(atom_op, ptr, val, order)
529540
} else {
530541
return invalid_monomorphization(ty);
531542
}

library/core/src/sync/atomic.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1040,8 +1040,16 @@ impl<T> AtomicPtr<T> {
10401040
#[stable(feature = "rust1", since = "1.0.0")]
10411041
#[cfg(target_has_atomic = "ptr")]
10421042
pub fn swap(&self, ptr: *mut T, order: Ordering) -> *mut T {
1043+
#[cfg(bootstrap)]
10431044
// SAFETY: data races are prevented by atomic intrinsics.
1044-
unsafe { atomic_swap(self.p.get() as *mut usize, ptr as usize, order) as *mut T }
1045+
unsafe {
1046+
atomic_swap(self.p.get() as *mut usize, ptr as usize, order) as *mut T
1047+
}
1048+
#[cfg(not(bootstrap))]
1049+
// SAFETY: data races are prevented by atomic intrinsics.
1050+
unsafe {
1051+
atomic_swap(self.p.get(), ptr, order)
1052+
}
10451053
}
10461054

10471055
/// Stores a value into the pointer if the current value is the same as the `current` value.

0 commit comments

Comments
 (0)