about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPavel Sountsov <siege@google.com>2016-05-05 21:48:44 -0700
committerSiegeLord <slabode@aim.com>2016-05-10 08:21:00 -0700
commitf16eac928a7feec28825db36acd259aca2382381 (patch)
treee71139d1a2ca8371fc0906f108e511f7a7f3d510
parentd6588097d4d65e567fb234c042e61ad8ce4d41e6 (diff)
Make --emit dep-info work correctly with -Z no-analysis again.
Previously, it would attempt to resolve some external crates that weren't
necessary for dep-info output.

Fixes #33231.
-rw-r--r--src/librustc_driver/driver.rs62
-rw-r--r--src/librustc_driver/lib.rs26
-rw-r--r--src/librustc_driver/pretty.rs22
-rw-r--r--src/test/run-make/dep-info-no-analysis/Makefile6
-rw-r--r--src/test/run-make/dep-info-no-analysis/input.dd3
-rw-r--r--src/test/run-make/dep-info-no-analysis/input.rs14
6 files changed, 93 insertions, 40 deletions
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs
index e72204e5e22..0d5ecc53a79 100644
--- a/src/librustc_driver/driver.rs
+++ b/src/librustc_driver/driver.rs
@@ -138,6 +138,20 @@ pub fn compile_input(sess: &Session,
                                                                  &id),
                                 Ok(()));
 
+        write_out_deps(sess, &outputs, &id);
+
+        {            controller_entry_point!(after_write_deps,
+                                    sess,
+                                    CompileState::state_after_write_deps(input,
+                                                                         sess,
+                                                                         outdir,
+                                                                         output,
+                                                                         &cstore,
+                                                                         &expanded_crate,
+                                                                         &id),
+                                    Ok(()));
+        }
+
         let expanded_crate = assign_node_ids(sess, expanded_crate);
         let dep_graph = DepGraph::new(sess.opts.build_dep_graph());
 
@@ -173,25 +187,22 @@ pub fn compile_input(sess: &Session,
                            "indexing hir",
                            move || hir_map::map_crate(hir_forest, defs));
 
-
-        write_out_deps(sess, &outputs, &id);
-
         {
             let _ignore = hir_map.dep_graph.in_ignore();
-            controller_entry_point!(after_write_deps,
+            controller_entry_point!(after_ast,
                                     sess,
-                                    CompileState::state_after_write_deps(input,
-                                                                         sess,
-                                                                         outdir,
-                                                                         output,
-                                                                         &arenas,
-                                                                         &cstore,
-                                                                         &hir_map,
-                                                                         &analysis,
-                                                                         &resolutions,
-                                                                         &expanded_crate,
-                                                                         &hir_map.krate(),
-                                                                         &id),
+                                    CompileState::state_after_ast(input,
+                                                                  sess,
+                                                                  outdir,
+                                                                  output,
+                                                                  &arenas,
+                                                                  &cstore,
+                                                                  &hir_map,
+                                                                  &analysis,
+                                                                  &resolutions,
+                                                                  &expanded_crate,
+                                                                  &hir_map.krate(),
+                                                                  &id),
                                     Ok(()));
         }
 
@@ -311,6 +322,7 @@ pub struct CompileController<'a> {
     pub after_parse: PhaseController<'a>,
     pub after_expand: PhaseController<'a>,
     pub after_write_deps: PhaseController<'a>,
+    pub after_ast: PhaseController<'a>,
     pub after_analysis: PhaseController<'a>,
     pub after_llvm: PhaseController<'a>,
 
@@ -323,6 +335,7 @@ impl<'a> CompileController<'a> {
             after_parse: PhaseController::basic(),
             after_expand: PhaseController::basic(),
             after_write_deps: PhaseController::basic(),
+            after_ast: PhaseController::basic(),
             after_analysis: PhaseController::basic(),
             after_llvm: PhaseController::basic(),
             make_glob_map: resolve::MakeGlobMap::No,
@@ -433,6 +446,23 @@ impl<'a, 'b, 'ast, 'tcx> CompileState<'a, 'b, 'ast, 'tcx> {
                               session: &'ast Session,
                               out_dir: &'a Option<PathBuf>,
                               out_file: &'a Option<PathBuf>,
+                              cstore: &'a CStore,
+                              krate: &'a ast::Crate,
+                              crate_name: &'a str)
+                              -> CompileState<'a, 'b, 'ast, 'tcx> {
+        CompileState {
+            crate_name: Some(crate_name),
+            cstore: Some(cstore),
+            expanded_crate: Some(krate),
+            out_file: out_file.as_ref().map(|s| &**s),
+            ..CompileState::empty(input, session, out_dir)
+        }
+    }
+
+    fn state_after_ast(input: &'a Input,
+                              session: &'ast Session,
+                              out_dir: &'a Option<PathBuf>,
+                              out_file: &'a Option<PathBuf>,
                               arenas: &'ast ty::CtxtArenas<'ast>,
                               cstore: &'a CStore,
                               hir_map: &'a hir_map::Map<'ast>,
diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs
index 4da36be94e0..483ba044add 100644
--- a/src/librustc_driver/lib.rs
+++ b/src/librustc_driver/lib.rs
@@ -461,23 +461,23 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
 
         if let Some((ppm, opt_uii)) = parse_pretty(sess, matches) {
             if ppm.needs_ast_map(&opt_uii) {
-                control.after_write_deps.stop = Compilation::Stop;
+                control.after_ast.stop = Compilation::Stop;
 
                 control.after_parse.callback = box move |state| {
                     state.krate = Some(pretty::fold_crate(state.krate.take().unwrap(), ppm));
                 };
-                control.after_write_deps.callback = box move |state| {
-                    pretty::print_after_write_deps(state.session,
-                                                   state.ast_map.unwrap(),
-                                                   state.analysis.unwrap(),
-                                                   state.resolutions.unwrap(),
-                                                   state.input,
-                                                   &state.expanded_crate.take().unwrap(),
-                                                   state.crate_name.unwrap(),
-                                                   ppm,
-                                                   state.arenas.unwrap(),
-                                                   opt_uii.clone(),
-                                                   state.out_file);
+                control.after_ast.callback = box move |state| {
+                    pretty::print_after_ast(state.session,
+                                            state.ast_map.unwrap(),
+                                            state.analysis.unwrap(),
+                                            state.resolutions.unwrap(),
+                                            state.input,
+                                            &state.expanded_crate.take().unwrap(),
+                                            state.crate_name.unwrap(),
+                                            ppm,
+                                            state.arenas.unwrap(),
+                                            opt_uii.clone(),
+                                            state.out_file);
                 };
             } else {
                 control.after_parse.stop = Compilation::Stop;
diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs
index 8d8984000c7..2fd015bf5b8 100644
--- a/src/librustc_driver/pretty.rs
+++ b/src/librustc_driver/pretty.rs
@@ -812,17 +812,17 @@ pub fn print_after_parsing(sess: &Session,
     write_output(out, ofile);
 }
 
-pub fn print_after_write_deps<'tcx, 'a: 'tcx>(sess: &'a Session,
-                                              ast_map: &hir_map::Map<'tcx>,
-                                              analysis: &ty::CrateAnalysis,
-                                              resolutions: &Resolutions,
-                                              input: &Input,
-                                              krate: &ast::Crate,
-                                              crate_name: &str,
-                                              ppm: PpMode,
-                                              arenas: &'tcx ty::CtxtArenas<'tcx>,
-                                              opt_uii: Option<UserIdentifiedItem>,
-                                              ofile: Option<&Path>) {
+pub fn print_after_ast<'tcx, 'a: 'tcx>(sess: &'a Session,
+                                       ast_map: &hir_map::Map<'tcx>,
+                                       analysis: &ty::CrateAnalysis,
+                                       resolutions: &Resolutions,
+                                       input: &Input,
+                                       krate: &ast::Crate,
+                                       crate_name: &str,
+                                       ppm: PpMode,
+                                       arenas: &'tcx ty::CtxtArenas<'tcx>,
+                                       opt_uii: Option<UserIdentifiedItem>,
+                                       ofile: Option<&Path>) {
     let dep_graph = DepGraph::new(false);
     let _ignore = dep_graph.in_ignore();
 
diff --git a/src/test/run-make/dep-info-no-analysis/Makefile b/src/test/run-make/dep-info-no-analysis/Makefile
new file mode 100644
index 00000000000..8d31de3781c
--- /dev/null
+++ b/src/test/run-make/dep-info-no-analysis/Makefile
@@ -0,0 +1,6 @@
+-include ../tools.mk
+
+all:
+	$(RUSTC) -o $(TMPDIR)/input.dd -Z no-analysis --emit dep-info input.rs
+	sed -i "s@$(TMPDIR)/@@g" $(TMPDIR)/input.dd
+	diff -u $(TMPDIR)/input.dd input.dd
diff --git a/src/test/run-make/dep-info-no-analysis/input.dd b/src/test/run-make/dep-info-no-analysis/input.dd
new file mode 100644
index 00000000000..f2c8676515b
--- /dev/null
+++ b/src/test/run-make/dep-info-no-analysis/input.dd
@@ -0,0 +1,3 @@
+input.dd: input.rs
+
+input.rs:
diff --git a/src/test/run-make/dep-info-no-analysis/input.rs b/src/test/run-make/dep-info-no-analysis/input.rs
new file mode 100644
index 00000000000..523b0f0670c
--- /dev/null
+++ b/src/test/run-make/dep-info-no-analysis/input.rs
@@ -0,0 +1,14 @@
+// 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.
+
+// Tests that dep info can be emitted without resolving external crates.
+extern crate not_there;
+
+fn main() {}