about summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa/src
diff options
context:
space:
mode:
authorbjorn3 <17426603+bjorn3@users.noreply.github.com>2024-12-12 19:29:54 +0000
committerbjorn3 <17426603+bjorn3@users.noreply.github.com>2025-04-14 09:34:21 +0000
commitffdc292ccaba2107dc404af2b6c96b40cb5fb6e4 (patch)
tree7cd1811b71b3f8ed665ab0069c30059f656944db /compiler/rustc_codegen_ssa/src
parent03f4e886dc28d1c6de4ccfe701f502ddfb69df1f (diff)
downloadrust-ffdc292ccaba2107dc404af2b6c96b40cb5fb6e4.tar.gz
rust-ffdc292ccaba2107dc404af2b6c96b40cb5fb6e4.zip
Don't begin defining a function when codegening a naked function
While LLVM is rather permissive in this regards, some other codegen
backends demand that once you declare a function for definition you
actually define contents of the function, which doesn't happen for naked
functions as we actually generate assembly for them.
Diffstat (limited to 'compiler/rustc_codegen_ssa/src')
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/mod.rs14
1 files changed, 7 insertions, 7 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/mod.rs b/compiler/rustc_codegen_ssa/src/mir/mod.rs
index 6a37889217a..b7a3b5e6480 100644
--- a/compiler/rustc_codegen_ssa/src/mir/mod.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/mod.rs
@@ -170,19 +170,19 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
 ) {
     assert!(!instance.args.has_infer());
 
+    let mut mir = cx.tcx().instance_mir(instance.def);
+
+    if cx.tcx().codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED) {
+        crate::mir::naked_asm::codegen_naked_asm::<Bx>(cx, &mir, instance);
+        return;
+    }
+
     let tcx = cx.tcx();
     let llfn = cx.get_fn(instance);
 
-    let mut mir = tcx.instance_mir(instance.def);
-
     let fn_abi = cx.fn_abi_of_instance(instance, ty::List::empty());
     debug!("fn_abi: {:?}", fn_abi);
 
-    if tcx.codegen_fn_attrs(instance.def_id()).flags.contains(CodegenFnAttrFlags::NAKED) {
-        crate::mir::naked_asm::codegen_naked_asm::<Bx>(cx, &mir, instance);
-        return;
-    }
-
     if tcx.features().ergonomic_clones() {
         let monomorphized_mir = instance.instantiate_mir_and_normalize_erasing_regions(
             tcx,