sway_ir::function

Struct Function

Source
pub struct Function(pub DefaultKey);
Expand description

A wrapper around an ECS handle into the Context.

Tuple Fields§

§0: DefaultKey

Implementations§

Source§

impl Function

Source

pub fn new( context: &mut Context<'_>, module: Module, name: String, args: Vec<(String, Type, Option<MetadataIndex>)>, return_type: Type, selector: Option<[u8; 4]>, is_public: bool, is_entry: bool, is_original_entry: bool, is_fallback: bool, metadata: Option<MetadataIndex>, ) -> Function

Return a new Function handle.

Creates a Function in the context within module and returns a handle.

name, args, return_type and is_public are the usual suspects. selector is a special value used for Sway contract calls; much like name is unique and not particularly used elsewhere in the IR.

Source

pub fn create_block( &self, context: &mut Context<'_>, label: Option<Label>, ) -> Block

Create and append a new Block to this function.

Source

pub fn create_block_before( &self, context: &mut Context<'_>, other: &Block, label: Option<Label>, ) -> Result<Block, IrError>

Create and insert a new Block into this function.

The new block is inserted before other.

Source

pub fn create_block_after( &self, context: &mut Context<'_>, other: &Block, label: Option<Label>, ) -> Result<Block, IrError>

Create and insert a new Block into this function.

The new block is inserted after other.

Source

pub fn remove_block( &self, context: &mut Context<'_>, block: &Block, ) -> Result<(), IrError>

Remove a Block from this function.

Care must be taken to ensure the block has no predecessors otherwise the function will be made invalid.

Source

pub fn get_unique_label( &self, context: &mut Context<'_>, hint: Option<String>, ) -> String

Get a new unique block label.

If hint is None then the label will be in the form "blockN" where N is an incrementing decimal.

Otherwise if the hint is already unique to this function it will be returned. If not already unique it will have N appended to it until it is unique.

Source

pub fn num_blocks(&self, context: &Context<'_>) -> usize

Return the number of blocks in this function.

Source

pub fn num_instructions(&self, context: &Context<'_>) -> usize

Return the number of instructions in this function.

The crate::InstOp::AsmBlock is counted as a single instruction, regardless of the number of crate::asm::AsmInstructions in the ASM block. E.g., even if the ASM block is empty and contains no instructions, it will still be counted as a single instruction.

If you want to count every ASM instruction as an instruction, use num_instructions_incl_asm_instructions instead.

Source

pub fn num_instructions_incl_asm_instructions( &self, context: &Context<'_>, ) -> usize

Return the number of instructions in this function, including the crate::asm::AsmInstructions found in crate::InstOp::AsmBlocks.

Every crate::asm::AsmInstruction encountered in any of the ASM blocks will be counted as an instruction. The crate::InstOp::AsmBlock itself is not counted but rather replaced with the number of ASM instructions found in the block. In other words, empty ASM blocks do not count as instructions.

If you want to count crate::InstOp::AsmBlocks as single instructions, use num_instructions instead.

Source

pub fn get_name<'a>(&self, context: &'a Context<'_>) -> &'a str

Return the function name.

Source

pub fn get_module(&self, context: &Context<'_>) -> Module

Return the module that this function belongs to.

Source

pub fn get_entry_block(&self, context: &Context<'_>) -> Block

Return the function entry (i.e., the first) block.

Source

pub fn get_metadata(&self, context: &Context<'_>) -> Option<MetadataIndex>

Return the attached metadata.

Source

pub fn has_selector(&self, context: &Context<'_>) -> bool

Whether this function has a valid selector.

Source

pub fn get_selector(&self, context: &Context<'_>) -> Option<[u8; 4]>

Return the function selector, if it has one.

Source

pub fn is_entry(&self, context: &Context<'_>) -> bool

Whether or not the function is a program entry point, i.e. main, #[test] fns or abi methods.

Source

pub fn is_original_entry(&self, context: &Context<'_>) -> bool

Whether or not the function was a program entry point, i.e. main, #[test] fns or abi methods, before it got wrapped within the __entry function.

Source

pub fn is_fallback(&self, context: &Context<'_>) -> bool

Whether or not this function is a contract fallback function

Source

pub fn get_return_type(&self, context: &Context<'_>) -> Type

Source

pub fn set_return_type(&self, context: &mut Context<'_>, new_ret_type: Type)

Source

pub fn num_args(&self, context: &Context<'_>) -> usize

Get the number of args.

Source

pub fn get_arg(&self, context: &Context<'_>, name: &str) -> Option<Value>

Get an arg value by name, if found.

Source

pub fn add_arg<S: Into<String>>( &self, context: &mut Context<'_>, name: S, arg: Value, )

Append an extra argument to the function signature.

NOTE: arg must be a BlockArgument value with the correct index otherwise add_arg will panic.

Source

pub fn lookup_arg_name<'a>( &self, context: &'a Context<'_>, value: &Value, ) -> Option<&'a String>

Find the name of an arg by value.

Source

pub fn args_iter<'a>( &self, context: &'a Context<'_>, ) -> impl Iterator<Item = &'a (String, Value)>

Return an iterator for each of the function arguments.

Source

pub fn get_local_var( &self, context: &Context<'_>, name: &str, ) -> Option<LocalVar>

Get a pointer to a local value by name, if found.

Source

pub fn lookup_local_name<'a>( &self, context: &'a Context<'_>, var: &LocalVar, ) -> Option<&'a String>

Find the name of a local value by pointer.

Source

pub fn new_local_var( &self, context: &mut Context<'_>, name: String, local_type: Type, initializer: Option<Constant>, mutable: bool, ) -> Result<LocalVar, IrError>

Add a value to the function local storage.

The name must be unique to this function else an error is returned.

Source

pub fn new_unique_local_var( &self, context: &mut Context<'_>, name: String, local_type: Type, initializer: Option<Constant>, mutable: bool, ) -> LocalVar

Add a value to the function local storage, by forcing the name to be unique if needed.

Will use the provided name as a hint and rename to guarantee insertion.

Source

pub fn locals_iter<'a>( &self, context: &'a Context<'_>, ) -> impl Iterator<Item = (&'a String, &'a LocalVar)>

Return an iterator to all of the values in this function’s local storage.

Source

pub fn remove_locals(&self, context: &mut Context<'_>, removals: &Vec<String>)

Remove given list of locals

Source

pub fn merge_locals_from( &self, context: &mut Context<'_>, other: Function, ) -> HashMap<LocalVar, LocalVar>

Merge values from another Function into this one.

The names of the merged values are guaranteed to be unique via the use of Function::new_unique_local_var.

Returns a map from the original pointers to the newly merged pointers.

Source

pub fn block_iter(&self, context: &Context<'_>) -> BlockIterator

Return an iterator to each block in this function.

Source

pub fn instruction_iter<'a>( &self, context: &'a Context<'_>, ) -> impl Iterator<Item = (Block, Value)> + 'a

Return an iterator to each instruction in each block in this function.

This is a convenience method for when all instructions in a function need to be inspected. The instruction value is returned from the iterator along with the block it belongs to.

Source

pub fn replace_values( &self, context: &mut Context<'_>, replace_map: &FxHashMap<Value, Value>, starting_block: Option<Block>, )

Replace a value with another within this function.

This is a convenience method which iterates over this function’s blocks and calls Block::replace_values in turn.

starting_block is an optimisation for when the first possible reference to old_val is known.

Source

pub fn replace_value( &self, context: &mut Context<'_>, old_val: Value, new_val: Value, starting_block: Option<Block>, )

Source

pub fn dot_cfg(&self, context: &Context<'_>) -> String

A graphviz dot graph of the control-flow-graph.

Trait Implementations§

Source§

impl Clone for Function

Source§

fn clone(&self) -> Function

Returns a copy 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 Function

Source§

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

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

impl Hash for Function

Source§

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

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 Function

Source§

fn eq(&self, other: &Function) -> 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 PassScope for Function

Source§

impl Copy for Function

Source§

impl Eq for Function

Source§

impl StructuralPartialEq for Function

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, dst: *mut u8)

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

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize = _

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> StorageAsMut for T

Source§

fn storage<Type>(&mut self) -> StorageMut<'_, Self, Type>
where Type: Mappable,

Source§

fn storage_as_mut<Type>(&mut self) -> StorageMut<'_, Self, Type>
where Type: Mappable,

Source§

impl<T> StorageAsRef for T

Source§

fn storage<Type>(&self) -> StorageRef<'_, Self, Type>
where Type: Mappable,

Source§

fn storage_as_ref<Type>(&self) -> StorageRef<'_, Self, Type>
where Type: Mappable,

Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
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> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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