collector: recursively traverse 'mentioned' items to evaluate their constants
This commit is contained in:
parent
d31b6fb8c0
commit
712fe36611
24 changed files with 641 additions and 142 deletions
|
@ -20,6 +20,7 @@ use rustc_hir::def_id::{DefId, CRATE_DEF_ID};
|
|||
use rustc_hir::{self, CoroutineDesugaring, CoroutineKind, ImplicitSelfKind};
|
||||
use rustc_hir::{self as hir, HirId};
|
||||
use rustc_session::Session;
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_target::abi::{FieldIdx, VariantIdx};
|
||||
|
||||
use polonius_engine::Atom;
|
||||
|
@ -312,6 +313,16 @@ impl<'tcx> CoroutineInfo<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Some item that needs to monomorphize successfully for a MIR body to be considered well-formed.
|
||||
#[derive(Copy, Clone, PartialEq, Debug, HashStable, TyEncodable, TyDecodable)]
|
||||
#[derive(TypeFoldable, TypeVisitable)]
|
||||
pub enum MentionedItem<'tcx> {
|
||||
Fn(DefId, GenericArgsRef<'tcx>),
|
||||
Drop(Ty<'tcx>),
|
||||
// FIXME: add Vtable { source_ty: Ty<'tcx>, target_ty: Ty<'tcx> },
|
||||
// FIXME: do we have to add closures?
|
||||
}
|
||||
|
||||
/// The lowered representation of a single function.
|
||||
#[derive(Clone, TyEncodable, TyDecodable, Debug, HashStable, TypeFoldable, TypeVisitable)]
|
||||
pub struct Body<'tcx> {
|
||||
|
@ -375,8 +386,24 @@ pub struct Body<'tcx> {
|
|||
|
||||
/// Constants that are required to evaluate successfully for this MIR to be well-formed.
|
||||
/// We hold in this field all the constants we are not able to evaluate yet.
|
||||
///
|
||||
/// This is soundness-critical, we make a guarantee that all consts syntactically mentioned in a
|
||||
/// function have successfully evaluated if the function ever gets executed at runtime.
|
||||
pub required_consts: Vec<ConstOperand<'tcx>>,
|
||||
|
||||
/// Further items that were mentioned in this function and hence *may* become monomorphized,
|
||||
/// depending on optimizations. We use this to avoid optimization-dependent compile errors: the
|
||||
/// collector recursively traverses all "mentioned" items and evaluates all their
|
||||
/// `required_consts`.
|
||||
///
|
||||
/// This is *not* soundness-critical and the contents of this list are *not* a stable guarantee.
|
||||
/// All that's relevant is that this set is optimization-level-independent, and that it includes
|
||||
/// everything that the collector would consider "used". (For example, we currently compute this
|
||||
/// set after drop elaboration, so some drop calls that can never be reached are not considered
|
||||
/// "mentioned".) See the documentation of `CollectionMode` in
|
||||
/// `compiler/rustc_monomorphize/src/collector.rs` for more context.
|
||||
pub mentioned_items: Vec<Spanned<MentionedItem<'tcx>>>,
|
||||
|
||||
/// Does this body use generic parameters. This is used for the `ConstEvaluatable` check.
|
||||
///
|
||||
/// Note that this does not actually mean that this body is not computable right now.
|
||||
|
@ -453,6 +480,7 @@ impl<'tcx> Body<'tcx> {
|
|||
var_debug_info,
|
||||
span,
|
||||
required_consts: Vec::new(),
|
||||
mentioned_items: Vec::new(),
|
||||
is_polymorphic: false,
|
||||
injection_phase: None,
|
||||
tainted_by_errors,
|
||||
|
@ -482,6 +510,7 @@ impl<'tcx> Body<'tcx> {
|
|||
spread_arg: None,
|
||||
span: DUMMY_SP,
|
||||
required_consts: Vec::new(),
|
||||
mentioned_items: Vec::new(),
|
||||
var_debug_info: Vec::new(),
|
||||
is_polymorphic: false,
|
||||
injection_phase: None,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue