gimple-low.c File Reference

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
#include "rtl.h"
#include "varray.h"
#include "tree-gimple.h"
#include "tree-inline.h"
#include "diagnostic.h"
#include "langhooks.h"
#include "langhooks-def.h"
#include "tree-flow.h"
#include "timevar.h"
#include "except.h"
#include "hashtab.h"
#include "flags.h"
#include "function.h"
#include "expr.h"
#include "toplev.h"
#include "tree-pass.h"

Include dependency graph for gimple-low.c:

Go to the source code of this file.

Data Structures

struct  lower_data

Functions

static void lower_stmt (tree_stmt_iterator *, struct lower_data *)
static void lower_bind_expr (tree_stmt_iterator *, struct lower_data *)
static void lower_cond_expr (tree_stmt_iterator *, struct lower_data *)
static void lower_return_expr (tree_stmt_iterator *, struct lower_data *)
static unsigned int lower_function_body ()
static void lower_stmt_body ()
static void lower_omp_directive ()
static void lower_stmt ()
static void lower_bind_expr ()
static bool try_catch_may_fallthru ()
bool block_may_fallthru ()
static void lower_cond_expr ()
static void lower_return_expr ()
void record_vars_into ()
void record_vars ()
static void mark_blocks_with_used_vars ()
static unsigned int mark_used_blocks ()

Variables

tree_opt_pass pass_lower_cf
tree_opt_pass pass_mark_used_blocks


Function Documentation

bool block_may_fallthru  ) 
 

Try to determine if we can fall out of the bottom of BLOCK.  This guess
   need not be 100% accurate; simply be conservative and return true if we
   don't know.  This is used only to avoid stupidly generating extra code.
   If we're wrong, we'll just delete the extra code later.   

Definition at line 345 of file gimple-low.c.

References BIND_EXPR_BODY, call_expr_flags(), COND_EXPR_ELSE, COND_EXPR_THEN, ECF_NORETURN, expr_last(), NULL_TREE, SWITCH_LABELS, TREE_CODE, TREE_OPERAND, and try_catch_may_fallthru().

Referenced by convert_nl_goto_receiver(), frob_into_branch_around(), honor_protect_cleanup_actions(), lower_catch(), lower_cleanup(), lower_cond_expr(), lower_function_body(), lower_try_finally(), shortcut_cond_expr(), and try_catch_may_fallthru().

00346 {
00347   tree stmt = expr_last (block);
00348 
00349   switch (stmt ? TREE_CODE (stmt) : ERROR_MARK)
00350     {
00351     case GOTO_EXPR:
00352     case RETURN_EXPR:
00353     case RESX_EXPR:
00354       /* Easy cases.  If the last statement of the block implies 
00355          control transfer, then we can't fall through.  */
00356       return false;
00357 
00358     case SWITCH_EXPR:
00359       /* If SWITCH_LABELS is set, this is lowered, and represents a
00360          branch to a selected label and hence can not fall through.
00361          Otherwise SWITCH_BODY is set, and the switch can fall
00362          through.  */
00363       return SWITCH_LABELS (stmt) == NULL_TREE;
00364 
00365     case COND_EXPR:
00366       if (block_may_fallthru (COND_EXPR_THEN (stmt)))
00367         return true;
00368       return block_may_fallthru (COND_EXPR_ELSE (stmt));
00369 
00370     case BIND_EXPR:
00371       return block_may_fallthru (BIND_EXPR_BODY (stmt));
00372 
00373     case TRY_CATCH_EXPR:
00374       return try_catch_may_fallthru (stmt);
00375 
00376     case TRY_FINALLY_EXPR:
00377       /* The finally clause is always executed after the try clause,
00378          so if it does not fall through, then the try-finally will not
00379          fall through.  Otherwise, if the try clause does not fall
00380          through, then when the finally clause falls through it will
00381          resume execution wherever the try clause was going.  So the
00382          whole try-finally will only fall through if both the try
00383          clause and the finally clause fall through.  */
00384       return (block_may_fallthru (TREE_OPERAND (stmt, 0))
00385               && block_may_fallthru (TREE_OPERAND (stmt, 1)));
00386 
00387     case MODIFY_EXPR:
00388       if (TREE_CODE (TREE_OPERAND (stmt, 1)) == CALL_EXPR)
00389         stmt = TREE_OPERAND (stmt, 1);
00390       else
00391         return true;
00392       /* FALLTHRU */
00393 
00394     case CALL_EXPR:
00395       /* Functions that do not return do not fall through.  */
00396       return (call_expr_flags (stmt) & ECF_NORETURN) == 0;
00397     
00398     case CLEANUP_POINT_EXPR:
00399       return block_may_fallthru (TREE_OPERAND (stmt, 0));
00400 
00401     default:
00402       return true;
00403     }
00404 }

static void lower_bind_expr  )  [static]
 

Lowers a bind_expr TSI.  DATA is passed through the recursion.   

Definition at line 240 of file gimple-low.c.

References BIND_EXPR_BLOCK, BIND_EXPR_BODY, BIND_EXPR_VARS, lower_data::block, BLOCK_CHAIN, BLOCK_SUBBLOCKS, BLOCK_SUPERCONTEXT, current_function_decl, DECL_INITIAL, lower_stmt_body(), NULL_TREE, record_vars(), TREE_ASM_WRITTEN, tsi_delink(), tsi_link_before(), TSI_SAME_STMT, and tsi_stmt().

00241 {
00242   tree old_block = data->block;
00243   tree stmt = tsi_stmt (*tsi);
00244   tree new_block = BIND_EXPR_BLOCK (stmt);
00245 
00246   if (new_block)
00247     {
00248       if (new_block == old_block)
00249         {
00250           /* The outermost block of the original function may not be the
00251              outermost statement chain of the gimplified function.  So we
00252              may see the outermost block just inside the function.  */
00253           gcc_assert (new_block == DECL_INITIAL (current_function_decl));
00254           new_block = NULL;
00255         }
00256       else
00257         {
00258           /* We do not expect to handle duplicate blocks.  */
00259           gcc_assert (!TREE_ASM_WRITTEN (new_block));
00260           TREE_ASM_WRITTEN (new_block) = 1;
00261 
00262           /* Block tree may get clobbered by inlining.  Normally this would
00263              be fixed in rest_of_decl_compilation using block notes, but
00264              since we are not going to emit them, it is up to us.  */
00265           BLOCK_CHAIN (new_block) = BLOCK_SUBBLOCKS (old_block);
00266           BLOCK_SUBBLOCKS (old_block) = new_block;
00267           BLOCK_SUBBLOCKS (new_block) = NULL_TREE;
00268           BLOCK_SUPERCONTEXT (new_block) = old_block;
00269 
00270           data->block = new_block;
00271         }
00272     }
00273 
00274   record_vars (BIND_EXPR_VARS (stmt));
00275   lower_stmt_body (BIND_EXPR_BODY (stmt), data);
00276 
00277   if (new_block)
00278     {
00279       gcc_assert (data->block == new_block);
00280 
00281       BLOCK_SUBBLOCKS (new_block)
00282         = blocks_nreverse (BLOCK_SUBBLOCKS (new_block));
00283       data->block = old_block;
00284     }
00285 
00286   /* The BIND_EXPR no longer carries any useful information -- kill it.  */
00287   tsi_link_before (tsi, BIND_EXPR_BODY (stmt), TSI_SAME_STMT);
00288   tsi_delink (tsi);
00289 }

static void lower_bind_expr tree_stmt_iterator ,
struct lower_data
[static]
 

Referenced by lower_function_body(), and lower_stmt().

static void lower_cond_expr  )  [static]
 

Lowers a cond_expr TSI.  DATA is passed through the recursion.   

Definition at line 409 of file gimple-low.c.

References block_may_fallthru(), build1, build_and_jump(), COND_EXPR_ELSE, COND_EXPR_THEN, expr_only(), LABEL_EXPR_LABEL, lower_stmt_body(), NULL_TREE, simple_goto_p(), TREE_SIDE_EFFECTS, TSI_CONTINUE_LINKING, tsi_delink(), tsi_link_after(), tsi_next(), tsi_stmt(), and void_type_node.

00410 {
00411   tree stmt = tsi_stmt (*tsi);
00412   bool then_is_goto, else_is_goto;
00413   tree then_branch, else_branch;
00414   tree then_goto, else_goto;
00415   
00416   then_branch = COND_EXPR_THEN (stmt);
00417   else_branch = COND_EXPR_ELSE (stmt);
00418 
00419   lower_stmt_body (then_branch, data);
00420   lower_stmt_body (else_branch, data);
00421 
00422   then_goto = expr_only (then_branch);
00423   then_is_goto = then_goto && simple_goto_p (then_goto);
00424 
00425   else_goto = expr_only (else_branch);
00426   else_is_goto = else_goto && simple_goto_p (else_goto);
00427 
00428   if (!then_is_goto || !else_is_goto)
00429     {
00430       tree then_label, else_label, end_label, t;
00431 
00432       then_label = NULL_TREE;
00433       else_label = NULL_TREE;
00434       end_label = NULL_TREE;
00435  
00436       /* Replace the cond_expr with explicit gotos.  */
00437       if (!then_is_goto)
00438         {
00439           t = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
00440           if (TREE_SIDE_EFFECTS (then_branch))
00441             then_label = t;
00442           else
00443             end_label = t;
00444           then_goto = build_and_jump (&LABEL_EXPR_LABEL (t));
00445         }
00446 
00447       if (!else_is_goto)
00448         {
00449           t = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
00450           if (TREE_SIDE_EFFECTS (else_branch))
00451             else_label = t;
00452           else
00453             {
00454               /* Both THEN and ELSE can be no-ops if one or both contained an
00455                  empty BIND_EXPR that was associated with the toplevel block
00456                  of an inlined function.  In that case remove_useless_stmts
00457                  can't have cleaned things up for us; kill the whole 
00458                  conditional now.  */
00459               if (end_label)
00460                 {
00461                   tsi_delink (tsi);
00462                   return;
00463                 }
00464               else
00465                 end_label = t;
00466             }
00467           else_goto = build_and_jump (&LABEL_EXPR_LABEL (t));
00468         }
00469 
00470       if (then_label)
00471         {
00472           bool may_fallthru = block_may_fallthru (then_branch);
00473 
00474           tsi_link_after (tsi, then_label, TSI_CONTINUE_LINKING);
00475           tsi_link_after (tsi, then_branch, TSI_CONTINUE_LINKING);
00476   
00477           if (else_label && may_fallthru)
00478             {
00479               end_label = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
00480               t = build_and_jump (&LABEL_EXPR_LABEL (end_label));
00481               tsi_link_after (tsi, t, TSI_CONTINUE_LINKING);
00482             }
00483         }
00484   
00485       if (else_label)
00486         {
00487           tsi_link_after (tsi, else_label, TSI_CONTINUE_LINKING);
00488           tsi_link_after (tsi, else_branch, TSI_CONTINUE_LINKING);
00489         }
00490 
00491       if (end_label)
00492         tsi_link_after (tsi, end_label, TSI_CONTINUE_LINKING);
00493     }
00494 
00495   COND_EXPR_THEN (stmt) = then_goto;
00496   COND_EXPR_ELSE (stmt) = else_goto;
00497 
00498   tsi_next (tsi);
00499 }

static void lower_cond_expr tree_stmt_iterator ,
struct lower_data
[static]
 

Referenced by lower_stmt().

static unsigned int lower_function_body  )  [static]
 

Lowers the body of current_function_decl.   

Definition at line 62 of file gimple-low.c.

References alloc_stmt_list(), BLOCK_CHAIN, block_may_fallthru(), BLOCK_SUBBLOCKS, build1, current_function_decl, DECL_INITIAL, DECL_SAVED_TREE, lower_bind_expr(), NULL_TREE, SET_EXPR_LOCATION, SET_EXPR_LOCUS, TREE_ASM_WRITTEN, TREE_CHAIN, TREE_CODE, TREE_OPERAND, TREE_PURPOSE, TREE_VALUE, TSI_CONTINUE_LINKING, tsi_last(), tsi_link_after(), TSI_NEW_STMT, tsi_start(), and void_type_node.

00063 {
00064   struct lower_data data;
00065   tree *body_p = &DECL_SAVED_TREE (current_function_decl);
00066   tree bind = *body_p;
00067   tree_stmt_iterator i;
00068   tree t, x;
00069 
00070   gcc_assert (TREE_CODE (bind) == BIND_EXPR);
00071 
00072   memset (&data, 0, sizeof (data));
00073   data.block = DECL_INITIAL (current_function_decl);
00074   BLOCK_SUBBLOCKS (data.block) = NULL_TREE;
00075   BLOCK_CHAIN (data.block) = NULL_TREE;
00076   TREE_ASM_WRITTEN (data.block) = 1;
00077 
00078   *body_p = alloc_stmt_list ();
00079   i = tsi_start (*body_p);
00080   tsi_link_after (&i, bind, TSI_NEW_STMT);
00081   lower_bind_expr (&i, &data);
00082 
00083   i = tsi_last (*body_p);
00084 
00085   /* If the function falls off the end, we need a null return statement.
00086      If we've already got one in the return_statements list, we don't
00087      need to do anything special.  Otherwise build one by hand.  */
00088   if (block_may_fallthru (*body_p)
00089       && (data.return_statements == NULL
00090           || TREE_OPERAND (TREE_VALUE (data.return_statements), 0) != NULL))
00091     {
00092       x = build1 (RETURN_EXPR, void_type_node, NULL);
00093       SET_EXPR_LOCATION (x, cfun->function_end_locus);
00094       tsi_link_after (&i, x, TSI_CONTINUE_LINKING);
00095     }
00096 
00097   /* If we lowered any return statements, emit the representative
00098      at the end of the function.  */
00099   for (t = data.return_statements ; t ; t = TREE_CHAIN (t))
00100     {
00101       x = build1 (LABEL_EXPR, void_type_node, TREE_PURPOSE (t));
00102       tsi_link_after (&i, x, TSI_CONTINUE_LINKING);
00103 
00104       /* Remove the line number from the representative return statement.
00105          It now fills in for many such returns.  Failure to remove this
00106          will result in incorrect results for coverage analysis.  */
00107       x = TREE_VALUE (t);
00108 #ifdef USE_MAPPED_LOCATION
00109       SET_EXPR_LOCATION (x, UNKNOWN_LOCATION);
00110 #else
00111       SET_EXPR_LOCUS (x, NULL);
00112 #endif
00113       tsi_link_after (&i, x, TSI_CONTINUE_LINKING);
00114     }
00115 
00116   gcc_assert (data.block == DECL_INITIAL (current_function_decl));
00117   BLOCK_SUBBLOCKS (data.block)
00118     = blocks_nreverse (BLOCK_SUBBLOCKS (data.block));
00119 
00120   clear_block_marks (data.block);
00121   return 0;
00122 }

static void lower_omp_directive  )  [static]
 

Lower the OpenMP directive statement pointed by TSI.  DATA is
   passed through the recursion.   

Definition at line 160 of file gimple-low.c.

References lower_stmt_body(), NULL_TREE, OMP_BODY, tsi_delink(), tsi_link_before(), TSI_SAME_STMT, and tsi_stmt().

Referenced by lower_stmt().

00161 {
00162   tree stmt;
00163   
00164   stmt = tsi_stmt (*tsi);
00165 
00166   lower_stmt_body (OMP_BODY (stmt), data);
00167   tsi_link_before (tsi, stmt, TSI_SAME_STMT);
00168   tsi_link_before (tsi, OMP_BODY (stmt), TSI_SAME_STMT);
00169   OMP_BODY (stmt) = NULL_TREE;
00170   tsi_delink (tsi);
00171 }

static void lower_return_expr  )  [static]
 

Definition at line 502 of file gimple-low.c.

References build1, create_artificial_label(), EXPR_LOCUS, lower_data::return_statements, SET_EXPR_LOCUS, TREE_CHAIN, TREE_CODE, tree_cons, TREE_OPERAND, TREE_PURPOSE, TREE_VALUE, tsi_delink(), tsi_link_before(), TSI_SAME_STMT, tsi_stmt(), and void_type_node.

00503 {
00504   tree stmt = tsi_stmt (*tsi);
00505   tree value, t, label;
00506 
00507   /* Extract the value being returned.  */
00508   value = TREE_OPERAND (stmt, 0);
00509   if (value && TREE_CODE (value) == MODIFY_EXPR)
00510     value = TREE_OPERAND (value, 1);
00511 
00512   /* Match this up with an existing return statement that's been created.  */
00513   for (t = data->return_statements; t ; t = TREE_CHAIN (t))
00514     {
00515       tree tvalue = TREE_OPERAND (TREE_VALUE (t), 0);
00516       if (tvalue && TREE_CODE (tvalue) == MODIFY_EXPR)
00517         tvalue = TREE_OPERAND (tvalue, 1);
00518 
00519       if (value == tvalue)
00520         {
00521           label = TREE_PURPOSE (t);
00522           goto found;
00523         }
00524     }
00525 
00526   /* Not found.  Create a new label and record the return statement.  */
00527   label = create_artificial_label ();
00528   data->return_statements = tree_cons (label, stmt, data->return_statements);
00529 
00530   /* Generate a goto statement and remove the return statement.  */
00531  found:
00532   t = build1 (GOTO_EXPR, void_type_node, label);
00533   SET_EXPR_LOCUS (t, EXPR_LOCUS (stmt));
00534   tsi_link_before (tsi, t, TSI_SAME_STMT);
00535   tsi_delink (tsi);
00536 }

static void lower_return_expr tree_stmt_iterator ,
struct lower_data
[static]
 

Referenced by lower_stmt().

static void lower_stmt  )  [static]
 

Lowers statement TSI.  DATA is passed through the recursion.   

Definition at line 177 of file gimple-low.c.

References lower_data::block, CATCH_BODY, EH_FILTER_FAILURE, EXPR_HAS_LOCATION, lower_bind_expr(), lower_cond_expr(), lower_omp_directive(), lower_return_expr(), lower_stmt_body(), TREE_BLOCK, TREE_CODE, TREE_OPERAND, tsi_next(), and tsi_stmt().

00178 {
00179   tree stmt = tsi_stmt (*tsi);
00180 
00181   if (EXPR_HAS_LOCATION (stmt) && data)
00182     TREE_BLOCK (stmt) = data->block;
00183 
00184   switch (TREE_CODE (stmt))
00185     {
00186     case BIND_EXPR:
00187       lower_bind_expr (tsi, data);
00188       return;
00189     case COND_EXPR:
00190       lower_cond_expr (tsi, data);
00191       return;
00192     case RETURN_EXPR:
00193       lower_return_expr (tsi, data);
00194       return;
00195 
00196     case TRY_FINALLY_EXPR:
00197     case TRY_CATCH_EXPR:
00198       lower_stmt_body (TREE_OPERAND (stmt, 0), data);
00199       lower_stmt_body (TREE_OPERAND (stmt, 1), data);
00200       break;
00201     case CATCH_EXPR:
00202       lower_stmt_body (CATCH_BODY (stmt), data);
00203       break;
00204     case EH_FILTER_EXPR:
00205       lower_stmt_body (EH_FILTER_FAILURE (stmt), data);
00206       break;
00207       
00208     case NOP_EXPR:
00209     case ASM_EXPR:
00210     case MODIFY_EXPR:
00211     case CALL_EXPR:
00212     case GOTO_EXPR:
00213     case LABEL_EXPR:
00214     case SWITCH_EXPR:
00215     case OMP_FOR:
00216     case OMP_SECTIONS:
00217     case OMP_SECTION:
00218     case OMP_SINGLE:
00219     case OMP_MASTER:
00220     case OMP_ORDERED:
00221     case OMP_CRITICAL:
00222     case OMP_RETURN:
00223     case OMP_CONTINUE:
00224       break;
00225 
00226     case OMP_PARALLEL:
00227       lower_omp_directive (tsi, data);
00228       return;
00229 
00230     default:
00231       gcc_unreachable ();
00232     }
00233 
00234   tsi_next (tsi);
00235 }

static void lower_stmt tree_stmt_iterator ,
struct lower_data
[static]
 

Referenced by lower_stmt_body().

static void lower_stmt_body  )  [static]
 

Lowers the EXPR.  Unlike gimplification the statements are not relowered
   when they are changed -- if this has to be done, the lowering routine must
   do it explicitly.  DATA is passed through the recursion.   

Definition at line 147 of file gimple-low.c.

References lower_stmt(), tsi_end_p(), and tsi_start().

Referenced by lower_bind_expr(), lower_cond_expr(), lower_omp_directive(), and lower_stmt().

00148 {
00149   tree_stmt_iterator tsi;
00150 
00151   for (tsi = tsi_start (expr); !tsi_end_p (tsi); )
00152     lower_stmt (&tsi, data);
00153 }

static void mark_blocks_with_used_vars  )  [static]
 

Mark BLOCK used if it has a used variable in it, then recurse over its
   subblocks.   

Definition at line 585 of file gimple-low.c.

References BLOCK_VARS, TREE_CHAIN, and TREE_USED.

Referenced by mark_used_blocks().

00586 {
00587   tree var;
00588   tree subblock;
00589 
00590   if (!TREE_USED (block))
00591     {
00592       for (var = BLOCK_VARS (block);
00593            var;
00594            var = TREE_CHAIN (var))
00595         {
00596           if (TREE_USED (var))
00597             {
00598               TREE_USED (block) = true;
00599               break;
00600             }
00601         }
00602     }
00603   for (subblock = BLOCK_SUBBLOCKS (block);
00604        subblock;
00605        subblock = BLOCK_CHAIN (subblock))
00606     mark_blocks_with_used_vars (subblock);
00607 }

static unsigned int mark_used_blocks  )  [static]
 

Mark the used attribute on blocks correctly.   

Definition at line 612 of file gimple-low.c.

References current_function_decl, DECL_INITIAL, and mark_blocks_with_used_vars().

00613 {  
00614   mark_blocks_with_used_vars (DECL_INITIAL (current_function_decl));
00615   return 0;
00616 }

void record_vars  ) 
 

Record the variables in VARS into current_function_decl.   

Definition at line 575 of file gimple-low.c.

References current_function_decl, and record_vars_into().

Referenced by gimple_add_tmp_var(), lower_bind_expr(), and pop_gimplify_context().

00576 {
00577   record_vars_into (vars, current_function_decl);
00578 }

void record_vars_into  ) 
 

Record the variables in VARS into function FN.   

Definition at line 542 of file gimple-low.c.

References current_function_decl, DECL_EXTERNAL, DECL_STRUCT_FUNCTION, NULL_TREE, TREE_CHAIN, TREE_CODE, and tree_cons.

Referenced by record_vars().

00543 {
00544   struct function *saved_cfun = cfun;
00545 
00546   if (fn != current_function_decl)
00547     cfun = DECL_STRUCT_FUNCTION (fn);
00548 
00549   for (; vars; vars = TREE_CHAIN (vars))
00550     {
00551       tree var = vars;
00552 
00553       /* BIND_EXPRs contains also function/type/constant declarations
00554          we don't need to care about.  */
00555       if (TREE_CODE (var) != VAR_DECL)
00556         continue;
00557 
00558       /* Nothing to do in this case.  */
00559       if (DECL_EXTERNAL (var))
00560         continue;
00561 
00562       /* Record the variable.  */
00563       cfun->unexpanded_var_list = tree_cons (NULL_TREE, var,
00564                                              cfun->unexpanded_var_list);
00565     }
00566 
00567   if (fn != current_function_decl)
00568     cfun = saved_cfun;
00569 }

static bool try_catch_may_fallthru  )  [static]
 

Try to determine whether a TRY_CATCH expression can fall through.
   This is a subroutine of block_may_fallthru.   

Definition at line 295 of file gimple-low.c.

References block_may_fallthru(), CATCH_BODY, EH_FILTER_FAILURE, TREE_CODE, TREE_OPERAND, tsi_end_p(), tsi_next(), tsi_start(), and tsi_stmt().

Referenced by block_may_fallthru().

00296 {
00297   tree_stmt_iterator i;
00298 
00299   /* If the TRY block can fall through, the whole TRY_CATCH can
00300      fall through.  */
00301   if (block_may_fallthru (TREE_OPERAND (stmt, 0)))
00302     return true;
00303 
00304   i = tsi_start (TREE_OPERAND (stmt, 1));
00305   switch (TREE_CODE (tsi_stmt (i)))
00306     {
00307     case CATCH_EXPR:
00308       /* We expect to see a sequence of CATCH_EXPR trees, each with a
00309          catch expression and a body.  The whole TRY_CATCH may fall
00310          through iff any of the catch bodies falls through.  */
00311       for (; !tsi_end_p (i); tsi_next (&i))
00312         {
00313           if (block_may_fallthru (CATCH_BODY (tsi_stmt (i))))
00314             return true;
00315         }
00316       return false;
00317 
00318     case EH_FILTER_EXPR:
00319       /* The exception filter expression only matters if there is an
00320          exception.  If the exception does not match EH_FILTER_TYPES,
00321          we will execute EH_FILTER_FAILURE, and we will fall through
00322          if that falls through.  If the exception does match
00323          EH_FILTER_TYPES, the stack unwinder will continue up the
00324          stack, so we will not fall through.  We don't know whether we
00325          will throw an exception which matches EH_FILTER_TYPES or not,
00326          so we just ignore EH_FILTER_TYPES and assume that we might
00327          throw an exception which doesn't match.  */
00328       return block_may_fallthru (EH_FILTER_FAILURE (tsi_stmt (i)));
00329 
00330     default:
00331       /* This case represents statements to be executed when an
00332          exception occurs.  Those statements are implicitly followed
00333          by a RESX_EXPR to resume execution after the exception.  So
00334          in this case the TRY_CATCH never falls through.  */
00335       return false;
00336     }
00337 }


Variable Documentation

struct tree_opt_pass pass_lower_cf
 

Initial value:

 
{
  "lower",                              
  NULL,                                 
  lower_function_body,                  
  NULL,                                 
  NULL,                                 
  0,                                    
  0,                                    
  PROP_gimple_any,                      
  PROP_gimple_lcf,                      
  0,                                    
  0,                                    
  TODO_dump_func,                       
  0                                     
}

Definition at line 124 of file gimple-low.c.

struct tree_opt_pass pass_mark_used_blocks
 

Initial value:

 
{
  "blocks",                             
  NULL,                                 
  mark_used_blocks,                     
  NULL,                                 
  NULL,                                 
  0,                                    
  0,                                    
  0,                                    
  0,                                    
  0,                                    
  0,                                    
  TODO_dump_func,                       
  0                                     
}

Definition at line 619 of file gimple-low.c.


Generated on Sun Sep 17 18:03:35 2006 for Tree SSA by  doxygen 1.4.6