]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
function.c (thread_prologue_epilogue_insns): Don't move the line note at the head...
authorRichard Henderson <rth@cygnus.com>
Sat, 27 May 2000 20:10:38 +0000 (13:10 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 27 May 2000 20:10:38 +0000 (13:10 -0700)
        * 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.

From-SVN: r34207

gcc/ChangeLog
gcc/function.c

index 74b7cb3eb0e3e2fa73f1f89ebe7e2e0a732395d1..6dfc95421f16bf3b9c469e03ec1344e77ca84523 100644 (file)
@@ -1,3 +1,9 @@
+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
index 63634bb602c8f8d25a200bf227aa875cf7edad94..a59de4b3467738b4cb268464b2f26b2e017bf92b 100644 (file)
@@ -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