diff options
| author | gaurikholkar <f2013002@goa.bits-pilani.ac.in> | 2018-03-03 01:49:55 +0530 |
|---|---|---|
| committer | gaurikholkar <f2013002@goa.bits-pilani.ac.in> | 2018-03-10 20:52:22 +0530 |
| commit | bfc9b761596a024e4ba6fc32997ffc74d0ba9abb (patch) | |
| tree | 70176f6dc927f70a34a87200761bbf9cba568772 /src | |
| parent | 3f0ce0858e4a07239ea6d38c14991bba46c413fc (diff) | |
| download | rust-bfc9b761596a024e4ba6fc32997ffc74d0ba9abb.tar.gz rust-bfc9b761596a024e4ba6fc32997ffc74d0ba9abb.zip | |
add collect_writes.rs
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_mir/lib.rs | 1 | ||||
| -rw-r--r-- | src/librustc_mir/util/collect_writes.rs | 50 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs index c31e95fd826..e21fa63ccc2 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 00000000000..a0c01fa834b --- /dev/null +++ b/src/librustc_mir/util/collect_writes.rs @@ -0,0 +1,50 @@ +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<Location>, +} + +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<Location>; + } + +impl<'tcx> FindAssignments for Mir<'tcx>{ + fn find_assignments(&self, local: Local) -> Vec<Location>{ + let mut visitor = FindLocalAssignmentVisitor{ needle: local, locations: vec![]}; + visitor.visit_mir(self); + visitor.locations + } +} + |
