Skip to content

Commit b07d7b0

Browse files
authored
vstd/atomic: gate pointer atomics on matching primitive alignment (#2751)
1 parent c07e6dd commit b07d7b0

1 file changed

Lines changed: 30 additions & 11 deletions

File tree

source/vstd/atomic.rs

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,26 @@ macro_rules! atomic_bool_methods {
509509
}
510510

511511
macro_rules! ptr_atomic_methods {
512-
($at_ty: ty, $rust_ty: ty, $value_ty: ty) => {
512+
($at_ty: ty, $rust_ty: ty, $value_ty: ty, $width: literal) => {
513+
// `from_ptr` requires alignment to `$rust_ty`; the caller holds a
514+
// `PointsTo<$value_ty>`, which guarantees only `align_of::<$value_ty>()`
515+
// (`PointsTo::is_aligned`). `target_has_atomic_primitive_alignment` is
516+
// rustc's name for those two being equal at a given width, so define
517+
// these only where it holds.
518+
#[cfg(target_has_atomic_primitive_alignment = $width)]
519+
const _: () = assert!(
520+
core::mem::align_of::<$value_ty>() == core::mem::align_of::<$rust_ty>(),
521+
concat!(
522+
stringify!($at_ty),
523+
": align_of::<",
524+
stringify!($value_ty),
525+
">() differs from align_of::<",
526+
stringify!($rust_ty),
527+
">() on this target",
528+
)
529+
);
530+
531+
#[cfg(target_has_atomic_primitive_alignment = $width)]
513532
verus!{
514533
impl $at_ty {
515534
/// Store a value via a raw pointer using atomic store.
@@ -581,20 +600,20 @@ macro_rules! ptr_atomic_methods {
581600
}
582601

583602
#[cfg(target_has_atomic = "64")]
584-
ptr_atomic_methods!(PAtomicU64, AtomicU64, u64);
603+
ptr_atomic_methods!(PAtomicU64, AtomicU64, u64, "64");
585604

586-
ptr_atomic_methods!(PAtomicU32, AtomicU32, u32);
587-
ptr_atomic_methods!(PAtomicU16, AtomicU16, u16);
588-
ptr_atomic_methods!(PAtomicU8, AtomicU8, u8);
589-
ptr_atomic_methods!(PAtomicUsize, AtomicUsize, usize);
605+
ptr_atomic_methods!(PAtomicU32, AtomicU32, u32, "32");
606+
ptr_atomic_methods!(PAtomicU16, AtomicU16, u16, "16");
607+
ptr_atomic_methods!(PAtomicU8, AtomicU8, u8, "8");
608+
ptr_atomic_methods!(PAtomicUsize, AtomicUsize, usize, "ptr");
590609

591610
#[cfg(target_has_atomic = "64")]
592-
ptr_atomic_methods!(PAtomicI64, AtomicI64, i64);
611+
ptr_atomic_methods!(PAtomicI64, AtomicI64, i64, "64");
593612

594-
ptr_atomic_methods!(PAtomicI32, AtomicI32, i32);
595-
ptr_atomic_methods!(PAtomicI16, AtomicI16, i16);
596-
ptr_atomic_methods!(PAtomicI8, AtomicI8, i8);
597-
ptr_atomic_methods!(PAtomicIsize, AtomicIsize, isize);
613+
ptr_atomic_methods!(PAtomicI32, AtomicI32, i32, "32");
614+
ptr_atomic_methods!(PAtomicI16, AtomicI16, i16, "16");
615+
ptr_atomic_methods!(PAtomicI8, AtomicI8, i8, "8");
616+
ptr_atomic_methods!(PAtomicIsize, AtomicIsize, isize, "ptr");
598617

599618
make_bool_atomic!(PAtomicBool, PermissionBool, PermissionDataBool, AtomicBool, bool);
600619

0 commit comments

Comments
 (0)