@@ -22,15 +22,18 @@ use rustc_data_structures::sync::{IntoDynSyncSend, par_map};
2222use rustc_metadata:: EncodedMetadata ;
2323use rustc_metadata:: fs:: copy_to_stdout;
2424use 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+ } ;
2629use rustc_session:: Session ;
2730use rustc_session:: config:: { DebugInfo , OutFileName , OutputFilenames , OutputType } ;
2831
2932use crate :: CodegenCx ;
3033use crate :: base:: CodegenedFunction ;
3134use crate :: concurrency_limiter:: { ConcurrencyLimiter , ConcurrencyLimiterToken } ;
3235use crate :: debuginfo:: TypeDebugContext ;
33- use crate :: global_asm:: GlobalAsmConfig ;
36+ use crate :: global_asm:: { GlobalAsmConfig , GlobalAsmContext } ;
3437use crate :: prelude:: * ;
3538use crate :: unwind_module:: UnwindModule ;
3639
@@ -530,19 +533,35 @@ fn codegen_cgu_content(
530533 let mut type_dbg = TypeDebugContext :: default ( ) ;
531534 super :: predefine_mono_items ( tcx, module, & mono_items) ;
532535 let mut codegened_functions = vec ! [ ] ;
533- for ( mono_item, _ ) in mono_items {
536+ for ( mono_item, item_data ) in mono_items {
534537 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 (
537557 tcx,
538558 & mut cx,
539559 & mut type_dbg,
540560 Function :: new ( ) ,
541561 module,
542- inst,
543- ) {
544- codegened_functions. push ( codegened_function) ;
545- }
562+ instance,
563+ ) ;
564+ codegened_functions. push ( codegened_function) ;
546565 }
547566 MonoItem :: Static ( def_id) => {
548567 let data_id = crate :: constant:: codegen_static ( tcx, module, def_id) ;
@@ -551,7 +570,10 @@ fn codegen_cgu_content(
551570 }
552571 }
553572 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+ ) ;
555577 }
556578 }
557579 }
0 commit comments