Basic data structures#
Gfortran creates GENERIC as an intermediate language for the middle-end. Details about GENERIC can be found in the GCC manual.
The basic data structure of GENERIC is a tree. Everything in
GENERIC is a tree, including types and statements. Fortunately
for the gfortran programmer, tree variables are
garbage-collected, so doing memory management for them is not
necessary.
tree expressions are built using functions such as, for
example, fold_build2_loc. For two tree variables a and
b, both of which have the type gfc_arry_index_type,
calculation c = a * b would be done by
c = fold_build2_loc (input_location, MULT_EXPR,
gfc_array_index_type, a, b);
The types have to agree, otherwise internal compiler errors will occur
at a later stage. Expressions can be converted to a different type
using fold_convert.
Accessing individual members in the tree structures should not
be done. Rather, access should be done via macros.
One basic data structure is the stmtblock_t struct. This is
used for holding a list of statements, expressed as tree
expressions. If a block is created using gfc_start_block, it
has its own scope for variables; if it is created using
gfc_init_block, it does not have its own scope.
It is possible to
Add an expression to the end of a block using
gfc_add_expr_to_blockAdd an expression to the beginning of a block using
void gfc_prepend_expr_to_blockMake a block into a single
treeusinggfc_finish_block. For example, this is needed to put the contents of a block into theiforelsebranch of aCOND_EXPR.
Variables are also tree expressions, they can be created using
gfc_create_var. Assigning to a variable can be done with
gfc_add_modify.
An example: Creating a default integer type variable in the current
scope with the prefix ‘everything’ in the stmt_block
block and assigning the value 42 would be
tree var, *block;
/* Initialize block somewhere here. */
var = gfc_create_var (integer_type_node, "everything");
gfc_add_modify (block, var, build_int_cst (integer_type_node, 42));