diff options
| author | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-03 22:15:27 +0200 |
|---|---|---|
| committer | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-15 12:58:32 +0200 |
| commit | b615b98f33c73670731c7e681a45a8335049492e (patch) | |
| tree | 03c9dddef611f2a7e55968ea3d0d61349afe886b | |
| parent | 316128c38a1bb011e3b6a5301ffe47427b06c9aa (diff) | |
| download | rust-b615b98f33c73670731c7e681a45a8335049492e.tar.gz rust-b615b98f33c73670731c7e681a45a8335049492e.zip | |
continue mir pipeline
| -rw-r--r-- | src/librustc_interface/passes.rs | 3 | ||||
| -rw-r--r-- | src/librustc_middle/arena.rs | 19 | ||||
| -rw-r--r-- | src/librustc_middle/query/mod.rs | 27 | ||||
| -rw-r--r-- | src/librustc_middle/ty/context.rs | 8 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/mod.rs | 4 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/eval_context.rs | 6 | ||||
| -rw-r--r-- | src/librustc_mir/transform/mod.rs | 25 | ||||
| -rw-r--r-- | src/librustc_mir_build/build/mod.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-impl.stderr | 5 | ||||
| -rw-r--r-- | src/test/ui/associated-consts/issue-24949-assoc-const-static-recursion-trait-default.stderr | 5 | ||||
| -rw-r--r-- | src/test/ui/associated-consts/issue-24949-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 6d85c2f1825..5152e62f072 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 3e5a2cd7825..caf771803c0 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::mir::Body<$tcx>>, + rustc_middle::ty::steal::Steal<rustc_middle::mir::Body<$tcx>>; [] 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 28cdedca3f7..bad2dc64859 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<mir::Body<'tcx>> { - storage(ArenaCacheSelector<'tcx>) + query mir_built(key: LocalDefId) -> &'tcx Steal<mir::Body<'tcx>> { 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<mir::Body<'tcx>> { - desc { |tcx| "processing MIR for `{}`", tcx.def_path_str(key) } - storage(ArenaCacheSelector<'tcx>) + query mir_const(key: DefId) -> &'tcx Steal<mir::Body<'tcx>> { + desc { |tcx| "processing MIR for `{}`", tcx.def_path_str(key) } no_hash } - query mir_drops_elaborated_and_const_checked(key: LocalDefId) -> Steal<mir::Body<'tcx>> { - storage(ArenaCacheSelector<'tcx>) + query mir_drops_elaborated_and_const_checked( + key: ty::WithOptParam<LocalDefId> + ) -> &'tcx Steal<mir::Body<'tcx>> { 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<mir::Body<'tcx>>, - Steal<IndexVec<mir::Promoted, mir::Body<'tcx>>> + &'tcx Steal<mir::Body<'tcx>>, + &'tcx Steal<IndexVec<mir::Promoted, mir::Body<'tcx>>> ) { - 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<LocalDefId>) -> &'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 c4a5bc30222..d2bad6e90dd 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<Body<'tcx>> { - Steal::new(mir) + pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> { + self.arena.alloc(Steal::new(mir)) } pub fn alloc_steal_promoted( self, promoted: IndexVec<Promoted, Body<'tcx>>, - ) -> Steal<IndexVec<Promoted, Body<'tcx>>> { - Steal::new(promoted) + ) -> &'tcx Steal<IndexVec<Promoted, Body<'tcx>>> { + 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 beb5f1fe924..e77dcb63f46 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 641b8cce5e4..5e1376677a0 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 4ba9cb9f772..25973462e4c 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<Body<'_>> { +fn mir_const<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx Steal<Body<'tcx>> { 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<Body<'_>> { fn mir_validated( tcx: TyCtxt<'tcx>, def_id: LocalDefId, -) -> (Steal<Body<'tcx>>, Steal<IndexVec<Promoted, Body<'tcx>>>) { +) -> (&'tcx Steal<Body<'tcx>>, &'tcx Steal<IndexVec<Promoted, Body<'tcx>>>) { // 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<Body<'tcx>> { + def: ty::WithOptParam<LocalDefId>, +) -> &'tcx Steal<Body<'tcx>> { + 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<LocalDefId>) -> 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 e69f6b30abd..07d0f6ab8dd 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<Body<'_>> { +crate fn mir_built<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> &'tcx ty::steal::Steal<Body<'tcx>> { 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 1b4326ea56a..846e2979f84 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 `<impl at $DIR/issue-24949-assoc-const- | LL | const BAR: u32 = IMPL_REF_BAR; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +note: ...which requires optimizing MIR for the potential const argument `<impl at $DIR/issue-24949-assoc-const-static-recursion-impl.rs:11:1: 13:2>::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 `<impl at $DIR/issue-24949-assoc-const-static-recursion-impl.rs:11:1: 13:2>::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 8efa56a9a2e..305d20c05c9 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 78ce1a28a3f..7a4912aaa73 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 `<impl at $DIR/issue-24949-assoc-const- | LL | const BAR: u32 = TRAIT_REF_BAR; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +note: ...which requires optimizing MIR for the potential const argument `<impl at $DIR/issue-24949-assoc-const-static-recursion-trait.rs:11:1: 13:2>::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 `<impl at $DIR/issue-24949-assoc-const-static-recursion-trait.rs:11:1: 13:2>::BAR`... --> $DIR/issue-24949-assoc-const-static-recursion-trait.rs:12:5 | |
