Suppress normal stop observer when it's problematic.
authorVladimir Prus <vladimir@codesourcery.com>
Tue, 10 Jun 2008 09:32:05 +0000 (09:32 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Tue, 10 Jun 2008 09:32:05 +0000 (09:32 +0000)
        * inferior.h (suppress_normal_stop_observer): New.
        * infcall.c (call_function_by_hand): Disable stop events when
        doing function calls.
        * infmcd.c (suppress_normal_stop_observer): New.
        (finish_command_continuation): Call normal_stop observer
        explicitly.
        (finish_command): Disable stop events inside proceed.
        * infrun.c (normal_stop): Don't call normal stop observer if
        suppressed of if multi-step is in progress.

gdb/ChangeLog
gdb/infcall.c
gdb/infcmd.c
gdb/inferior.h
gdb/infrun.c

index 1d80cc6..4f4e28c 100644 (file)
@@ -1,5 +1,18 @@
 2008-06-10  Vladimir Prus  <vladimir@codesourcery.com>
 
+       Suppress normal stop observer when it's problematic.
+        * inferior.h (suppress_normal_stop_observer): New.
+        * infcall.c (call_function_by_hand): Disable stop events when
+        doing function calls.
+        * infmcd.c (suppress_normal_stop_observer): New.
+        (finish_command_continuation): Call normal_stop observer
+        explicitly.
+        (finish_command): Disable stop events inside proceed.
+        * infrun.c (normal_stop): Don't call normal stop observer if
+        suppressed of if multi-step is in progress.
+
+2008-06-10  Vladimir Prus  <vladimir@codesourcery.com>
+
        Remove stale code.
         * infrun.c (finish_command): Don't pass cleanup
         to continuation.
index c065b59..ded3211 100644 (file)
@@ -706,6 +706,7 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
 
   {
     struct cleanup *old_cleanups = make_cleanup (null_cleanup, 0);
+    struct cleanup *old_cleanups2;
     int saved_async = 0;
 
     /* If all error()s out of proceed ended up calling normal_stop
@@ -718,8 +719,12 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
 
     if (target_can_async_p ())
       saved_async = target_async_mask (0);
-    
+
+    old_cleanups2 = make_cleanup_restore_integer 
+      (&suppress_normal_stop_observer);
+    suppress_normal_stop_observer = 1;
     proceed (real_pc, TARGET_SIGNAL_0, 0);
+    do_cleanups (old_cleanups2);
     
     if (saved_async)
       target_async_mask (saved_async);
index 30858f1..a844b7d 100644 (file)
@@ -206,6 +206,9 @@ int step_multi;
    in format described in environ.h.  */
 
 struct gdb_environ *inferior_environ;
+
+/* When set, normal_stop will not call the normal_stop observer.  */
+int suppress_normal_stop_observer = 0;
 \f
 /* Accessor routines. */
 
@@ -1294,8 +1297,13 @@ finish_command_continuation (struct continuation_arg *arg, int error_p)
          if (TYPE_CODE (value_type) != TYPE_CODE_VOID)
            print_return_value (SYMBOL_TYPE (function), value_type); 
        }
+
+      /* We suppress normal call of normal_stop observer and do it here so that
+        that *stopped notification includes the return value.  */
+      observer_notify_normal_stop (stop_bpstat);
     }
 
+  suppress_normal_stop_observer = 0;
   delete_breakpoint (breakpoint);
 }
 
@@ -1362,6 +1370,8 @@ finish_command (char *arg, int from_tty)
     }
 
   proceed_to_finish = 1;       /* We want stop_registers, please...  */
+  make_cleanup_restore_integer (&suppress_normal_stop_observer);
+  suppress_normal_stop_observer = 1;
   proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
 
   arg1 =
index 1dd152a..7f85507 100644 (file)
@@ -391,6 +391,9 @@ extern int debug_displaced;
 void displaced_step_dump_bytes (struct ui_file *file,
                                 const gdb_byte *buf, size_t len);
 
+
+/* When set, normal_stop will not call the normal_stop observer.  */
+extern int suppress_normal_stop_observer;
 \f
 /* Possible values for gdbarch_call_dummy_location.  */
 #define ON_STACK 1
index 2960acb..1e10ecc 100644 (file)
@@ -3772,7 +3772,8 @@ Further execution is probably impossible.\n"));
 
 done:
   annotate_stopped ();
-  observer_notify_normal_stop (stop_bpstat);
+  if (!suppress_normal_stop_observer && !step_multi)
+    observer_notify_normal_stop (stop_bpstat);
   /* Delete the breakpoint we stopped at, if it wants to be deleted.
      Delete any breakpoint that is to be deleted at the next stop.  */
   breakpoint_auto_delete (stop_bpstat);