diff options
| author | Michael Woerister <michaelwoerister@posteo.net> | 2016-08-04 18:29:58 -0400 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo.net> | 2016-08-11 09:56:00 -0400 |
| commit | d3578ab742129a8aae8461f015d6cc36d85e65cc (patch) | |
| tree | 001ec5b2f20e1473936d34f37ebe2b251abff1f1 | |
| parent | 32414310b7e0b93491ce6243e1ec0c92c6168557 (diff) | |
| download | rust-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.rs | 4 | ||||
| -rw-r--r-- | src/librustc_incremental/persist/load.rs | 19 | ||||
| -rw-r--r-- | src/librustc_incremental/persist/save.rs | 4 | ||||
| -rw-r--r-- | src/test/incremental/commandline-args.rs | 30 |
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"); +} |
