OSDN Git Service

* except.c (sjlj_find_directly_reachable_regions): Be ready for removed toplevel
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Apr 2009 18:33:13 +0000 (18:33 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Apr 2009 18:33:13 +0000 (18:33 +0000)
regions.
(sjlj_mark_call_sites): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145565 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/except.c

index b0f0405..74b0f8d 100644 (file)
@@ -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.
index 2651e99..e0e90d2 100644 (file)
@@ -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;