@@ -17,6 +17,7 @@ use crate::{ModuleCodegen, ModuleKind, CachedModuleCodegen};
1717
1818use rustc:: dep_graph:: cgu_reuse_tracker:: CguReuse ;
1919use rustc:: hir:: def_id:: { DefId , LOCAL_CRATE } ;
20+ use rustc:: middle:: cstore:: EncodedMetadata ;
2021use rustc:: middle:: lang_items:: StartFnLangItem ;
2122use rustc:: middle:: weak_lang_items;
2223use rustc:: mir:: mono:: { Stats , CodegenUnitNameBuilder } ;
@@ -25,7 +26,7 @@ use rustc::ty::layout::{self, Align, TyLayout, LayoutOf, VariantIdx, HasTyCtxt};
2526use rustc:: ty:: query:: Providers ;
2627use rustc:: middle:: cstore:: { self , LinkagePreference } ;
2728use rustc:: util:: common:: { time, print_time_passes_entry} ;
28- use rustc:: session:: config:: { self , CrateType , EntryFnType , Lto } ;
29+ use rustc:: session:: config:: { self , EntryFnType , Lto } ;
2930use rustc:: session:: Session ;
3031use rustc_mir:: monomorphize:: item:: DefPathBasedNames ;
3132use rustc_mir:: monomorphize:: Instance ;
@@ -530,26 +531,13 @@ pub const CODEGEN_WORKER_ID: usize = ::std::usize::MAX;
530531pub fn codegen_crate < B : ExtraBackendMethods > (
531532 backend : B ,
532533 tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
534+ metadata : EncodedMetadata ,
535+ need_metadata_module : bool ,
533536 rx : mpsc:: Receiver < Box < dyn Any + Send > >
534537) -> OngoingCodegen < B > {
535538
536539 check_for_rustc_errors_attr ( tcx) ;
537540
538- let cgu_name_builder = & mut CodegenUnitNameBuilder :: new ( tcx) ;
539-
540- // Codegen the metadata.
541- tcx. sess . profiler ( |p| p. start_activity ( "codegen crate metadata" ) ) ;
542-
543- let metadata_cgu_name = cgu_name_builder. build_cgu_name ( LOCAL_CRATE ,
544- & [ "crate" ] ,
545- Some ( "metadata" ) ) . as_str ( )
546- . to_string ( ) ;
547- let mut metadata_llvm_module = backend. new_metadata ( tcx, & metadata_cgu_name) ;
548- let metadata = time ( tcx. sess , "write metadata" , || {
549- backend. write_metadata ( tcx, & mut metadata_llvm_module)
550- } ) ;
551- tcx. sess . profiler ( |p| p. end_activity ( "codegen crate metadata" ) ) ;
552-
553541 // Skip crate items and just output metadata in -Z no-codegen mode.
554542 if tcx. sess . opts . debugging_opts . no_codegen ||
555543 !tcx. sess . opts . output_types . should_codegen ( ) {
@@ -569,6 +557,8 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
569557 return ongoing_codegen;
570558 }
571559
560+ let cgu_name_builder = & mut CodegenUnitNameBuilder :: new ( tcx) ;
561+
572562 // Run the monomorphization collector and partition the collected items into
573563 // codegen units.
574564 let codegen_units = tcx. collect_and_partition_mono_items ( LOCAL_CRATE ) . 1 ;
@@ -632,17 +622,21 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
632622 ongoing_codegen. submit_pre_codegened_module_to_llvm ( tcx, allocator_module) ;
633623 }
634624
635- let needs_metadata_module = tcx. sess . crate_types . borrow ( ) . iter ( ) . any ( |ct| {
636- match * ct {
637- CrateType :: Dylib |
638- CrateType :: ProcMacro => true ,
639- CrateType :: Executable |
640- CrateType :: Rlib |
641- CrateType :: Staticlib |
642- CrateType :: Cdylib => false ,
643- }
644- } ) ;
645- if needs_metadata_module {
625+ if need_metadata_module {
626+ // Codegen the encoded metadata.
627+ tcx. sess . profiler ( |p| p. start_activity ( "codegen crate metadata" ) ) ;
628+
629+ let metadata_cgu_name = cgu_name_builder. build_cgu_name ( LOCAL_CRATE ,
630+ & [ "crate" ] ,
631+ Some ( "metadata" ) ) . as_str ( )
632+ . to_string ( ) ;
633+ let mut metadata_llvm_module = backend. new_metadata ( tcx, & metadata_cgu_name) ;
634+ time ( tcx. sess , "write compressed metadata" , || {
635+ backend. write_compressed_metadata ( tcx, & ongoing_codegen. metadata ,
636+ & mut metadata_llvm_module) ;
637+ } ) ;
638+ tcx. sess . profiler ( |p| p. end_activity ( "codegen crate metadata" ) ) ;
639+
646640 let metadata_module = ModuleCodegen {
647641 name : metadata_cgu_name,
648642 module_llvm : metadata_llvm_module,
0 commit comments