Skip to content

Commit

Permalink
consider DepNode::Krate to be an input
Browse files Browse the repository at this point in the history
This seems not only more correct but allows us to write tests that check
whether the krate hash as a whole is clean/dirty
  • Loading branch information
nikomatsakis committed Aug 23, 2016
1 parent c42e0a3 commit ea2d90e
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 5 deletions.
5 changes: 5 additions & 0 deletions src/librustc/dep_graph/dep_node.rs
Expand Up @@ -147,6 +147,11 @@ impl<D: Clone + Debug> DepNode<D> {
}
}

if label == "Krate" {
// special case
return Ok(DepNode::Krate);
}

check! {
CollectItem,
BorrowCheck,
Expand Down
2 changes: 2 additions & 0 deletions src/librustc_incremental/persist/dirty_clean.rs
Expand Up @@ -133,6 +133,7 @@ impl<'a, 'tcx> DirtyCleanVisitor<'a, 'tcx> {
debug!("assert_dirty({:?})", dep_node);

match dep_node {
DepNode::Krate |
DepNode::Hir(_) => {
// HIR nodes are inputs, so if we are asserting that the HIR node is
// dirty, we check the dirty input set.
Expand Down Expand Up @@ -161,6 +162,7 @@ impl<'a, 'tcx> DirtyCleanVisitor<'a, 'tcx> {
debug!("assert_clean({:?})", dep_node);

match dep_node {
DepNode::Krate |
DepNode::Hir(_) => {
// For HIR nodes, check the inputs.
if self.dirty_inputs.contains(&dep_node) {
Expand Down
11 changes: 8 additions & 3 deletions src/librustc_incremental/persist/hash.rs
Expand Up @@ -45,14 +45,19 @@ impl<'a, 'tcx> HashContext<'a, 'tcx> {

pub fn is_hashable(dep_node: &DepNode<DefId>) -> bool {
match *dep_node {
DepNode::Krate |
DepNode::Hir(_) => true,
DepNode::MetaData(def_id) => !def_id.is_local(),
_ => false,
}
}

pub fn hash(&mut self, dep_node: &DepNode<DefId>) -> Option<(DefId, u64)> {
pub fn hash(&mut self, dep_node: &DepNode<DefId>) -> Option<u64> {
match *dep_node {
DepNode::Krate => {
Some(self.incremental_hashes_map[dep_node])
}

// HIR nodes (which always come from our crate) are an input:
DepNode::Hir(def_id) => {
assert!(def_id.is_local(),
Expand All @@ -65,15 +70,15 @@ impl<'a, 'tcx> HashContext<'a, 'tcx> {
def_id,
self.tcx.item_path_str(def_id));

Some((def_id, self.incremental_hashes_map[dep_node]))
Some(self.incremental_hashes_map[dep_node])
}

// MetaData from other crates is an *input* to us.
// MetaData nodes from *our* crates are an *output*; we
// don't hash them, but we do compute a hash for them and
// save it for others to use.
DepNode::MetaData(def_id) if !def_id.is_local() => {
Some((def_id, self.metadata_hash(def_id)))
Some(self.metadata_hash(def_id))
}

_ => {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_incremental/persist/load.rs
Expand Up @@ -222,7 +222,7 @@ fn dirty_nodes<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,

for hash in serialized_hashes {
if let Some(dep_node) = retraced.map(&hash.dep_node) {
let (_, current_hash) = hcx.hash(&dep_node).unwrap();
let current_hash = hcx.hash(&dep_node).unwrap();
if current_hash == hash.hash {
continue;
}
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_incremental/persist/preds.rs
Expand Up @@ -62,7 +62,7 @@ impl<'q> Predecessors<'q> {
let mut hashes = FnvHashMap();
for input in inputs.values().flat_map(|v| v.iter().cloned()) {
hashes.entry(input)
.or_insert_with(|| hcx.hash(input).unwrap().1);
.or_insert_with(|| hcx.hash(input).unwrap());
}

Predecessors {
Expand Down
40 changes: 40 additions & 0 deletions src/test/incremental/crate_hash_reorder.rs
@@ -0,0 +1,40 @@
// Copyright 2014 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 incremental compilation tracking where we change field names
// in between revisions (hashing should be stable).

// revisions:rpass1 rpass2 rpass3
// compile-flags: -Z query-dep-graph

#![feature(rustc_attrs)]

// Check that reordering otherwise identical items is not considered a
// change at all.
#[rustc_clean(label="Krate", cfg="rpass2")]

// But removing an item, naturally, is.
#[rustc_dirty(label="Krate", cfg="rpass3")]

#[cfg(rpass1)]
pub struct X {
pub x: u32,
}

pub struct Y {
pub x: u32,
}

#[cfg(rpass2)]
pub struct X {
pub x: u32,
}

pub fn main() { }

0 comments on commit ea2d90e

Please sign in to comment.