From 57c98d3392405705e17cc87dee350c16aeb24b4f Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Tue, 2 Jul 2019 20:50:27 -0400 Subject: [PATCH] Add a query to get the `promoted`s 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 --- src/librustc/query/mod.rs | 2 ++ src/librustc_mir/const_eval.rs | 2 +- src/librustc_mir/transform/mod.rs | 7 +++++++ src/librustc_mir/util/pretty.rs | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index d2082ab87e738..70b79c5a6cadc 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -124,6 +124,8 @@ rustc_queries! { mir.map(|x| &*tcx.arena.alloc(x)) } } + + query promoted_mir(key: DefId) -> &'tcx IndexVec> { } } TypeChecking { diff --git a/src/librustc_mir/const_eval.rs b/src/librustc_mir/const_eval.rs index 887ef4b520ea3..b2955c61097cb 100644 --- a/src/librustc_mir/const_eval.rs +++ b/src/librustc_mir/const_eval.rs @@ -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), diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 81d91dcd0a95f..4313c75342f0b 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -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> { + let body = tcx.optimized_mir(def_id); + &body.promoted +} diff --git a/src/librustc_mir/util/pretty.rs b/src/librustc_mir/util/pretty.rs index d66f35f82c662..68880fc345ae2 100644 --- a/src/librustc_mir/util/pretty.rs +++ b/src/librustc_mir/util/pretty.rs @@ -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),