* infrun.c (wait_for_inferior): Move "have_waited" label
authorJeff Law <law@redhat.com>
Wed, 24 Apr 1996 06:36:10 +0000 (06:36 +0000)
committerJeff Law <law@redhat.com>
Wed, 24 Apr 1996 06:36:10 +0000 (06:36 +0000)
        outside of #ifdef conditionals.  Don't trash the wait status
        if we get a signal and the current instruction is nullified.
Fixes long standing problem on the PA (spurious SIGTRAPs)..

gdb/ChangeLog
gdb/infrun.c

index 8644c03e500c5a42c10ea2c574b54aa5a78123d4..b8f32fc6de8cb02d2e5df981798250ceaa768d75 100644 (file)
@@ -1,3 +1,14 @@
+Wed Apr 24 00:32:55 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * infrun.c (wait_for_inferior): Move "have_waited" label
+       outside of #ifdef conditionals.  Don't trash the wait status
+       if we get a signal and the current instruction is nullified.
+
+Mon Apr 22 20:17:01 1996  Fred Fish  <fnf@cygnus.com>
+
+       * Makefile.in (VERSION): Bump version number to 4.16.1
+       * NEWS: Update for 4.16 release.
+
 Mon Apr 22 16:32:29 1996  Stan Shebs  <shebs@andros.cygnus.com>
 
        * monitor.h: Clean up comment formatting.
index 3a68e347604f9c98896c1acb55d7d8f0e02375b9..568147a858eaa8e2a64f96a9f35a2a617d46a59b 100644 (file)
@@ -200,6 +200,8 @@ extern int one_stepped;             /* From machine dependent code */
 extern void single_step ();    /* Same. */
 #endif /* NO_SINGLE_STEP */
 
+extern void write_pc_pid PARAMS ((CORE_ADDR, int));
+
 \f
 /* Things to clean up if we QUIT out of resume ().  */
 /* ARGSUSED */
@@ -457,7 +459,10 @@ wait_for_inferior ()
   CORE_ADDR stop_func_start;
   CORE_ADDR stop_func_end;
   char *stop_func_name;
-  CORE_ADDR prologue_pc = 0, tmp;
+#if 0
+  CORE_ADDR prologue_pc = 0;
+#endif
+  CORE_ADDR tmp;
   struct symtab_and_line sal;
   int remove_breakpoints_on_following_step = 0;
   int current_line;
@@ -498,9 +503,12 @@ wait_for_inferior ()
       else
        pid = target_wait (-1, &w);
 
-#ifdef HAVE_NONSTEPPABLE_WATCHPOINT
+    /* Gross.
+
+       We goto this label from elsewhere in wait_for_inferior when we want
+       to continue the main loop without calling "wait" and trashing the
+       waitstatus contained in W.  */
     have_waited:
-#endif
 
       flush_cached_frames ();
 
@@ -712,8 +720,20 @@ wait_for_inferior ()
 
       if (INSTRUCTION_NULLIFIED)
        {
-         resume (1, 0);
-         continue;
+         struct target_waitstatus tmpstatus;
+
+         target_resume (pid, 1, TARGET_SIGNAL_0);
+
+         /* We may have received a signal that we want to pass to
+            the inferior; therefore, we must not clobber the waitstatus
+            in W.  So we call wait ourselves, then continue the loop
+            at the "have_waited" label.  */
+         if (target_wait_hook)
+           target_wait_hook (pid, &tmpstatus);
+         else
+           target_wait (pid, &tmpstatus);
+
+         goto have_waited;
        }
 
 #ifdef HAVE_STEPPABLE_WATCHPOINT