about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-12-11 21:51:07 +0000
committerbors <bors@rust-lang.org>2024-12-11 21:51:07 +0000
commitca71dc1c9c2b8b5c130289920661e47166861cbc (patch)
tree4829d14e0030cd230b41074268a2c9816ed33e37
parent691aec2ef3b5758a9ab0d277e9f72bcbd21921ee (diff)
parent91425f2c85764af92fd2cbae23b22f5d264d150d (diff)
downloadrust-ca71dc1c9c2b8b5c130289920661e47166861cbc.tar.gz
rust-ca71dc1c9c2b8b5c130289920661e47166861cbc.zip
Auto merge of #128004 - folkertdev:naked-fn-asm, r=Amanieu
codegen `#[naked]` functions using global asm

tracking issue: https://github.com/rust-lang/rust/issues/90957

Fixes #124375

This implements the approach suggested in the tracking issue: use the existing global assembly infrastructure to emit the body of `#[naked]` functions. The main advantage is that we now have full control over what gets generated, and are no longer dependent on LLVM not sneakily messing with our output (inlining, adding extra instructions, etc).

I discussed this approach with `@Amanieu` and while I think the general direction is correct, there is probably a bunch of stuff that needs to change or move around here. I'll leave some inline comments on things that I'm not sure about.

Combined with https://github.com/rust-lang/rust/pull/127853, if both accepted, I think that resolves all steps from the tracking issue.

r? `@Amanieu`
-rw-r--r--src/asm.rs7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/asm.rs b/src/asm.rs
index a1f9eab10e7..415f8affab9 100644
--- a/src/asm.rs
+++ b/src/asm.rs
@@ -867,6 +867,13 @@ impl<'gcc, 'tcx> AsmCodegenMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
         template_str.push_str("\n.popsection");
         self.context.add_top_level_asm(None, &template_str);
     }
+
+    fn mangled_name(&self, instance: Instance<'tcx>) -> String {
+        // TODO(@Amanieu): Additional mangling is needed on
+        // some targets to add a leading underscore (Mach-O)
+        // or byte count suffixes (x86 Windows).
+        self.tcx.symbol_name(instance).name.to_string()
+    }
 }
 
 fn modifier_to_gcc(