From 815eb8f0ca3d0b677b5694781ac9b2809e39cd08 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 2 Dec 2005 06:15:54 +0000 Subject: [PATCH] re PR middle-end/25176 ([4.0 only] FAIL: Array_3 -O3 execution - bytecode->native test) PR middle-end/25176 * function.c (expand_function_end): Emit blockage for unwinder after return label. From-SVN: r107871 --- gcc/ChangeLog | 6 ++++++ gcc/function.c | 29 +++++++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a3c113adcff..d33807b378e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-12-02 Alan Modra + + PR middle-end/25176 + * function.c (expand_function_end): Emit blockage for unwinder + after return label. + 2005-12-01 Roger Sayle * tree.h (TREE_OVERFLOW): Make this flag/predicate specific to diff --git a/gcc/function.c b/gcc/function.c index c0339b8950e..ff80df70b28 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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. */ -- 2.30.2