mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Add custom mir support for PtrMetadata
This commit is contained in:
parent
459ce3f6bb
commit
7150839552
@ -212,6 +212,7 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
||||
Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
|
||||
},
|
||||
@call(mir_len, args) => Ok(Rvalue::Len(self.parse_place(args[0])?)),
|
||||
@call(mir_ptr_metadata, args) => Ok(Rvalue::UnaryOp(UnOp::PtrMetadata, self.parse_operand(args[0])?)),
|
||||
@call(mir_copy_for_deref, args) => Ok(Rvalue::CopyForDeref(self.parse_place(args[0])?)),
|
||||
ExprKind::Borrow { borrow_kind, arg } => Ok(
|
||||
Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
|
||||
|
@ -1179,6 +1179,7 @@ symbols! {
|
||||
mir_make_place,
|
||||
mir_move,
|
||||
mir_offset,
|
||||
mir_ptr_metadata,
|
||||
mir_retag,
|
||||
mir_return,
|
||||
mir_return_to,
|
||||
|
@ -360,6 +360,10 @@ define!("mir_assume", fn Assume(operand: bool));
|
||||
define!("mir_deinit", fn Deinit<T>(place: T));
|
||||
define!("mir_checked", fn Checked<T>(binop: T) -> (T, bool));
|
||||
define!("mir_len", fn Len<T>(place: T) -> usize);
|
||||
define!(
|
||||
"mir_ptr_metadata",
|
||||
fn PtrMetadata<P: ?Sized>(place: *const P) -> <P as ::core::ptr::Pointee>::Metadata
|
||||
);
|
||||
define!("mir_copy_for_deref", fn CopyForDeref<T>(place: T) -> T);
|
||||
define!("mir_retag", fn Retag<T>(place: T));
|
||||
define!("mir_move", fn Move<T>(place: T) -> T);
|
||||
|
13
tests/mir-opt/building/custom/operators.g.runtime.after.mir
Normal file
13
tests/mir-opt/building/custom/operators.g.runtime.after.mir
Normal file
@ -0,0 +1,13 @@
|
||||
// MIR for `g` after runtime
|
||||
|
||||
fn g(_1: *const i32, _2: *const [i32]) -> () {
|
||||
let mut _0: ();
|
||||
let mut _3: ();
|
||||
let mut _4: usize;
|
||||
|
||||
bb0: {
|
||||
_3 = PtrMetadata(_1);
|
||||
_4 = PtrMetadata(_2);
|
||||
return;
|
||||
}
|
||||
}
|
@ -30,3 +30,13 @@ pub fn f(a: i32, b: bool) -> i32 {
|
||||
Return()
|
||||
})
|
||||
}
|
||||
|
||||
// EMIT_MIR operators.g.runtime.after.mir
|
||||
#[custom_mir(dialect = "runtime")]
|
||||
pub fn g(p: *const i32, q: *const [i32]) {
|
||||
mir!({
|
||||
let a = PtrMetadata(p);
|
||||
let b = PtrMetadata(q);
|
||||
Return()
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user