Skip to content

Commit 11d0889

Browse files
committed
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?)
1 parent 0cba97b commit 11d0889

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

src/abi/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ pub(crate) fn conv_to_call_conv(
5656
CanonAbi::Rust | CanonAbi::C => default_call_conv,
5757
CanonAbi::RustCold => CallConv::Cold,
5858

59+
// Cranelift doesn't currently have anything for this.
60+
CanonAbi::RustPreserveNone => default_call_conv,
61+
5962
// Functions with this calling convention can only be called from assembly, but it is
6063
// possible to declare an `extern "custom"` block, so the backend still needs a calling
6164
// convention for declaring foreign functions.

0 commit comments

Comments
 (0)