about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorgaurikholkar <f2013002@goa.bits-pilani.ac.in>2018-03-03 01:49:55 +0530
committergaurikholkar <f2013002@goa.bits-pilani.ac.in>2018-03-10 20:52:22 +0530
commitbfc9b761596a024e4ba6fc32997ffc74d0ba9abb (patch)
tree70176f6dc927f70a34a87200761bbf9cba568772 /src
parent3f0ce0858e4a07239ea6d38c14991bba46c413fc (diff)
downloadrust-bfc9b761596a024e4ba6fc32997ffc74d0ba9abb.tar.gz
rust-bfc9b761596a024e4ba6fc32997ffc74d0ba9abb.zip
add collect_writes.rs
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/lib.rs1
-rw-r--r--src/librustc_mir/util/collect_writes.rs50
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
+    }
+}
+