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.
This commit is contained in:
parent
c5a4d20bb9
commit
f3b1572e1a
|
@ -1,3 +1,24 @@
|
|||
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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue