re PR target/51552 (bfin generates bad assembly)
PR target/51552 * dwarf2cfi.c (dwarf2out_frame_debug): Move any_cfis_emitted code... (scan_trace): ... here. From-SVN: r182604
This commit is contained in:
parent
c65b06073c
commit
67d7405ef4
@ -1,3 +1,9 @@
|
||||
2011-12-21 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR target/51552
|
||||
* dwarf2cfi.c (dwarf2out_frame_debug): Move any_cfis_emitted code...
|
||||
(scan_trace): ... here.
|
||||
|
||||
2011-12-21 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* doc/standards.texi (C++ language): Update for C++11.
|
||||
|
@ -1930,9 +1930,6 @@ dwarf2out_frame_debug (rtx insn)
|
||||
{
|
||||
rtx note, n;
|
||||
bool handled_one = false;
|
||||
bool need_flush = false;
|
||||
|
||||
any_cfis_emitted = false;
|
||||
|
||||
for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
|
||||
switch (REG_NOTE_KIND (note))
|
||||
@ -2020,8 +2017,7 @@ dwarf2out_frame_debug (rtx insn)
|
||||
break;
|
||||
|
||||
case REG_CFA_FLUSH_QUEUE:
|
||||
/* The actual flush happens below. */
|
||||
need_flush = true;
|
||||
/* The actual flush happens elsewhere. */
|
||||
handled_one = true;
|
||||
break;
|
||||
|
||||
@ -2029,13 +2025,7 @@ dwarf2out_frame_debug (rtx insn)
|
||||
break;
|
||||
}
|
||||
|
||||
if (handled_one)
|
||||
{
|
||||
/* Minimize the number of advances by emitting the entire queue
|
||||
once anything is emitted. */
|
||||
need_flush |= any_cfis_emitted;
|
||||
}
|
||||
else
|
||||
if (!handled_one)
|
||||
{
|
||||
insn = PATTERN (insn);
|
||||
do_frame_expr:
|
||||
@ -2044,12 +2034,9 @@ dwarf2out_frame_debug (rtx insn)
|
||||
/* Check again. A parallel can save and update the same register.
|
||||
We could probably check just once, here, but this is safer than
|
||||
removing the check at the start of the function. */
|
||||
if (any_cfis_emitted || clobbers_queued_reg_save (insn))
|
||||
need_flush = true;
|
||||
if (clobbers_queued_reg_save (insn))
|
||||
dwarf2out_flush_queued_reg_saves ();
|
||||
}
|
||||
|
||||
if (need_flush)
|
||||
dwarf2out_flush_queued_reg_saves ();
|
||||
}
|
||||
|
||||
/* Emit CFI info to change the state from OLD_ROW to NEW_ROW. */
|
||||
@ -2489,6 +2476,7 @@ scan_trace (dw_trace_info *trace)
|
||||
|
||||
/* Make sure any register saves are visible at the jump target. */
|
||||
dwarf2out_flush_queued_reg_saves ();
|
||||
any_cfis_emitted = false;
|
||||
|
||||
/* However, if there is some adjustment on the call itself, e.g.
|
||||
a call_pop, that action should be considered to happen after
|
||||
@ -2508,6 +2496,7 @@ scan_trace (dw_trace_info *trace)
|
||||
|| clobbers_queued_reg_save (insn)
|
||||
|| find_reg_note (insn, REG_CFA_FLUSH_QUEUE, NULL))
|
||||
dwarf2out_flush_queued_reg_saves ();
|
||||
any_cfis_emitted = false;
|
||||
|
||||
add_cfi_insn = insn;
|
||||
scan_insn_after (insn);
|
||||
@ -2518,6 +2507,12 @@ scan_trace (dw_trace_info *trace)
|
||||
emitted two cfa adjustments. Do it now. */
|
||||
def_cfa_1 (&this_cfa);
|
||||
|
||||
/* Minimize the number of advances by emitting the entire queue
|
||||
once anything is emitted. */
|
||||
if (any_cfis_emitted
|
||||
|| find_reg_note (insn, REG_CFA_FLUSH_QUEUE, NULL))
|
||||
dwarf2out_flush_queued_reg_saves ();
|
||||
|
||||
/* Note that a test for control_flow_insn_p does exactly the
|
||||
same tests as are done to actually create the edges. So
|
||||
always call the routine and let it not create edges for
|
||||
|
Loading…
Reference in New Issue
Block a user