@@ -28,7 +28,7 @@ use rustc::traits::specialization_graph;
28
28
use rustc:: ty:: { self , Ty , TyCtxt , ReprOptions , SymbolName } ;
29
29
use rustc:: ty:: codec:: { self as ty_codec, TyEncoder } ;
30
30
31
- use rustc:: session:: config:: { self , CrateTypeProcMacro } ;
31
+ use rustc:: session:: config:: { self , CrateTypeProcMacro , OutputType } ;
32
32
use rustc:: util:: nodemap:: FxHashMap ;
33
33
34
34
use rustc_data_structures:: stable_hasher:: StableHasher ;
@@ -833,6 +833,12 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
833
833
}
834
834
}
835
835
836
+ fn metadata_output_only ( & self ) -> bool {
837
+ // MIR optimisation can be skipped when we're just interested in the metadata.
838
+ self . tcx . sess . opts . output_types . keys ( ) . count ( ) == 1 &&
839
+ self . tcx . sess . opts . output_types . contains_key ( & OutputType :: Metadata )
840
+ }
841
+
836
842
fn encode_info_for_impl_item ( & mut self , def_id : DefId ) -> Entry < ' tcx > {
837
843
debug ! ( "IsolatedEncoder::encode_info_for_impl_item({:?})" , def_id) ;
838
844
let tcx = self . tcx ;
@@ -877,7 +883,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
877
883
} else if let hir:: ImplItemKind :: Method ( ref sig, body) = ast_item. node {
878
884
let generics = self . tcx . generics_of ( def_id) ;
879
885
let types = generics. parent_types as usize + generics. types . len ( ) ;
880
- let needs_inline = types > 0 || tcx. trans_fn_attrs ( def_id) . requests_inline ( ) ;
886
+ let needs_inline = ( types > 0 || tcx. trans_fn_attrs ( def_id) . requests_inline ( ) ) &&
887
+ !self . metadata_output_only ( ) ;
881
888
let is_const_fn = sig. constness == hir:: Constness :: Const ;
882
889
let ast = if is_const_fn { Some ( body) } else { None } ;
883
890
let always_encode_mir = self . tcx . sess . opts . debugging_opts . always_encode_mir ;
@@ -1168,7 +1175,8 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
1168
1175
hir:: ItemConst ( ..) => self . encode_optimized_mir ( def_id) ,
1169
1176
hir:: ItemFn ( _, _, constness, _, ref generics, _) => {
1170
1177
let has_tps = generics. ty_params ( ) . next ( ) . is_some ( ) ;
1171
- let needs_inline = has_tps || tcx. trans_fn_attrs ( def_id) . requests_inline ( ) ;
1178
+ let needs_inline = ( has_tps || tcx. trans_fn_attrs ( def_id) . requests_inline ( ) ) &&
1179
+ !self . metadata_output_only ( ) ;
1172
1180
let always_encode_mir = self . tcx . sess . opts . debugging_opts . always_encode_mir ;
1173
1181
if needs_inline || constness == hir:: Constness :: Const || always_encode_mir {
1174
1182
self . encode_optimized_mir ( def_id)
0 commit comments