* infrun.c (wait_for_inferior): fix stepi/nexti that was broken
authorStu Grossman <grossman@cygnus>
Tue, 22 Oct 1991 00:50:58 +0000 (00:50 +0000)
committerStu Grossman <grossman@cygnus>
Tue, 22 Oct 1991 00:50:58 +0000 (00:50 +0000)
by my last edit to this routine.

gdb/infrun.c

index e81c1fda6b0804d3ec809cb7f69910d36d01eb1e..5f85779de79a73f7c77c46f97efd90f1f1bea5de 100644 (file)
@@ -508,6 +508,13 @@ child_create_inferior (exec_file, allargs, env)
 
   new_tty_prefork (inferior_io_terminal);
 
+  /* It is generally good practice to flush any possible pending stdio
+     output prior to doing a fork, to avoid the possibility of both the
+     parent and child flushing the same data after the fork. */
+
+  fflush (stdout);
+  fflush (stderr);
+
 #if defined(USG) && !defined(HAVE_VFORK)
   pid = fork ();
 #else
@@ -762,6 +769,7 @@ wait_for_inferior ()
 #ifdef TDESC
   extern dc_handle_t tdesc_handle;
 #endif
+  int current_line;
 
 #if 0
   /* This no longer works now that read_register is lazy;
@@ -773,6 +781,9 @@ wait_for_inferior ()
   prev_sp = read_register (SP_REGNUM);
 #endif /* 0 */
 
+  sal = find_pc_line(prev_pc, 0);
+  current_line = sal.line;
+
   while (1)
     {
       /* Clean up saved state that will become invalid.  */
@@ -1222,11 +1233,29 @@ wait_for_inferior ()
                  break;
                }
            }
-         /* No subroutince call; stop now.  */
+         /* No subroutine call; stop now.  */
          else
            {
-             stop_step = 1;
-             break;
+             if (step_range_end == 1) break; /* Don't do this for stepi/nexti */
+
+             /* We've wandered out of the step range (but we haven't done a
+                subroutine call or return (that's handled elsewhere)).  We
+                don't really want to stop until we encounter the start of a
+                new statement.  If so, we stop.  Otherwise, we reset
+                step_range_start and step_range_end, and just continue. */
+             sal = find_pc_line(stop_pc, 0);
+             
+             if (current_line != sal.line
+                 && stop_pc == sal.pc) {
+               stop_step = 1;
+               break;
+             } else {
+               /* This is probably not necessary, but it probably makes
+                  stepping more efficient, as we avoid calling find_pc_line()
+                  for each instruction we step over. */
+               step_range_start = sal.pc;
+               step_range_end = sal.end;
+             }
            }
        }