[mi] organize possible exec async mi oc command reasons

Bob Rossi
2005-03-24T15:46:42Z

[-- Attachment #1: Type: text/plain, Size: 11468 bytes --]

Hi,

I am going to attempt to organize the possible MI exec async output
commands. The current problem is that it is not easy to understand the
possible number of 'exec async output commands' that GDB/MI can return
to the FE. I would like to simply this, and eventually add a testcase
for each case. This is a start at enumerating all of the case's and
giving the user a minimal amount of information.

The design is to have mi-common.h be the interface to the rest of
GDB. Also, MI developers can have a place to look at to determine all
possible supported command types.

Eli, if you can think of a better way for me to add to the doco, let me
know.

BTW, someone please tell me if the testsuite diff is OK, for some reason
there are minor differences between a fresh checkout and my patched
tree, although, I think it has nothing to do with my changes.

I've attached the added files and the testsuite diff. The patch is
below.

2005-03-24 Bob Rossi <bob@brasko.net>
* Makefile.in (SUBDIR_MI_OBS, SUBDIR_MI_SRCS): Add mi-common
(gdb/mi/ headers): Add mi_common_h
(breakpoint.o, infrun.o): Add dependencies mi_common_h
* breakpoint.c (include): Add include 'mi/mi-common.h'
(print_it_typical): Use async_reason_lookup
(watchpoint_check): ditto
* infrun.c (include): Add include 'mi/mi-common.h'
(print_stop_reason): Use async_reason_lookup

2005-03-24 Bob Rossi <bob@brasko.net>

* gdb.texinfo (GDB/MI Out-of-band Records): Add bullet enumerating
the possible reasons why an exec async record would be returned to FE.

Thanks,
Bob Rossi

Index: src/gdb/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.707
diff -w -u -r1.707 Makefile.in
--- src/gdb/Makefile.in 18 Mar 2005 21:03:38 -0000 1.707
+++ src/gdb/Makefile.in 24 Mar 2005 03:11:05 -0000
@@ -171,14 +171,14 @@
mi-cmds.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \
mi-cmd-file.o mi-cmd-disas.o mi-symbol-cmds.o \
mi-interp.o \
- mi-main.o mi-parse.o mi-getopt.o
+ mi-main.o mi-parse.o mi-getopt.o mi-common.o
SUBDIR_MI_SRCS = \
mi/mi-out.c mi/mi-console.c \
mi/mi-cmds.c mi/mi-cmd-env.c \
mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \
mi/mi-cmd-file.c mi/mi-cmd-disas.c mi/mi-symbol-cmds.c \
mi/mi-interp.c \
- mi/mi-main.c mi/mi-parse.c mi/mi-getopt.c
+ mi/mi-main.c mi/mi-parse.c mi/mi-getopt.c mi/mi-common.c
SUBDIR_MI_DEPS =
SUBDIR_MI_LDFLAGS=
SUBDIR_MI_CFLAGS= \
@@ -824,6 +824,7 @@
mi_main_h = $(srcdir)/mi/mi-main.h
mi_out_h = $(srcdir)/mi/mi-out.h
mi_parse_h = $(srcdir)/mi/mi-parse.h
+mi_common_h = $(srcdir)/mi/mi-common.h

#
# gdb/tui/ headers
@@ -1773,7 +1774,7 @@
$(gdb_string_h) $(demangle_h) $(annotate_h) $(symfile_h) \
$(objfiles_h) $(source_h) $(linespec_h) $(completer_h) $(gdb_h) \
$(ui_out_h) $(cli_script_h) $(gdb_assert_h) $(block_h) $(solist_h) \
- $(observer_h) $(exceptions_h) $(gdb_events_h)
+ $(observer_h) $(exceptions_h) $(gdb_events_h) $(mi_common_h)
bsd-kvm.o: bsd-kvm.c $(defs_h) $(cli_cmds_h) $(command_h) $(frame_h) \
$(regcache_h) $(target_h) $(value_h) $(gdbcore_h) $(gdb_assert_h) \
$(readline_h) $(bsd_kvm_h)
@@ -2121,7 +2122,7 @@
$(inferior_h) $(exceptions_h) $(breakpoint_h) $(gdb_wait_h) \
$(gdbcore_h) $(gdbcmd_h) $(cli_script_h) $(target_h) $(gdbthread_h) \
$(annotate_h) $(symfile_h) $(top_h) $(inf_loop_h) $(regcache_h) \
- $(value_h) $(observer_h) $(language_h) $(gdb_assert_h)
+ $(value_h) $(observer_h) $(language_h) $(gdb_assert_h) $(mi_common_h)
inftarg.o: inftarg.c $(defs_h) $(frame_h) $(inferior_h) $(target_h) \
$(gdbcore_h) $(command_h) $(gdb_stat_h) $(observer_h) $(gdb_wait_h) \
$(inflow_h)
@@ -2990,6 +2991,8 @@
mi-symbol-cmds.o: $(srcdir)/mi/mi-symbol-cmds.c $(defs_h) $(mi_cmds_h) \
$(symtab_h) $(ui_out_h)
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-symbol-cmds.c
+mi-common.o: $(srcdir)/mi/mi-common.c $(mi_common_h)
+ $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-common.c

#
# rdi-share sub-directory
Index: src/gdb/breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.212
diff -w -u -r1.212 breakpoint.c
--- src/gdb/breakpoint.c 24 Feb 2005 13:51:30 -0000 1.212
+++ src/gdb/breakpoint.c 24 Mar 2005 03:11:09 -0000
@@ -54,6 +54,7 @@
#include "exceptions.h"

#include "gdb-events.h"
+#include "mi/mi-common.h"

/* Prototypes for local functions. */

@@ -2108,7 +2109,8 @@
annotate_breakpoint (bs->breakpoint_at->number);
ui_out_text (uiout, "\nBreakpoint ");
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "breakpoint-hit");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_BREAKPOINT_HIT));
ui_out_field_int (uiout, "bkptno", bs->breakpoint_at->number);
ui_out_text (uiout, ", ");
return PRINT_SRC_AND_LOC;
@@ -2243,7 +2245,8 @@
{
annotate_watchpoint (bs->breakpoint_at->number);
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "watchpoint-trigger");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_WATCHPOINT_TRIGGER));
mention (bs->breakpoint_at);
ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
ui_out_text (uiout, "\nOld value = ");
@@ -2263,7 +2266,8 @@

case bp_read_watchpoint:
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "read-watchpoint-trigger");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_READ_WATCHPOINT_TRIGGER));
mention (bs->breakpoint_at);
ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
ui_out_text (uiout, "\nValue = ");
@@ -2279,7 +2283,8 @@
{
annotate_watchpoint (bs->breakpoint_at->number);
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "access-watchpoint-trigger");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
mention (bs->breakpoint_at);
ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
ui_out_text (uiout, "\nOld value = ");
@@ -2293,7 +2298,8 @@
{
mention (bs->breakpoint_at);
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "access-watchpoint-trigger");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
ui_out_text (uiout, "\nValue = ");
}
@@ -2309,7 +2315,8 @@

case bp_finish:
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "function-finished");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_FUNCTION_FINISHED));
return PRINT_UNKNOWN;
break;

@@ -2539,7 +2546,8 @@
will be deleted already. So we have no choice but print the
information here. */
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "watchpoint-scope");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_WATCHPOINT_SCOPE));
ui_out_text (uiout, "\nWatchpoint ");
ui_out_field_int (uiout, "wpnum", bs->breakpoint_at->number);
ui_out_text (uiout, " deleted because the program has left the block in\n\
Index: src/gdb/infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.199
diff -w -u -r1.199 infrun.c
--- src/gdb/infrun.c 24 Feb 2005 13:51:32 -0000 1.199
+++ src/gdb/infrun.c 24 Mar 2005 03:11:11 -0000
@@ -46,6 +46,7 @@
#include "observer.h"
#include "language.h"
#include "gdb_assert.h"
+#include "mi/mi-common.h"

/* Prototypes for local functions */

@@ -2866,7 +2867,8 @@
operation for n > 1 */
if (!step_multi || !stop_step)
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "end-stepping-range");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_END_STEPPING_RANGE));
break;
case BREAKPOINT_HIT:
/* We found a breakpoint. */
@@ -2876,7 +2878,8 @@
/* The inferior was terminated by a signal. */
annotate_signalled ();
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "exited-signalled");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_EXITED_SIGNALLED));
ui_out_text (uiout, "\nProgram terminated with signal ");
annotate_signal_name ();
ui_out_field_string (uiout, "signal-name",
@@ -2896,7 +2899,8 @@
if (stop_info)
{
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "exited");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_EXITED));
ui_out_text (uiout, "\nProgram exited with code ");
ui_out_field_fmt (uiout, "exit-code", "0%o",
(unsigned int) stop_info);
@@ -2905,7 +2909,8 @@
else
{
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "exited-normally");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_EXITED_NORMALLY));
ui_out_text (uiout, "\nProgram exited normally.\n");
}
break;
@@ -2916,7 +2921,8 @@
ui_out_text (uiout, "\nProgram received signal ");
annotate_signal_name ();
if (ui_out_is_mi_like_p (uiout))
- ui_out_field_string (uiout, "reason", "signal-received");
+ ui_out_field_string (uiout, "reason",
+ async_reason_lookup(EXEC_ASYNC_SIGNAL_RECEIVED));
ui_out_field_string (uiout, "signal-name",
target_signal_to_name (stop_info));
annotate_signal_name_end ();
Index: src/gdb/doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.233
diff -w -u -r1.233 gdb.texinfo
--- src/gdb/doc/gdb.texinfo 10 Mar 2005 13:12:33 -0000 1.233
+++ src/gdb/doc/gdb.texinfo 24 Mar 2005 03:11:23 -0000
@@ -15418,9 +15418,50 @@
The following is a preliminary list of possible out-of-band records.

@table @code
-@item "*" "stop"
+@item "*" "stopped"
@end table

+The following enumerates the current set of reasons why @sc{gdb/mi} would
+return with *stopped (exec-async-output).
+
+@itemize @bullet
+@item
+A breakpoint was reached, "breakpoint-hit"
+
+@item
+A watchpoint was triggered, "watchpoint-trigger"
+
+@item
+A read watchpoint was triggered, "read-watchpoint-trigger"
+
+@item
+An access watchpoint was triggered, "access-watchpoint-trigger"
+
+@item
+A function finished, "function-finished"
+
+@item
+A location was reached, "location-reached"
+
+@item
+A watchpoint scope, "watchpoint-scope"
+
+@item
+end stepping range, "end-stepping-range"
+
+@item
+inferior exited because of a signal, "exited-signalled"
+
+@item
+inferior exited, "exited"
+
+@item
+inferior exited normally, "exited-normally"
+
+@item
+a signal was received by the inferior, "signal-received"
+@end itemize
+

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@node GDB/MI Command Description Format

[-- Attachment #2: mi-common.h --]
[-- Type: text/x-chdr, Size: 1653 bytes --]

/* List lines of source files for GDB, the GNU debugger.
Copyright 1999 Free Software Foundation, Inc.

This file is part of GDB.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */

#ifndef MI_COMMON_H
#define MI_COMMON_H

/* Represents the reason why GDB is sending an asyncronous command to the
* front end
*
* NOTE: When modifing this, don't forget to update gdb.texinfo! */
enum async_reply_reason
{
EXEC_ASYNC_BREAKPOINT_HIT = 0,
EXEC_ASYNC_WATCHPOINT_TRIGGER,
EXEC_ASYNC_READ_WATCHPOINT_TRIGGER,
EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER,
EXEC_ASYNC_FUNCTION_FINISHED,
EXEC_ASYNC_LOCATION_REACHED,
EXEC_ASYNC_WATCHPOINT_SCOPE,
EXEC_ASYNC_END_STEPPING_RANGE,
EXEC_ASYNC_EXITED_SIGNALLED,
EXEC_ASYNC_EXITED,
EXEC_ASYNC_EXITED_NORMALLY,
EXEC_ASYNC_SIGNAL_RECEIVED,
/* This is here only to represent the number of enum's */
EXEC_ASYNC_LAST
};

const char *async_reason_lookup (enum async_reply_reason reason);

#endif

[-- Attachment #3: mi-common.c --]
[-- Type: text/x-csrc, Size: 530 bytes --]

#include "mi-common.h"

static const char *async_reason_string_lookup[EXEC_ASYNC_LAST+1] =
{
"breakpoint-hit",
"watchpoint-trigger",
"read-watchpoint-trigger",
"access-watchpoint-trigger",
"function-finished",
"location-reached",
"watchpoint-scope",
"end-stepping-range",
"exited-signalled",
"exited",
"exited-normally",
"signal-received",
(char*)0
};

const char *async_reason_lookup (enum async_reply_reason reason)
{
return async_reason_string_lookup[reason];
}

[-- Attachment #4: mi-common-ts.diff --]
[-- Type: text/plain, Size: 3718 bytes --]

--- /home/bob/cvs/gdb/original/builddir/gdb/testsuite/gdb.sum 2005-03-23 22:37:30.000000000 -0500
+++ /home/bob/cvs/gdb/gdb_async/build/gdb/testsuite/gdb.sum 2005-03-23 22:25:18.000000000 -0500
@@ -1,4 +1,4 @@
-Test Run By bob on Wed Mar 23 22:27:39 2005
+Test Run By bob on Wed Mar 23 22:12:02 2005
Native configuration is i686-pc-linux-gnu

=== gdb tests ===
@@ -10825,7 +10825,7 @@
PASS: gdb.threads/manythreads.exp: info threads
PASS: gdb.threads/manythreads.exp: second continue
FAIL: gdb.threads/manythreads.exp: stop threads 2
-FAIL: gdb.threads/manythreads.exp: GDB exits after stopping multithreaded program (timeout)
+PASS: gdb.threads/manythreads.exp: GDB exits after stopping multithreaded program
Running ../../../src/gdb/testsuite/gdb.threads/print-threads.exp ...
PASS: gdb.threads/print-threads.exp: successfully compiled posix threads test case
PASS: gdb.threads/print-threads.exp: set print sevenbit-strings
@@ -10866,6 +10866,7 @@
PASS: gdb.threads/print-threads.exp: Hit kill breakpoint, 9 (slow with kill breakpoint)
PASS: gdb.threads/print-threads.exp: Hit thread_function breakpoint, 4 (slow with kill breakpoint)
PASS: gdb.threads/print-threads.exp: Hit kill breakpoint, 10 (slow with kill breakpoint)
+PASS: gdb.threads/print-threads.exp: Hit kill breakpoint, 11 (slow with kill breakpoint)
PASS: gdb.threads/print-threads.exp: Hit thread_function breakpoint, 5 (slow with kill breakpoint)
KFAIL: gdb.threads/print-threads.exp: Running threads (slow with kill breakpoint) (zombie thread) (PRMS: gdb/1265)
Running ../../../src/gdb/testsuite/gdb.threads/pthread_cond_wait.exp ...
@@ -10957,8 +10958,8 @@
PASS: gdb.threads/schedlock.exp: other thread 0 didn't run
PASS: gdb.threads/schedlock.exp: other thread 1 didn't run
PASS: gdb.threads/schedlock.exp: other thread 2 didn't run
-PASS: gdb.threads/schedlock.exp: other thread 3 didn't run
PASS: gdb.threads/schedlock.exp: current thread ran
+PASS: gdb.threads/schedlock.exp: other thread 4 didn't run
PASS: gdb.threads/schedlock.exp: other thread 5 didn't run
PASS: gdb.threads/schedlock.exp: step to increment (locked 0)
PASS: gdb.threads/schedlock.exp: step to increment (locked 1)
@@ -10976,8 +10977,8 @@
PASS: gdb.threads/schedlock.exp: other thread 0 didn't run (stepping)
PASS: gdb.threads/schedlock.exp: other thread 1 didn't run (stepping)
PASS: gdb.threads/schedlock.exp: other thread 2 didn't run (stepping)
-PASS: gdb.threads/schedlock.exp: other thread 3 didn't run (stepping)
PASS: gdb.threads/schedlock.exp: current thread stepped locked
+PASS: gdb.threads/schedlock.exp: other thread 4 didn't run (stepping)
PASS: gdb.threads/schedlock.exp: other thread 5 didn't run (stepping)
Running ../../../src/gdb/testsuite/gdb.threads/staticthreads.exp ...
PASS: gdb.threads/staticthreads.exp: successfully compiled posix threads test case
@@ -11095,8 +11096,8 @@
PASS: gdb.threads/watchthreads.exp: watch args[1]
FAIL: gdb.threads/watchthreads.exp: threaded watch loop
PASS: gdb.threads/watchthreads.exp: first watchpoint on args[0] hit
-PASS: gdb.threads/watchthreads.exp: first watchpoint on args[1] hit
-FAIL: gdb.threads/watchthreads.exp: watchpoint on args[0] hit in thread
+FAIL: gdb.threads/watchthreads.exp: first watchpoint on args[1] hit
+PASS: gdb.threads/watchthreads.exp: watchpoint on args[0] hit in thread
FAIL: gdb.threads/watchthreads.exp: watchpoint on args[1] hit in thread
FAIL: gdb.threads/watchthreads.exp: combination of threaded watchpoints = 30
Running ../../../src/gdb/testsuite/gdb.trace/actions.exp ...
@@ -11240,12 +11241,12 @@

=== gdb Summary ===

-# of expected passes 10746
-# of unexpected failures 36
+# of expected passes 10749
+# of unexpected failures 34