* annotate.c (breakpoint_changed): Adjust parameter type.
* breakpoint.c (set_breakpoint_condition): Adjust to change
in breakpoint_modified type.
(breakpoint_set_commands): Likewise.
(do_map_commands_command): Likewise.
(bpstat_check_breakpoint_conditions): Notify that breakpoint has
changed after bumping hit count.
(bpstat_stop_status): Likewise.
(print_one_breakpoint_location): Don't wrap in tuple here.
(print_one_breakpoint): Always print individual locations.
For locations, use unnamed tuple.
(disable_breakpoints_in_unloaded_shlib): Notify that breakpoint
has changed.
(create_catchpoint, create_syscall_event_catchpoint): Call
breakpoint_created obsever.
(mention): Don't call breakpoint_created observer.
(create_breakpoint_sal): Call breakpoint_created observer.
(create_breakpoint, watch_command_1): Likewise.
(create_ada_exception_breakpoint): Likewise.
(delete_breakpoint): Call breakpoint_deleted breakpoint.
(locations_are_equal): New.
(update_breakpoint_locations): If locations were changed, notify.
(set_ignore_count, disable_breakpoint, do_enable_breakpoint):
Call breakpoint_modified observer.
* mi/mi-cmd-break.c (breakpoint_notify): Adjust.
(mi_cmd_break_insert): Don't set observers for modify and delete.
* mi/mi-interp.c (mi_suppress_breakpoint_notifications): New.
(mi_breakpoint_created, mi_breakpoint_deleted)
(mi_breakpoint_modified): New.
(mi_interpreter_init): Hook the above.
* mi/mi-main.c (mi_cmd_execute): Disable breakpoint notifications
while -break-* commands are executing.
* mi/mi-main.h (mi_suppress_breakpoint_notifications): New.
* mi/mi-out.c (struct ui_out_data): New field original_buffer.
(mi_redirect): New.
(mi_ui_out_impl): Hook in mi_redirect.
(mi_field_skip): True to the name, skip the field, don't output
a field with an empty value.
* python/py-breakpoint.c (gdbpy_breakpoint_created)
(gdbpy_breakpoint_deleted): Adjust.
* tui/tui-hooks.c (tui_event_create_breakpoint)
(tui_event_delete_breakpoint, tui_event_modify_breakpoint): Adjust.
+2011-04-27 Vladimir Prus <vladimir@codesourcery.com>
+
+ MI breakpoint notifications.
+
+ * annotate.c (breakpoint_changed): Adjust parameter type.
+ * breakpoint.c (set_breakpoint_condition): Adjust to change
+ in breakpoint_modified type.
+ (breakpoint_set_commands): Likewise.
+ (do_map_commands_command): Likewise.
+ (bpstat_check_breakpoint_conditions): Notify that breakpoint has
+ changed after bumping hit count.
+ (bpstat_stop_status): Likewise.
+ (print_one_breakpoint_location): Don't wrap in tuple here.
+ (print_one_breakpoint): Always print individual locations.
+ For locations, use unnamed tuple.
+ (disable_breakpoints_in_unloaded_shlib): Notify that breakpoint
+ has changed.
+ (create_catchpoint, create_syscall_event_catchpoint): Call
+ breakpoint_created obsever.
+ (mention): Don't call breakpoint_created observer.
+ (create_breakpoint_sal): Call breakpoint_created observer.
+ (create_breakpoint, watch_command_1): Likewise.
+ (create_ada_exception_breakpoint): Likewise.
+ (delete_breakpoint): Call breakpoint_deleted breakpoint.
+ (locations_are_equal): New.
+ (update_breakpoint_locations): If locations were changed, notify.
+ (set_ignore_count, disable_breakpoint, do_enable_breakpoint):
+ Call breakpoint_modified observer.
+
+ * mi/mi-cmd-break.c (breakpoint_notify): Adjust.
+ (mi_cmd_break_insert): Don't set observers for modify and delete.
+ * mi/mi-interp.c (mi_suppress_breakpoint_notifications): New.
+ (mi_breakpoint_created, mi_breakpoint_deleted)
+ (mi_breakpoint_modified): New.
+ (mi_interpreter_init): Hook the above.
+ * mi/mi-main.c (mi_cmd_execute): Disable breakpoint notifications
+ while -break-* commands are executing.
+ * mi/mi-main.h (mi_suppress_breakpoint_notifications): New.
+ * mi/mi-out.c (struct ui_out_data): New field original_buffer.
+ (mi_redirect): New.
+ (mi_ui_out_impl): Hook in mi_redirect.
+ (mi_field_skip): True to the name, skip the field, don't output
+ a field with an empty value.
+
+ * python/py-breakpoint.c (gdbpy_breakpoint_created)
+ (gdbpy_breakpoint_deleted): Adjust.
+ * tui/tui-hooks.c (tui_event_create_breakpoint)
+ (tui_event_delete_breakpoint, tui_event_modify_breakpoint): Adjust.
+
2011-04-26 Aleksandar Ristovski <aristovski@qnx.com>
* nto-procfs.c (procfs_insert_hw_watchpoint): Fix prototype.
static void print_value_flags (struct type *);
-static void breakpoint_changed (int);
+static void breakpoint_changed (struct breakpoint *b);
void (*deprecated_annotate_signalled_hook) (void);
}
static void
-breakpoint_changed (int bpno)
+breakpoint_changed (struct breakpoint *b)
{
breakpoints_changed ();
}
}
}
breakpoints_changed ();
- observer_notify_breakpoint_modified (b->number);
+ observer_notify_breakpoint_modified (b);
}
/* condition N EXP -- set break condition of breakpoint N to EXP. */
decref_counted_command_line (&b->commands);
b->commands = alloc_counted_command_line (commands);
breakpoints_changed ();
- observer_notify_breakpoint_modified (b->number);
+ observer_notify_breakpoint_modified (b);
}
/* Set the internal `silent' flag on the breakpoint. Note that this
b->silent = silent;
if (old_silent != silent)
- observer_notify_breakpoint_modified (b->number);
+ observer_notify_breakpoint_modified (b);
}
/* Set the thread for this breakpoint. If THREAD is -1, make the
b->thread = thread;
if (old_thread != thread)
- observer_notify_breakpoint_modified (b->number);
+ observer_notify_breakpoint_modified (b);
}
/* Set the task for this breakpoint. If TASK is 0, make the
b->task = task;
if (old_task != task)
- observer_notify_breakpoint_modified (b->number);
+ observer_notify_breakpoint_modified (b);
}
void
decref_counted_command_line (&b->commands);
b->commands = info->cmd;
breakpoints_changed ();
- observer_notify_breakpoint_modified (b->number);
+ observer_notify_breakpoint_modified (b);
}
}
/* See also: disable_breakpoints_in_shlibs. */
val = 0;
bl->shlib_disabled = 1;
+ observer_notify_breakpoint_modified (bl->owner);
if (!*disabled_breaks)
{
fprintf_unfiltered (tmp_error_stream,
bs->stop = 0;
/* Increase the hit count even though we don't stop. */
++(b->hit_count);
+ observer_notify_breakpoint_modified (b);
}
}
}
if (bs->stop)
{
++(b->hit_count);
+ observer_notify_breakpoint_modified (b);
/* We will stop here. */
if (b->disposition == disp_disable)
{
struct command_line *l;
static char bpenables[] = "nynny";
- struct cleanup *bkpt_chain;
int header_of_multiple = 0;
int part_of_multiple = (loc != NULL);
loc = b->loc;
annotate_record ();
- bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "bkpt");
/* 1 */
annotate_field (0);
else if (b->exp_string)
ui_out_field_string (uiout, "original-location", b->exp_string);
}
-
- do_cleanups (bkpt_chain);
}
static void
struct bp_location **last_loc,
int allflag)
{
+ struct cleanup *bkpt_chain;
+
+ bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "bkpt");
+
print_one_breakpoint_location (b, NULL, 0, last_loc, allflag);
+ do_cleanups (bkpt_chain);
/* If this breakpoint has custom print function,
it's already printed. Otherwise, print individual
internally, that's not a property exposed to user. */
if (b->loc
&& !is_hardware_watchpoint (b)
- && (b->loc->next || !b->loc->enabled)
- && !ui_out_is_mi_like_p (uiout))
+ && (b->loc->next || !b->loc->enabled))
{
struct bp_location *loc;
int n = 1;
+
for (loc = b->loc; loc; loc = loc->next, ++n)
- print_one_breakpoint_location (b, loc, n, last_loc, allflag);
+ {
+ struct cleanup *inner2 =
+ make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
+ print_one_breakpoint_location (b, loc, n, last_loc, allflag);
+ do_cleanups (inner2);
+ }
}
}
}
succeeding so we must mark the breakpoint as not inserted
to prevent future errors occurring in remove_breakpoints. */
loc->inserted = 0;
+
+ /* This may cause duplicate notifications for the same breakpoint. */
+ observer_notify_breakpoint_modified (b);
+
if (!disabled_shlib_breaks)
{
target_terminal_ours_for_output ();
create_catchpoint_without_mention (gdbarch, tempflag, cond_string, ops);
mention (b);
+ observer_notify_breakpoint_created (b);
update_global_location_list (1);
return b;
/* Now, we have to mention the breakpoint and update the global
location list. */
mention (b);
+ observer_notify_breakpoint_created (b);
update_global_location_list (1);
}
get_user_print_options (&opts);
- /* FIXME: This is misplaced; mention() is called by things (like
- hitting a watchpoint) other than breakpoint creation. It should
- be possible to clean this up and at the same time replace the
- random calls to breakpoint_changed with this hook. */
- observer_notify_breakpoint_created (b->number);
-
if (b->ops != NULL && b->ops->print_mention != NULL)
b->ops->print_mention (b);
else
= xstrprintf ("*%s", paddress (b->loc->gdbarch, b->loc->address));
b->ops = ops;
- if (internal)
- /* Do not mention breakpoints with a negative number, but do
- notify observers. */
- observer_notify_breakpoint_created (b->number);
- else
+ /* Do not mention breakpoints with a negative number, but do
+ notify observers. */
+ if (!internal)
mention (b);
+ observer_notify_breakpoint_created (b);
}
/* Remove element at INDEX_TO_REMOVE from SAL, shifting other
|| b->type == bp_hardware_breakpoint))
b->enable_state = bp_startup_disabled;
- if (internal)
+ if (!internal)
/* Do not mention breakpoints with a negative number,
but do notify observers. */
- observer_notify_breakpoint_created (b->number);
- else
- mention (b);
+ mention (b);
+ observer_notify_breakpoint_created (b);
}
if (sals.nelts > 1)
discard_cleanups (cleanup_bkpt);
mention (b);
+ observer_notify_breakpoint_created (b);
update_global_location_list (1);
}
/* Finally update the new watchpoint. This creates the locations
that should be inserted. */
update_watchpoint (b, 1);
- if (internal)
- /* Do not mention breakpoints with a negative number, but do
+
+ /* Do not mention breakpoints with a negative number, but do
notify observers. */
- observer_notify_breakpoint_created (b->number);
- else
+ if (!internal)
mention (b);
+ observer_notify_breakpoint_created (b);
+
update_global_location_list (1);
}
b->ops = ops;
mention (b);
+ observer_notify_breakpoint_created (b);
update_global_location_list (1);
}
bpt->related_breakpoint = bpt;
}
- observer_notify_breakpoint_deleted (bpt->number);
+ observer_notify_breakpoint_deleted (bpt);
if (breakpoint_chain == bpt)
breakpoint_chain = bpt->next;
return sal;
}
+/* Returns 1 iff locations A and B are sufficiently same that
+ we don't need to report breakpoint as changed. */
+
+static int
+locations_are_equal (struct bp_location *a, struct bp_location *b)
+{
+ while (a && b)
+ {
+ if (a->address != b->address)
+ return 0;
+
+ if (a->shlib_disabled != b->shlib_disabled)
+ return 0;
+
+ if (a->enabled != b->enabled)
+ return 0;
+
+ a = a->next;
+ b = b->next;
+ }
+
+ if ((a == NULL) != (b == NULL))
+ return 0;
+
+ return 1;
+}
+
/* Create new breakpoint locations for B (a hardware or software breakpoint)
based on SALS and SALS_END. If SALS_END.NELTS is not zero, then B is
a ranged breakpoint. */
}
}
+ if (!locations_are_equal (existing_locations, b->loc))
+ observer_notify_breakpoint_modified (b);
+
update_global_location_list (1);
}
count, bptnum);
}
breakpoints_changed ();
- observer_notify_breakpoint_modified (b->number);
+ observer_notify_breakpoint_modified (b);
return;
}
update_global_location_list (0);
- observer_notify_breakpoint_modified (bpt->number);
+ observer_notify_breakpoint_modified (bpt);
}
/* A callback for map_breakpoint_numbers that calls
update_global_location_list (1);
breakpoints_changed ();
- observer_notify_breakpoint_modified (bpt->number);
+ observer_notify_breakpoint_modified (bpt);
}
absent, it means the library was unloaded in the context of all present
thread groups.
+@item =breakpoint-created,bkpt=@{...@}
+@itemx =breakpoint-modified,bkpt=@{...@}
+@itemx =breakpoint-deleted,bkpt=@{...@}
+Reports that a breakpoint was created, modified, or deleted,
+respectively. Only user-visible breakpoints are reported to the MI
+user.
+
+The @var{bkpt} argument is of the same form as returned by the various
+breakpoint commands; @xref{GDB/MI Breakpoint Commands}.
+
+Note that if a breakpoint is emitted in the result record of a
+command, then it will not also be emitted in an async record.
+
@end table
@node GDB/MI Frame Information
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.
+@deftypefun void breakpoint_created (struct breakpoint *@var{b})
+A new breakpoint @var{b} has been created.
@end deftypefun
-@deftypefun void breakpoint_deleted (int @var{bpnum})
-A breakpoint has been destroyed. The argument @var{bpnum} is the
-number of the newly-destroyed breakpoint.
+@deftypefun void breakpoint_deleted (struct breakpoint *@var{b})
+A breakpoint has been destroyed. The argument @var{b} is the
+pointer to the destroyed breakpoint.
@end deftypefun
-@deftypefun void breakpoint_modified (int @var{bpnum})
-A breakpoint has been modified in some way. The argument @var{bpnum}
-is the number of the modified breakpoint.
+@deftypefun void breakpoint_modified (struct breakpoint *@var{b})
+A breakpoint has been modified in some way. The argument @var{b}
+is the modified breakpoint.
@end deftypefun
@deftypefun void tracepoint_created (int @var{tpnum})
#include "gdb.h"
#include "exceptions.h"
#include "observer.h"
+#include "mi-main.h"
enum
{
/* Output a single breakpoint, when allowed. */
static void
-breakpoint_notify (int b)
+breakpoint_notify (struct breakpoint *b)
{
if (mi_can_breakpoint_notify)
- gdb_breakpoint_query (uiout, b, NULL);
+ gdb_breakpoint_query (uiout, b->number, NULL);
}
enum bp_type
if (! mi_breakpoint_observers_installed)
{
observer_attach_breakpoint_created (breakpoint_notify);
- observer_attach_breakpoint_modified (breakpoint_notify);
- observer_attach_breakpoint_deleted (breakpoint_notify);
mi_breakpoint_observers_installed = 1;
}
#include "observer.h"
#include "gdbthread.h"
#include "solist.h"
+#include "gdb.h"
/* These are the interpreter setup, etc. functions for the MI interpreter */
static void mi_execute_command_wrapper (char *cmd);
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_breakpoint_created (struct breakpoint *b);
+static void mi_breakpoint_deleted (struct breakpoint *b);
+static void mi_breakpoint_modified (struct breakpoint *b);
static int report_initial_inferior (struct inferior *inf, void *closure);
observer_attach_solib_loaded (mi_solib_loaded);
observer_attach_solib_unloaded (mi_solib_unloaded);
observer_attach_about_to_proceed (mi_about_to_proceed);
+ observer_attach_breakpoint_created (mi_breakpoint_created);
+ observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
+ observer_attach_breakpoint_modified (mi_breakpoint_modified);
/* The initial inferior is created before this function is called, so we
need to report it explicitly. Use iteration in case future version
mi_proceeded = 1;
}
+/* When non-zero, no MI notifications will be emitted in
+ response to breakpoint change observers. */
+int mi_suppress_breakpoint_notifications = 0;
+
+/* Emit notification about a created breakpoint. */
+static void
+mi_breakpoint_created (struct breakpoint *b)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+ struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
+ struct gdb_exception e;
+
+ if (mi_suppress_breakpoint_notifications)
+ return;
+
+ if (b->number <= 0)
+ return;
+
+ target_terminal_ours ();
+ fprintf_unfiltered (mi->event_channel,
+ "breakpoint-created");
+ /* We want the output from gdb_breakpoint_query to go to
+ mi->event_channel. One approach would be to just
+ call gdb_breakpoint_query, and then use mi_out_put to
+ send the current content of mi_outout into mi->event_channel.
+ However, that will break if anything is output to mi_uiout
+ prior the calling the breakpoint_created notifications.
+ So, we use ui_out_redirect. */
+ ui_out_redirect (mi_uiout, mi->event_channel);
+ TRY_CATCH (e, RETURN_MASK_ERROR)
+ gdb_breakpoint_query (mi_uiout, b->number, NULL);
+ ui_out_redirect (mi_uiout, NULL);
+
+ gdb_flush (mi->event_channel);
+}
+
+/* Emit notification about deleted breakpoint. */
+static void
+mi_breakpoint_deleted (struct breakpoint *b)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+
+ if (mi_suppress_breakpoint_notifications)
+ return;
+
+ if (b->number <= 0)
+ return;
+
+ target_terminal_ours ();
+
+ fprintf_unfiltered (mi->event_channel, "breakpoint-deleted,id=\"%d\"",
+ b->number);
+
+ gdb_flush (mi->event_channel);
+}
+
+/* Emit notification about modified breakpoint. */
+static void
+mi_breakpoint_modified (struct breakpoint *b)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+ struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
+ struct gdb_exception e;
+
+ if (mi_suppress_breakpoint_notifications)
+ return;
+
+ if (b->number <= 0)
+ return;
+
+ target_terminal_ours ();
+ fprintf_unfiltered (mi->event_channel,
+ "breakpoint-modified");
+ /* We want the output from gdb_breakpoint_query to go to
+ mi->event_channel. One approach would be to just
+ call gdb_breakpoint_query, and then use mi_out_put to
+ send the current content of mi_outout into mi->event_channel.
+ However, that will break if anything is output to mi_uiout
+ prior the calling the breakpoint_created notifications.
+ So, we use ui_out_redirect. */
+ ui_out_redirect (mi_uiout, mi->event_channel);
+ TRY_CATCH (e, RETURN_MASK_ERROR)
+ gdb_breakpoint_query (mi_uiout, b->number, NULL);
+ ui_out_redirect (mi_uiout, NULL);
+
+ gdb_flush (mi->event_channel);
+}
+
+
static int
mi_output_running_pid (struct thread_info *info, void *arg)
{
current_context = parse;
+ if (strncmp (parse->command, "break-", sizeof ("break-") - 1 ) == 0)
+ {
+ make_cleanup_restore_integer (&mi_suppress_breakpoint_notifications);
+ mi_suppress_breakpoint_notifications = 1;
+ }
+
if (parse->cmd->argv_func != NULL)
- parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
+ {
+ parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
+ }
else if (parse->cmd->cli.cmd != 0)
{
/* FIXME: DELETE THIS. */
extern int running_result_record_printed;
extern int mi_proceeded;
+extern int mi_suppress_breakpoint_notifications;
#endif
int suppress_output;
int mi_version;
struct ui_file *buffer;
+ struct ui_file *original_buffer;
};
typedef struct ui_out_data mi_out_data;
ATTRIBUTE_PRINTF (3, 0);
static void mi_wrap_hint (struct ui_out *uiout, char *identstring);
static void mi_flush (struct ui_out *uiout);
+static int mi_redirect (struct ui_out *uiout, struct ui_file *outstream);
/* This is the MI ui-out implementation functions vector */
mi_message,
mi_wrap_hint,
mi_flush,
- NULL,
+ mi_redirect,
1, /* Needs MI hacks. */
};
mi_field_skip (struct ui_out *uiout, int fldno, int width,
enum ui_align alignment, const char *fldname)
{
- mi_out_data *data = ui_out_data (uiout);
-
- if (data->suppress_output)
- return;
- mi_field_string (uiout, fldno, width, alignment, fldname, "");
}
/* other specific mi_field_* end up here so alignment and field
gdb_flush (data->buffer);
}
+int
+mi_redirect (struct ui_out *uiout, struct ui_file *outstream)
+{
+ mi_out_data *data = ui_out_data (uiout);
+
+ if (outstream != NULL)
+ {
+ data->original_buffer = data->buffer;
+ data->buffer = outstream;
+ }
+ else if (data->original_buffer != NULL)
+ {
+ data->buffer = data->original_buffer;
+ data->original_buffer = NULL;
+ }
+
+ return 0;
+}
+
/* local functions */
/* access to ui_out format private members */
/* Callback that is used when a breakpoint is created. This function
will create a new Python breakpoint object. */
static void
-gdbpy_breakpoint_created (int num)
+gdbpy_breakpoint_created (struct breakpoint *bp)
{
breakpoint_object *newbp;
- struct breakpoint *bp = NULL;
PyGILState_STATE state;
- bp = get_breakpoint (num);
- if (! bp)
- return;
-
if (num < 0 && bppy_pending_object == NULL)
return;
newbp = PyObject_New (breakpoint_object, &breakpoint_object_type);
if (newbp)
{
- newbp->number = num;
+ newbp->number = bp->number;
newbp->bp = bp;
newbp->bp->py_bp_object = newbp;
Py_INCREF (newbp);
/* Callback that is used when a breakpoint is deleted. This will
invalidate the corresponding Python object. */
static void
-gdbpy_breakpoint_deleted (int num)
+gdbpy_breakpoint_deleted (struct breakpoint *b)
{
+ int num = b->number;
PyGILState_STATE state;
struct breakpoint *bp = NULL;
breakpoint_object *bp_obj;
+2011-04-27 Vladimir Prus <vladimir@codesourcery.com>
+
+ MI breakpoint notifications.
+
+ * testsuite/gdb.mi/mi-cli.exp: Adust.
+ * testsuite/gdb.mi/mi2-cli.exp: Adust.
+ * testsuite/gdb.mi/mi-watch.exp: Adust.
+ * testsuite/gdb.mi/mi2-watch.exp: Adust.
+ * testsuite/lib/mi-support.exp (mi_expect_stop): Accept breakpoint
+ notifications.
+
2011-04-25 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.base/gdbindex-stabs-dwarf.c: New file.
# {.*=breakpoint-delete,number=\"2\".*\^done} \
# "-interpreter-exec console \"delete 2\""
mi_gdb_test "100-interpreter-exec console \"delete 2\"" \
- {100\^done} \
+ {=breakpoint-deleted,id=\"2\"\r\n100\^done} \
"-interpreter-exec console \"delete 2\""
# NOTE: cagney/2003-02-03: Not yet.
"break-watch operation"
mi_gdb_test "222-break-list" \
- "222\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[bkpt=\{number=\"2\",type=\".*watchpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",what=\"C\",times=\"0\",original-location=\"C\"\}\\\]\}" \
+ "222\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[bkpt=\{number=\"2\",type=\".*watchpoint\",disp=\"keep\",enabled=\"y\",what=\"C\",times=\"0\",original-location=\"C\"\}\\\]\}" \
"list of watchpoints"
}
# {.*=breakpoint-delete,number=\"2\".*\^done} \
# "-interpreter-exec console \"delete 2\""
mi_gdb_test "100-interpreter-exec console \"delete 2\"" \
- {100\^done} \
+ {=breakpoint-deleted,id=\"2\"\r\n100\^done} \
"-interpreter-exec console \"delete 2\""
# NOTE: cagney/2003-02-03: Not yet.
"break-watch operation"
mi_gdb_test "222-break-list" \
- "222\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[bkpt=\{number=\"2\",type=\".*watchpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",what=\"C\",times=\"0\",original-location=\"C\"\}\\\]\}" \
+ "222\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[bkpt=\{number=\"2\",type=\".*watchpoint\",disp=\"keep\",enabled=\"y\",what=\"C\",times=\"0\",original-location=\"C\"\}\\\]\}" \
"list of watchpoints"
}
set thread_selected_re "=thread-selected,id=\"\[0-9\]+\"\r\n"
set library_loaded_re "=library-loaded\[^\n\]+\"\r\n"
+set breakpoint_re "=(breakpoint-created|breakpoint-deleted)\[^\n\]+\"\r\n"
#
# mi_gdb_exit -- exit the GDB, killing the target program if necessary
global fullname_syntax
global async
global thread_selected_re
+ global breakpoint_re
set after_stopped ""
set after_reason ""
set any "\[^\n\]*"
- verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re)?$prompt_re"
+ verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re"
gdb_expect {
- -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re)?$prompt_re" {
+ -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re" {
pass "$test"
return $expect_out(2,string)
}
/* Breakpoint creation hook.
Update the screen to show the new breakpoint. */
static void
-tui_event_create_breakpoint (int number)
+tui_event_create_breakpoint (struct breakpoint *b)
{
tui_update_all_breakpoint_info ();
}
/* Breakpoint deletion hook.
Refresh the screen to update the breakpoint marks. */
static void
-tui_event_delete_breakpoint (int number)
+tui_event_delete_breakpoint (struct breakpoint *b)
{
tui_update_all_breakpoint_info ();
}
static void
-tui_event_modify_breakpoint (int number)
+tui_event_modify_breakpoint (struct breakpoint *b)
{
tui_update_all_breakpoint_info ();
}