diff options
author | Jan Hubicka <jh@suse.cz> | 2009-04-05 20:33:13 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2009-04-05 18:33:13 +0000 |
commit | 12633413c6a0c00e21075294205cd432daa4461b (patch) | |
tree | 4f93df0c2ba4fa10a2b50ba85da732b1679db504 /gcc/except.c | |
parent | beb64b4a00894739c738e1bcb3a40e2dc3e6c9e4 (diff) | |
download | gcc-12633413c6a0c00e21075294205cd432daa4461b.zip gcc-12633413c6a0c00e21075294205cd432daa4461b.tar.gz gcc-12633413c6a0c00e21075294205cd432daa4461b.tar.bz2 |
except.c (sjlj_find_directly_reachable_regions): Be ready for removed toplevel regions.
* except.c (sjlj_find_directly_reachable_regions): Be ready for removed toplevel
regions.
(sjlj_mark_call_sites): Likewise.
From-SVN: r145565
Diffstat (limited to 'gcc/except.c')
-rw-r--r-- | gcc/except.c | 23 |
1 files changed, 14 insertions, 9 deletions
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; |