Converting Expressions to tree#
Converting expressions to tree is done by functions called
gfc_conv_*.
The central data structure for a GENERIC expression is the
gfc_se structure. Its expr member is a tree that
holds the value of the expression. A gfc_se structure is
initialized using gfc_init_se ; it needs to be embedded in an
outer gfc_se.
Evaluating Fortran expressions often require things to be done before
and after evaluation of the expression, for example code for the
allocation of a temporary variable and its subsequent deallocation.
Therefore, gfc_se contains the members pre and
post, which point to stmt_block blocks for code that
needs to be executed before and after evaluation of the expression.
When using a local gfc_se to convert some expression, it is
often necessary to add the generated pre and post blocks
to the pre or post blocks of the outer gfc_se.
Code like this (lifted from trans-expr.cc) is fairly common:
gfc_se cont_se;
tree cont_var;
/* cont_var = is_contiguous (expr); . */
gfc_init_se (&cont_se, parmse);
gfc_conv_is_contiguous_expr (&cont_se, expr);
gfc_add_block_to_block (&se->pre, &(&cont_se)->pre);
gfc_add_modify (&se->pre, cont_var, cont_se.expr);
gfc_add_block_to_block (&se->pre, &(&cont_se)->post);
Conversion functions which need a gfc_se structure will have a
corresponding argument.
gfc_se also contains pointers to a gfc_ss and a
gfc_loopinfo structure. These are needed by the scalarizer.