Only memoize const fn calls during const eval
Miri and other engines may want to execute the function in order to detect UB inside of them.
This commit is contained in:
parent
4752c05af4
commit
735a610f47
2 changed files with 15 additions and 13 deletions
|
@ -336,6 +336,20 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
|
|||
_unwind: Option<mir::BasicBlock> // unwinding is not supported in consts
|
||||
) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> {
|
||||
debug!("eval_fn_call: {:?}", instance);
|
||||
|
||||
// If this function is a `const fn` then as an optimization we can query this
|
||||
// evaluation immediately.
|
||||
//
|
||||
// For the moment we only do this for functions which take no arguments
|
||||
// (or all arguments are ZSTs) so that we don't memoize too much.
|
||||
if ecx.tcx.is_const_fn_raw(instance.def.def_id()) &&
|
||||
args.iter().all(|a| a.layout.is_zst())
|
||||
{
|
||||
let gid = GlobalId { instance, promoted: None };
|
||||
ecx.eval_const_fn_call(gid, ret)?;
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
// Only check non-glue functions
|
||||
if let ty::InstanceDef::Item(def_id) = instance.def {
|
||||
// Execution might have wandered off into other crates, so we cannot do a stability-
|
||||
|
|
|
@ -284,18 +284,6 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
ty::InstanceDef::DropGlue(..) |
|
||||
ty::InstanceDef::CloneShim(..) |
|
||||
ty::InstanceDef::Item(_) => {
|
||||
// If this function is a `const fn` then as an optimization we can query this
|
||||
// evaluation immediately.
|
||||
//
|
||||
// For the moment we only do this for functions which take no arguments
|
||||
// (or all arguments are ZSTs) so that we don't memoize too much.
|
||||
if self.tcx.is_const_fn_raw(instance.def.def_id()) &&
|
||||
args.iter().all(|a| a.layout.is_zst())
|
||||
{
|
||||
let gid = GlobalId { instance, promoted: None };
|
||||
return self.eval_const_fn_call(gid, ret);
|
||||
}
|
||||
|
||||
// We need MIR for this fn
|
||||
let body = match M::find_fn(self, instance, args, ret, unwind)? {
|
||||
Some(body) => body,
|
||||
|
@ -463,7 +451,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
|
||||
/// Evaluate a const function where all arguments (if any) are zero-sized types.
|
||||
/// The evaluation is memoized thanks to the query system.
|
||||
fn eval_const_fn_call(
|
||||
pub (crate) fn eval_const_fn_call(
|
||||
&mut self,
|
||||
gid: GlobalId<'tcx>,
|
||||
ret: Option<(PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue