Struct cretonne_frontend::FunctionBuilder [] [src]

pub struct FunctionBuilder<'a, Variable: 'a> where
    Variable: EntityRef, 
{ pub func: &'a mut Function, // some fields omitted }

Temporary object used to build a single Cretonne IR Function.

Fields

The function currently being built. This field is public so the function can be re-borrowed.

Methods

impl<'a, Variable> FunctionBuilder<'a, Variable> where
    Variable: EntityRef, 
[src]

This module allows you to create a function in Cretonne IR in a straightforward way, hiding all the complexity of its internal representation.

The module is parametrized by one type which is the representation of variables in your origin language. It offers a way to conveniently append instruction to your program flow. You are responsible to split your instruction flow into extended blocks (declared with create_ebb) whose properties are:

  • branch and jump instructions can only point at the top of extended blocks;
  • the last instruction of each block is a terminator instruction which has no natural successor, and those instructions can only appear at the end of extended blocks.

The parameters of Cretonne IR instructions are Cretonne IR values, which can only be created as results of other Cretonne IR instructions. To be able to create variables redefined multiple times in your program, use the def_var and use_var command, that will maintain the correspondence between your variables and Cretonne IR SSA values.

The first block for which you call switch_to_block will be assumed to be the beginning of the function.

At creation, a FunctionBuilder instance borrows an already allocated Function which it modifies with the information stored in the mutable borrowed FunctionBuilderContext. The function passed in argument should be newly created with Function::with_name_signature(), whereas the FunctionBuilderContext can be kept as is between two function translations.

Errors

The functions below will panic in debug mode whenever you try to modify the Cretonne IR function in a way that violate the coherence of the code. For instance: switching to a new Ebb when you haven't filled the current one with a terminator instruction, inserting a return instruction with arguments that don't match the function's signature.

[src]

Creates a new FunctionBuilder structure that will operate on a Function using a FunctionBuilderContext.

[src]

Set the source location that should be assigned to all new instructions.

[src]

Creates a new Ebb and returns its reference.

[src]

After the call to this function, new instructions will be inserted into the designated block, in the order they are declared. You must declare the types of the Ebb arguments you will use here.

When inserting the terminator instruction (which doesn't have a fallthrough to its immediate successor), the block will be declared filled and it will not be possible to append instructions to it.

[src]

Declares that all the predecessors of this block are known.

Function to call with ebb as soon as the last branch instruction to ebb has been created. Forgetting to call this method on every block will cause inconsistencies in the produced functions.

[src]

Effectively calls seal_block on all blocks in the function.

It's more efficient to seal Ebbs as soon as possible, during translation, but for frontends where this is impractical to do, this function can be used at the end of translating all blocks to ensure that everything is sealed.

[src]

In order to use a variable in a use_var, you need to declare its type with this method.

[src]

Returns the Cretonne IR value corresponding to the utilization at the current program position of a previously defined user variable.

[src]

Register a new definition of a user variable. Panics if the type of the value is not the same as the type registered for the variable.

[src]

Creates a jump table in the function, to be used by br_table instructions.

[src]

Inserts an entry in a previously declared jump table.

[src]

Creates a stack slot in the function, to be used by stack_load, stack_store and stack_addr instructions.

[src]

Adds a signature which can later be used to declare an external function import.

[src]

Declare an external function import.

[src]

Declares a global variable accessible to the function.

[src]

Declares a heap accessible to the function.

[src]

Returns an object with the InstBuilder trait that allows to conveniently append an instruction to the current Ebb being built.

[src]

Make sure that the current EBB is inserted in the layout.

[src]

Returns a FuncCursor pointed at the current position ready for inserting instructions.

This can be used to insert SSA code that doesn't need to access locals and that doesn't need to know about FunctionBuilder at all.

[src]

Append parameters to the given Ebb corresponding to the function parameters. This can be used to set up the ebb parameters for the entry block.

[src]

Append parameters to the given Ebb corresponding to the function return values. This can be used to set up the ebb parameters for a function exit block.

[src]

Declare that translation of the current function is complete. This resets the state of the FunctionBuilder in preparation to be used for another function.

impl<'a, Variable> FunctionBuilder<'a, Variable> where
    Variable: EntityRef, 
[src]

All the functions documented in the previous block are write-only and help you build a valid Cretonne IR functions via multiple debug asserts. However, you might need to improve the performance of your translation perform more complex transformations to your Cretonne IR function. The functions below help you inspect the function you're creating and modify it in ways that can be unsafe if used incorrectly.

[src]

Retrieves all the parameters for an Ebb currently inferred from the jump instructions inserted that target it and the SSA construction.

[src]

Retrieves the signature with reference sigref previously added with import_signature.

[src]

Creates a parameter for a specific Ebb by appending it to the list of already existing parameters.

Note: this function has to be called at the creation of the Ebb before adding instructions to it, otherwise this could interfere with SSA construction.

[src]

Returns the result values of an instruction.

[src]

Changes the destination of a jump instruction after creation.

Note: You are responsible for maintaining the coherence with the arguments of other jump instructions.

[src]

Returns true if and only if the current Ebb is sealed and has no predecessors declared.

The entry block of a function is never unreachable.

[src]

Returns true if and only if no instructions have been added since the last call to switch_to_block.

[src]

Returns true if and only if a terminator instruction has been inserted since the last call to switch_to_block.

[src]

Returns a displayable object for the function as it is.

Useful for debug purposes. Use it with None for standard printing.

Trait Implementations

Auto Trait Implementations

impl<'a, Variable> Send for FunctionBuilder<'a, Variable> where
    Variable: Send

impl<'a, Variable> Sync for FunctionBuilder<'a, Variable> where
    Variable: Sync