]> git.lizzy.rs Git - rust.git/commitdiff
incr.comp.: Avoid creating an edge to DepNode::Krate when generating debuginfo namesp...
authorMichael Woerister <michaelwoerister@posteo.net>
Thu, 8 Dec 2016 17:47:35 +0000 (12:47 -0500)
committerMichael Woerister <michaelwoerister@posteo.net>
Mon, 12 Dec 2016 17:18:04 +0000 (12:18 -0500)
src/librustc/hir/map/mod.rs
src/librustc_incremental/calculate_svh/mod.rs
src/librustc_incremental/calculate_svh/svh_visitor.rs
src/test/incremental/issue-38222.rs [new file with mode: 0644]

index 6ce6f6896df29cca0134a636ec79d8f2b01c03dd..117edcf14a1d169a5e718eb70cfc91a2e60ee79d 100644 (file)
@@ -310,8 +310,9 @@ fn dep_node(&self, id0: NodeId) -> DepNode<DefId> {
                         id = p;
                     }
 
-                    RootCrate =>
-                        return DepNode::Krate,
+                    RootCrate => {
+                        return DepNode::Hir(DefId::local(CRATE_DEF_INDEX));
+                    }
 
                     RootInlinedParent(_) =>
                         bug!("node {} has inlined ancestor but is not inlined", id0),
@@ -782,7 +783,7 @@ pub fn span(&self, id: NodeId) -> Span {
             Some(EntryVisibility(_, &Visibility::Restricted { ref path, .. })) => path.span,
             Some(EntryVisibility(_, v)) => bug!("unexpected Visibility {:?}", v),
 
-            Some(RootCrate) => self.krate().span,
+            Some(RootCrate) => self.forest.krate.span,
             Some(RootInlinedParent(parent)) => parent.body.span,
             Some(NotPresent) | None => {
                 bug!("hir::map::Map::span: id not in map: {:?}", id)
index 4595a940f100d4e9596d198bd74f359d9b798cad..df65c4d27947b68b27dc60b0af8f51dad58c2e03 100644 (file)
@@ -112,8 +112,9 @@ pub fn compute_incremental_hashes_map<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>)
         hash_spans: hash_spans,
     };
     record_time(&tcx.sess.perf_stats.incr_comp_hashes_time, || {
-        visitor.calculate_def_id(DefId::local(CRATE_DEF_INDEX),
-                                 |v| visit::walk_crate(v, krate));
+        visitor.calculate_def_id(DefId::local(CRATE_DEF_INDEX), |v| {
+            v.hash_crate_root_module(krate);
+        });
         krate.visit_all_item_likes(&mut visitor.as_deep_visitor());
 
         for macro_def in krate.exported_macros.iter() {
index 681ad2efa0c14bf250b216ea03c0728be0e989e5..de52b70f1ec92d252f80a0f62d0fdb5c67ab93cf 100644 (file)
@@ -619,9 +619,10 @@ fn visit_item(&mut self, i: &'tcx Item) {
         visit::walk_item(self, i)
     }
 
-    fn visit_mod(&mut self, m: &'tcx Mod, _s: Span, n: NodeId) {
+    fn visit_mod(&mut self, m: &'tcx Mod, span: Span, n: NodeId) {
         debug!("visit_mod: st={:?}", self.st);
         SawMod.hash(self.st);
+        hash_span!(self, span);
         visit::walk_mod(self, m, n)
     }
 
@@ -1085,4 +1086,23 @@ fn hash_token(&mut self,
             token::Token::Shebang(val) => val.as_str().hash(self.st),
         }
     }
+
+    pub fn hash_crate_root_module(&mut self, krate: &'tcx Crate) {
+        let hir::Crate {
+            ref module,
+            ref attrs,
+            span,
+
+            // These fields are handled separately:
+            exported_macros: _,
+            items: _,
+            impl_items: _,
+            exprs: _,
+        } = *krate;
+
+        visit::Visitor::visit_mod(self, module, span, ast::CRATE_NODE_ID);
+        // Crate attributes are not copied over to the root `Mod`, so hash them
+        // explicitly here.
+        hash_attrs!(self, attrs);
+    }
 }
diff --git a/src/test/incremental/issue-38222.rs b/src/test/incremental/issue-38222.rs
new file mode 100644 (file)
index 0000000..d14b1cf
--- /dev/null
@@ -0,0 +1,40 @@
+// 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 debuginfo does not introduce a dependency edge to the Krate
+// dep-node.
+
+// revisions:rpass1 rpass2
+
+#![feature(rustc_attrs)]
+
+
+#![rustc_partition_translated(module="issue_38222-mod1", cfg="rpass2")]
+
+// If trans had added a dependency edge to the Krate dep-node, nothing would
+// be re-used, so checking that this module was re-used is sufficient.
+#![rustc_partition_reused(module="issue_38222", cfg="rpass2")]
+
+//[rpass1] compile-flags: -C debuginfo=1
+//[rpass2] compile-flags: -C debuginfo=1
+
+pub fn main() {
+    mod1::some_fn();
+}
+
+mod mod1 {
+    pub fn some_fn() {
+        let _ = 1;
+    }
+
+    #[cfg(rpass2)]
+    fn _some_other_fn() {
+    }
+}