diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/except.c | 23 |
2 files changed, 20 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0f0405..74b0f8d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-04-04 Jan Hubicka <jh@suse.cz> + + * except.c (sjlj_find_directly_reachable_regions): Be ready for removed toplevel + regions. + (sjlj_mark_call_sites): Likewise. + 2009-04-04 Dave Korn <dave.korn.cygwin@gmail.com> * config.gcc (cygwin tm_file): Add cygwin-stdint.h. diff --git a/gcc/except.c b/gcc/except.c index 2651e99..e0e90d2 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1930,6 +1930,8 @@ sjlj_find_directly_reachable_regions (struct sjlj_lp_info *lp_info) continue; region = VEC_index (eh_region, cfun->eh->region_array, INTVAL (XEXP (note, 0))); + if (!region) + continue; type_thrown = NULL_TREE; if (region->type == ERT_THROW) @@ -2040,7 +2042,17 @@ sjlj_mark_call_sites (struct sjlj_lp_info *lp_info) continue; note = find_reg_note (insn, REG_EH_REGION, NULL_RTX); - if (!note) + + /* Calls that are known to not throw need not be marked. */ + if (note && INTVAL (XEXP (note, 0)) <= 0) + continue; + + if (note) + region = VEC_index (eh_region, cfun->eh->region_array, INTVAL (XEXP (note, 0))); + else + region = NULL; + + if (!region) { /* Calls (and trapping insns) without notes are outside any exception handling region in this function. Mark them as @@ -2053,14 +2065,7 @@ sjlj_mark_call_sites (struct sjlj_lp_info *lp_info) continue; } else - { - /* Calls that are known to not throw need not be marked. */ - if (INTVAL (XEXP (note, 0)) <= 0) - continue; - - region = VEC_index (eh_region, cfun->eh->region_array, INTVAL (XEXP (note, 0))); - this_call_site = lp_info[region->region_number].call_site_index; - } + this_call_site = lp_info[region->region_number].call_site_index; if (this_call_site == last_call_site) continue; |