@@ -8,6 +8,7 @@ use std::{env, fs, iter};
88use rustc_ast as ast;
99use rustc_attr_parsing:: { AttributeParser , ShouldEmit } ;
1010use rustc_codegen_ssa:: traits:: CodegenBackend ;
11+ use rustc_codegen_ssa:: { CodegenResults , CrateInfo } ;
1112use rustc_data_structures:: jobserver:: Proxy ;
1213use rustc_data_structures:: steal:: Steal ;
1314use rustc_data_structures:: sync:: { AppendOnlyIndexVec , FreezeLock , WorkerLocal } ;
@@ -1236,7 +1237,21 @@ pub(crate) fn start_codegen<'tcx>(
12361237
12371238 let metadata = rustc_metadata:: fs:: encode_and_write_metadata ( tcx) ;
12381239
1239- let codegen = tcx. sess . time ( "codegen_crate" , move || codegen_backend. codegen_crate ( tcx) ) ;
1240+ let codegen = tcx. sess . time ( "codegen_crate" , move || {
1241+ if tcx. sess . opts . unstable_opts . no_codegen || !tcx. sess . opts . output_types . should_codegen ( ) {
1242+ // Skip crate items and just output metadata in -Z no-codegen mode.
1243+ tcx. sess . dcx ( ) . abort_if_errors ( ) ;
1244+
1245+ // Linker::link will skip join_codegen in case of a CodegenResults Any value.
1246+ Box :: new ( CodegenResults {
1247+ modules : vec ! [ ] ,
1248+ allocator_module : None ,
1249+ crate_info : CrateInfo :: new ( tcx, "<dummy cpu>" . to_owned ( ) ) ,
1250+ } )
1251+ } else {
1252+ codegen_backend. codegen_crate ( tcx)
1253+ }
1254+ } ) ;
12401255
12411256 info ! ( "Post-codegen\n {:?}" , tcx. debug_stats( ) ) ;
12421257
0 commit comments