summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/function.c
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2000-05-27 02:25:28 +0000
committerobrien <obrien@FreeBSD.org>2000-05-27 02:25:28 +0000
commit890b30850f08010e6461f2af573cb7b53a82ef36 (patch)
treeb725d094db3c58a89d4ee7be9eac2c5e09532e13 /contrib/gcc/function.c
parent89d6e979f6e51927c13633bc1c374b05a37d0238 (diff)
downloadFreeBSD-src-890b30850f08010e6461f2af573cb7b53a82ef36.zip
FreeBSD-src-890b30850f08010e6461f2af573cb7b53a82ef36.tar.gz
Bring in bug fixes from the GCC anoncvs server's "gcc-2_95-branch"
branch as of May 26th, 2000. [these are changes March 31 - May 24th]
Diffstat (limited to 'contrib/gcc/function.c')
-rw-r--r--contrib/gcc/function.c59
1 files changed, 55 insertions, 4 deletions
diff --git a/contrib/gcc/function.c b/contrib/gcc/function.c
index 5592e48..60afafa 100644
--- a/contrib/gcc/function.c
+++ b/contrib/gcc/function.c
@@ -6695,7 +6695,10 @@ void
thread_prologue_and_epilogue_insns (f)
rtx f ATTRIBUTE_UNUSED;
{
- int insertted = 0;
+ int inserted = 0;
+#ifdef HAVE_prologue
+ rtx prologue_end = NULL_RTX;
+#endif
prologue = 0;
#ifdef HAVE_prologue
@@ -6712,7 +6715,7 @@ thread_prologue_and_epilogue_insns (f)
seq = get_insns ();
prologue = record_insns (seq);
- emit_note (NULL, NOTE_INSN_PROLOGUE_END);
+ prologue_end = emit_note (NULL, NOTE_INSN_PROLOGUE_END);
seq = gen_sequence ();
end_sequence ();
@@ -6725,7 +6728,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);
@@ -6857,8 +6860,56 @@ thread_prologue_and_epilogue_insns (f)
}
#endif
- if (insertted)
+ if (inserted)
commit_edge_insertions ();
+
+#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
OpenPOWER on IntegriCloud