Skip to content

Commit 5d788bd

Browse files
committed
Auto merge of #141753 - matthiaskrgr:rollup-bw4j2u0, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - rust-lang/rust#133823 (Use `cfg_attr_trace` in AST with a placeholder attribute for accurate suggestion) - rust-lang/rust#141004 (Report text_direction_codepoint_in_literal when parsing) - rust-lang/rust#141407 (Refactor the two-phase check for impls and impl items) - rust-lang/rust#141430 (remove `visit_clobber` and move `DummyAstNode` to `rustc_expand`) - rust-lang/rust#141507 (atomic_load intrinsic: use const generic parameter for ordering) - rust-lang/rust#141538 (implement `va_arg` for x86_64 systemv) - rust-lang/rust#141669 (float: Replace some approximate assertions with exact) - rust-lang/rust#141747 (rustdoc: display doc(cfg(false)) properly) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 62e5f31 + 038823c commit 5d788bd

File tree

4 files changed

+25
-5
lines changed

4 files changed

+25
-5
lines changed

src/intrinsics/atomic.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use rustc_middle::mir::BinOp;
2+
use rustc_middle::ty::AtomicOrdering;
23
use rustc_middle::{mir, ty};
34

45
use self::helpers::check_intrinsic_arg_count;
@@ -19,6 +20,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
1920
fn emulate_atomic_intrinsic(
2021
&mut self,
2122
intrinsic_name: &str,
23+
generic_args: ty::GenericArgsRef<'tcx>,
2224
args: &[OpTy<'tcx>],
2325
dest: &MPlaceTy<'tcx>,
2426
) -> InterpResult<'tcx, EmulateItemResult> {
@@ -35,6 +37,15 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
3537
}
3638
}
3739

40+
fn read_ord_const_generic(o: AtomicOrdering) -> AtomicReadOrd {
41+
match o {
42+
AtomicOrdering::SeqCst => AtomicReadOrd::SeqCst,
43+
AtomicOrdering::Acquire => AtomicReadOrd::Acquire,
44+
AtomicOrdering::Relaxed => AtomicReadOrd::Relaxed,
45+
_ => panic!("invalid read ordering `{o:?}`"),
46+
}
47+
}
48+
3849
fn write_ord(ord: &str) -> AtomicWriteOrd {
3950
match ord {
4051
"seqcst" => AtomicWriteOrd::SeqCst,
@@ -66,7 +77,15 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
6677
}
6778

6879
match &*intrinsic_structure {
69-
["load", ord] => this.atomic_load(args, dest, read_ord(ord))?,
80+
// New-style intrinsics that use const generics
81+
["load"] => {
82+
let ordering = generic_args.const_at(1).to_value();
83+
let ordering =
84+
ordering.valtree.unwrap_branch()[0].unwrap_leaf().to_atomic_ordering();
85+
this.atomic_load(args, dest, read_ord_const_generic(ordering))?;
86+
}
87+
88+
// Old-style intrinsics that have the ordering in the intrinsic name
7089
["store", ord] => this.atomic_store(args, write_ord(ord))?,
7190

7291
["fence", ord] => this.atomic_fence_intrinsic(args, fence_ord(ord))?,

src/intrinsics/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
9797
let this = self.eval_context_mut();
9898

9999
if let Some(name) = intrinsic_name.strip_prefix("atomic_") {
100-
return this.emulate_atomic_intrinsic(name, args, dest);
100+
return this.emulate_atomic_intrinsic(name, generic_args, args, dest);
101101
}
102102
if let Some(name) = intrinsic_name.strip_prefix("simd_") {
103103
return this.emulate_simd_intrinsic(name, generic_args, args, dest);
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
//@compile-flags: -Zmiri-symbolic-alignment-check -Cdebug-assertions=no
22
#![feature(core_intrinsics)]
3+
use std::intrinsics;
34

45
fn main() {
56
// Do a 4-aligned u64 atomic access. That should be UB on all platforms,
67
// even if u64 only has alignment 4.
78
let z = [0u32; 2];
89
let zptr = &z as *const _ as *const u64;
910
unsafe {
10-
::std::intrinsics::atomic_load_seqcst(zptr);
11+
intrinsics::atomic_load::<_, { intrinsics::AtomicOrdering::SeqCst }>(zptr);
1112
//~^ERROR: accessing memory with alignment 4, but alignment 8 is required
1213
}
1314
}

tests/fail/unaligned_pointers/atomic_unaligned.stderr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: Undefined Behavior: accessing memory with alignment ALIGN, but alignment ALIGN is required
22
--> tests/fail/unaligned_pointers/atomic_unaligned.rs:LL:CC
33
|
4-
LL | ::std::intrinsics::atomic_load_seqcst(zptr);
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ accessing memory with alignment ALIGN, but alignment ALIGN is required
4+
LL | intrinsics::atomic_load::<_, { intrinsics::AtomicOrdering::SeqCst }>(zptr);
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ accessing memory with alignment ALIGN, but alignment ALIGN is required
66
|
77
= help: this usually indicates that your program performed an invalid operation and caused Undefined Behavior
88
= help: but due to `-Zmiri-symbolic-alignment-check`, alignment errors can also be false positives

0 commit comments

Comments
 (0)