2003-04-08 Elena Zannoni <ezannoni@redhat.com>
[deliverable/binutils-gdb.git] / gdb / infrun.c
index 74f1de1f672a36dab02039a44d3cd71c52bf58e0..92bbcdd2cb0147b0b978c8d024340359024e209b 100644 (file)
@@ -286,7 +286,7 @@ int stop_after_trap;
    when running in the shell before the child program has been exec'd;
    and when running some kinds of remote stuff (FIXME?).  */
 
-int stop_soon_quietly;
+enum stop_kind stop_soon_quietly;
 
 /* Nonzero if proceed is being used for a "finish" command or a similar
    situation when stop_registers should be saved.  */
@@ -659,7 +659,7 @@ clear_proceed_status (void)
   step_frame_id = null_frame_id;
   step_over_calls = STEP_OVER_UNDEBUGGABLE;
   stop_after_trap = 0;
-  stop_soon_quietly = 0;
+  stop_soon_quietly = NO_STOP_QUIETLY;
   proceed_to_finish = 0;
   breakpoint_proceeded = 1;    /* We're about to proceed... */
 
@@ -802,7 +802,7 @@ start_remote (void)
 {
   init_thread_list ();
   init_wait_for_inferior ();
-  stop_soon_quietly = 1;
+  stop_soon_quietly = STOP_QUIETLY;
   trap_expected = 0;
 
   /* Always go on waiting for the target, regardless of the mode. */
@@ -1258,7 +1258,7 @@ handle_inferior_event (struct execution_control_state *ecs)
          might be the shell which has just loaded some objects,
          otherwise add the symbols for the newly loaded objects.  */
 #ifdef SOLIB_ADD
-      if (!stop_soon_quietly)
+      if (stop_soon_quietly == NO_STOP_QUIETLY)
        {
          /* Remove breakpoints, SOLIB_ADD might adjust
             breakpoint addresses via breakpoint_re_set.  */
@@ -1757,7 +1757,9 @@ handle_inferior_event (struct execution_control_state *ecs)
   if (stop_signal == TARGET_SIGNAL_TRAP
       || (breakpoints_inserted &&
          (stop_signal == TARGET_SIGNAL_ILL
-          || stop_signal == TARGET_SIGNAL_EMT)) || stop_soon_quietly)
+          || stop_signal == TARGET_SIGNAL_EMT))
+      || stop_soon_quietly == STOP_QUIETLY
+      || stop_soon_quietly == STOP_QUIETLY_NO_SIGSTOP)
     {
       if (stop_signal == TARGET_SIGNAL_TRAP && stop_after_trap)
        {
@@ -1765,12 +1767,27 @@ handle_inferior_event (struct execution_control_state *ecs)
          stop_stepping (ecs);
          return;
        }
-      if (stop_soon_quietly)
+
+      /* This is originated from start_remote(), start_inferior() and
+         shared libraries hook functions.  */
+      if (stop_soon_quietly == STOP_QUIETLY)
        {
          stop_stepping (ecs);
          return;
        }
 
+      /* This originates from attach_command().  We need to overwrite
+         the stop_signal here, because some kernels don't ignore a
+         SIGSTOP in a subsequent ptrace(PTRACE_SONT,SOGSTOP) call.
+         See more comments in inferior.h.  */
+      if (stop_soon_quietly == STOP_QUIETLY_NO_SIGSTOP)
+       {
+         stop_stepping (ecs);
+         if (stop_signal == TARGET_SIGNAL_STOP)
+           stop_signal = TARGET_SIGNAL_0;
+         return;
+       }
+
       /* Don't even think about breakpoints
          if just proceeded over a breakpoint.
 
This page took 0.02538 seconds and 4 git commands to generate.