The IR builder

This struct is used during the building of the IR, it holds structures needed only temporarely while building.

Some of these structures are:

  • A SymbolTable: which holds mappings from names to indexes.
  • The AST bodies of the major structures like functions, structs, etc. They are Arc thus cheaply clonable.
  • A mapping of top level module names to their module indexes.
  • The current self_ty self type to use during lowering when inside a method with a self argument.
  • The current local_module being built.
  • A struct index to type index mapping, to avoid duplicating and making equality easier.
  • A type index to module index mapping, to aid in method resolution.

The function IR builder

When lowering a function the IR builder is wrapper around a function builder, holding extra information to lower the function:

  • The function IR being build.
  • A mapping from name to local index (for named variables).
  • A list of statements
  • The return local index.
  • A hashset to know whether a local has been initialized (aids error checking).

Passes

Lowering is done roughly with the following passes:

Symbol resolution

A key concept is that the arenas holding the structures are Option<T>, this is needed to solve cyclic references.

The first pass loops through all the modules and all their structures, inserting them into the arenas with None (for everything expect modules) and storing the returned index to the symbol table.

Actually, within the pass, 2 loops are done, this is because for impl blocks we first need to have the struct and types ids assigned, so we can relate the methods to their types. So impl blocks are handled as a separate step.

Import resolution

The next pass handles imports between modules.

Module lowering

Here the whole lowering happens for all functions, structs, etc.