Add a query to get the promoteds for a mir::Body

This is a builidng block toward removing a lot of duplicated code
between miri and the cosnt-propagator pass.

See this thread for more info:
https://rust-lang.zulipchat.com/#narrow/stream/189540-t-compiler.2Fwg-mir-opt/topic/Using.20.60InterpCx.60.20more/near/169030661
This commit is contained in:
Wesley Wiser 2019-07-02 20:50:27 -04:00
parent 0beb2ba16a
commit 57c98d3392
4 changed files with 11 additions and 2 deletions

View File

@ -124,6 +124,8 @@ rustc_queries! {
mir.map(|x| &*tcx.arena.alloc(x))
}
}
query promoted_mir(key: DefId) -> &'tcx IndexVec<mir::Promoted, mir::Body<'tcx>> { }
}
TypeChecking {

View File

@ -681,7 +681,7 @@ pub fn const_eval_raw_provider<'tcx>(
// promoting runtime code is only allowed to error if it references broken constants
// any other kind of error will be reported to the user as a deny-by-default lint
_ => if let Some(p) = cid.promoted {
let span = tcx.optimized_mir(def_id).promoted[p].span;
let span = tcx.promoted_mir(def_id)[p].span;
if let InterpError::ReferencedConstant = err.error {
err.report_as_error(
tcx.at(span),

View File

@ -1,4 +1,5 @@
use crate::{build, shim};
use rustc_data_structures::indexed_vec::IndexVec;
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
use rustc::mir::{Body, MirPhase, Promoted};
use rustc::ty::{TyCtxt, InstanceDef};
@ -46,6 +47,7 @@ pub(crate) fn provide(providers: &mut Providers<'_>) {
mir_validated,
optimized_mir,
is_mir_available,
promoted_mir,
..*providers
};
}
@ -296,3 +298,8 @@ fn optimized_mir<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx Body<'tcx> {
]);
tcx.arena.alloc(body)
}
fn promoted_mir<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx IndexVec<Promoted, Body<'tcx>> {
let body = tcx.optimized_mir(def_id);
&body.promoted
}

View File

@ -263,7 +263,7 @@ pub fn write_mir_pretty<'tcx>(
write_mir_fn(tcx, MirSource::item(def_id), body, &mut |_, _| Ok(()), w)?;
for (i, body) in body.promoted.iter_enumerated() {
for (i, body) in tcx.promoted_mir(def_id).iter_enumerated() {
writeln!(w, "")?;
let src = MirSource {
instance: ty::InstanceDef::Item(def_id),