mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2026-03-27 20:40:59 +00:00
Auto merge of #151065 - nagisa:add-preserve-none-abi, r=petrochenkov
abi: add a rust-preserve-none calling convention
This is the conceptual opposite of the rust-cold calling convention and is particularly useful in combination with the new `explicit_tail_calls` feature.
For relatively tight loops implemented with tail calling (`become`) each of the function with the regular calling convention is still responsible for restoring the initial value of the preserved registers. So it is not unusual to end up with a situation where each step in the tail call loop is spilling and reloading registers, along the lines of:
foo:
push r12
; do things
pop r12
jmp next_step
This adds up quickly, especially when most of the clobberable registers are already used to pass arguments or other uses.
I was thinking of making the name of this ABI a little less LLVM-derived and more like a conceptual inverse of `rust-cold`, but could not come with a great name (`rust-cold` is itself not a great name: cold in what context? from which perspective? is it supposed to mean that the function is rarely called?)
This commit is contained in:
@@ -230,6 +230,7 @@ pub enum FnAbi {
|
||||
Win64,
|
||||
Win64Unwind,
|
||||
X86Interrupt,
|
||||
RustPreserveNone,
|
||||
Unknown,
|
||||
}
|
||||
|
||||
@@ -271,6 +272,7 @@ impl FnAbi {
|
||||
s if *s == sym::riscv_dash_interrupt_dash_s => FnAbi::RiscvInterruptS,
|
||||
s if *s == sym::rust_dash_call => FnAbi::RustCall,
|
||||
s if *s == sym::rust_dash_cold => FnAbi::RustCold,
|
||||
s if *s == sym::rust_dash_preserve_dash_none => FnAbi::RustPreserveNone,
|
||||
s if *s == sym::rust_dash_intrinsic => FnAbi::RustIntrinsic,
|
||||
s if *s == sym::Rust => FnAbi::Rust,
|
||||
s if *s == sym::stdcall_dash_unwind => FnAbi::StdcallUnwind,
|
||||
@@ -314,6 +316,7 @@ impl FnAbi {
|
||||
FnAbi::Rust => "Rust",
|
||||
FnAbi::RustCall => "rust-call",
|
||||
FnAbi::RustCold => "rust-cold",
|
||||
FnAbi::RustPreserveNone => "rust-preserve-none",
|
||||
FnAbi::RustIntrinsic => "rust-intrinsic",
|
||||
FnAbi::Stdcall => "stdcall",
|
||||
FnAbi::StdcallUnwind => "stdcall-unwind",
|
||||
|
||||
@@ -109,6 +109,7 @@ define_symbols! {
|
||||
vectorcall_dash_unwind = "vectorcall-unwind",
|
||||
win64_dash_unwind = "win64-unwind",
|
||||
x86_dash_interrupt = "x86-interrupt",
|
||||
rust_dash_preserve_dash_none = "preserve-none",
|
||||
|
||||
@PLAIN:
|
||||
__ra_fixup,
|
||||
|
||||
Reference in New Issue
Block a user