]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/25176 ([4.0 only] FAIL: Array_3 -O3 execution - bytecode->native...
authorAlan Modra <amodra@bigpond.net.au>
Fri, 2 Dec 2005 06:15:54 +0000 (06:15 +0000)
committerAlan Modra <amodra@gcc.gnu.org>
Fri, 2 Dec 2005 06:15:54 +0000 (16:45 +1030)
PR middle-end/25176
* function.c (expand_function_end): Emit blockage for unwinder
after return label.

From-SVN: r107871

gcc/ChangeLog
gcc/function.c

index a3c113adcff02dc8794a282dd78aabaee67237d3..d33807b378ee9804e01cd867fce26e26c484e64b 100644 (file)
@@ -1,3 +1,9 @@
+2005-12-02  Alan Modra  <amodra@bigpond.net.au>
+
+       PR middle-end/25176
+       * function.c (expand_function_end): Emit blockage for unwinder
+       after return label.
+
 2005-12-01  Roger Sayle  <roger@eyesopen.com>
 
        * tree.h (TREE_OVERFLOW): Make this flag/predicate specific to
index c0339b8950e54b84fa2ea37feb10e9a014522de5..ff80df70b28104a5a764868ccf55350fa07e415c 100644 (file)
@@ -4334,14 +4334,6 @@ expand_function_end (void)
   clear_pending_stack_adjust ();
   do_pending_stack_adjust ();
 
-  /* @@@ This is a kludge.  We want to ensure that instructions that
-     may trap are not moved into the epilogue by scheduling, because
-     we don't always emit unwind information for the epilogue.
-     However, not all machine descriptions define a blockage insn, so
-     emit an ASM_INPUT to act as one.  */
-  if (flag_non_call_exceptions)
-    emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
-
   /* Mark the end of the function body.
      If control reaches this insn, the function can drop through
      without returning a value.  */
@@ -4373,10 +4365,23 @@ expand_function_end (void)
   /* Output the label for the actual return from the function.  */
   emit_label (return_label);
 
-  /* Let except.c know where it should emit the call to unregister
-     the function context for sjlj exceptions.  */
-  if (flag_exceptions && USING_SJLJ_EXCEPTIONS)
-    sjlj_emit_function_exit_after (get_last_insn ());
+  if (USING_SJLJ_EXCEPTIONS)
+    {
+      /* Let except.c know where it should emit the call to unregister
+        the function context for sjlj exceptions.  */
+      if (flag_exceptions)
+       sjlj_emit_function_exit_after (get_last_insn ());
+    }
+  else
+    {
+      /* @@@ This is a kludge.  We want to ensure that instructions that
+        may trap are not moved into the epilogue by scheduling, because
+        we don't always emit unwind information for the epilogue.
+        However, not all machine descriptions define a blockage insn, so
+        emit an ASM_INPUT to act as one.  */
+      if (flag_non_call_exceptions)
+       emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
+    }
 
   /* If this is an implementation of throw, do what's necessary to
      communicate between __builtin_eh_return and the epilogue.  */