@@ -22,15 +22,18 @@ use rustc_data_structures::sync::{IntoDynSyncSend, par_map};
22
22
use rustc_metadata:: EncodedMetadata ;
23
23
use rustc_metadata:: fs:: copy_to_stdout;
24
24
use rustc_middle:: dep_graph:: { WorkProduct , WorkProductId } ;
25
- use rustc_middle:: mir:: mono:: { CodegenUnit , MonoItem } ;
25
+ use rustc_middle:: middle:: codegen_fn_attrs:: CodegenFnAttrFlags ;
26
+ use rustc_middle:: mir:: mono:: {
27
+ CodegenUnit , Linkage as RLinkage , MonoItem , MonoItemData , Visibility ,
28
+ } ;
26
29
use rustc_session:: Session ;
27
30
use rustc_session:: config:: { DebugInfo , OutFileName , OutputFilenames , OutputType } ;
28
31
29
32
use crate :: CodegenCx ;
30
33
use crate :: base:: CodegenedFunction ;
31
34
use crate :: concurrency_limiter:: { ConcurrencyLimiter , ConcurrencyLimiterToken } ;
32
35
use crate :: debuginfo:: TypeDebugContext ;
33
- use crate :: global_asm:: GlobalAsmConfig ;
36
+ use crate :: global_asm:: { GlobalAsmConfig , GlobalAsmContext } ;
34
37
use crate :: prelude:: * ;
35
38
use crate :: unwind_module:: UnwindModule ;
36
39
@@ -530,19 +533,35 @@ fn codegen_cgu_content(
530
533
let mut type_dbg = TypeDebugContext :: default ( ) ;
531
534
super :: predefine_mono_items ( tcx, module, & mono_items) ;
532
535
let mut codegened_functions = vec ! [ ] ;
533
- for ( mono_item, _ ) in mono_items {
536
+ for ( mono_item, item_data ) in mono_items {
534
537
match mono_item {
535
- MonoItem :: Fn ( inst) => {
536
- if let Some ( codegened_function) = crate :: base:: codegen_fn (
538
+ MonoItem :: Fn ( instance) => {
539
+ if tcx. codegen_fn_attrs ( instance. def_id ( ) ) . flags . contains ( CodegenFnAttrFlags :: NAKED )
540
+ {
541
+ rustc_codegen_ssa:: mir:: naked_asm:: codegen_naked_asm (
542
+ & mut GlobalAsmContext { tcx, global_asm : & mut cx. global_asm } ,
543
+ instance,
544
+ MonoItemData {
545
+ linkage : RLinkage :: External ,
546
+ visibility : if item_data. linkage == RLinkage :: Internal {
547
+ Visibility :: Hidden
548
+ } else {
549
+ item_data. visibility
550
+ } ,
551
+ ..item_data
552
+ } ,
553
+ ) ;
554
+ continue ;
555
+ }
556
+ let codegened_function = crate :: base:: codegen_fn (
537
557
tcx,
538
558
& mut cx,
539
559
& mut type_dbg,
540
560
Function :: new ( ) ,
541
561
module,
542
- inst,
543
- ) {
544
- codegened_functions. push ( codegened_function) ;
545
- }
562
+ instance,
563
+ ) ;
564
+ codegened_functions. push ( codegened_function) ;
546
565
}
547
566
MonoItem :: Static ( def_id) => {
548
567
let data_id = crate :: constant:: codegen_static ( tcx, module, def_id) ;
@@ -551,7 +570,10 @@ fn codegen_cgu_content(
551
570
}
552
571
}
553
572
MonoItem :: GlobalAsm ( item_id) => {
554
- crate :: global_asm:: codegen_global_asm_item ( tcx, & mut cx. global_asm , item_id) ;
573
+ rustc_codegen_ssa:: base:: codegen_global_asm (
574
+ & mut GlobalAsmContext { tcx, global_asm : & mut cx. global_asm } ,
575
+ item_id,
576
+ ) ;
555
577
}
556
578
}
557
579
}
0 commit comments