Skip to content

Commit ce8f37b

Browse files
committed
Add custom mir support for PtrMetadata
1 parent ede62b8 commit ce8f37b

File tree

5 files changed

+29
-0
lines changed

5 files changed

+29
-0
lines changed

compiler/rustc_mir_build/src/build/custom/parse/instruction.rs

+1
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
212212
Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
213213
},
214214
@call(mir_len, args) => Ok(Rvalue::Len(self.parse_place(args[0])?)),
215+
@call(mir_ptr_metadata, args) => Ok(Rvalue::UnaryOp(UnOp::PtrMetadata, self.parse_operand(args[0])?)),
215216
@call(mir_copy_for_deref, args) => Ok(Rvalue::CopyForDeref(self.parse_place(args[0])?)),
216217
ExprKind::Borrow { borrow_kind, arg } => Ok(
217218
Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)

compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,7 @@ symbols! {
11791179
mir_make_place,
11801180
mir_move,
11811181
mir_offset,
1182+
mir_ptr_metadata,
11821183
mir_retag,
11831184
mir_return,
11841185
mir_return_to,

library/core/src/intrinsics/mir.rs

+4
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,10 @@ define!("mir_assume", fn Assume(operand: bool));
360360
define!("mir_deinit", fn Deinit<T>(place: T));
361361
define!("mir_checked", fn Checked<T>(binop: T) -> (T, bool));
362362
define!("mir_len", fn Len<T>(place: T) -> usize);
363+
define!(
364+
"mir_ptr_metadata",
365+
fn PtrMetadata<P: ?Sized>(place: *const P) -> <P as ::core::ptr::Pointee>::Metadata
366+
);
363367
define!("mir_copy_for_deref", fn CopyForDeref<T>(place: T) -> T);
364368
define!("mir_retag", fn Retag<T>(place: T));
365369
define!("mir_move", fn Move<T>(place: T) -> T);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// MIR for `g` after runtime
2+
3+
fn g(_1: *const i32, _2: *const [i32]) -> () {
4+
let mut _0: ();
5+
let mut _3: ();
6+
let mut _4: usize;
7+
8+
bb0: {
9+
_3 = PtrMetadata(_1);
10+
_4 = PtrMetadata(_2);
11+
return;
12+
}
13+
}

tests/mir-opt/building/custom/operators.rs

+10
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,13 @@ pub fn f(a: i32, b: bool) -> i32 {
3030
Return()
3131
})
3232
}
33+
34+
// EMIT_MIR operators.g.runtime.after.mir
35+
#[custom_mir(dialect = "runtime")]
36+
pub fn g(p: *const i32, q: *const [i32]) {
37+
mir!({
38+
let a = PtrMetadata(p);
39+
let b = PtrMetadata(q);
40+
Return()
41+
})
42+
}

0 commit comments

Comments
 (0)