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))))
|
Ok(Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, offset))))
|
||||||
},
|
},
|
||||||
@call(mir_len, args) => Ok(Rvalue::Len(self.parse_place(args[0])?)),
|
@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])?)),
|
@call(mir_copy_for_deref, args) => Ok(Rvalue::CopyForDeref(self.parse_place(args[0])?)),
|
||||||
ExprKind::Borrow { borrow_kind, arg } => Ok(
|
ExprKind::Borrow { borrow_kind, arg } => Ok(
|
||||||
Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
|
Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
|
||||||
|
@ -1179,6 +1179,7 @@ symbols! {
|
|||||||
mir_make_place,
|
mir_make_place,
|
||||||
mir_move,
|
mir_move,
|
||||||
mir_offset,
|
mir_offset,
|
||||||
|
mir_ptr_metadata,
|
||||||
mir_retag,
|
mir_retag,
|
||||||
mir_return,
|
mir_return,
|
||||||
mir_return_to,
|
mir_return_to,
|
||||||
|
@ -360,6 +360,10 @@ define!("mir_assume", fn Assume(operand: bool));
|
|||||||
define!("mir_deinit", fn Deinit<T>(place: T));
|
define!("mir_deinit", fn Deinit<T>(place: T));
|
||||||
define!("mir_checked", fn Checked<T>(binop: T) -> (T, bool));
|
define!("mir_checked", fn Checked<T>(binop: T) -> (T, bool));
|
||||||
define!("mir_len", fn Len<T>(place: T) -> usize);
|
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_copy_for_deref", fn CopyForDeref<T>(place: T) -> T);
|
||||||
define!("mir_retag", fn Retag<T>(place: T));
|
define!("mir_retag", fn Retag<T>(place: T));
|
||||||
define!("mir_move", fn Move<T>(place: T) -> 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()
|
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…
x
Reference in New Issue
Block a user