diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-05-27 20:10:38 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-05-27 20:10:38 +0000 |
commit | 5496faf1f5e781229d4ea5cfb2d3a9295845f661 (patch) | |
tree | 505a94fbe12c6bc641f5eef7af5da579dd6d4d3a | |
parent | f316cb53db7661842a26fe9f3ecec955c7065822 (diff) | |
download | gcc-5496faf1f5e781229d4ea5cfb2d3a9295845f661.tar.gz |
* function.c (thread_prologue_epilogue_insns): Don't move the
line note at the head of the chain. Only force a lineno note
before the end of block 0.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@34207 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/function.c | 51 |
2 files changed, 33 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 74b7cb3eb0e..6dfc95421f1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2000-05-27 Richard Henderson <rth@cygnus.com> + * function.c (thread_prologue_epilogue_insns): Don't move the + line note at the head of the chain. Only force a lineno note + before the end of block 0. + +2000-05-27 Richard Henderson <rth@cygnus.com> + * gensupport.c (collect_insn_data): Record the maximum number of alternatives, not the last seen. diff --git a/gcc/function.c b/gcc/function.c index 63634bb602c..a59de4b3467 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -7038,10 +7038,11 @@ epilogue_done: rtx insn, prev; /* GDB handles `break f' by setting a breakpoint on the first - line note *after* the prologue. Which means (1) that if + 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. */ + prologue we should move them, and (2) we should generate a + note before the end of the first basic block, if there isn't + one already there. */ for (insn = prologue_end; insn ; insn = prev) { @@ -7050,32 +7051,34 @@ epilogue_done: { /* 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. */ + remaining constant. */ 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); + break; + reorder_insns (insn, insn, prologue_end); } } - insn = NEXT_INSN (prologue_end); - if (! insn || GET_CODE (insn) != NOTE || NOTE_LINE_NUMBER (insn) <= 0) + /* Find the last line number note in the first block. */ + for (insn = BASIC_BLOCK (0)->end; + insn != prologue_end; + insn = PREV_INSN (insn)) + if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) + break; + + /* If we didn't find one, make a copy of the first line number + we run across. */ + if (! insn) { - 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; - } - } + for (insn = next_active_insn (prologue_end); + 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 |