Next: , Up: GIMPLE

10.2.1 Interfaces

The tree representation of a function is stored in DECL_SAVED_TREE. It is lowered to GIMPLE by a call to gimplify_function_tree.

If a front end wants to include language-specific tree codes in the tree representation which it provides to the back end, it must provide a definition of LANG_HOOKS_GIMPLIFY_EXPR which knows how to convert the front end trees to GIMPLE. Usually such a hook will involve much of the same code for expanding front end trees to RTL. This function can return fully lowered GIMPLE, or it can return GENERIC trees and let the main gimplifier lower them the rest of the way; this is often simpler. GIMPLE that is not fully lowered is known as “high GIMPLE” and consists of the IL before the pass pass_lower_cf. High GIMPLE still contains lexical scopes and nested expressions, while low GIMPLE exposes all of the implicit jumps for control expressions like COND_EXPR.

The C and C++ front ends currently convert directly from front end trees to GIMPLE, and hand that off to the back end rather than first converting to GENERIC. Their gimplifier hooks know about all the _STMT nodes and how to convert them to GENERIC forms. There was some work done on a genericization pass which would run first, but the existence of STMT_EXPR meant that in order to convert all of the C statements into GENERIC equivalents would involve walking the entire tree anyway, so it was simpler to lower all the way. This might change in the future if someone writes an optimization pass which would work better with higher-level trees, but currently the optimizers all expect GIMPLE.

A front end which wants to use the tree optimizers (and already has some sort of whole-function tree representation) only needs to provide a definition of LANG_HOOKS_GIMPLIFY_EXPR, call gimplify_function_tree to lower to GIMPLE, and then hand off to tree_rest_of_compilation to compile and output the function.

You can tell the compiler to dump a C-like representation of the GIMPLE form with the flag -fdump-tree-gimple.