From e292dbb06b68cd9f03055dff06de8989715ac2b8 Mon Sep 17 00:00:00 2001 From: Waldek Hebisch Date: Fri, 5 Dec 2003 12:11:08 +0100 Subject: [PATCH] stmt.c (expand_nl_goto_receiver): Copy hard register clobbers and ASM_INPUT barrier from... * stmt.c (expand_nl_goto_receiver): Copy hard register clobbers and ASM_INPUT barrier from expand_builtin_setjmp_receiver. * gcc.c-torture/execute/nestfunc-5.c: New. From-SVN: r74326 --- gcc/ChangeLog | 5 +++ gcc/stmt.c | 15 ++++++++ .../gcc.c-torture/execute/nestfunc-5.c | 36 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/nestfunc-5.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e492f702dfd..1105644a9b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-12-05 Waldek Hebisch + + * stmt.c (expand_nl_goto_receiver): Copy hard register clobbers + and ASM_INPUT barrier from expand_builtin_setjmp_receiver. + 2003-12-05 Richard Sandiford * config/mips/mips.c (mips_expand_call): Don't allow laziy binding diff --git a/gcc/stmt.c b/gcc/stmt.c index 324789da312..bc52a6b096b 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -3558,6 +3558,14 @@ expand_nl_handler_label (rtx slot, rtx before_insn) static void expand_nl_goto_receiver (void) { + /* Clobber the FP when we get here, so we have to make sure it's + marked as used by this function. */ + emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx)); + + /* Mark the static chain as clobbered here so life information + doesn't get messed up for it. */ + emit_insn (gen_rtx_CLOBBER (VOIDmode, static_chain_rtx)); + #ifdef HAVE_nonlocal_goto if (! HAVE_nonlocal_goto) #endif @@ -3606,6 +3614,13 @@ expand_nl_goto_receiver (void) if (HAVE_nonlocal_goto_receiver) emit_insn (gen_nonlocal_goto_receiver ()); #endif + + /* @@@ This is a kludge. Not all machine descriptions define a blockage + insn, but we must not allow the code we just generated to be reordered + by scheduling. Specifically, the update of the frame pointer must + happen immediately, not later. So emit an ASM_INPUT to act as blockage + insn. */ + emit_insn (gen_rtx_ASM_INPUT (VOIDmode, "")); } /* Make handlers for nonlocal gotos taking place in the function calls in diff --git a/gcc/testsuite/gcc.c-torture/execute/nestfunc-5.c b/gcc/testsuite/gcc.c-torture/execute/nestfunc-5.c new file mode 100644 index 00000000000..88e74cc904c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/nestfunc-5.c @@ -0,0 +1,36 @@ +extern void abort (void); +extern void exit (int); + +#ifndef NO_TRAMPOLINES +static void recursive (int n, void (*proc) (void)) +{ + __label__ l1; + + void do_goto (void) + { + goto l1; + } + + if (n == 3) + recursive (n - 1, do_goto); + else if (n > 0) + recursive (n - 1, proc); + else + (*proc) (); + return; + +l1: + if (n == 3) + exit (0); + else + abort (); +} + +int main () +{ + recursive (10, abort); + abort (); +} +#else +int main () { return 0; } +#endif -- 2.30.2