mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-12 07:20:27 +08:00
function.c (thread_prologue_and_epilogue_insns): Make sure existing line number notes appear after the prologue.
* function.c (thread_prologue_and_epilogue_insns): Make sure existing line number notes appear after the prologue. From-SVN: r34098
This commit is contained in:
parent
941cc05afd
commit
ca1117ccf7
@ -1,3 +1,8 @@
|
||||
2000-05-22 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* function.c (thread_prologue_and_epilogue_insns): Make sure
|
||||
existing line number notes appear after the prologue.
|
||||
|
||||
Mon May 22 21:49:00 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
* config/alpha/alpha.c (alpha_fnname): New static variable.
|
||||
|
@ -6812,15 +6812,16 @@ void
|
||||
thread_prologue_and_epilogue_insns (f)
|
||||
rtx f ATTRIBUTE_UNUSED;
|
||||
{
|
||||
int insertted = 0;
|
||||
int inserted = 0;
|
||||
edge e;
|
||||
rtx seq;
|
||||
#ifdef HAVE_prologue
|
||||
rtx prologue_end = NULL_RTX;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_prologue
|
||||
if (HAVE_prologue)
|
||||
{
|
||||
rtx insn;
|
||||
|
||||
start_sequence ();
|
||||
seq = gen_prologue();
|
||||
emit_insn (seq);
|
||||
@ -6829,26 +6830,7 @@ thread_prologue_and_epilogue_insns (f)
|
||||
if (GET_CODE (seq) != SEQUENCE)
|
||||
seq = get_insns ();
|
||||
record_insns (seq, &prologue);
|
||||
emit_note (NULL, NOTE_INSN_PROLOGUE_END);
|
||||
|
||||
/* GDB handles `break f' by setting a breakpoint on the first
|
||||
line note *after* the prologue. That means that we should
|
||||
insert a line note here; otherwise, if the next line note
|
||||
comes part way into the next block, GDB will skip all the way
|
||||
to that point. */
|
||||
insn = next_nonnote_insn (f);
|
||||
while (insn)
|
||||
{
|
||||
if (GET_CODE (insn) == NOTE
|
||||
&& NOTE_LINE_NUMBER (insn) >= 0)
|
||||
{
|
||||
emit_line_note_force (NOTE_SOURCE_FILE (insn),
|
||||
NOTE_LINE_NUMBER (insn));
|
||||
break;
|
||||
}
|
||||
|
||||
insn = PREV_INSN (insn);
|
||||
}
|
||||
prologue_end = emit_note (NULL, NOTE_INSN_PROLOGUE_END);
|
||||
|
||||
seq = gen_sequence ();
|
||||
end_sequence ();
|
||||
@ -6862,7 +6844,7 @@ thread_prologue_and_epilogue_insns (f)
|
||||
abort ();
|
||||
|
||||
insert_insn_on_edge (seq, ENTRY_BLOCK_PTR->succ);
|
||||
insertted = 1;
|
||||
inserted = 1;
|
||||
}
|
||||
else
|
||||
emit_insn_after (seq, f);
|
||||
@ -6977,7 +6959,7 @@ thread_prologue_and_epilogue_insns (f)
|
||||
seq = gen_sequence ();
|
||||
end_sequence ();
|
||||
insert_insn_on_edge (seq, e);
|
||||
insertted = 1;
|
||||
inserted = 1;
|
||||
}
|
||||
goto epilogue_done;
|
||||
}
|
||||
@ -7011,12 +6993,12 @@ thread_prologue_and_epilogue_insns (f)
|
||||
end_sequence();
|
||||
|
||||
insert_insn_on_edge (seq, e);
|
||||
insertted = 1;
|
||||
inserted = 1;
|
||||
}
|
||||
#endif
|
||||
epilogue_done:
|
||||
|
||||
if (insertted)
|
||||
if (inserted)
|
||||
commit_edge_insertions ();
|
||||
|
||||
#ifdef HAVE_sibcall_epilogue
|
||||
@ -7049,6 +7031,54 @@ epilogue_done:
|
||||
? seq : newinsn, &sibcall_epilogue);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_prologue
|
||||
if (prologue_end)
|
||||
{
|
||||
rtx insn, prev;
|
||||
|
||||
/* GDB handles `break f' by setting a breakpoint on the first
|
||||
line note *after* the prologue. Which means (1) that if
|
||||
there are line number notes before where we inserted the
|
||||
prologue we should move them, and (2) if there is no such
|
||||
note, then we should generate one at the prologue. */
|
||||
|
||||
for (insn = prologue_end; insn ; insn = prev)
|
||||
{
|
||||
prev = PREV_INSN (insn);
|
||||
if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
|
||||
{
|
||||
/* Note that we cannot reorder the first insn in the
|
||||
chain, since rest_of_compilation relies on that
|
||||
remaining constant. Do the next best thing. */
|
||||
if (prev == NULL)
|
||||
{
|
||||
emit_line_note_after (NOTE_SOURCE_FILE (insn),
|
||||
NOTE_LINE_NUMBER (insn),
|
||||
prologue_end);
|
||||
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
|
||||
}
|
||||
else
|
||||
reorder_insns (insn, insn, prologue_end);
|
||||
}
|
||||
}
|
||||
|
||||
insn = NEXT_INSN (prologue_end);
|
||||
if (! insn || GET_CODE (insn) != NOTE || NOTE_LINE_NUMBER (insn) <= 0)
|
||||
{
|
||||
for (insn = next_active_insn (f); insn ; insn = PREV_INSN (insn))
|
||||
{
|
||||
if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
|
||||
{
|
||||
emit_line_note_after (NOTE_SOURCE_FILE (insn),
|
||||
NOTE_LINE_NUMBER (insn),
|
||||
prologue_end);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Reposition the prologue-end and epilogue-begin notes after instruction
|
||||
|
Loading…
x
Reference in New Issue
Block a user