@@ -26,6 +26,8 @@ use rustc_middle::mir::mono::{CodegenUnit, MonoItem};
2626use rustc_session:: Session ;
2727use rustc_session:: config:: { DebugInfo , OutFileName , OutputFilenames , OutputType } ;
2828
29+ use crate :: CodegenCx ;
30+ use crate :: base:: CodegenedFunction ;
2931use crate :: concurrency_limiter:: { ConcurrencyLimiter , ConcurrencyLimiterToken } ;
3032use crate :: debuginfo:: TypeDebugContext ;
3133use crate :: global_asm:: GlobalAsmConfig ;
@@ -486,6 +488,55 @@ fn reuse_workproduct_for_cgu(
486488 } )
487489}
488490
491+ fn codegen_cgu_content (
492+ tcx : TyCtxt < ' _ > ,
493+ module : & mut dyn Module ,
494+ cgu_name : rustc_span:: Symbol ,
495+ ) -> ( CodegenCx , Vec < CodegenedFunction > ) {
496+ let _timer = tcx. prof . generic_activity_with_arg ( "codegen cgu" , cgu_name. as_str ( ) ) ;
497+
498+ let cgu = tcx. codegen_unit ( cgu_name) ;
499+ let mono_items = cgu. items_in_deterministic_order ( tcx) ;
500+
501+ let mut cx = crate :: CodegenCx :: new (
502+ tcx,
503+ module. isa ( ) ,
504+ tcx. sess . opts . debuginfo != DebugInfo :: None ,
505+ cgu_name,
506+ ) ;
507+ let mut type_dbg = TypeDebugContext :: default ( ) ;
508+ super :: predefine_mono_items ( tcx, module, & mono_items) ;
509+ let mut codegened_functions = vec ! [ ] ;
510+ for ( mono_item, _) in mono_items {
511+ match mono_item {
512+ MonoItem :: Fn ( inst) => {
513+ if let Some ( codegened_function) = crate :: base:: codegen_fn (
514+ tcx,
515+ & mut cx,
516+ & mut type_dbg,
517+ Function :: new ( ) ,
518+ module,
519+ inst,
520+ ) {
521+ codegened_functions. push ( codegened_function) ;
522+ }
523+ }
524+ MonoItem :: Static ( def_id) => {
525+ let data_id = crate :: constant:: codegen_static ( tcx, module, def_id) ;
526+ if let Some ( debug_context) = & mut cx. debug_context {
527+ debug_context. define_static ( tcx, & mut type_dbg, def_id, data_id) ;
528+ }
529+ }
530+ MonoItem :: GlobalAsm ( item_id) => {
531+ crate :: global_asm:: codegen_global_asm_item ( tcx, & mut cx. global_asm , item_id) ;
532+ }
533+ }
534+ }
535+ crate :: main_shim:: maybe_create_entry_wrapper ( tcx, module, false , cgu. is_primary ( ) ) ;
536+
537+ ( cx, codegened_functions)
538+ }
539+
489540fn module_codegen (
490541 tcx : TyCtxt < ' _ > ,
491542 ( global_asm_config, cgu_name, token) : (
@@ -494,57 +545,11 @@ fn module_codegen(
494545 ConcurrencyLimiterToken ,
495546 ) ,
496547) -> OngoingModuleCodegen {
497- let ( cgu_name, mut cx, mut module, codegened_functions) =
498- tcx. prof . generic_activity_with_arg ( "codegen cgu" , cgu_name. as_str ( ) ) . run ( || {
499- let cgu = tcx. codegen_unit ( cgu_name) ;
500- let mono_items = cgu. items_in_deterministic_order ( tcx) ;
501-
502- let mut module = make_module ( tcx. sess , cgu_name. as_str ( ) . to_string ( ) ) ;
503-
504- let mut cx = crate :: CodegenCx :: new (
505- tcx,
506- module. isa ( ) ,
507- tcx. sess . opts . debuginfo != DebugInfo :: None ,
508- cgu_name,
509- ) ;
510- let mut type_dbg = TypeDebugContext :: default ( ) ;
511- super :: predefine_mono_items ( tcx, & mut module, & mono_items) ;
512- let mut codegened_functions = vec ! [ ] ;
513- for ( mono_item, _) in mono_items {
514- match mono_item {
515- MonoItem :: Fn ( inst) => {
516- if let Some ( codegened_function) = crate :: base:: codegen_fn (
517- tcx,
518- & mut cx,
519- & mut type_dbg,
520- Function :: new ( ) ,
521- & mut module,
522- inst,
523- ) {
524- codegened_functions. push ( codegened_function) ;
525- }
526- }
527- MonoItem :: Static ( def_id) => {
528- let data_id = crate :: constant:: codegen_static ( tcx, & mut module, def_id) ;
529- if let Some ( debug_context) = & mut cx. debug_context {
530- debug_context. define_static ( tcx, & mut type_dbg, def_id, data_id) ;
531- }
532- }
533- MonoItem :: GlobalAsm ( item_id) => {
534- crate :: global_asm:: codegen_global_asm_item (
535- tcx,
536- & mut cx. global_asm ,
537- item_id,
538- ) ;
539- }
540- }
541- }
542- crate :: main_shim:: maybe_create_entry_wrapper ( tcx, & mut module, false , cgu. is_primary ( ) ) ;
548+ let mut module = make_module ( tcx. sess , cgu_name. as_str ( ) . to_string ( ) ) ;
543549
544- let cgu_name = cgu . name ( ) . as_str ( ) . to_owned ( ) ;
550+ let ( mut cx , codegened_functions ) = codegen_cgu_content ( tcx , & mut module , cgu_name) ;
545551
546- ( cgu_name, cx, module, codegened_functions)
547- } ) ;
552+ let cgu_name = cgu_name. as_str ( ) . to_owned ( ) ;
548553
549554 let producer = crate :: debuginfo:: producer ( tcx. sess ) ;
550555
0 commit comments