about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-04-16 10:30:57 +0000
committerbors <bors@rust-lang.org>2018-04-16 10:30:57 +0000
commitd6a2dd9912e762fb0029c4463002d674686c1159 (patch)
treeda714c22c8135a75b616a107fa2bd2bc297b2f4c
parent532764cb791718dc4c1102814b47c4ef1c6d1e24 (diff)
parent5576ce84cf13a32ebcf9a08366e3117da9832c84 (diff)
downloadrust-d6a2dd9912e762fb0029c4463002d674686c1159.tar.gz
rust-d6a2dd9912e762fb0029c4463002d674686c1159.zip
Auto merge of #49433 - varkor:metadata-skip-mir-opt, r=michaelwoerister
Skip MIR encoding for cargo check

Resolves #48662.

r? @michaelwoerister
-rw-r--r--src/librustc/session/config.rs4
-rw-r--r--src/librustc_driver/driver.rs2
-rw-r--r--src/librustc_metadata/encoder.rs11
3 files changed, 14 insertions, 3 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs
index d309026212b..0f7de0ffffe 100644
--- a/src/librustc/session/config.rs
+++ b/src/librustc/session/config.rs
@@ -246,6 +246,10 @@ impl OutputTypes {
         self.0.values()
     }
 
+    pub fn len(&self) -> usize {
+        self.0.len()
+    }
+
     // True if any of the output types require codegen or linking.
     pub fn should_trans(&self) -> bool {
         self.0.keys().any(|k| match *k {
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs
index 4071b804def..fe89be11764 100644
--- a/src/librustc_driver/driver.rs
+++ b/src/librustc_driver/driver.rs
@@ -168,7 +168,7 @@ pub fn compile_input(trans: Box<TransCrate>,
 
         write_out_deps(sess, &outputs, &output_paths);
         if sess.opts.output_types.contains_key(&OutputType::DepInfo) &&
-            sess.opts.output_types.keys().count() == 1 {
+            sess.opts.output_types.len() == 1 {
             return Ok(())
         }
 
diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs
index a61428b841f..67c180e94ca 100644
--- a/src/librustc_metadata/encoder.rs
+++ b/src/librustc_metadata/encoder.rs
@@ -864,6 +864,11 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
         }
     }
 
+    fn metadata_output_only(&self) -> bool {
+        // MIR optimisation can be skipped when we're just interested in the metadata.
+        !self.tcx.sess.opts.output_types.should_trans()
+    }
+
     fn encode_info_for_impl_item(&mut self, def_id: DefId) -> Entry<'tcx> {
         debug!("IsolatedEncoder::encode_info_for_impl_item({:?})", def_id);
         let tcx = self.tcx;
@@ -908,7 +913,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
         } else if let hir::ImplItemKind::Method(ref sig, body) = ast_item.node {
             let generics = self.tcx.generics_of(def_id);
             let types = generics.parent_types as usize + generics.types.len();
-            let needs_inline = types > 0 || tcx.trans_fn_attrs(def_id).requests_inline();
+            let needs_inline = (types > 0 || tcx.trans_fn_attrs(def_id).requests_inline()) &&
+                !self.metadata_output_only();
             let is_const_fn = sig.constness == hir::Constness::Const;
             let ast = if is_const_fn { Some(body) } else { None };
             let always_encode_mir = self.tcx.sess.opts.debugging_opts.always_encode_mir;
@@ -1199,7 +1205,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
                 hir::ItemConst(..) => self.encode_optimized_mir(def_id),
                 hir::ItemFn(_, _, constness, _, ref generics, _) => {
                     let has_tps = generics.ty_params().next().is_some();
-                    let needs_inline = has_tps || tcx.trans_fn_attrs(def_id).requests_inline();
+                    let needs_inline = (has_tps || tcx.trans_fn_attrs(def_id).requests_inline()) &&
+                        !self.metadata_output_only();
                     let always_encode_mir = self.tcx.sess.opts.debugging_opts.always_encode_mir;
                     if needs_inline || constness == hir::Constness::Const || always_encode_mir {
                         self.encode_optimized_mir(def_id)