about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <17426603+bjorn3@users.noreply.github.com>2024-12-12 19:51:37 +0000
committerbjorn3 <17426603+bjorn3@users.noreply.github.com>2025-04-14 09:38:02 +0000
commita73eba99f7811fb0aec548ccf382ae7a2c77135f (patch)
tree5682e85e7c9f111687f743954aaa2ffe5e17b516
parent764d3a50a318c22fd0145b1837ad32cf69bf7d28 (diff)
downloadrust-a73eba99f7811fb0aec548ccf382ae7a2c77135f.tar.gz
rust-a73eba99f7811fb0aec548ccf382ae7a2c77135f.zip
Move codegen_naked_asm call up into MonoItem::define
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/mod.rs7
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/naked_asm.rs3
-rw-r--r--compiler/rustc_codegen_ssa/src/mono_item.rs12
3 files changed, 14 insertions, 8 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/mod.rs b/compiler/rustc_codegen_ssa/src/mir/mod.rs
index 9c89b284104..8c90d764f29 100644
--- a/compiler/rustc_codegen_ssa/src/mir/mod.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/mod.rs
@@ -20,7 +20,7 @@ mod coverageinfo;
 pub mod debuginfo;
 mod intrinsic;
 mod locals;
-mod naked_asm;
+pub(crate) mod naked_asm;
 pub mod operand;
 pub mod place;
 mod rvalue;
@@ -170,11 +170,6 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
 ) {
     assert!(!instance.args.has_infer());
 
-    if cx.tcx().codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED) {
-        crate::mir::naked_asm::codegen_naked_asm::<Bx::CodegenCx>(cx, instance);
-        return;
-    }
-
     let tcx = cx.tcx();
     let llfn = cx.get_fn(instance);
 
diff --git a/compiler/rustc_codegen_ssa/src/mir/naked_asm.rs b/compiler/rustc_codegen_ssa/src/mir/naked_asm.rs
index 7490fdf7166..f25c9195415 100644
--- a/compiler/rustc_codegen_ssa/src/mir/naked_asm.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/naked_asm.rs
@@ -4,7 +4,7 @@ use rustc_hir::def_id::DefId;
 use rustc_middle::mir::mono::{Linkage, MonoItem, MonoItemData, Visibility};
 use rustc_middle::mir::{InlineAsmOperand, START_BLOCK};
 use rustc_middle::ty::layout::{FnAbiOf, LayoutOf, TyAndLayout};
-use rustc_middle::ty::{Instance, Ty, TyCtxt};
+use rustc_middle::ty::{Instance, Ty, TyCtxt, TypeVisitableExt};
 use rustc_middle::{bug, span_bug, ty};
 use rustc_span::sym;
 use rustc_target::callconv::{ArgAbi, FnAbi, PassMode};
@@ -25,6 +25,7 @@ pub(crate) fn codegen_naked_asm<
     cx: &'a Cx,
     instance: Instance<'tcx>,
 ) {
+    assert!(!instance.args.has_infer());
     let mir = cx.tcx().instance_mir(instance.def);
 
     let rustc_middle::mir::TerminatorKind::InlineAsm {
diff --git a/compiler/rustc_codegen_ssa/src/mono_item.rs b/compiler/rustc_codegen_ssa/src/mono_item.rs
index f6af889fd6e..57e7b02196e 100644
--- a/compiler/rustc_codegen_ssa/src/mono_item.rs
+++ b/compiler/rustc_codegen_ssa/src/mono_item.rs
@@ -7,6 +7,7 @@ use rustc_middle::ty::layout::{HasTyCtxt, LayoutOf};
 use rustc_middle::{span_bug, ty};
 use tracing::debug;
 
+use crate::mir::naked_asm;
 use crate::traits::*;
 use crate::{base, common};
 
@@ -99,7 +100,16 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
                 }
             }
             MonoItem::Fn(instance) => {
-                base::codegen_instance::<Bx>(cx, instance);
+                if cx
+                    .tcx()
+                    .codegen_fn_attrs(instance.def_id())
+                    .flags
+                    .contains(CodegenFnAttrFlags::NAKED)
+                {
+                    naked_asm::codegen_naked_asm::<Bx::CodegenCx>(cx, instance);
+                } else {
+                    base::codegen_instance::<Bx>(cx, instance);
+                }
             }
         }