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 1d80cc6d9b46c2b93ef364be0a032f5d0cd0755a..4f4e28c2032a90ad5ac2b8c1e0818ac24e8b07b6 100644 (file)
@@ -1,3 +1,16 @@
+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.
index c065b59b42d2355e822f32dda4dabba39b2f96cd..ded3211ac2f37ae9e27b6851824eef0f1a6101b1 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 30858f1a7a7d7bed604ddee5c8cd7ddfc731d18a..a844b7d4c1e386d7aeb07a19216143fa21cdc0bd 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 1dd152a04b2913444238d5fafbe62a3ebb6339a2..7f85507a0c191a214dd8a6178f662312119cc663 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 2960acb2a8f216732229ddf748730114578bf01e..1e10ecc701a03fa2562f4c9e272f01d31edd4c11 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);