Enum ExternAbi
pub enum ExternAbi {
Show 29 variants
C {
unwind: bool,
},
System {
unwind: bool,
},
Rust,
RustCall,
RustCold,
RustInvalid,
RustPreserveNone,
Unadjusted,
Custom,
EfiApi,
Swift,
Aapcs {
unwind: bool,
},
CmseNonSecureCall,
CmseNonSecureEntry,
GpuKernel,
PtxKernel,
AvrInterrupt,
AvrNonBlockingInterrupt,
Msp430Interrupt,
RiscvInterruptM,
RiscvInterruptS,
X86Interrupt,
Cdecl {
unwind: bool,
},
Stdcall {
unwind: bool,
},
Fastcall {
unwind: bool,
},
Thiscall {
unwind: bool,
},
Vectorcall {
unwind: bool,
},
SysV64 {
unwind: bool,
},
Win64 {
unwind: bool,
},
}Expand description
ABI we expect to see within extern "{abi}"
Variants§
C
presumed C ABI for the platform
System
ABI of the “system” interface, e.g. the Win32 API, always “aliasing”
Rust
that’s us!
RustCall
the mostly-unused unboxed_closures ABI, effectively now an impl detail unless someone
puts in the work to make it viable again… but would we need a special ABI?
RustCold
For things unlikely to be called, where reducing register pressure in
extern "Rust" callers is worth paying extra cost in the callee.
Stronger than just #[cold] because fn pointers might be incompatible.
RustInvalid
An always-invalid ABI that’s used to test “this ABI is not supported by this platform” in a platform-agnostic way.
RustPreserveNone
Preserves no registers.
Note, that this ABI is not stable in the registers it uses, is intended as an optimization and may fall-back to a more conservative calling convention if the backend does not support forcing callers to save all registers.
Unadjusted
Unstable impl detail that directly uses Rust types to describe the ABI to LLVM. Even normally-compatible Rust types can become ABI-incompatible with this ABI!
Custom
An ABI that rustc does not know how to call or define. Functions with this ABI can
only be created using #[naked] functions or extern "custom" blocks, and can only
be called from inline assembly.
EfiApi
UEFI ABI, usually an alias of C, but sometimes an arch-specific alias and only valid on platforms that have a UEFI standard
Swift
Swift’s calling convention, used to interoperate with Swift code without going through C as an intermediary.
Aapcs
Arm Architecture Procedure Call Standard, sometimes ExternAbi::C is an alias for this
CmseNonSecureCall
extremely constrained barely-C ABI for TrustZone
CmseNonSecureEntry
extremely constrained barely-C ABI for TrustZone
GpuKernel
An entry-point function called by the GPU’s host
PtxKernel
An entry-point function called by the GPU’s host
AvrInterrupt
AvrNonBlockingInterrupt
Msp430Interrupt
RiscvInterruptM
RiscvInterruptS
X86Interrupt
Cdecl
ExternAbi::C but spelled funny because x86
Stdcall
gnu-stdcall on “unix” and win-stdcall on “windows”
Fastcall
gnu-fastcall on “unix” and win-fastcall on “windows”
Thiscall
windows C++ ABI
Vectorcall
uses AVX and stuff
SysV64
Win64
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ExternAbi
impl RefUnwindSafe for ExternAbi
impl Send for ExternAbi
impl Sync for ExternAbi
impl Unpin for ExternAbi
impl UnsafeUnpin for ExternAbi
impl UnwindSafe for ExternAbi
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<I, T> ExtractContext<I, ()> for T
impl<I, T> ExtractContext<I, ()> for T
§fn extract_context(self, _original_input: I)
fn extract_context(self, _original_input: I)
§impl<T> Indentable for Twhere
T: Display,
impl<T> Indentable for Twhere
T: Display,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more