Skip to main content

CallConv

Enum CallConv 

Source
#[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 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.

§

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 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 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:

  • i32
  • i64
  • f32 (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 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).
  • 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 C convention
§

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 call or dyncall instruction
  • 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 ComponentModel 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 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§

Source§

impl CallConv

Source

pub fn is_wasm_canonical_abi(&self) -> bool

Returns true if this convention corresponds to the Canonical ABI convention

Source

pub fn as_str(&self) -> &'static str

Get the string representation of this calling convention

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<'de> Deserialize<'de> for CallConv

Source§

fn deserialize<D>( deserializer: D, ) -> Result<CallConv, <D as Deserializer<'de>>::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. 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 FromStr for CallConv

Source§

type Err = UnknownCallingConventionError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<CallConv, <CallConv as FromStr>::Err>

Parses a string s to return a value of this type. 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 Serialize for CallConv

Source§

fn serialize<S>( &self, serializer: S, ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. 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<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
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
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,