CallConv

Enum CallConv 

Source
#[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 exec or dynexec instruction
  • 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 exec or dynexec instruction
  • 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 sret attribute. 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 exec or dynexec instruction
  • 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 f32 which 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 SystemV convention
§

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 call or dyncall instruction
  • May only be called from a CanonLower function
  • Only supports IR types which correspond to a valid Canonical ABI type. Notably this does not include pointer types. No support for resource types 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 CanonLift functions. 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 CanonLift function
  • Functions using this convention are not allowed to have Public visibility
  • 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 syscall instruction, and may not be called from another Kernel function.
  • This convention is only permitted on function definitions when emitting a kernel library
  • In addition to the type restrictions described by the Fast convention, it additionally forbids any arguments/results of pointer type, due to the context switch that occurs.

Implementations§

Source§

impl CallConv

Source

pub fn is_wasm_canonical_abi(&self) -> bool

Returns true if this convention corresponds to one of the two Canonical ABI conventions

Trait Implementations§

Source§

impl Clone for CallConv

Source§

fn clone(&self) -> CallConv

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CallConv

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for CallConv

Source§

fn default() -> CallConv

Returns the “default value” for a type. Read more
Source§

impl Display for CallConv

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Hash for CallConv

Source§

fn hash<__H>(&self, state: &mut __H)
where __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CallConv

Source§

fn eq(&self, other: &CallConv) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PrettyPrint for CallConv

Source§

fn render(&self) -> Document

The core of the PrettyPrint functionality. Read more
Source§

fn to_pretty_string(&self) -> String

Produce a String containing the results of pretty-printing this object. Read more
Source§

fn pretty_print(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Pretty-print this object to the given core::fmt::Formatter. Read more
Source§

impl Copy for CallConv

Source§

impl Eq for CallConv

Source§

impl StructuralPartialEq for CallConv

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more