add some comments explaining how the required_consts stuff fits together
This commit is contained in:
parent
acb7c21507
commit
fa248cd9e6
4 changed files with 10 additions and 0 deletions
|
@ -21,6 +21,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn eval_mir_constant(&self, constant: &mir::ConstOperand<'tcx>) -> mir::ConstValue<'tcx> {
|
pub fn eval_mir_constant(&self, constant: &mir::ConstOperand<'tcx>) -> mir::ConstValue<'tcx> {
|
||||||
|
// `MirUsedCollector` visited all constants before codegen began, so if we got here there
|
||||||
|
// can be no more constants that fail to evaluate.
|
||||||
self.monomorphize(constant.const_)
|
self.monomorphize(constant.const_)
|
||||||
.eval(self.cx.tcx(), ty::ParamEnv::reveal_all(), Some(constant.span))
|
.eval(self.cx.tcx(), ty::ParamEnv::reveal_all(), Some(constant.span))
|
||||||
.expect("erroneous constant not captured by required_consts")
|
.expect("erroneous constant not captured by required_consts")
|
||||||
|
|
|
@ -209,6 +209,10 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
||||||
caller_location: None,
|
caller_location: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// It may seem like we should iterate over `required_consts` to ensure they all successfully
|
||||||
|
// evaluate; however, the `MirUsedCollector` already did that during the collection phase of
|
||||||
|
// monomorphization so we don't have to do it again.
|
||||||
|
|
||||||
fx.per_local_var_debug_info = fx.compute_per_local_var_debug_info(&mut start_bx);
|
fx.per_local_var_debug_info = fx.compute_per_local_var_debug_info(&mut start_bx);
|
||||||
|
|
||||||
let memory_locals = analyze::non_ssa_locals(&fx);
|
let memory_locals = analyze::non_ssa_locals(&fx);
|
||||||
|
|
|
@ -184,6 +184,8 @@ macro_rules! make_mir_visitor {
|
||||||
|
|
||||||
visit_place_fns!($($mutability)?);
|
visit_place_fns!($($mutability)?);
|
||||||
|
|
||||||
|
/// This is called for every constant in the MIR body and every `required_consts`
|
||||||
|
/// (i.e., including consts that have been dead-code-eliminated).
|
||||||
fn visit_constant(
|
fn visit_constant(
|
||||||
&mut self,
|
&mut self,
|
||||||
constant: & $($mutability)? ConstOperand<'tcx>,
|
constant: & $($mutability)? ConstOperand<'tcx>,
|
||||||
|
|
|
@ -1426,6 +1426,8 @@ fn collect_used_items<'tcx>(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Here we rely on the visitor also visiting `required_consts`, so that we evaluate them
|
||||||
|
// and abort compilation if any of them errors.
|
||||||
MirUsedCollector {
|
MirUsedCollector {
|
||||||
tcx,
|
tcx,
|
||||||
body: &body,
|
body: &body,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue