about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Woerister <michaelwoerister@posteo.net>2016-08-04 18:29:58 -0400
committerMichael Woerister <michaelwoerister@posteo.net>2016-08-11 09:56:00 -0400
commitd3578ab742129a8aae8461f015d6cc36d85e65cc (patch)
tree001ec5b2f20e1473936d34f37ebe2b251abff1f1
parent32414310b7e0b93491ce6243e1ec0c92c6168557 (diff)
downloadrust-d3578ab742129a8aae8461f015d6cc36d85e65cc.tar.gz
rust-d3578ab742129a8aae8461f015d6cc36d85e65cc.zip
Save dep-tracking hash of commandline arguments in dep-graph file.
.. and use it to purge the incremental compilation cache if necessary.
-rw-r--r--src/librustc_incremental/persist/directory.rs4
-rw-r--r--src/librustc_incremental/persist/load.rs19
-rw-r--r--src/librustc_incremental/persist/save.rs4
-rw-r--r--src/test/incremental/commandline-args.rs30
4 files changed, 55 insertions, 2 deletions
diff --git a/src/librustc_incremental/persist/directory.rs b/src/librustc_incremental/persist/directory.rs
index 084b6714b67..89a79d1a487 100644
--- a/src/librustc_incremental/persist/directory.rs
+++ b/src/librustc_incremental/persist/directory.rs
@@ -158,6 +158,10 @@ impl<'a,'tcx> DefIdDirectoryBuilder<'a,'tcx> {
         }
     }
 
+    pub fn tcx(&self) -> TyCtxt<'a, 'tcx, 'tcx> {
+        self.tcx
+    }
+
     pub fn add(&mut self, def_id: DefId) -> DefPathIndex {
         debug!("DefIdDirectoryBuilder: def_id={:?}", def_id);
         let tcx = self.tcx;
diff --git a/src/librustc_incremental/persist/load.rs b/src/librustc_incremental/persist/load.rs
index 79b90b63dc6..c736437df1a 100644
--- a/src/librustc_incremental/persist/load.rs
+++ b/src/librustc_incremental/persist/load.rs
@@ -101,8 +101,25 @@ pub fn decode_dep_graph<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                                   work_products_data: &[u8])
                                   -> Result<(), Error>
 {
+    // Decode the list of work_products
+    let mut work_product_decoder = Decoder::new(work_products_data, 0);
+    let work_products = try!(<Vec<SerializedWorkProduct>>::decode(&mut work_product_decoder));
+
     // Deserialize the directory and dep-graph.
     let mut dep_graph_decoder = Decoder::new(dep_graph_data, 0);
+    let prev_commandline_args_hash = try!(u64::decode(&mut dep_graph_decoder));
+
+    if prev_commandline_args_hash != tcx.sess.opts.dep_tracking_hash() {
+        // We can't reuse the cache, purge it.
+        debug!("decode_dep_graph: differing commandline arg hashes");
+        for swp in work_products {
+            delete_dirty_work_product(tcx, swp);
+        }
+
+        // No need to do any further work
+        return Ok(());
+    }
+
     let directory = try!(DefIdDirectory::decode(&mut dep_graph_decoder));
     let serialized_dep_graph = try!(SerializedDepGraph::decode(&mut dep_graph_decoder));
 
@@ -179,8 +196,6 @@ pub fn decode_dep_graph<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
 
     // Add in work-products that are still clean, and delete those that are
     // dirty.
-    let mut work_product_decoder = Decoder::new(work_products_data, 0);
-    let work_products = try!(<Vec<SerializedWorkProduct>>::decode(&mut work_product_decoder));
     reconcile_work_products(tcx, work_products, &dirty_target_nodes);
 
     dirty_clean::check_dirty_clean_annotations(tcx, &dirty_raw_source_nodes, &retraced);
diff --git a/src/librustc_incremental/persist/save.rs b/src/librustc_incremental/persist/save.rs
index f296cd3172f..a9523a81fba 100644
--- a/src/librustc_incremental/persist/save.rs
+++ b/src/librustc_incremental/persist/save.rs
@@ -105,6 +105,10 @@ pub fn encode_dep_graph(preds: &Predecessors,
                         builder: &mut DefIdDirectoryBuilder,
                         encoder: &mut Encoder)
                         -> io::Result<()> {
+    // First encode the commandline arguments hash
+    let tcx = builder.tcx();
+    try!(tcx.sess.opts.dep_tracking_hash().encode(encoder));
+
     // Create a flat list of (Input, WorkProduct) edges for
     // serialization.
     let mut edges = vec![];
diff --git a/src/test/incremental/commandline-args.rs b/src/test/incremental/commandline-args.rs
new file mode 100644
index 00000000000..a79fcd4f6af
--- /dev/null
+++ b/src/test/incremental/commandline-args.rs
@@ -0,0 +1,30 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <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.
+
+// Test that changing a tracked commandline argument invalidates
+// the cache while changing an untracked one doesn't.
+
+// revisions:rpass1 rpass2 rpass3
+
+#![feature(rustc_attrs)]
+
+#![rustc_partition_translated(module="commandline_args", cfg="rpass2")]
+#![rustc_partition_reused(module="commandline_args", cfg="rpass3")]
+
+// Between revisions 1 and 2, we are changing the debuginfo-level, which should
+// invalidate the cache. Between revisions 2 and 3, we are adding `--verbose`
+// which should have no effect on the cache:
+//[rpass1] compile-flags: -C debuginfo=0
+//[rpass2] compile-flags: -C debuginfo=2
+//[rpass3] compile-flags: -C debuginfo=2 --verbose
+
+pub fn main() {
+    println!("hello world");
+}