diff options
Diffstat (limited to 'gcc/final.c')
-rw-r--r-- | gcc/final.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/gcc/final.c b/gcc/final.c index 86b0b2f..0907411 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 |