Include frame information for *stopped due to CLI commands.

* ada-tasks.c (ada_normal_stop_observer): Adjust prototype.
        * infcmd.c (finish_command_continuation): Pass '1' for
        'print_frame' parameter to the observer.
        * infrun.c (normal_stop): Don't print mi-specific information
        here. Pass 'stop_print_frame' to the 'print_frame' parameter
        of the observer.
        * mi/mi-interp.c (mi_on_normal_stop): Adjust prototype.
        If we need to print frame, and current uiout is not the MI one,
        print frame again.
This commit is contained in:
Vladimir Prus 2009-02-14 15:24:44 +00:00
parent faafb04710
commit 1d33d6baa4
10 changed files with 78 additions and 32 deletions

View File

@ -1,3 +1,17 @@
2009-02-14 Vladimir Prus <vladimir@codesourcery.com>
Include frame information for *stopped due to CLI commands.
* ada-tasks.c (ada_normal_stop_observer): Adjust prototype.
* infcmd.c (finish_command_continuation): Pass '1' for
'print_frame' parameter to the observer.
* infrun.c (normal_stop): Don't print mi-specific information
here. Pass 'stop_print_frame' to the 'print_frame' parameter
of the observer.
* mi/mi-interp.c (mi_on_normal_stop): Adjust prototype.
If we need to print frame, and current uiout is not the MI one,
print frame again.
2009-02-13 Pierre Muller <muller@ics.u-strasbg.fr> 2009-02-13 Pierre Muller <muller@ics.u-strasbg.fr>
* xtensa-tdep.c (call0_analyze_prologue): Delete BSZ macro. * xtensa-tdep.c (call0_analyze_prologue): Delete BSZ macro.

View File

@ -951,7 +951,7 @@ ada_task_list_changed (void)
/* The 'normal_stop' observer notification callback. */ /* The 'normal_stop' observer notification callback. */
static void static void
ada_normal_stop_observer (struct bpstats *unused_args) ada_normal_stop_observer (struct bpstats *unused_args, int unused_args2)
{ {
/* The inferior has been resumed, and just stopped. This means that /* The inferior has been resumed, and just stopped. This means that
our task_list needs to be recomputed before it can be used again. */ our task_list needs to be recomputed before it can be used again. */

View File

@ -1,3 +1,8 @@
2009-02-14 Vladimir Prus <vladimir@codesourcery.com>
* observer.texi: Add parameter 'print_frame' to normal_stop
observer.
2009-02-07 Eli Zaretskii <eliz@gnu.org> 2009-02-07 Eli Zaretskii <eliz@gnu.org>
* gdb.texinfo (Basic Python): Fix change from 2009-02-04. * gdb.texinfo (Basic Python): Fix change from 2009-02-04.

View File

@ -88,8 +88,11 @@ Send a notification to all @var{event} observers.
The following observable events are defined: The following observable events are defined:
@deftypefun void normal_stop (struct bpstats *@var{bs}) @deftypefun void normal_stop (struct bpstats *@var{bs}, int @var{print_frame})
The inferior has stopped for real. The inferior has stopped for real. The @var{bs} argument describes
the breakpoints were are stopped at, if any. Second argument
@var{print_frame} non-zero means display the location where the
inferior has stopped.
@end deftypefun @end deftypefun
@deftypefun void target_changed (struct target_ops *@var{target}) @deftypefun void target_changed (struct target_ops *@var{target})

View File

@ -1374,7 +1374,7 @@ finish_command_continuation (void *arg)
next stop will be in the same thread that we started doing a next stop will be in the same thread that we started doing a
finish on. This suppressing (or some other replacement means) finish on. This suppressing (or some other replacement means)
should be a thread property. */ should be a thread property. */
observer_notify_normal_stop (bs); observer_notify_normal_stop (bs, 1 /* print frame */);
suppress_stop_observer = 0; suppress_stop_observer = 0;
delete_breakpoint (a->breakpoint); delete_breakpoint (a->breakpoint);
} }

View File

@ -4360,22 +4360,6 @@ Further execution is probably impossible.\n"));
internal_error (__FILE__, __LINE__, _("Unknown value.")); internal_error (__FILE__, __LINE__, _("Unknown value."));
} }
if (ui_out_is_mi_like_p (uiout))
{
ui_out_field_int (uiout, "thread-id",
pid_to_thread_id (inferior_ptid));
if (non_stop)
{
struct cleanup *back_to = make_cleanup_ui_out_list_begin_end
(uiout, "stopped-threads");
ui_out_field_int (uiout, NULL,
pid_to_thread_id (inferior_ptid));
do_cleanups (back_to);
}
else
ui_out_field_string (uiout, "stopped-threads", "all");
}
/* The behavior of this routine with respect to the source /* The behavior of this routine with respect to the source
flag is: flag is:
SRC_LINE: Print only source line SRC_LINE: Print only source line
@ -4430,9 +4414,10 @@ done:
&& inferior_thread ()->step_multi)) && inferior_thread ()->step_multi))
{ {
if (!ptid_equal (inferior_ptid, null_ptid)) if (!ptid_equal (inferior_ptid, null_ptid))
observer_notify_normal_stop (inferior_thread ()->stop_bpstat); observer_notify_normal_stop (inferior_thread ()->stop_bpstat,
stop_print_frame);
else else
observer_notify_normal_stop (NULL); observer_notify_normal_stop (NULL, stop_print_frame);
} }
if (target_has_execution) if (target_has_execution)

View File

@ -51,7 +51,7 @@ static void mi1_command_loop (void);
static void mi_insert_notify_hooks (void); static void mi_insert_notify_hooks (void);
static void mi_remove_notify_hooks (void); static void mi_remove_notify_hooks (void);
static void mi_on_normal_stop (struct bpstats *bs); static void mi_on_normal_stop (struct bpstats *bs, int print_frame);
static void mi_new_thread (struct thread_info *t); static void mi_new_thread (struct thread_info *t);
static void mi_thread_exit (struct thread_info *t); static void mi_thread_exit (struct thread_info *t);
@ -317,17 +317,46 @@ mi_inferior_exit (int pid)
} }
static void static void
mi_on_normal_stop (struct bpstats *bs) mi_on_normal_stop (struct bpstats *bs, int print_frame)
{ {
/* Since this can be called when CLI command is executing, /* Since this can be called when CLI command is executing,
using cli interpreter, be sure to use MI uiout for output, using cli interpreter, be sure to use MI uiout for output,
not the current one. */ not the current one. */
struct ui_out *uiout = interp_ui_out (top_level_interpreter ()); struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
struct mi_interp *mi = top_level_interpreter_data (); struct mi_interp *mi = top_level_interpreter_data ();
if (print_frame)
{
if (uiout != mi_uiout)
{
/* The normal_stop function has printed frame information into
CLI uiout, or some other non-MI uiout. There's no way we
can extract proper fields from random uiout object, so we print
the frame again. In practice, this can only happen when running
a CLI command in MI. */
struct ui_out *saved_uiout = uiout;
uiout = mi_uiout;
print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
uiout = saved_uiout;
}
ui_out_field_int (mi_uiout, "thread-id",
pid_to_thread_id (inferior_ptid));
if (non_stop)
{
struct cleanup *back_to = make_cleanup_ui_out_list_begin_end
(mi_uiout, "stopped-threads");
ui_out_field_int (mi_uiout, NULL,
pid_to_thread_id (inferior_ptid));
do_cleanups (back_to);
}
else
ui_out_field_string (mi_uiout, "stopped-threads", "all");
}
fputs_unfiltered ("*stopped", raw_stdout); fputs_unfiltered ("*stopped", raw_stdout);
mi_out_put (uiout, raw_stdout); mi_out_put (mi_uiout, raw_stdout);
mi_out_rewind (uiout); mi_out_rewind (mi_uiout);
fputs_unfiltered ("\n", raw_stdout); fputs_unfiltered ("\n", raw_stdout);
gdb_flush (raw_stdout); gdb_flush (raw_stdout);
} }

View File

@ -1,3 +1,10 @@
2009-02-14 Vladimir Prus <vladimir@codesourcery.com>
* lib/mi-support.exp (mi_expect_stop): Adjust the order of fields.
(mi_expect_interrupt): Likewise.
* gdb.mi/mi-cli.exp: Check that "step" results in proper *stopped
response.
2009-02-14 Pierre Muller <muller@ics.u-strasbg.fr> 2009-02-14 Pierre Muller <muller@ics.u-strasbg.fr>
* lib/gdb.exp (get_hexadecimal_valueof): New procedure. * lib/gdb.exp (get_hexadecimal_valueof): New procedure.

View File

@ -140,6 +140,9 @@ mi_gdb_test "500-stack-select-frame 0" \
{500\^done} \ {500\^done} \
"-stack-select-frame 0" "-stack-select-frame 0"
mi_execute_to "interpreter-exec console step" "" "callee4" "" ".*basics.c" "29" \
"" "check *stopped from CLI command"
# NOTE: cagney/2003-02-03: Not yet. # NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-break-insert -t basics.c:$line_main_hello" \ # mi_gdb_test "-break-insert -t basics.c:$line_main_hello" \
# {.*=breakpoint-create,number="3".*\^done} \ # {.*=breakpoint-create,number="3".*\^done} \

View File

@ -1018,13 +1018,13 @@ proc mi_expect_stop { reason func args file line extra test } {
set any "\[^\n\]*" set any "\[^\n\]*"
verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}thread-id=\"$decimal\",stopped-threads=$any,frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped\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)?$prompt_re"
gdb_expect { gdb_expect {
-re "\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",stopped-threads=$any,frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped\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)?$prompt_re" {
pass "$test" pass "$test"
return $expect_out(2,string) return $expect_out(2,string)
} }
-re "\\*stopped,${r}${a}${bn}thread-id=\"$decimal\",stopped-threads=$any,frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}$any\r\n$prompt_re" { -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" {
verbose -log "got $expect_out(buffer)" verbose -log "got $expect_out(buffer)"
fail "$test (stopped at wrong place)" fail "$test (stopped at wrong place)"
return -1 return -1
@ -1059,9 +1059,9 @@ proc mi_expect_interrupt { test } {
set any "\[^\n\]*" set any "\[^\n\]*"
# A signal can land anywhere, just ignore the location # A signal can land anywhere, just ignore the location
verbose -log "mi_expect_interrupt: expecting: \\*stopped,${r},thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" verbose -log "mi_expect_interrupt: expecting: \\*stopped,${r}$any\r\n$prompt_re"
gdb_expect { gdb_expect {
-re "\\*stopped,${r},thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" { -re "\\*stopped,${r}$any\r\n$prompt_re" {
pass "$test" pass "$test"
return 0; return 0;
} }