diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs index c31e95fd826c..e21fa63ccc27 100644 --- a/src/librustc_mir/lib.rs +++ b/src/librustc_mir/lib.rs @@ -39,6 +39,7 @@ Rust MIR: a lowered representation of Rust. Also: an experiment! #![feature(collection_placement)] #![feature(nonzero)] #![feature(underscore_lifetimes)] +#![feature(crate_visibility_modifier)] extern crate arena; #[macro_use] diff --git a/src/librustc_mir/util/collect_writes.rs b/src/librustc_mir/util/collect_writes.rs new file mode 100644 index 000000000000..a0c01fa834b6 --- /dev/null +++ b/src/librustc_mir/util/collect_writes.rs @@ -0,0 +1,50 @@ +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use rustc::mir::{Local, Location}; +use rustc::mir::Mir; +use rustc::mir::visit::PlaceContext; +use rustc::mir::visit::Visitor; + +pub struct FindLocalAssignmentVisitor { + needle: Local, + locations: Vec, +} + +impl<'tcx> Visitor<'tcx> for FindLocalAssignmentVisitor { + fn visit_local(&mut self, + local: &Local, + place_context: PlaceContext<'tcx>, + location: Location) { + if self.needle != *local { + return; + } + + match place_context { + PlaceContext::Store | PlaceContext::Call => { + self.locations.push(location); + } + PlaceContext::AsmOutput | PlaceContext::Drop| PlaceContext::Inspect | + PlaceContext::Borrow{..}| PlaceContext::Projection(..)| PlaceContext::Copy| + PlaceContext::Move| PlaceContext::StorageLive| PlaceContext::StorageDead| + PlaceContext::Validate => { + } + } + + Visitor::visit_local(self,local,place_context,location) + } +} + +crate trait FindAssignments { + fn find_assignments(&self, local: Local) -> Vec; + } + +impl<'tcx> FindAssignments for Mir<'tcx>{ + fn find_assignments(&self, local: Local) -> Vec{ + let mut visitor = FindLocalAssignmentVisitor{ needle: local, locations: vec![]}; + visitor.visit_mir(self); + visitor.locations + } +} +