final.c (final_scan_insn): Apply the effects of frame-related delay slot insns before...
authorRichard Sandiford <rsandifo@redhat.com>
Tue, 13 May 2003 18:51:57 +0000 (18:51 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 13 May 2003 18:51:57 +0000 (18:51 +0000)
* final.c (final_scan_insn): Apply the effects of frame-related
delay slot insns before emitting a delayed branch.

From-SVN: r66774

gcc/ChangeLog
gcc/final.c

index 9f3a51f3c89e8c59536439e6a52009a24ab898c0..0fac8ca296497d11910f620dd2f63bf2132e8fd9 100644 (file)
@@ -1,3 +1,8 @@
+2003-05-13  Richard Sandiford  <rsandifo@redhat.com>
+
+       * final.c (final_scan_insn): Apply the effects of frame-related
+       delay slot insns before emitting a delayed branch.
+
 2003-05-13  Nick Clifton  <nickc@redhat.com>
 
        * config/mcore/mcore.md (jump): Use emit_jump_insn.
index 86b0b2f6f41b634f76af76c168d32c00876dcb10..0907411efbe2491b8f9799f59ebb1c82a604224f 100644 (file)
@@ -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