#[repr(u8)]pub enum CallConv {
Fast = 0,
SystemV = 1,
Wasm = 2,
CanonLift = 3,
CanonLower = 4,
Kernel = 5,
}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.
SystemV = 1
The C calling convention, as specified for System V (x86), 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 CanonLift 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 is non-optimal if not being used for cross-language interop.
Wasm = 2
This convention is used to represent functions translated from WebAssembly.
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, which are not currently supported).
- 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
SystemVconvention
CanonLift = 3
This convention represents one of the host-defined primitives of the Wasm Component Model.
In particular, this convention corresponds to functions synthesized via a (canon lift)
declaration, which is used to export a core Wasm function with a Canonical ABI signature.
These synthesized functions are responsible for “lowering” arguments out of the Canonical
ABI into a Wasm-compatible representation, and “lifting” results back into the Canonical
ABI.
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.
It has the following properties:
- It is always executed in a new context
- May only be the target of a
callordyncallinstruction - May only be called from a
CanonLowerfunction - 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
CanonLiftfunctions. 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
SystemV, the spilled arguments will be written into memory in reverse order (the closer to the front of the argument list, the smaller the offset).
Unlike CanonLower, the details of this calling convention are stable, as it is designed
expressly for cross-language, cross-context interop, and is in fact the only supported
way to represent cross-context function calls at this time.
CanonLower = 4
This convention represents one of the host-defined primitives of the Wasm Component Model.
In particular, this convention corresponds to functions synthesized via a (canon lower)
declaration, which is used to import a Canonical ABI function into a core Wasm module,
by providing a Wasm-compatible adapter for the underlying Canonical ABI function. These
synthesized functions are responsible for “lifting” the core Wasm arguments into the
Canonical ABI representation, and “lowering” the results out of that representation.
This convention is identical to Wasm, with the following additional properties:
- It is the only convention which may contain calls to a
CanonLiftfunction - Functions using this convention are not allowed to have
Publicvisibility - Functions using this convention are considered to be compiler-generated, and thus are aggressively inlined/eliminated where possible.
This should be considered an unstable, compiler-internal calling convention, and the details
of this convention can change at any time. Currently, it is only used by the Wasm frontend
to distinguish functions synthesized from a (canon lower).
Kernel = 5
This convention is like Fast, but indicates that the function implements a syscall as
part of a kernel module definition.
Additional properties include:
- It is always executed in the root context, and therefore a context switch is involved.
- This convention may only be called via the
syscallinstruction, and may not be called from anotherKernelfunction. - This convention is only permitted on function definitions when emitting a kernel library
- In addition to the type restrictions described by the
Fastconvention, it additionally forbids any arguments/results of pointer type, due to the context switch that occurs.
Implementations§
Trait Implementations§
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>
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 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<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