91th Cygnus<->FSF quick merge
authorMike Stump <mrs@cygnus.com>
Thu, 29 May 1997 20:29:01 +0000 (20:29 +0000)
committerMike Stump <mrs@gcc.gnu.org>
Thu, 29 May 1997 20:29:01 +0000 (20:29 +0000)
From-SVN: r14139

gcc/cp/ChangeLog
gcc/cp/except.c

index a61f4ee9158dee095b75d6d71a7f3cbd748fb757..ccf8c1cb5f3ebbf26a0c6d6d9d09f6889d4184c8 100644 (file)
@@ -1,3 +1,14 @@
+Thu May 29 13:02:06 1997  Mike Stump  <mrs@cygnus.com>
+
+       * except.c (expand_exception_blocks): Simplify and fix and make
+       sure we don't end a region in a sequence, as expand_end_bindings
+       doesn't like it.
+
+Wed May 28 17:08:03 1997  Mike Stump  <mrs@cygnus.com>
+
+       * except.c (init_exception_processing): Mark terminate as not
+       returning so that the optimizer can optimize better.
+
 Tue May 27 19:49:19 1997  Mike Stump  <mrs@cygnus.com>
 
        * cvt.c (convert): Don't do any extra work, if we can avoid it
index 83363db7033fd8f265685399376a9bb6a83bc44e..eb2a2559f84c167a56d7b45b5e01be885fe96ca4 100644 (file)
@@ -262,6 +262,7 @@ init_exception_processing ()
                                     vtype, NOT_BUILT_IN);
   terminate_fndecl = auto_function (get_identifier ("terminate"),
                                    vtype, NOT_BUILT_IN);
+  TREE_THIS_VOLATILE (terminate_fndecl) = 1;
 
   push_lang_context (lang_name_c);
 
@@ -916,25 +917,11 @@ expand_end_eh_spec (raises)
 void
 expand_exception_blocks ()
 {
-  rtx funcend;
-  rtx insns;
-
-  start_sequence ();
-
-  funcend = gen_label_rtx ();
-
-  start_sequence ();
-
-  /* Add all the catch clauses here.  */
-  emit_insns (catch_clauses);
-  catch_clauses = NULL_RTX;
-
+  push_to_sequence (catch_clauses);
   expand_leftover_cleanups ();
-
-  insns = get_insns ();
+  catch_clauses = get_insns ();
   end_sequence ();
 
-#if 1
   /* Do this after we expand leftover cleanups, so that the
      expand_eh_region_end that expand_end_eh_spec does will match the
      right expand_eh_region_start, and make sure it comes out before
@@ -942,20 +929,17 @@ expand_exception_blocks ()
   if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
     {
      expand_end_eh_spec (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)));
-     push_to_sequence (insns);
-
-     /* Now expand any new ones.  */
+     push_to_sequence (catch_clauses);
      expand_leftover_cleanups ();
-
-     insns = get_insns ();
+     catch_clauses = get_insns ();
      end_sequence ();
     }
-#endif
-
-  emit_jump (funcend);
 
-  if (insns)
+  if (catch_clauses)
     {
+      rtx funcend = gen_label_rtx ();
+      emit_jump (funcend);
+
       /* We cannot protect n regions this way if we must flow into the
         EH region through the top of the region, as we have to with
         the setjmp/longjmp approach.  */
@@ -967,23 +951,16 @@ expand_exception_blocks ()
          expand_eh_region_start ();
        }
 
-      emit_insns (insns);
+      emit_insns (catch_clauses);
+      catch_clauses = NULL_RTX;
 
       if (exceptions_via_longjmp == 0)
        expand_eh_region_end (TerminateFunctionCall);
 
       expand_leftover_cleanups ();
-    }
 
-  emit_label (funcend);
-
-  /* Only if we had previous insns do we want to emit the jump around
-     them.  If there weren't any, then insns will remain NULL_RTX.  */
-  if (insns)
-    insns = get_insns ();
-  end_sequence ();
-
-  emit_insns (insns);
+      emit_label (funcend);
+    }
 }
 
 tree