From 713ec152fcbe19dc3d75e41d7878b227477d46ba Mon Sep 17 00:00:00 2001 From: Dylan MacKenzie Date: Wed, 25 Sep 2019 12:02:56 -0700 Subject: [PATCH] Share `IndirectlyMutableLocals` results via reference --- .../transform/check_consts/resolver.rs | 7 ++- .../transform/check_consts/validation.rs | 51 +++++++++++-------- src/librustc_mir/transform/qualify_consts.rs | 3 +- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/librustc_mir/transform/check_consts/resolver.rs b/src/librustc_mir/transform/check_consts/resolver.rs index 2350382e663..52c471ad691 100644 --- a/src/librustc_mir/transform/check_consts/resolver.rs +++ b/src/librustc_mir/transform/check_consts/resolver.rs @@ -4,7 +4,6 @@ use std::cell::RefCell; use std::marker::PhantomData; -use std::rc::Rc; use crate::dataflow::{self as old_dataflow, generic as dataflow}; use super::{Item, Qualif}; @@ -164,7 +163,7 @@ fn contains(&mut self, local: Local) -> bool { fn reset(&mut self); } -type IndirectlyMutableResults<'mir, 'tcx> = +pub type IndirectlyMutableResults<'mir, 'tcx> = old_dataflow::DataflowResultsCursor<'mir, 'tcx, IndirectlyMutableLocals<'mir, 'tcx>>; /// A resolver for qualifs that works on arbitrarily complex CFGs. @@ -181,7 +180,7 @@ pub struct FlowSensitiveResolver<'a, 'mir, 'tcx, Q> Q: Qualif, { location: Location, - indirectly_mutable_locals: Rc>>, + indirectly_mutable_locals: &'a RefCell>, cursor: dataflow::ResultsCursor<'mir, 'tcx, FlowSensitiveAnalysis<'a, 'mir, 'tcx, Q>>, qualifs_per_local: BitSet, } @@ -193,7 +192,7 @@ impl FlowSensitiveResolver<'a, 'mir, 'tcx, Q> pub fn new( _: Q, item: &'a Item<'mir, 'tcx>, - indirectly_mutable_locals: Rc>>, + indirectly_mutable_locals: &'a RefCell>, dead_unwinds: &BitSet, ) -> Self { let analysis = FlowSensitiveAnalysis { diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index c61fdf5b970..74bf70f05e6 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -11,11 +11,10 @@ use std::cell::RefCell; use std::fmt; use std::ops::Deref; -use std::rc::Rc; use crate::dataflow as old_dataflow; use super::{Item, Qualif, is_lang_panic_fn}; -use super::resolver::{QualifResolver, FlowSensitiveResolver}; +use super::resolver::{FlowSensitiveResolver, IndirectlyMutableResults, QualifResolver}; use super::qualifs::{HasMutInterior, NeedsDrop}; use super::ops::{self, NonConstOp}; @@ -127,37 +126,47 @@ fn deref(&self) -> &Self::Target { } } +pub fn compute_indirectly_mutable_locals<'mir, 'tcx>( + item: &Item<'mir, 'tcx>, +) -> RefCell> { + let dead_unwinds = BitSet::new_empty(item.body.basic_blocks().len()); + + let indirectly_mutable_locals = old_dataflow::do_dataflow( + item.tcx, + item.body, + item.def_id, + &[], + &dead_unwinds, + old_dataflow::IndirectlyMutableLocals::new(item.tcx, item.body, item.param_env), + |_, local| old_dataflow::DebugFormatted::new(&local), + ); + + let indirectly_mutable_locals = old_dataflow::DataflowResultsCursor::new( + indirectly_mutable_locals, + item.body, + ); + + RefCell::new(indirectly_mutable_locals) +} + impl Validator<'a, 'mir, 'tcx> { - pub fn new(item: &'a Item<'mir, 'tcx>) -> Self { + pub fn new( + item: &'a Item<'mir, 'tcx>, + indirectly_mutable_locals: &'a RefCell>, + ) -> Self { let dead_unwinds = BitSet::new_empty(item.body.basic_blocks().len()); - let indirectly_mutable_locals = old_dataflow::do_dataflow( - item.tcx, - item.body, - item.def_id, - &[], - &dead_unwinds, - old_dataflow::IndirectlyMutableLocals::new(item.tcx, item.body, item.param_env), - |_, local| old_dataflow::DebugFormatted::new(&local), - ); - - let indirectly_mutable_locals = old_dataflow::DataflowResultsCursor::new( - indirectly_mutable_locals, - item.body, - ); - let indirectly_mutable_locals = Rc::new(RefCell::new(indirectly_mutable_locals)); - let needs_drop = FlowSensitiveResolver::new( NeedsDrop, item, - indirectly_mutable_locals.clone(), + indirectly_mutable_locals, &dead_unwinds, ); let has_mut_interior = FlowSensitiveResolver::new( HasMutInterior, item, - indirectly_mutable_locals.clone(), + indirectly_mutable_locals, &dead_unwinds, ); diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index 5add7a64aab..387540655f0 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -957,7 +957,8 @@ fn check_const(&mut self) -> (u8, &'tcx BitSet) { } let item = new_checker::Item::new(self.tcx, self.def_id, self.body); - let mut validator = new_checker::validation::Validator::new(&item); + let mut_borrowed_locals = new_checker::validation::compute_indirectly_mutable_locals(&item); + let mut validator = new_checker::validation::Validator::new(&item, &mut_borrowed_locals); validator.suppress_errors = !use_new_validator; self.suppress_errors = use_new_validator; -- 2.44.0