From 1d33d6baa4963c315d33807eea8ab33742a90369 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sat, 14 Feb 2009 15:24:44 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/ada-tasks.c | 2 +- gdb/doc/ChangeLog | 5 +++++ gdb/doc/observer.texi | 7 +++++-- gdb/infcmd.c | 2 +- gdb/infrun.c | 21 +++------------------ gdb/mi/mi-interp.c | 39 ++++++++++++++++++++++++++++++++++----- gdb/testsuite/ChangeLog | 7 +++++++ gdb/testsuite/gdb.mi/mi-cli.exp | 3 +++ gdb/testsuite/lib/mi-support.exp | 10 +++++----- 10 files changed, 78 insertions(+), 32 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fea85e9..f36c9ad 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2009-02-14 Vladimir Prus + + 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 * xtensa-tdep.c (call0_analyze_prologue): Delete BSZ macro. diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 5176d75..3639472 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -951,7 +951,7 @@ ada_task_list_changed (void) /* The 'normal_stop' observer notification callback. */ 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 our task_list needs to be recomputed before it can be used again. */ diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 7a5f0c4..7d913d6 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2009-02-14 Vladimir Prus + + * observer.texi: Add parameter 'print_frame' to normal_stop + observer. + 2009-02-07 Eli Zaretskii * gdb.texinfo (Basic Python): Fix change from 2009-02-04. diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi index 636658a..c8e8b96 100644 --- a/gdb/doc/observer.texi +++ b/gdb/doc/observer.texi @@ -88,8 +88,11 @@ Send a notification to all @var{event} observers. The following observable events are defined: -@deftypefun void normal_stop (struct bpstats *@var{bs}) -The inferior has stopped for real. +@deftypefun void normal_stop (struct bpstats *@var{bs}, int @var{print_frame}) +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 @deftypefun void target_changed (struct target_ops *@var{target}) diff --git a/gdb/infcmd.c b/gdb/infcmd.c index a0189c8..ba17109 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1374,7 +1374,7 @@ finish_command_continuation (void *arg) next stop will be in the same thread that we started doing a finish on. This suppressing (or some other replacement means) should be a thread property. */ - observer_notify_normal_stop (bs); + observer_notify_normal_stop (bs, 1 /* print frame */); suppress_stop_observer = 0; delete_breakpoint (a->breakpoint); } diff --git a/gdb/infrun.c b/gdb/infrun.c index bed628d..2afc738 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -4360,22 +4360,6 @@ Further execution is probably impossible.\n")); 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 flag is: SRC_LINE: Print only source line @@ -4430,9 +4414,10 @@ done: && inferior_thread ()->step_multi)) { 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 - observer_notify_normal_stop (NULL); + observer_notify_normal_stop (NULL, stop_print_frame); } if (target_has_execution) diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index f530176..95dfdf4 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -51,7 +51,7 @@ static void mi1_command_loop (void); static void mi_insert_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_thread_exit (struct thread_info *t); @@ -317,17 +317,46 @@ mi_inferior_exit (int pid) } 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, using cli interpreter, be sure to use MI uiout for output, 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 (); + 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); - mi_out_put (uiout, raw_stdout); - mi_out_rewind (uiout); + mi_out_put (mi_uiout, raw_stdout); + mi_out_rewind (mi_uiout); fputs_unfiltered ("\n", raw_stdout); gdb_flush (raw_stdout); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5b5ca26..e760e8a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-02-14 Vladimir Prus + + * 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 * lib/gdb.exp (get_hexadecimal_valueof): New procedure. diff --git a/gdb/testsuite/gdb.mi/mi-cli.exp b/gdb/testsuite/gdb.mi/mi-cli.exp index b77a4d4..b469acb 100644 --- a/gdb/testsuite/gdb.mi/mi-cli.exp +++ b/gdb/testsuite/gdb.mi/mi-cli.exp @@ -140,6 +140,9 @@ mi_gdb_test "500-stack-select-frame 0" \ {500\^done} \ "-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. # mi_gdb_test "-break-insert -t basics.c:$line_main_hello" \ # {.*=breakpoint-create,number="3".*\^done} \ diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index a85e373..a2aa629 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -1018,13 +1018,13 @@ proc mi_expect_stop { reason func args file line extra test } { 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 { - -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" 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)" fail "$test (stopped at wrong place)" return -1 @@ -1059,9 +1059,9 @@ proc mi_expect_interrupt { test } { set any "\[^\n\]*" # 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 { - -re "\\*stopped,${r},thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" { + -re "\\*stopped,${r}$any\r\n$prompt_re" { pass "$test" return 0; } -- 2.7.4