gdb/
authorPedro Alves <palves@redhat.com>
Sun, 22 Mar 2009 18:06:07 +0000 (18:06 +0000)
committerPedro Alves <palves@redhat.com>
Sun, 22 Mar 2009 18:06:07 +0000 (18:06 +0000)
* mi/mi-interp.c (mi_interpreter_init): Attach mi_about_to_proceed
to the about_to_proceed observer notification.
(mi_about_to_proceed): New.
(mi_on_resume): Only output ^running and the prompt here if the
target was proceeded.
* breakpoint.c (breakpoint_proceeded): New static.
(breakpoint_about_to_proceed): New.
(_initialize_breakpoints): Attach breakpoint_about_to_proceed to
the about_to_proceed observer notification.
* inferior.h (breakpoint_proceeded): Delete declaration.
* infrun.c (clear_proceed_status): Don't set breakpoint_proceeded.
Notify the about_to_proceed observers.
(struct inferior_status): Delete breakpoint_proceeded member.
(save_inferior_status): Don't save it.
(restore_inferior_status): Don't restore it.
* mi-main.h (mi_proceeded): Declare.
* mi/mi-main.c (mi_cmd_execute): Clear mi_proceeded before running
a command.

gdb/doc/

* observer.texi (about_to_proceed): New.

gdb/ChangeLog
gdb/breakpoint.c
gdb/doc/ChangeLog
gdb/doc/observer.texi
gdb/inferior.h
gdb/infrun.c
gdb/mi/mi-interp.c
gdb/mi/mi-main.c
gdb/mi/mi-main.h

index 12aff52..a323589 100644 (file)
@@ -1,5 +1,26 @@
 2009-03-22  Pedro Alves  <pedro@codesourcery.com>
 
+       * mi/mi-interp.c (mi_interpreter_init): Attach mi_about_to_proceed
+       to the about_to_proceed observer notification.
+       (mi_about_to_proceed): New.
+       (mi_on_resume): Only output ^running and the prompt here if the
+       target was proceeded.
+       * breakpoint.c (breakpoint_proceeded): New static.
+       (breakpoint_about_to_proceed): New.
+       (_initialize_breakpoints): Attach breakpoint_about_to_proceed to
+       the about_to_proceed observer notification.
+       * inferior.h (breakpoint_proceeded): Delete declaration.
+       * infrun.c (clear_proceed_status): Don't set breakpoint_proceeded.
+       Notify the about_to_proceed observers.
+       (struct inferior_status): Delete breakpoint_proceeded member.
+       (save_inferior_status): Don't save it.
+       (restore_inferior_status): Don't restore it.
+       * mi-main.h (mi_proceeded): Declare.
+       * mi/mi-main.c (mi_cmd_execute): Clear mi_proceeded before running
+       a command.
+
+2009-03-22  Pedro Alves  <pedro@codesourcery.com>
+
        * gdbthread.h (struct thread_info): Add in_infcall member.
        * infcall.c (run_inferior_call): Save, set and restore in_infcall.
        Remove reverences to suppress_resume_observer.  Refresh
index 5a909c8..5affe4e 100644 (file)
@@ -191,6 +191,11 @@ static int is_hardware_watchpoint (struct breakpoint *bpt);
 
 static void insert_breakpoint_locations (void);
 
+/* Flag indicating that a command has proceeded the inferior past the
+   current breakpoint.  */
+
+static int breakpoint_proceeded;
+
 static const char *
 bpdisp_text (enum bpdisp disp)
 {
@@ -2083,6 +2088,26 @@ bpstat_clear_actions (bpstat bs)
     }
 }
 
+/* Called when a command is about to proceed the inferior.  */
+
+static void
+breakpoint_about_to_proceed (void)
+{
+  if (!ptid_equal (inferior_ptid, null_ptid))
+    {
+      struct thread_info *tp = inferior_thread ();
+
+      /* Allow inferior function calls in breakpoint commands to not
+        interrupt the command list.  When the call finishes
+        successfully, the inferior will be standing at the same
+        breakpoint as if nothing happened.  */
+      if (tp->in_infcall)
+       return;
+    }
+
+  breakpoint_proceeded = 1;
+}
+
 /* Stub for cleaning up our state if we error-out of a breakpoint command */
 static void
 cleanup_executing_breakpoints (void *ignore)
@@ -8498,4 +8523,6 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."),
                           &breakpoint_show_cmdlist);
   
   automatic_hardware_breakpoints = 1;
+
+  observer_attach_about_to_proceed (breakpoint_about_to_proceed);
 }
index 8aa0722..d86674a 100644 (file)
@@ -1,3 +1,7 @@
+2009-03-22  Pedro Alves  <pedro@codesourcery.com>
+
+       * observer.texi (about_to_proceed): New.
+
 2009-03-21  Jeremy Bennett  <jeremy.bennett@embecosm.com>
 
        * gdbint.texinfo (everywhere): Use braces {} in @deftypeXX type
index 04f5034..f0fc6f4 100644 (file)
@@ -151,6 +151,10 @@ The target was resumed.  The @var{ptid} parameter specifies which
 thread was resume, and may be RESUME_ALL if all threads are resumed.
 @end deftypefun
 
+@deftypefun void about_to_proceed (void)
+The target is about to be proceeded.
+@end deftypefun
+
 @deftypefun void breakpoint_created (int @var{bpnum})
 A new breakpoint has been created.  The argument @var{bpnum} is the
 number of the newly-created breakpoint.
index 969974c..c237e6e 100644 (file)
@@ -287,11 +287,6 @@ extern void notice_new_inferior (ptid_t, int, int);
 
 extern CORE_ADDR stop_pc;
 
-/* Flag indicating that a command has proceeded the inferior past the
-   current breakpoint.  */
-
-extern int breakpoint_proceeded;
-
 /* Nonzero if stopped due to completion of a stack dummy routine.  */
 
 extern int stop_stack_dummy;
index dfd6e71..6600bbb 100644 (file)
@@ -1230,7 +1230,8 @@ clear_proceed_status (void)
     }
 
   stop_after_trap = 0;
-  breakpoint_proceeded = 1;    /* We're about to proceed... */
+
+  observer_notify_about_to_proceed ();
 
   if (stop_registers)
     {
@@ -5007,7 +5008,6 @@ struct inferior_status
   /* ID if the selected frame when the inferior function call was made.  */
   struct frame_id selected_frame_id;
 
-  int breakpoint_proceeded;
   int proceed_to_finish;
   int in_infcall;
 };
@@ -5038,7 +5038,6 @@ save_inferior_status (void)
      called.  */
   inf_status->stop_bpstat = tp->stop_bpstat;
   tp->stop_bpstat = bpstat_copy (tp->stop_bpstat);
-  inf_status->breakpoint_proceeded = breakpoint_proceeded;
   inf_status->proceed_to_finish = tp->proceed_to_finish;
   inf_status->in_infcall = tp->in_infcall;
 
@@ -5089,7 +5088,6 @@ restore_inferior_status (struct inferior_status *inf_status)
   bpstat_clear (&tp->stop_bpstat);
   tp->stop_bpstat = inf_status->stop_bpstat;
   inf_status->stop_bpstat = NULL;
-  breakpoint_proceeded = inf_status->breakpoint_proceeded;
   tp->proceed_to_finish = inf_status->proceed_to_finish;
   tp->in_infcall = inf_status->in_infcall;
 
index fb4b4d5..dee921f 100644 (file)
@@ -61,6 +61,7 @@ static void mi_inferior_exit (int pid);
 static void mi_on_resume (ptid_t ptid);
 static void mi_solib_loaded (struct so_list *solib);
 static void mi_solib_unloaded (struct so_list *solib);
+static void mi_about_to_proceed (void);
 
 static void *
 mi_interpreter_init (int top_level)
@@ -91,6 +92,7 @@ mi_interpreter_init (int top_level)
       observer_attach_target_resumed (mi_on_resume);
       observer_attach_solib_loaded (mi_solib_loaded);
       observer_attach_solib_unloaded (mi_solib_unloaded);
+      observer_attach_about_to_proceed (mi_about_to_proceed);
     }
 
   return mi;
@@ -368,6 +370,21 @@ mi_on_normal_stop (struct bpstats *bs, int print_frame)
 }
 
 static void
+mi_about_to_proceed (void)
+{
+  /* Suppress output while calling an inferior function.  */
+
+  if (!ptid_equal (inferior_ptid, null_ptid))
+    {
+      struct thread_info *tp = inferior_thread ();
+      if (tp->in_infcall)
+       return;
+    }
+
+  mi_proceeded = 1;
+}
+
+static void
 mi_on_resume (ptid_t ptid)
 {
   struct thread_info *tp = NULL;
@@ -389,7 +406,7 @@ mi_on_resume (ptid_t ptid)
      will make it impossible for frontend to know what's going on.
 
      In future (MI3), we'll be outputting "^done" here.  */
-  if (!running_result_record_printed)
+  if (!running_result_record_printed && mi_proceeded)
     {
       if (current_token)
        fputs_unfiltered (current_token, raw_stdout);
@@ -411,7 +428,7 @@ mi_on_resume (ptid_t ptid)
       fprintf_unfiltered (raw_stdout, "*running,thread-id=\"%d\"\n", ti->num);
     }
 
-  if (!running_result_record_printed)
+  if (!running_result_record_printed && mi_proceeded)
     {
       running_result_record_printed = 1;
       /* This is what gdb used to do historically -- printing prompt even if
index 97a136b..d7d8dc4 100644 (file)
@@ -78,6 +78,10 @@ static int do_timings = 0;
 char *current_token;
 int running_result_record_printed = 1;
 
+/* Flag indicating that the target has proceeded since the last
+   command was issued.  */
+int mi_proceeded;
+
 extern void _initialize_mi_main (void);
 static void mi_cmd_execute (struct mi_parse *parse);
 
@@ -1147,6 +1151,7 @@ captured_mi_execute_command (struct ui_out *uiout, void *data)
   cleanup = make_cleanup (free_current_contents, &current_token);
 
   running_result_record_printed = 0;
+  mi_proceeded = 0;
   switch (context->op)
     {
     case MI_COMMAND:
index 90a61e3..c8e0b7e 100644 (file)
@@ -31,6 +31,7 @@ extern void mi_print_timing_maybe (void);
 extern char *current_token;
 
 extern int running_result_record_printed;
+extern int mi_proceeded;
 
 #endif