@@ -26,6 +26,8 @@ use rustc_middle::mir::mono::{CodegenUnit, MonoItem};
26
26
use rustc_session:: Session ;
27
27
use rustc_session:: config:: { DebugInfo , OutFileName , OutputFilenames , OutputType } ;
28
28
29
+ use crate :: CodegenCx ;
30
+ use crate :: base:: CodegenedFunction ;
29
31
use crate :: concurrency_limiter:: { ConcurrencyLimiter , ConcurrencyLimiterToken } ;
30
32
use crate :: debuginfo:: TypeDebugContext ;
31
33
use crate :: global_asm:: GlobalAsmConfig ;
@@ -486,6 +488,55 @@ fn reuse_workproduct_for_cgu(
486
488
} )
487
489
}
488
490
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
+
489
540
fn module_codegen (
490
541
tcx : TyCtxt < ' _ > ,
491
542
( global_asm_config, cgu_name, token) : (
@@ -494,57 +545,11 @@ fn module_codegen(
494
545
ConcurrencyLimiterToken ,
495
546
) ,
496
547
) -> 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 ( ) ) ;
543
549
544
- let cgu_name = cgu . name ( ) . as_str ( ) . to_owned ( ) ;
550
+ let ( mut cx , codegened_functions ) = codegen_cgu_content ( tcx , & mut module , cgu_name) ;
545
551
546
- ( cgu_name, cx, module, codegened_functions)
547
- } ) ;
552
+ let cgu_name = cgu_name. as_str ( ) . to_owned ( ) ;
548
553
549
554
let producer = crate :: debuginfo:: producer ( tcx. sess ) ;
550
555
0 commit comments