@@ -23,11 +23,12 @@ use rustc_middle::mir::mono::{CodegenUnit, MonoItem};
23
23
use rustc_session:: config:: { DebugInfo , OutFileName , OutputFilenames , OutputType } ;
24
24
use rustc_session:: Session ;
25
25
26
+ use crate :: base:: CodegenedFunction ;
26
27
use crate :: concurrency_limiter:: { ConcurrencyLimiter , ConcurrencyLimiterToken } ;
27
28
use crate :: debuginfo:: TypeDebugContext ;
28
29
use crate :: global_asm:: GlobalAsmConfig ;
29
30
use crate :: unwind_module:: UnwindModule ;
30
- use crate :: { prelude:: * , BackendConfig } ;
31
+ use crate :: { prelude:: * , BackendConfig , CodegenCx } ;
31
32
32
33
struct ModuleCodegenResult {
33
34
module_regular : CompiledModule ,
@@ -478,6 +479,55 @@ fn reuse_workproduct_for_cgu(
478
479
} )
479
480
}
480
481
482
+ fn codegen_cgu_content (
483
+ tcx : TyCtxt < ' _ > ,
484
+ module : & mut dyn Module ,
485
+ cgu_name : rustc_span:: Symbol ,
486
+ ) -> ( CodegenCx , Vec < CodegenedFunction > ) {
487
+ tcx. prof . generic_activity_with_arg ( "codegen cgu" , cgu_name. as_str ( ) ) . run ( || {
488
+ let cgu = tcx. codegen_unit ( cgu_name) ;
489
+ let mono_items = cgu. items_in_deterministic_order ( tcx) ;
490
+
491
+ let mut cx = crate :: CodegenCx :: new (
492
+ tcx,
493
+ module. isa ( ) ,
494
+ tcx. sess . opts . debuginfo != DebugInfo :: None ,
495
+ cgu_name,
496
+ ) ;
497
+ let mut type_dbg = TypeDebugContext :: default ( ) ;
498
+ super :: predefine_mono_items ( tcx, module, & mono_items) ;
499
+ let mut codegened_functions = vec ! [ ] ;
500
+ for ( mono_item, _) in mono_items {
501
+ match mono_item {
502
+ MonoItem :: Fn ( inst) => {
503
+ if let Some ( codegened_function) = crate :: base:: codegen_fn (
504
+ tcx,
505
+ & mut cx,
506
+ & mut type_dbg,
507
+ Function :: new ( ) ,
508
+ module,
509
+ inst,
510
+ ) {
511
+ codegened_functions. push ( codegened_function) ;
512
+ }
513
+ }
514
+ MonoItem :: Static ( def_id) => {
515
+ let data_id = crate :: constant:: codegen_static ( tcx, module, def_id) ;
516
+ if let Some ( debug_context) = & mut cx. debug_context {
517
+ debug_context. define_static ( tcx, & mut type_dbg, def_id, data_id) ;
518
+ }
519
+ }
520
+ MonoItem :: GlobalAsm ( item_id) => {
521
+ crate :: global_asm:: codegen_global_asm_item ( tcx, & mut cx. global_asm , item_id) ;
522
+ }
523
+ }
524
+ }
525
+ crate :: main_shim:: maybe_create_entry_wrapper ( tcx, module, false , cgu. is_primary ( ) ) ;
526
+
527
+ ( cx, codegened_functions)
528
+ } )
529
+ }
530
+
481
531
fn module_codegen (
482
532
tcx : TyCtxt < ' _ > ,
483
533
( backend_config, global_asm_config, cgu_name, token) : (
@@ -487,57 +537,11 @@ fn module_codegen(
487
537
ConcurrencyLimiterToken ,
488
538
) ,
489
539
) -> OngoingModuleCodegen {
490
- let ( cgu_name, mut cx, mut module, codegened_functions) =
491
- tcx. prof . generic_activity_with_arg ( "codegen cgu" , cgu_name. as_str ( ) ) . run ( || {
492
- let cgu = tcx. codegen_unit ( cgu_name) ;
493
- let mono_items = cgu. items_in_deterministic_order ( tcx) ;
494
-
495
- let mut module = make_module ( tcx. sess , & backend_config, cgu_name. as_str ( ) . to_string ( ) ) ;
496
-
497
- let mut cx = crate :: CodegenCx :: new (
498
- tcx,
499
- module. isa ( ) ,
500
- tcx. sess . opts . debuginfo != DebugInfo :: None ,
501
- cgu_name,
502
- ) ;
503
- let mut type_dbg = TypeDebugContext :: default ( ) ;
504
- super :: predefine_mono_items ( tcx, & mut module, & mono_items) ;
505
- let mut codegened_functions = vec ! [ ] ;
506
- for ( mono_item, _) in mono_items {
507
- match mono_item {
508
- MonoItem :: Fn ( inst) => {
509
- if let Some ( codegened_function) = crate :: base:: codegen_fn (
510
- tcx,
511
- & mut cx,
512
- & mut type_dbg,
513
- Function :: new ( ) ,
514
- & mut module,
515
- inst,
516
- ) {
517
- codegened_functions. push ( codegened_function) ;
518
- }
519
- }
520
- MonoItem :: Static ( def_id) => {
521
- let data_id = crate :: constant:: codegen_static ( tcx, & mut module, def_id) ;
522
- if let Some ( debug_context) = & mut cx. debug_context {
523
- debug_context. define_static ( tcx, & mut type_dbg, def_id, data_id) ;
524
- }
525
- }
526
- MonoItem :: GlobalAsm ( item_id) => {
527
- crate :: global_asm:: codegen_global_asm_item (
528
- tcx,
529
- & mut cx. global_asm ,
530
- item_id,
531
- ) ;
532
- }
533
- }
534
- }
535
- crate :: main_shim:: maybe_create_entry_wrapper ( tcx, & mut module, false , cgu. is_primary ( ) ) ;
540
+ let mut module = make_module ( tcx. sess , & backend_config, cgu_name. as_str ( ) . to_string ( ) ) ;
536
541
537
- let cgu_name = cgu . name ( ) . as_str ( ) . to_owned ( ) ;
542
+ let ( mut cx , codegened_functions ) = codegen_cgu_content ( tcx , & mut module , cgu_name) ;
538
543
539
- ( cgu_name, cx, module, codegened_functions)
540
- } ) ;
544
+ let cgu_name = cgu_name. as_str ( ) . to_owned ( ) ;
541
545
542
546
let producer = crate :: debuginfo:: producer ( tcx. sess ) ;
543
547
0 commit comments