Include frame information for *stopped due to CLI commands.
authorVladimir Prus <vladimir@codesourcery.com>
Sat, 14 Feb 2009 15:24:44 +0000 (15:24 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Sat, 14 Feb 2009 15:24:44 +0000 (15:24 +0000)
        * 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
gdb/ada-tasks.c
gdb/doc/ChangeLog
gdb/doc/observer.texi
gdb/infcmd.c
gdb/infrun.c
gdb/mi/mi-interp.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-cli.exp
gdb/testsuite/lib/mi-support.exp

index fea85e9407136ba67236215543f3c8e9543ba5e3..f36c9adcea66633149907012ca3f1a03a5bcce92 100644 (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>
 
        * xtensa-tdep.c (call0_analyze_prologue): Delete BSZ macro.
index 5176d75ccda1670e3ecf5c944d0d368a8c48db86..3639472abc36e9397fc437c3d3cb11fe88404cb8 100644 (file)
@@ -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.  */
index 7a5f0c4581ac36069a3d911b61536eceb047f8c6..7d913d6305f4d68eb65b88a0c9f4a0559270cb3f 100644 (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>
 
        * gdb.texinfo (Basic Python): Fix change from 2009-02-04.
index 636658af66b407e7183ea50b11cce1977d526193..c8e8b9691b9e38c49584b0b18bc067939beaba84 100644 (file)
@@ -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})
index a0189c8be77eaa56bbece38ce76c484db8d1ed77..ba17109f56e342a8779c47d79a5dc450f88cb187 100644 (file)
@@ -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);
 }
index bed628d5abbf7394132a330e4e401d312441638c..2afc738010eac758e700602b9d3fa697cefff917 100644 (file)
@@ -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)
index f5301765537aee1727dba5fe06fdbdc6460f31ce..95dfdf4414ec4fb1f451c728c205b3a77b6650b7 100644 (file)
@@ -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);
 }
index 5b5ca26005238a2026e86f836ea068dc8ad4715c..e760e8a3acc3240854188f5f4796fb0b52296062 100644 (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>
 
        * lib/gdb.exp (get_hexadecimal_valueof): New procedure.
index b77a4d42921faa35590e9f3e6b913fe754f440ea..b469acbbfb94d40671be0facf9c49e7b16af2e77 100644 (file)
@@ -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} \
index a85e373f4e99dd5f8f39d8373eabc7d34bd6fe8c..a2aa629c5973cf3b8680ba56abe96d8609656c1f 100644 (file)
@@ -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;
        }