aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/except.c23
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;