#[repr(u8)]pub enum CallConv {
Fast = 0,
C = 1,
Wasm = 2,
ComponentModel = 3,
}Expand description
Represents the calling convention of a function.
Calling conventions are part of a program’s ABI (Application Binary Interface), and defines the contract between caller and callee, by specifying the architecture-specific details of how arguments are passed, results are returned, what effects may/will occur (e.g. context switches), etc.
Additionally, calling conventions define the set of allowed types for function arguments and results, and how those types are represented in the target ABI. It may impose additional restrictions on callers, such as only allowing calls under specific conditions.
It is not required that callers be functions of the same convention as the callee, it is perfectly acceptable to mix conventions in a program. The only requirement is that the convention used at a given call site, matches the convention of the callee, i.e. it must be the case that caller and callee agree on the convention used for that call.
Variants§
Fast = 0
This convention passes all arguments and results by value, and thus requires that the types of its arguments and results be valid immediates in the Miden ABI. The representation of those types on the operand stack is specified by the Miden ABI.
Additional properties of this convention:
- It is always executed in the caller’s context
- May only be the target of a
execordynexecinstruction - Must not require more than 16 elements of the operand stack for arguments or results
- Callees are expected to preserve the state of the operand stack following the function arguments, such that from the caller’s perspective, the effect of the call on the operand stack is as if the function arguments had been popped, and the function results were pushed.
This convention is optimal when both caller and callee are in the same language, no context switching is required, and the arguments and results can be passed on the operand stack without the potential for overflow.
C = 1
The C calling convention, as specified for WebAssembly, adapted to Miden’s ABI.
The purpose of this convention is to support cross-language interop via a foreign function
interface (FFI) based on the C data layout rules. It is specifically designed for interop
occurring within the same context. For cross-language, cross-context interop, we require
the use of the Wasm Component Model, see the ComponentModel convention for more.
Notable properties of this convention:
- It is always executed in the caller’s context
- May only be the target of a
execordynexecinstruction - Supports any IR type that corresponds to a valid C type (i.e. structs, arrays, etc.)
- Aggregates (structs and arrays) must be returned by reference, where the caller is
responsible for allocating the memory to which the return value will be written. The
caller passes the pointer to that memory as the first parameter of the function, which
must be of matching pointer type, and marked with the
sretattribute. When the “struct return” protocol is in use, the function does not return any values directly. - Aggregates up to 64 bits may be passed by value, all other structs must be passed by reference.
- Integer types up to 128 bits are supported, and are passed by value
- Floating-point types are not supported
- Callees must preserve the state of the operand stack following the function arguments
- If the function arguments require more than 16 elements of the operand stack to represent,
then arguments will be spilled to the caller’s stack frame, such that no more than 15
elements are required. The caller must then obtain the value of the stack pointer on
entry, and offset it to access spilled arguments as desired. The arguments are spilled
in reverse order, i.e. the last argument in the argument list has the greatest offset,
while the first argument of the argument list to be spilled starts at
sp(the value of the stack pointer on entry).
NOTE: This convention may be non-optimal if not being used for cross-language interop.
Wasm = 2
This convention is used to represent function signatures in WebAssembly.
WebAssembly has only the following types relevant for us:
i32i64f32(used to represent field elements here)f64(not supported here)- Reference types (i.e. handles that act like pointers)
It has the following properties:
- It is always executed in the caller’s context
- May only be the target of a
execordynexecinstruction - Only supports IR types which correspond to a valid WebAssembly type. Notably this does not include aggregates (except via reference types).
- Floating-point types are not allowed, except
f32which is used to represent field elements in the WebAssembly type system. - Callees must preserve the state of the operand stack following the function arguments
- Uses the same argument spilling strategy as the
Cconvention
ComponentModel = 3
This convention corresponds to the Canonical ABI of the Wasm Component Model.
This convention must be used for all exports of a component, in order for those exports to be callable from other components and across Miden contexts.
NOTE: This calling convention corresponds specifically to the functions synthesized from a
(canon lift) declaration in a Wasm component, which acts as a wrapper for some internal
function with another calling convention (i.e. Wasm) “lifting” it into the Canonical ABI.
Specifically, lifting here refers to the act of “lowering” the function arguments out of the
Canonical ABI and into the underlying convention of the wrapped function, and “lifting” the
results from the underlying convention into the Canonical ABI. While exports might have been
synthesized by a compiler, the details of this ABI can also be implemented by hand for
procedures written in Miden Assembly.
NOTE: Some important details of this calling convention are described by the Canonical ABI
spec covering the canon lift primitive, as well as how types are lifted/lowered from/to
the “flattened” core Wasm type representation. See
this document
for those details, and other useful information about the Canonical ABI.
This convention has the following properties:
- It is always executed in a new context
- May only be the target of a
callordyncallinstruction - Only supports IR types which correspond to a valid Canonical ABI type. Notably this does
not include pointer types. No support for
resourcetypes exists at this time due to limitations of the Miden VM. - Callers must ensure that sensitive data is removed from the first 16 elements of the
operand stack when lowering calls to
ComponentModelfunctions. This compiler will zero- pad the unused portions of the operand stack where applicable. - If the function arguments require more than 16 elements of the operand stack to represent,
then arguments will be spilled to the advice provider, as a block of memory (in words)
sufficiently large to hold all of the spilled arguments. The block will be hashed and
the digest used as the key in the advice map under which the block will be stored. The
digest will then be passed by-value to the callee as the first argument. This requires
a word (4 elements) of operand stack to be unused, so when spilling arguments, the first
12 elements are preserved, while the rest are spilled. The callee is expected to, as part
of its prologue, immediately fetch the spilled arguments from the advice map using the
provided digest on top of the operand stack, and write them into the current stack frame.
The spilled arguments can then be accessed by computing the offset from the stack pointer
to the desired argument. Note that, like the spill strategy for
C, the spilled arguments will be written into memory in reverse order (the closer to the front of the argument list, the smaller the offset).
Implementations§
Trait Implementations§
Source§impl<'de> Deserialize<'de> for CallConv
impl<'de> Deserialize<'de> for CallConv
Source§fn deserialize<D>(
deserializer: D,
) -> Result<CallConv, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<CallConv, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl PrettyPrint for CallConv
impl PrettyPrint for CallConv
Source§fn to_pretty_string(&self) -> String
fn to_pretty_string(&self) -> String
Source§fn pretty_print(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn pretty_print(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Source§impl Serialize for CallConv
impl Serialize for CallConv
Source§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
impl Copy for CallConv
impl Eq for CallConv
impl StructuralPartialEq for CallConv
Auto Trait Implementations§
impl Freeze for CallConv
impl RefUnwindSafe for CallConv
impl Send for CallConv
impl Sync for CallConv
impl Unpin for CallConv
impl UnsafeUnpin for CallConv
impl UnwindSafe for CallConv
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,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more