Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

compute and cache HIR hashes at beginning #35854

Merged
merged 9 commits into from
Aug 23, 2016
5 changes: 5 additions & 0 deletions src/librustc/dep_graph/dep_node.rs
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems to be a leftover from another test.


// 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() { }