From d660cefe65aba85a809c01e104b1480df13952d1 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 13 May 2003 18:51:57 +0000 Subject: [PATCH] final.c (final_scan_insn): Apply the effects of frame-related delay slot insns before emitting a delayed... * final.c (final_scan_insn): Apply the effects of frame-related delay slot insns before emitting a delayed branch. From-SVN: r66774 --- gcc/ChangeLog | 5 +++++ gcc/final.c | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f3a51f3c89..0fac8ca2964 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-05-13 Richard Sandiford + + * final.c (final_scan_insn): Apply the effects of frame-related + delay slot insns before emitting a delayed branch. + 2003-05-13 Nick Clifton * config/mcore/mcore.md (jump): Use emit_jump_insn. diff --git a/gcc/final.c b/gcc/final.c index 86b0b2f6f41..0907411efbe 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -2160,6 +2160,14 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes) break; final_sequence = body; + /* Record the delay slots' frame information before the branch. + This is needed for delayed calls: see execute_cfa_program(). */ +#if defined (DWARF2_UNWIND_INFO) + if (dwarf2out_do_frame ()) + for (i = 1; i < XVECLEN (body, 0); i++) + dwarf2out_frame_debug (XVECEXP (body, 0, i)); +#endif + /* The first insn in this SEQUENCE might be a JUMP_INSN that will force the restoration of a comparison that was previously thought unnecessary. If that happens, cancel this sequence @@ -2514,17 +2522,18 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes) output_asm_insn (template, recog_data.operand); + /* If necessary, report the effect that the instruction has on + the unwind info. We've already done this for delay slots + and call instructions. */ #if defined (DWARF2_UNWIND_INFO) -#if defined (HAVE_prologue) - if (GET_CODE (insn) == INSN && dwarf2out_do_frame ()) - dwarf2out_frame_debug (insn); -#else - if (!ACCUMULATE_OUTGOING_ARGS - && GET_CODE (insn) == INSN + if (GET_CODE (insn) == INSN +#if !defined (HAVE_prologue) + && !ACCUMULATE_OUTGOING_ARGS +#endif + && final_sequence == 0 && dwarf2out_do_frame ()) dwarf2out_frame_debug (insn); #endif -#endif #if 0 /* It's not at all clear why we did this and doing so interferes -- 2.30.2