This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix handling of calls wrt EH
> > On Fri, May 13, 2005 at 05:26:54AM +0200, Jan Hubicka wrote:
> > > + /* ??? For the benefit of calls.c, converting all this to rtl,
> > > + we need to record the call expression, not just the outer
> > > + modify statement. */
> > > + if ((TREE_CODE (t) == MODIFY_EXPR
> > > + || TREE_CODE (t) == RETURN_EXPR)
> > > + && (t = get_call_expr_in (t)))
> > > + add_stmt_to_eh_region_fn (ifun, t, num);
> >
> > If we're going to do this, I think we should rearrange add_stmt_eh_region
> > and record_stmt_eh_region (and their callers) such that we only do this in
> > one place.
> >
> > And did you really need to check RETURN_EXPR? We're not testing for that
> > in lower_eh_constructs_1. Either your test is unnecessary or we've got a
> > latent bug.
>
> I guess it is not neccesary, I just copied what the old code did without
> much thinking abou it ;(
> Does the attached patch seem to make more sense (I just started testing
> it)
> I guess I can also add verify_flow_info check that call_expr is in sync
> (I have few extra EH checking bits so I will push this out together if
> we decide to walk this way)
Doh, forgot one extra RETURN_EXPR check few lines down. Fixed thus and
bootstrapped/regtested i686-pc-gnu-linux.
2005-05-13 Jan Hubicka <jh@suse.cz>
* tree-cfg.c (execute_warn_function_return): Break out noreturn
warning too..
(execute_warn_function_noreturn): ... here.
(pass_warn_function_noreturn): New pass.
* tree-pass.h (pass_warn_function_noreturn): Declare
* tree-optimize.c (init_tree_optimization_passes): Move return
warnings early and add noreturn warnings at place of previous
return warnings.
Index: tree-eh.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-eh.c,v
retrieving revision 2.35
diff -c -3 -p -r2.35 tree-eh.c
*** tree-eh.c 12 May 2005 19:29:21 -0000 2.35
--- tree-eh.c 13 May 2005 20:06:31 -0000
*************** struct_ptr_hash (const void *a)
*** 84,102 ****
static void
record_stmt_eh_region (struct eh_region *region, tree t)
{
- struct throw_stmt_node *n;
- void **slot;
-
if (!region)
return;
! n = ggc_alloc (sizeof (*n));
! n->stmt = t;
! n->region_nr = get_eh_region_number (region);
!
! slot = htab_find_slot (get_eh_throw_stmt_table (cfun), n, INSERT);
! gcc_assert (!*slot);
! *slot = n;
}
void
--- 84,93 ----
static void
record_stmt_eh_region (struct eh_region *region, tree t)
{
if (!region)
return;
! add_stmt_to_eh_region (t, get_eh_region_number (region));
}
void
*************** add_stmt_to_eh_region_fn (struct functio
*** 120,125 ****
--- 111,122 ----
slot = htab_find_slot (get_eh_throw_stmt_table (ifun), n, INSERT);
gcc_assert (!*slot);
*slot = n;
+ /* ??? For the benefit of calls.c, converting all this to rtl,
+ we need to record the call expression, not just the outer
+ modify statement. */
+ if (TREE_CODE (t) == MODIFY_EXPR
+ && (t = get_call_expr_in (t)))
+ add_stmt_to_eh_region_fn (ifun, t, num);
}
void
*************** remove_stmt_from_eh_region_fn (struct fu
*** 143,148 ****
--- 140,151 ----
if (slot)
{
htab_clear_slot (get_eh_throw_stmt_table (ifun), slot);
+ /* ??? For the benefit of calls.c, converting all this to rtl,
+ we need to record the call expression, not just the outer
+ modify statement. */
+ if (TREE_CODE (t) == MODIFY_EXPR
+ && (t = get_call_expr_in (t)))
+ remove_stmt_from_eh_region_fn (ifun, t);
return true;
}
else
*************** lower_eh_constructs_1 (struct leh_state
*** 1618,1634 ****
/* Look for things that can throw exceptions, and record them. */
if (state->cur_region && tree_could_throw_p (t))
{
- tree op;
-
record_stmt_eh_region (state->cur_region, t);
note_eh_region_may_contain_throw (state->cur_region);
-
- /* ??? For the benefit of calls.c, converting all this to rtl,
- we need to record the call expression, not just the outer
- modify statement. */
- op = get_call_expr_in (t);
- if (op)
- record_stmt_eh_region (state->cur_region, op);
}
break;
--- 1621,1628 ----
*************** lower_eh_constructs (void)
*** 1689,1697 ****
tree *tp = &DECL_SAVED_TREE (current_function_decl);
finally_tree = htab_create (31, struct_ptr_hash, struct_ptr_eq, free);
- set_eh_throw_stmt_table (cfun, htab_create_ggc (31, struct_ptr_hash,
- struct_ptr_eq,
- ggc_free));
collect_finally_tree (*tp, NULL);
--- 1683,1688 ----