A function that has a definition in the current translation unit will
have a non-NULL DECL_INITIAL.  However, back ends should not make
use of the particular value given by DECL_INITIAL.
   
The DECL_SAVED_TREE macro will give the complete body of the
function.  This node will usually be a COMPOUND_STMT representing
the outermost block of the function, but it may also be a
TRY_BLOCK, a RETURN_INIT, or any other valid statement.
There are tree nodes corresponding to all of the source-level statement constructs. These are enumerated here, together with a list of the various macros that can be used to obtain information about them. There are a few macros that can be used with all statements:
STMT_LINENO
     CASE_LABEL below
as if it were a statement, they do not allow the use of
STMT_LINENO.  There is no way to obtain the line number for a
CASE_LABEL.
     Statements do not contain information about
the file from which they came; that information is implicit in the
FUNCTION_DECL from which the statements originate.
     
STMT_IS_FULL_EXPR_P
     STMT_IS_FULL_EXPR_P set.  Temporaries
created during such statements should be destroyed when the innermost
enclosing statement with STMT_IS_FULL_EXPR_P set is exited.
   Here is the list of the various statement nodes, and the macros used to access them. This documentation describes the use of these nodes in non-template functions (including instantiations of template functions). In template functions, the same nodes are used, but sometimes in slightly different ways.
Many of the statements have substatements.  For example, a while
loop will have a body, which is itself a statement.  If the substatement
is NULL_TREE, it is considered equivalent to a statement
consisting of a single ;, i.e., an expression statement in which
the expression has been omitted.  A substatement may in fact be a list
of statements, connected via their TREE_CHAINs.  So, you should
always process the statement tree by looping over substatements, like
this:
     void process_stmt (stmt)
          tree stmt;
     {
       while (stmt)
         {
           switch (TREE_CODE (stmt))
             {
             case IF_STMT:
               process_stmt (THEN_CLAUSE (stmt));
               /* More processing here.  */
               break;
     
             ...
             }
     
           stmt = TREE_CHAIN (stmt);
         }
     }
     
   In other words, while the then clause of an if statement
in C++ can be only one statement (although that one statement may be a
compound statement), the intermediate representation will sometimes use
several statements chained together.
     ASM_STMT
               asm ("mov x, y");
          
     The ASM_STRING macro will return a STRING_CST node for
"mov x, y".  If the original statement made use of the
extended-assembly syntax, then ASM_OUTPUTS,
ASM_INPUTS, and ASM_CLOBBERS will be the outputs, inputs,
and clobbers for the statement, represented as STRING_CST nodes. 
The extended-assembly syntax looks like:
               asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
          
     The first string is the ASM_STRING, containing the instruction
template.  The next two strings are the output and inputs, respectively;
this statement has no clobbers.  As this example indicates, "plain"
assembly statements are merely a special case of extended assembly
statements; they have no cv-qualifiers, outputs, inputs, or clobbers. 
All of the strings will be NUL-terminated, and will contain no
embedded NUL-characters.
     If the assembly statement is declared volatile, or if the
statement was not an extended assembly statement, and is therefore
implicitly volatile, then the predicate ASM_VOLATILE_P will hold
of the ASM_STMT.
     
BREAK_STMT
     break statement.  There are no additional
fields.
     CASE_LABEL
     case label, range of case labels, or a
default label.  If CASE_LOW is NULL_TREE, then this is a
default label.  Otherwise, if CASE_HIGH is NULL_TREE, then
this is an ordinary case label.  In this case, CASE_LOW is
an expression giving the value of the label.  Both CASE_LOW and
CASE_HIGH are INTEGER_CST nodes.  These values will have
the same type as the condition expression in the switch statement.
     Otherwise, if both CASE_LOW and CASE_HIGH are defined, the
statement is a range of case labels.  Such statements originate with the
extension that allows users to write things of the form:
     
          case 2 ... 5:
          
     The first value will be CASE_LOW, while the second will be
CASE_HIGH.
     CLEANUP_STMT
     CLEANUP_DECL will be
the VAR_DECL destroyed.  Otherwise, CLEANUP_DECL will be
NULL_TREE.  In any case, the CLEANUP_EXPR is the
expression to execute.  The cleanups executed on exit from a scope
should be run in the reverse order of the order in which the associated
CLEANUP_STMTs were encountered.
     COMPOUND_STMT
     COMPOUND_BODY.  Subsequent substatements are found by
following the TREE_CHAIN link from one substatement to the next. 
The COMPOUND_BODY will be NULL_TREE if there are no
substatements.
     CONTINUE_STMT
     continue statement.  There are no additional
fields.
     CTOR_STMT
     CTOR_BEGIN_P holds) or end (if
CTOR_END_P holds of the main body of a constructor.  See also
SUBOBJECT for more information on how to use these nodes.
     DECL_STMT
     DECL_STMT_DECL macro
can be used to obtain the entity declared.  This declaration may be a
LABEL_DECL, indicating that the label declared is a local label. 
(As an extension, GCC allows the declaration of labels with scope.)  In
C, this declaration may be a FUNCTION_DECL, indicating the
use of the GCC nested function extension.  For more information,
see Functions.
     DO_STMT
     do loop.  The body of the loop is given by
DO_BODY while the termination condition for the loop is given by
DO_COND.  The condition for a do-statement is always an
expression.
     EMPTY_CLASS_EXPR
     TREE_TYPE represents the type of the object.
     EXPR_STMT
     EXPR_STMT_EXPR to
obtain the expression.
     FILE_STMT
     FILE_STMT_FILENAME to obtain the new filename.
     FOR_STMT
     for statement.  The FOR_INIT_STMT is
the initialization statement for the loop.  The FOR_COND is the
termination condition.  The FOR_EXPR is the expression executed
right before the FOR_COND on each loop iteration; often, this
expression increments a counter.  The body of the loop is given by
FOR_BODY.  Note that FOR_INIT_STMT and FOR_BODY
return statements, while FOR_COND and FOR_EXPR return
expressions.
     GOTO_STMT
     goto statement.  The GOTO_DESTINATION will
usually be a LABEL_DECL.  However, if the "computed goto" extension
has been used, the GOTO_DESTINATION will be an arbitrary expression
indicating the destination.  This expression will always have pointer type. 
Additionally the GOTO_FAKE_P flag is set whenever the goto statement
does not come from source code, but it is generated implicitly by the compiler. 
This is used for branch prediction.
     HANDLER
     catch block.  The HANDLER_TYPE
is the type of exception that will be caught by this handler; it is
equal (by pointer equality) to CATCH_ALL_TYPE if this handler
is for all types.  HANDLER_PARMS is the DECL_STMT for
the catch parameter, and HANDLER_BODY is the
COMPOUND_STMT for the block itself.
     IF_STMT
     if statement.  The IF_COND is the
expression.
     If the condition is a TREE_LIST, then the TREE_PURPOSE is
a statement (usually a DECL_STMT).  Each time the condition is
evaluated, the statement should be executed.  Then, the
TREE_VALUE should be used as the conditional expression itself. 
This representation is used to handle C++ code like this:
     
          if (int i = 7) ...
          
     where there is a new local variable (or variables) declared within the condition.
The THEN_CLAUSE represents the statement given by the then
condition, while the ELSE_CLAUSE represents the statement given
by the else condition.
     
LABEL_STMT
     LABEL_DECL declared by this
statement can be obtained with the LABEL_STMT_LABEL macro.  The
IDENTIFIER_NODE giving the name of the label can be obtained from
the LABEL_DECL with DECL_NAME.
     RETURN_INIT
               S f(int) return s {...}
          
     then there will be a RETURN_INIT.  There is never a named
returned value for a constructor.  The first argument to the
RETURN_INIT is the name of the object returned; the second
argument is the initializer for the object.  The object is initialized
when the RETURN_INIT is encountered.  The object referred to is
the actual object returned; this extension is a manual way of doing the
"return-value optimization."  Therefore, the object must actually be
constructed in the place where the object will be returned.
     RETURN_STMT
     return statement.  The RETURN_EXPR is
the expression returned; it will be NULL_TREE if the statement
was just
               return;
          
     SCOPE_STMT
     SCOPE_BEGIN_P holds, this statement represents the beginning of a
scope; if SCOPE_END_P holds this statement represents the end of
a scope.  On exit from a scope, all cleanups from CLEANUP_STMTs
occurring in the scope must be run, in reverse order to the order in
which they were encountered.  If SCOPE_NULLIFIED_P or
SCOPE_NO_CLEANUPS_P holds of the scope, back ends should behave
as if the SCOPE_STMT were not present at all.
     SUBOBJECT
     this is fully constructed.  If, after this point, an
exception is thrown before a CTOR_STMT with CTOR_END_P set
is encountered, the SUBOBJECT_CLEANUP must be executed.  The
cleanups must be executed in the reverse order in which they appear.
     SWITCH_STMT
     switch statement.  The SWITCH_COND is
the expression on which the switch is occurring.  See the documentation
for an IF_STMT for more information on the representation used
for the condition.  The SWITCH_BODY is the body of the switch
statement.   The SWITCH_TYPE is the original type of switch
expression as given in the source, before any compiler conversions.
     TRY_BLOCK
     try block.  The body of the try block is
given by TRY_STMTS.  Each of the catch blocks is a HANDLER
node.  The first handler is given by TRY_HANDLERS.  Subsequent
handlers are obtained by following the TREE_CHAIN link from one
handler to the next.  The body of the handler is given by
HANDLER_BODY.
     If CLEANUP_P holds of the TRY_BLOCK, then the
TRY_HANDLERS will not be a HANDLER node.  Instead, it will
be an expression that should be executed if an exception is thrown in
the try block.  It must rethrow the exception after executing that code. 
And, if an exception is thrown while the expression is executing,
terminate must be called.
     
USING_STMT
     using directive.  The namespace is given by
USING_STMT_NAMESPACE, which will be a NAMESPACE_DECL.  This node
is needed inside template functions, to implement using directives
during instantiation.
     WHILE_STMT
     while loop.  The WHILE_COND is the
termination condition for the loop.  See the documentation for an
IF_STMT for more information on the representation used for the
condition.
     The WHILE_BODY is the body of the loop.