2004-08-30 Andrew Cagney <cagney@gnu.org>
authorAndrew Cagney <cagney@redhat.com>
Mon, 30 Aug 2004 16:59:45 +0000 (16:59 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 30 Aug 2004 16:59:45 +0000 (16:59 +0000)
Fix PR breakpoints/1757.
* infrun.c (struct execution_control_state): Replace
remove_breakpoints_on_following_step with
step_after_step_resume_breakpoint.
(init_execution_control_state): Update.
(handle_inferior_event): For signals, when stepping off a
breakpoint, set step_after_step_resume_breakpoint.  When
BPSTAT_WHAT_STEP_RESUME, do a single-step off the breakpoint.
(keep_going): Delete code handling
remove_breakpoints_on_following_step.

Index: testsuite/ChangeLog
2004-08-30  Andrew Cagney  <cagney@gnu.org>

* gdb.base/sigstep.exp (breakpoint_over_handler): Remove kfail
gdb/1757.

gdb/ChangeLog
gdb/infrun.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/sigstep.exp

index c141526e6036b9d3f9d4076849c0bfe0c8c187f2..3ab32f2e0a99bf84e011f0b5cb6bc19c7ced61a2 100644 (file)
@@ -1,3 +1,16 @@
+2004-08-30  Andrew Cagney  <cagney@gnu.org>
+
+       Fix PR breakpoints/1757.
+       * infrun.c (struct execution_control_state): Replace
+       remove_breakpoints_on_following_step with
+       step_after_step_resume_breakpoint.
+       (init_execution_control_state): Update.
+       (handle_inferior_event): For signals, when stepping off a
+       breakpoint, set step_after_step_resume_breakpoint.  When
+       BPSTAT_WHAT_STEP_RESUME, do a single-step off the breakpoint.
+       (keep_going): Delete code handling
+       remove_breakpoints_on_following_step.
+
 2004-08-29  David Lecomber  <david@streamline-computing.com>
        
        Fix PR gdb/648
index 5d0158a8a71c765f4fe1a2ce2852fa7c6b8e0ee6..062a24db1eb7ec36c7deafa621550981d4817ca6 100644 (file)
@@ -914,12 +914,12 @@ struct execution_control_state
   CORE_ADDR stop_func_end;
   char *stop_func_name;
   struct symtab_and_line sal;
-  int remove_breakpoints_on_following_step;
   int current_line;
   struct symtab *current_symtab;
   int handling_longjmp;                /* FIXME */
   ptid_t ptid;
   ptid_t saved_inferior_ptid;
+  int step_after_step_resume_breakpoint;
   int stepping_through_solib_after_catch;
   bpstat stepping_through_solib_catchpoints;
   int enable_hw_watchpoints_after_wait;
@@ -1068,7 +1068,7 @@ init_execution_control_state (struct execution_control_state *ecs)
 {
   /* ecs->another_trap? */
   ecs->random_signal = 0;
-  ecs->remove_breakpoints_on_following_step = 0;
+  ecs->step_after_step_resume_breakpoint = 0;
   ecs->handling_longjmp = 0;   /* FIXME */
   ecs->stepping_through_solib_after_catch = 0;
   ecs->stepping_through_solib_catchpoints = NULL;
@@ -1932,10 +1932,29 @@ process_event_stop_test:
       if (signal_program[stop_signal] == 0)
        stop_signal = TARGET_SIGNAL_0;
 
-      if (step_range_end != 0
-         && stop_signal != TARGET_SIGNAL_0
-         && stop_pc >= step_range_start && stop_pc < step_range_end
-         && frame_id_eq (get_frame_id (get_current_frame ()), step_frame_id))
+      if (prev_pc == read_pc ()
+         && !breakpoints_inserted
+         && breakpoint_here_p (read_pc ())
+         && step_resume_breakpoint == NULL)
+       {
+         /* We were just starting a new sequence, attempting to
+            single-step off of a breakpoint and expecting a SIGTRAP.
+            Intead this signal arrives.  This signal will take us out
+            of the stepping range so GDB needs to remember to, when
+            the signal handler returns, resume stepping off that
+            breakpoint.  */
+         /* To simplify things, "continue" is forced to use the same
+            code paths as single-step - set a breakpoint at the
+            signal return address and then, once hit, step off that
+            breakpoint.  */
+         insert_step_resume_breakpoint (get_current_frame (), ecs);
+         ecs->step_after_step_resume_breakpoint = 1;
+       }
+      else if (step_range_end != 0
+              && stop_signal != TARGET_SIGNAL_0
+              && stop_pc >= step_range_start && stop_pc < step_range_end
+              && frame_id_eq (get_frame_id (get_current_frame ()),
+                              step_frame_id))
        {
          /* The inferior is about to take a signal that will take it
             out of the single step range.  Set a breakpoint at the
@@ -2054,6 +2073,18 @@ process_event_stop_test:
              bpstat_find_step_resume_breakpoint (stop_bpstat);
          }
        delete_step_resume_breakpoint (&step_resume_breakpoint);
+       if (ecs->step_after_step_resume_breakpoint)
+         {
+           /* Back when the step-resume breakpoint was inserted, we
+              were trying to single-step off a breakpoint.  Go back
+              to doing that.  */
+           ecs->step_after_step_resume_breakpoint = 0;
+           remove_breakpoints ();
+           breakpoints_inserted = 0;
+           ecs->another_trap = 1;
+           keep_going (ecs);
+           return;
+         }
        break;
 
       case BPSTAT_WHAT_THROUGH_SIGTRAMP:
@@ -2700,20 +2731,9 @@ keep_going (struct execution_control_state *ecs)
          The signal was SIGTRAP, e.g. it was our signal, but we
          decided we should resume from it.
 
-         We're going to run this baby now!
+         We're going to run this baby now!  */
 
-         Insert breakpoints now, unless we are trying to one-proceed
-         past a breakpoint.  */
-      /* If we've just finished a special step resume and we don't
-         want to hit a breakpoint, pull em out.  */
-      if (step_resume_breakpoint == NULL
-         && ecs->remove_breakpoints_on_following_step)
-       {
-         ecs->remove_breakpoints_on_following_step = 0;
-         remove_breakpoints ();
-         breakpoints_inserted = 0;
-       }
-      else if (!breakpoints_inserted && !ecs->another_trap)
+      if (!breakpoints_inserted && !ecs->another_trap)
        {
          breakpoints_failed = insert_breakpoints ();
          if (breakpoints_failed)
index ad2524d0a6b8a76d0c724893593097633f68c4e7..ef2b73d7c5671d23841df9edb085d0fbd7d21265 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-30  Andrew Cagney  <cagney@gnu.org>
+
+       * gdb.base/sigstep.exp (breakpoint_over_handler): Remove kfail
+       gdb/1757.
+
 2004-08-27  Michael Chastain  <mec.gnu@mindspring.com>
 
        With code from Manoj Iyer <manjo@austin.ibm.com>:
index 942b91223bf82e230ef5b5ae4ff9bc7d4ba61157..2304091a42dc79440ce1e817ccbb132f70e757fc 100644 (file)
@@ -328,7 +328,6 @@ proc breakpoint_over_handler { i } {
     # Make the signal pending
     sleep 1
     
-    setup_kfail "powerpc*-*-*" gdb/1757
     gdb_test "$i" "done = 0.*" "$prefix; performing $i"
     gdb_test "clear $infinite_loop" "" "$prefix; clear infinite loop"
 }