From f3b1572e1aedb92f0d7672c384de4bbc70b59757 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Sun, 22 Mar 2009 18:06:07 +0000 Subject: [PATCH] gdb/ * 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 | 21 +++++++++++++++++++++ gdb/breakpoint.c | 27 +++++++++++++++++++++++++++ gdb/doc/ChangeLog | 4 ++++ gdb/doc/observer.texi | 4 ++++ gdb/inferior.h | 5 ----- gdb/infrun.c | 6 ++---- gdb/mi/mi-interp.c | 21 +++++++++++++++++++-- gdb/mi/mi-main.c | 5 +++++ gdb/mi/mi-main.h | 1 + 9 files changed, 83 insertions(+), 11 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 12aff52fa11..a323589a441 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +2009-03-22 Pedro Alves + + * 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 * gdbthread.h (struct thread_info): Add in_infcall member. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 5a909c81058..5affe4e6835 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 8aa07223e52..d86674afe27 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,7 @@ +2009-03-22 Pedro Alves + + * observer.texi (about_to_proceed): New. + 2009-03-21 Jeremy Bennett * gdbint.texinfo (everywhere): Use braces {} in @deftypeXX type diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi index 04f5034081a..f0fc6f45767 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 969974c3bee..c237e6e9ea6 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 dfd6e71ff55..6600bbb2ba3 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 fb4b4d5374a..dee921f50fa 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; @@ -367,6 +369,21 @@ mi_on_normal_stop (struct bpstats *bs, int print_frame) gdb_flush (raw_stdout); } +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) { @@ -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 97a136b043e..d7d8dc438ee 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, ¤t_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 90a61e3821b..c8e0b7e0a0d 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 -- 2.30.2