From b615b98f33c73670731c7e681a45a8335049492e Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Fri, 3 Jul 2020 22:15:27 +0200 Subject: [PATCH] continue mir pipeline --- src/librustc_interface/passes.rs | 3 ++- src/librustc_middle/arena.rs | 19 +++++++++++++ src/librustc_middle/query/mod.rs | 27 ++++++++++--------- src/librustc_middle/ty/context.rs | 8 +++--- src/librustc_mir/borrow_check/mod.rs | 4 +-- src/librustc_mir/interpret/eval_context.rs | 6 ++++- src/librustc_mir/transform/mod.rs | 25 ++++++++++------- src/librustc_mir_build/build/mod.rs | 2 +- ...9-assoc-const-static-recursion-impl.stderr | 5 ++++ ...onst-static-recursion-trait-default.stderr | 5 ++++ ...-assoc-const-static-recursion-trait.stderr | 5 ++++ 11 files changed, 78 insertions(+), 31 deletions(-) diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index 6d85c2f182544..5152e62f07201 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -891,7 +891,8 @@ fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> { mir::transform::check_unsafety::check_unsafety(tcx, def_id); if tcx.hir().body_const_context(def_id).is_some() { - tcx.ensure().mir_drops_elaborated_and_const_checked(def_id); + tcx.ensure() + .mir_drops_elaborated_and_const_checked(ty::WithOptParam::dummy(def_id)); } } }); diff --git a/src/librustc_middle/arena.rs b/src/librustc_middle/arena.rs index 3e5a2cd7825fa..caf771803c0f4 100644 --- a/src/librustc_middle/arena.rs +++ b/src/librustc_middle/arena.rs @@ -14,8 +14,27 @@ macro_rules! arena_types { [] layouts: rustc_target::abi::Layout, rustc_target::abi::Layout; // AdtDef are interned and compared by address [] adt_def: rustc_middle::ty::AdtDef, rustc_middle::ty::AdtDef; + [] steal_mir: + rustc_middle::ty::steal::Steal>, + rustc_middle::ty::steal::Steal>; [] mir: rustc_middle::mir::Body<$tcx>, rustc_middle::mir::Body<$tcx>; + [] steal_promoted: + rustc_middle::ty::steal::Steal< + rustc_index::vec::IndexVec< + rustc_middle::mir::Promoted, + rustc_middle::mir::Body<$tcx> + > + >, + rustc_middle::ty::steal::Steal< + rustc_index::vec::IndexVec< + rustc_middle::mir::Promoted, + rustc_middle::mir::Body<$tcx> + > + >; [decode] tables: rustc_middle::ty::TypeckTables<$tcx>, rustc_middle::ty::TypeckTables<'_x>; + [decode] borrowck_result: + rustc_middle::mir::BorrowCheckResult<$tcx>, + rustc_middle::mir::BorrowCheckResult<'_x>; [] const_allocs: rustc_middle::mir::interpret::Allocation, rustc_middle::mir::interpret::Allocation; // Required for the incremental on-disk cache [few, decode] mir_keys: rustc_hir::def_id::DefIdSet, rustc_hir::def_id::DefIdSet; diff --git a/src/librustc_middle/query/mod.rs b/src/librustc_middle/query/mod.rs index 28cdedca3f74d..bad2dc648594e 100644 --- a/src/librustc_middle/query/mod.rs +++ b/src/librustc_middle/query/mod.rs @@ -211,8 +211,7 @@ rustc_queries! { /// Fetch the MIR for a given `DefId` right after it's built - this includes /// unreachable code. - query mir_built(key: LocalDefId) -> Steal> { - storage(ArenaCacheSelector<'tcx>) + query mir_built(key: LocalDefId) -> &'tcx Steal> { desc { |tcx| "building MIR for `{}`", tcx.def_path_str(key.to_def_id()) } } @@ -220,24 +219,23 @@ rustc_queries! { /// ready for const qualification. /// /// See the README for the `mir` module for details. - query mir_const(key: DefId) -> Steal> { - desc { |tcx| "processing MIR for `{}`", tcx.def_path_str(key) } - storage(ArenaCacheSelector<'tcx>) + query mir_const(key: DefId) -> &'tcx Steal> { + desc { |tcx| "processing MIR for `{}`", tcx.def_path_str(key) } no_hash } - query mir_drops_elaborated_and_const_checked(key: LocalDefId) -> Steal> { - storage(ArenaCacheSelector<'tcx>) + query mir_drops_elaborated_and_const_checked( + key: ty::WithOptParam + ) -> &'tcx Steal> { no_hash - desc { |tcx| "elaborating drops for `{}`", tcx.def_path_str(key.to_def_id()) } + desc { |tcx| "elaborating drops for `{}`", tcx.def_path_str(key.did.to_def_id()) } } query mir_validated(key: LocalDefId) -> ( - Steal>, - Steal>> + &'tcx Steal>, + &'tcx Steal>> ) { - storage(ArenaCacheSelector<'tcx>) no_hash desc { |tcx| "processing `{}`", tcx.def_path_str(key.to_def_id()) } } @@ -249,7 +247,10 @@ rustc_queries! { cache_on_disk_if { key.is_local() } } query optimized_mir_of_const_arg(key: ty::WithOptParam) -> &'tcx mir::Body<'tcx> { - desc { |tcx| "optimizing MIR for `{}`", tcx.def_path_str(key.did.to_def_id()) } + desc { + |tcx| "optimizing MIR for the potential const argument `{}`", + tcx.def_path_str(key.did.to_def_id()) + } } /// Returns coverage summary info for a function, after executing the `InstrumentCoverage` @@ -599,7 +600,7 @@ rustc_queries! { BorrowChecking { /// Borrow-checks the function body. If this is a closure, returns /// additional requirements that the closure's creator must verify. - query mir_borrowck(key: LocalDefId) -> mir::BorrowCheckResult<'tcx> { + query mir_borrowck(key: LocalDefId) -> &'tcx mir::BorrowCheckResult<'tcx> { storage(ArenaCacheSelector<'tcx>) desc { |tcx| "borrow-checking `{}`", tcx.def_path_str(key.to_def_id()) } cache_on_disk_if(tcx, opt_result) { diff --git a/src/librustc_middle/ty/context.rs b/src/librustc_middle/ty/context.rs index c4a5bc302227d..d2bad6e90dda2 100644 --- a/src/librustc_middle/ty/context.rs +++ b/src/librustc_middle/ty/context.rs @@ -980,15 +980,15 @@ pub struct GlobalCtxt<'tcx> { } impl<'tcx> TyCtxt<'tcx> { - pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> Steal> { - Steal::new(mir) + pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal> { + self.arena.alloc(Steal::new(mir)) } pub fn alloc_steal_promoted( self, promoted: IndexVec>, - ) -> Steal>> { - Steal::new(promoted) + ) -> &'tcx Steal>> { + self.arena.alloc(Steal::new(promoted)) } pub fn alloc_adt_def( diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index beb5f1fe924ec..e77dcb63f4667 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -90,7 +90,7 @@ pub fn provide(providers: &mut Providers) { *providers = Providers { mir_borrowck, ..*providers }; } -fn mir_borrowck(tcx: TyCtxt<'_>, def_id: LocalDefId) -> BorrowCheckResult<'_> { +fn mir_borrowck<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> &'tcx BorrowCheckResult<'tcx> { let (input_body, promoted) = tcx.mir_validated(def_id); debug!("run query mir_borrowck: {}", tcx.def_path_str(def_id.to_def_id())); @@ -101,7 +101,7 @@ fn mir_borrowck(tcx: TyCtxt<'_>, def_id: LocalDefId) -> BorrowCheckResult<'_> { }); debug!("mir_borrowck done"); - opt_closure_req + tcx.arena.alloc(opt_closure_req) } fn do_mir_borrowck<'a, 'tcx>( diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 641b8cce5e419..5e1376677a0a7 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -411,7 +411,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { match instance { ty::InstanceDef::Item(def) => { if self.tcx.is_mir_available(def.did) { - Ok(self.tcx.optimized_mir(def.did)) + if let Some(def) = def.as_local() { + Ok(self.tcx.optimized_mir_of_const_arg(def)) + } else { + Ok(self.tcx.optimized_mir(def.did)) + } } else { throw_unsup!(NoMirFor(def.did)) } diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 4ba9cb9f7720d..25973462e4c6e 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -235,7 +235,7 @@ fn mir_const_qualif(tcx: TyCtxt<'_>, def_id: DefId) -> ConstQualifs { } /// Make MIR ready for const evaluation. This is run on all MIR, not just on consts! -fn mir_const(tcx: TyCtxt<'_>, def_id: DefId) -> Steal> { +fn mir_const<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx Steal> { let def_id = def_id.expect_local(); // Unsafety check uses the raw mir, so make sure it is run. @@ -267,7 +267,7 @@ fn mir_const(tcx: TyCtxt<'_>, def_id: DefId) -> Steal> { fn mir_validated( tcx: TyCtxt<'tcx>, def_id: LocalDefId, -) -> (Steal>, Steal>>) { +) -> (&'tcx Steal>, &'tcx Steal>>) { // Ensure that we compute the `mir_const_qualif` for constants at // this point, before we steal the mir-const result. let _ = tcx.mir_const_qualif(def_id.to_def_id()); @@ -305,17 +305,24 @@ fn mir_validated( fn mir_drops_elaborated_and_const_checked<'tcx>( tcx: TyCtxt<'tcx>, - def_id: LocalDefId, -) -> Steal> { + def: ty::WithOptParam, +) -> &'tcx Steal> { + if def.param_did.is_none() { + if let param_did @ Some(_) = tcx.opt_const_param_of(def.did) { + return tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptParam { param_did, ..def }); + } + } + // (Mir-)Borrowck uses `mir_validated`, so we have to force it to // execute before we can steal. - tcx.ensure().mir_borrowck(def_id); + tcx.ensure().mir_borrowck(def.did); - let (body, _) = tcx.mir_validated(def_id); + let (body, _) = tcx.mir_validated(def.did); let mut body = body.steal(); - run_post_borrowck_cleanup_passes(tcx, &mut body, def_id, None); - check_consts::post_drop_elaboration::check_live_drops(tcx, def_id, &body); + run_post_borrowck_cleanup_passes(tcx, &mut body, def.did, None); + check_consts::post_drop_elaboration::check_live_drops(tcx, def.did, &body); tcx.alloc_steal_mir(body) } @@ -458,7 +465,7 @@ fn inner_optimized_mir(tcx: TyCtxt<'_>, def: ty::WithOptParam) -> Bo return shim::build_adt_ctor(tcx, def.did.to_def_id()); } - let mut body = tcx.mir_drops_elaborated_and_const_checked(def.did).steal(); + let mut body = tcx.mir_drops_elaborated_and_const_checked(def).steal(); run_optimization_passes(tcx, &mut body, def.did, None); debug_assert!(!body.has_free_regions(), "Free regions in optimized MIR"); diff --git a/src/librustc_mir_build/build/mod.rs b/src/librustc_mir_build/build/mod.rs index e69f6b30abd5c..07d0f6ab8dd93 100644 --- a/src/librustc_mir_build/build/mod.rs +++ b/src/librustc_mir_build/build/mod.rs @@ -21,7 +21,7 @@ use rustc_target::spec::PanicStrategy; use super::lints; -crate fn mir_built(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::steal::Steal> { +crate fn mir_built<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> &'tcx ty::steal::Steal> { tcx.alloc_steal_mir(mir_build(tcx, def_id)) } diff --git a/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-impl.stderr b/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-impl.stderr index 1b4326ea56aaa..846e2979f8439 100644 --- a/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-impl.stderr +++ b/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-impl.stderr @@ -30,6 +30,11 @@ note: ...which requires const-evaluating `::BAR`... + --> $DIR/issue-24949-assoc-const-static-recursion-impl.rs:12:5 + | +LL | const BAR: u32 = IMPL_REF_BAR; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: ...which requires optimizing MIR for `::BAR`... --> $DIR/issue-24949-assoc-const-static-recursion-impl.rs:12:5 | diff --git a/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait-default.stderr b/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait-default.stderr index 8efa56a9a2e63..305d20c05c9a8 100644 --- a/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait-default.stderr +++ b/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait-default.stderr @@ -30,6 +30,11 @@ note: ...which requires const-evaluating `FooDefault::BAR`... | LL | const BAR: u32 = DEFAULT_REF_BAR; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +note: ...which requires optimizing MIR for the potential const argument `FooDefault::BAR`... + --> $DIR/issue-24949-assoc-const-static-recursion-trait-default.rs:8:5 + | +LL | const BAR: u32 = DEFAULT_REF_BAR; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: ...which requires optimizing MIR for `FooDefault::BAR`... --> $DIR/issue-24949-assoc-const-static-recursion-trait-default.rs:8:5 | diff --git a/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait.stderr b/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait.stderr index 78ce1a28a3fdc..7a4912aaa73ab 100644 --- a/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait.stderr +++ b/src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait.stderr @@ -30,6 +30,11 @@ note: ...which requires const-evaluating `::BAR`... + --> $DIR/issue-24949-assoc-const-static-recursion-trait.rs:12:5 + | +LL | const BAR: u32 = TRAIT_REF_BAR; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: ...which requires optimizing MIR for `::BAR`... --> $DIR/issue-24949-assoc-const-static-recursion-trait.rs:12:5 |