https://gcc.gnu.org/g:079ca47d41e5030c63cca7f8ee679e7323a26d45
commit 079ca47d41e5030c63cca7f8ee679e7323a26d45 Author: Pranil Dey <mkd...@gmail.com> Date: Tue Oct 1 09:46:48 2024 +0530 Updated parameters of functions and typecasted resx stmts Diff: --- gcc/tree-eh.cc | 23 +++++++++++++---------- gcc/tree-eh.h | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc index ea9a2ca6bb00..8e7629164b7d 100644 --- a/gcc/tree-eh.cc +++ b/gcc/tree-eh.cc @@ -2346,18 +2346,20 @@ void update_stmt_eh_region (gimple *stmt) { while (region) { switch (region->type) { case ERT_CLEANUP: - if(gimple_code (stmt) == GIMPLE_RESX){ - gimple_resx_set_region(stmt, region->index); + if (gimple_code (stmt) == GIMPLE_RESX){ + gresx *resx_stmt = as_a <gresx *> (stmt); + gimple_resx_set_region (resx_stmt, region->index); } - *cfun->eh->throw_stmt_table->get (const_cast<gimple *> (stmt)) = lp->index; + else *cfun->eh->throw_stmt_table->get (const_cast<gimple *> (stmt)) = lp->index; return; case ERT_TRY: if (match_lp (lp, &exception_types)) { - if(gimple_code (stmt) == GIMPLE_RESX){ - gimple_resx_set_region(stmt, region->index); + if (gimple_code (stmt) == GIMPLE_RESX){ + gresx *resx_stmt = as_a <gresx *> (stmt); + gimple_resx_set_region (resx_stmt, region->index); } - *cfun->eh->throw_stmt_table->get (const_cast<gimple *> (stmt)) = lp->index; + else *cfun->eh->throw_stmt_table->get (const_cast<gimple *> (stmt)) = lp->index; return; } break; @@ -2378,8 +2380,9 @@ void update_stmt_eh_region (gimple *stmt) { region = region->outer; } - if(gimple_code (stmt) == GIMPLE_RESX){ - gimple_resx_set_region(stmt, -1); + if (gimple_code (stmt) == GIMPLE_RESX){ + gresx *resx_stmt = as_a <gresx *> (stmt); + gimple_resx_set_region (resx_stmt, 0); } else remove_stmt_from_eh_lp_fn (cfun, stmt); } @@ -3075,7 +3078,7 @@ void extract_types_for_resx (gimple *resx_stmt, vec<tree> *ret_vector) { basic_block bb = gimple_bb (resx_stmt); // Iterate over edges to walk up the basic blocks - FOR_EACH_EDGE (e, ei, bb->pred) + FOR_EACH_EDGE (e, ei, bb->preds) { // Get the last stmt of the basic block as it is an EH stmt bb = e->src; @@ -3115,7 +3118,7 @@ void extract_fun_resx_types (function *fun, vec<tree> *ret_vector) { gimple *stmt = gsi_stmt (gsi); vec<tree> *ret_vector; - if (stmt_can_throw_external (stmt)){ + if (stmt_can_throw_external (fun, stmt)){ if (gimple_code (stmt) == GIMPLE_RESX){ extract_types_for_resx (stmt, ret_vector); } diff --git a/gcc/tree-eh.h b/gcc/tree-eh.h index ea5cefc9fd29..4d816fd93c85 100644 --- a/gcc/tree-eh.h +++ b/gcc/tree-eh.h @@ -44,7 +44,7 @@ extern tree rewrite_to_non_trapping_overflow (tree); extern void extract_exception_types_for_call (gcall *, vec<tree> *); extern bool stmt_throw_types (function *, gimple *, vec<tree> *); extern void extract_types_for_resx (gimple *, vec<tree> *); -extern void extract_fun_resx_types (function *); +extern void extract_fun_resx_types (function *, vec<tree> *); extern bool stmt_could_throw_p (function *, gimple *); extern bool stmt_unremovable_because_of_non_call_eh_p (function *, gimple *); extern bool tree_could_throw_p (tree);