aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog21
-rw-r--r--gdb/breakpoint.c27
-rw-r--r--gdb/doc/ChangeLog4
-rw-r--r--gdb/doc/observer.texi4
-rw-r--r--gdb/inferior.h5
-rw-r--r--gdb/infrun.c6
-rw-r--r--gdb/mi/mi-interp.c21
-rw-r--r--gdb/mi/mi-main.c5
-rw-r--r--gdb/mi/mi-main.h1
9 files changed, 83 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 12aff52..a323589 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 5a909c8..5affe4e 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -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);
}
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 8aa0722..d86674a 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -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
diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi
index 04f5034..f0fc6f4 100644
--- a/gdb/doc/observer.texi
+++ b/gdb/doc/observer.texi
@@ -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.
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 969974c..c237e6e 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -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;
diff --git a/gdb/infrun.c b/gdb/infrun.c
index dfd6e71..6600bbb 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -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;
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index fb4b4d5..dee921f 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -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
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 97a136b..d7d8dc4 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -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:
diff --git a/gdb/mi/mi-main.h b/gdb/mi/mi-main.h
index 90a61e3..c8e0b7e 100644
--- a/gdb/mi/mi-main.h
+++ b/gdb/mi/mi-main.h
@@ -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