about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/hir/map/collector.rs21
-rw-r--r--src/librustc/hir/map/mod.rs5
2 files changed, 23 insertions, 3 deletions
diff --git a/src/librustc/hir/map/collector.rs b/src/librustc/hir/map/collector.rs
index 5c1e74dcf43..02a1e33eeb9 100644
--- a/src/librustc/hir/map/collector.rs
+++ b/src/librustc/hir/map/collector.rs
@@ -12,6 +12,7 @@ use super::*;
 
 use dep_graph::{DepGraph, DepKind, DepNodeIndex};
 use hir::intravisit::{Visitor, NestedVisitorMap};
+use middle::cstore::CrateStore;
 use session::CrateDisambiguator;
 use std::iter::repeat;
 use syntax::ast::{NodeId, CRATE_NODE_ID};
@@ -119,7 +120,9 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
     }
 
     pub(super) fn finalize_and_compute_crate_hash(self,
-                                                  crate_disambiguator: CrateDisambiguator)
+                                                  crate_disambiguator: CrateDisambiguator,
+                                                  cstore: &CrateStore,
+                                                  commandline_args_hash: u64)
                                                   -> Vec<MapEntry<'hir>> {
         let mut node_hashes: Vec<_> = self
             .hir_body_nodes
@@ -132,9 +135,23 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
 
         node_hashes.sort_unstable_by(|&(ref d1, _), &(ref d2, _)| d1.cmp(d2));
 
+        let mut upstream_crates: Vec<_> = cstore.crates_untracked().iter().map(|&cnum| {
+            let name = cstore.crate_name_untracked(cnum).as_str();
+            let disambiguator = cstore.crate_disambiguator_untracked(cnum)
+                                      .to_fingerprint();
+            let hash = cstore.crate_hash_untracked(cnum);
+            (name, disambiguator, hash)
+        }).collect();
+
+        upstream_crates.sort_unstable_by(|&(name1, dis1, _), &(name2, dis2, _)| {
+            (name1, dis1).cmp(&(name2, dis2))
+        });
+
         self.dep_graph.with_task(DepNode::new_no_params(DepKind::Krate),
                                  &self.hcx,
-                                 (node_hashes, crate_disambiguator.to_fingerprint()),
+                                 ((node_hashes, upstream_crates),
+                                  (commandline_args_hash,
+                                   crate_disambiguator.to_fingerprint())),
                                  identity_fn);
         self.map
     }
diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs
index 8b00280b26b..28527b6f0bc 100644
--- a/src/librustc/hir/map/mod.rs
+++ b/src/librustc/hir/map/mod.rs
@@ -1059,7 +1059,10 @@ pub fn map_crate<'hir>(sess: &::session::Session,
         intravisit::walk_crate(&mut collector, &forest.krate);
 
         let crate_disambiguator = sess.local_crate_disambiguator();
-        collector.finalize_and_compute_crate_hash(crate_disambiguator)
+        let cmdline_args = sess.opts.dep_tracking_hash();
+        collector.finalize_and_compute_crate_hash(crate_disambiguator,
+                                                  cstore,
+                                                  cmdline_args)
     };
 
     if log_enabled!(::log::LogLevel::Debug) {