except.c (remove_fixup_regions): Adjust REG_EH_REGION notes to the parent of the...
authorRichard Henderson <rth@gcc.gnu.org>
Sat, 5 May 2001 16:38:25 +0000 (09:38 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 5 May 2001 16:38:25 +0000 (09:38 -0700)
        * except.c (remove_fixup_regions): Adjust REG_EH_REGION notes
        to the parent of the fixup region.

From-SVN: r41867

gcc/ChangeLog
gcc/except.c

index 83355b1a0a82f8d3733cb892ee189f7b069242f6..3b9b4a60eb03a5668f71455e5a2a434778938c86 100644 (file)
@@ -1,4 +1,9 @@
-2001-05-05  Jakub Jelinek  <jakub@redhat.com
+2001-05-05  Richard Henderson  <rth@redhat.com>
+
+       * except.c (remove_fixup_regions): Adjust REG_EH_REGION notes
+       to the parent of the fixup region.
+
+2001-05-05  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.c (cpp_options): Define __NO_INLINE__ unless we are honoring
        "inline" keyword.
index a0158126b2b5f001e528df25f3535d10fda5ab93..b21769c28f97418d5eb681e8b192cf2b0e43f509 100644 (file)
@@ -1101,11 +1101,30 @@ static void
 remove_fixup_regions ()
 {
   int i;
+  rtx insn, note;
+  struct eh_region *fixup;
 
+  /* Walk the insn chain and adjust the REG_EH_REGION numbers
+     for instructions referencing fixup regions.  This is only
+     strictly necessary for fixup regions with no parent, but
+     doesn't hurt to do it for all regions.  */
+  for (insn = get_insns(); insn ; insn = NEXT_INSN (insn))
+    if (INSN_P (insn)
+       && (note = find_reg_note (insn, REG_EH_REGION, NULL))
+       && INTVAL (XEXP (note, 0)) > 0
+       && (fixup = cfun->eh->region_array[INTVAL (XEXP (note, 0))])
+       && fixup->type == ERT_FIXUP)
+      {
+       if (fixup->u.fixup.real_region)
+         XEXP (note, 1) = GEN_INT (fixup->u.fixup.real_region->region_number);
+       else
+         remove_note (insn, note);
+      }
+
+  /* Remove the fixup regions from the tree.  */
   for (i = cfun->eh->last_region_number; i > 0; --i)
     {
-      struct eh_region *fixup = cfun->eh->region_array[i];
-
+      fixup = cfun->eh->region_array[i];
       if (! fixup)
        continue;