* corelow.c, exec.c, inftarg.c, m3-nat.c, op50-rom.c, procfs.c,
[deliverable/binutils-gdb.git] / gdb / infrun.c
index dfe2cc0ae783ac8f14484ab671d260c05bd8987a..fd3bf0aaad35e52fcb6ab6f89a12972f2b4d0247 100644 (file)
@@ -30,6 +30,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "gdbcmd.h"
 #include "target.h"
 #include "thread.h"
+#include "annotate.h"
 
 #include <signal.h>
 
@@ -293,6 +294,24 @@ proceed (addr, siggnal, step)
   else
     write_pc (addr);
 
+#ifdef PREPARE_TO_PROCEED
+  /* In a multi-threaded task we may select another thread and then continue.
+     
+     In this case the thread that stopped at a breakpoint will immediately
+     cause another stop, if it is not stepped over first. On the other hand,
+     if (ADDR != -1) we only want to single step over the breakpoint if we did
+     switch to another thread.
+
+     If we are single stepping, don't do any of the above.
+     (Note that in the current implementation single stepping another
+     thread after a breakpoint and then continuing will cause the original
+     breakpoint to be hit again, but you can always continue, so it's not
+     a big deal.)  */
+
+  if (! step && PREPARE_TO_PROCEED (1) && breakpoint_here_p (read_pc ()))
+    oneproc = 1;
+#endif /* PREPARE_TO_PROCEED */
+
   if (trap_expected_after_continue)
     {
       /* If (step == 0), a trap will be automatically generated after
@@ -326,6 +345,8 @@ The same program may be running in another process.");
   else if (!signal_program[stop_signal])
     stop_signal = TARGET_SIGNAL_0;
 
+  annotate_starting ();
+
   /* Resume inferior.  */
   resume (oneproc || step || bpstat_should_step (), stop_signal);
 
@@ -341,10 +362,8 @@ The same program may be running in another process.");
    to be preserved over calls to it and cleared when the inferior
    is started.  */
 static CORE_ADDR prev_pc;
-static CORE_ADDR prev_sp;
 static CORE_ADDR prev_func_start;
 static char *prev_func_name;
-static CORE_ADDR prev_frame_address;
 
 \f
 /* Start remote-debugging of a machine over a serial link.  */
@@ -367,10 +386,8 @@ init_wait_for_inferior ()
 {
   /* These are meaningless until the first time through wait_for_inferior.  */
   prev_pc = 0;
-  prev_sp = 0;
   prev_func_start = 0;
   prev_func_name = NULL;
-  prev_frame_address = 0;
 
   trap_expected_after_continue = 0;
   breakpoints_inserted = 0;
@@ -402,7 +419,6 @@ wait_for_inferior ()
   struct target_waitstatus w;
   int another_trap;
   int random_signal;
-  CORE_ADDR stop_sp = 0;
   CORE_ADDR stop_func_start;
   CORE_ADDR stop_func_end;
   char *stop_func_name;
@@ -415,6 +431,7 @@ wait_for_inferior ()
   struct breakpoint *step_resume_breakpoint = NULL;
   struct breakpoint *through_sigtramp_breakpoint = NULL;
   int pid;
+  int update_step_sp = 0;
 
   old_cleanups = make_cleanup (delete_breakpoint_current_contents,
                               &step_resume_breakpoint);
@@ -434,11 +451,39 @@ wait_for_inferior ()
 
   while (1)
     {
-      /* Clean up saved state that will become invalid.  */
-      flush_cached_frames ();
+      /* We have to invalidate the registers BEFORE calling target_wait because
+        they can be loaded from the target while in target_wait.  This makes
+        remote debugging a bit more efficient for those targets that provide
+        critical registers as part of their normal status mechanism. */
+
       registers_changed ();
 
-      pid = target_wait (-1, &w);
+      if (target_wait_hook)
+       pid = target_wait_hook (-1, &w);
+      else
+       pid = target_wait (-1, &w);
+
+      flush_cached_frames ();
+
+      /* If it's a new process, add it to the thread database */
+
+      if (pid != inferior_pid
+         && !in_thread_list (pid))
+       {
+         fprintf_unfiltered (gdb_stderr, "[New %s]\n", target_pid_to_str (pid));
+         add_thread (pid);
+
+         /* We may want to consider not doing a resume here in order to give
+            the user a chance to play with the new thread.  It might be good
+            to make that a user-settable option.  */
+
+         /* At this point, all threads are stopped (happens automatically in
+            either the OS or the native code).  Therefore we need to continue
+            all threads in order to make progress.  */
+
+         target_resume (-1, 0, TARGET_SIGNAL_0);
+         continue;
+       }
 
       switch (w.kind)
        {
@@ -458,12 +503,12 @@ wait_for_inferior ()
 
        case TARGET_WAITKIND_EXITED:
          target_terminal_ours ();      /* Must do this before mourn anyway */
+         annotate_exited (w.value.integer);
          if (w.value.integer)
            printf_filtered ("\nProgram exited with code 0%o.\n", 
                             (unsigned int)w.value.integer);
          else
-           if (!batch_mode())
-             printf_filtered ("\nProgram exited normally.\n");
+           printf_filtered ("\nProgram exited normally.\n");
          gdb_flush (gdb_stdout);
          target_mourn_inferior ();
 #ifdef NO_SINGLE_STEP
@@ -476,10 +521,17 @@ wait_for_inferior ()
          stop_print_frame = 0;
          stop_signal = w.value.sig;
          target_terminal_ours ();      /* Must do this before mourn anyway */
+         annotate_signalled ();
          target_kill ();               /* kill mourns as well */
-         printf_filtered ("\nProgram terminated with signal %s, %s.\n",
-                          target_signal_to_name (stop_signal),
-                          target_signal_to_string (stop_signal));
+         printf_filtered ("\nProgram terminated with signal ");
+         annotate_signal_name ();
+         printf_filtered ("%s", target_signal_to_name (stop_signal));
+         annotate_signal_name_end ();
+         printf_filtered (", ");
+         annotate_signal_string ();
+         printf_filtered ("%s", target_signal_to_string (stop_signal));
+         annotate_signal_string_end ();
+         printf_filtered (".\n");
 
          printf_filtered ("The program no longer exists.\n");
          gdb_flush (gdb_stdout);
@@ -496,127 +548,107 @@ wait_for_inferior ()
 
       stop_signal = w.value.sig;
 
-      if (pid != inferior_pid)
-       {
-         int save_pid = inferior_pid;
+      stop_pc = read_pc_pid (pid);
 
-         inferior_pid = pid;   /* Setup for target memory/regs */
-         registers_changed ();
-         stop_pc = read_pc ();
-         inferior_pid = save_pid;
-         registers_changed ();
-       }
-      else
-       stop_pc = read_pc ();
+      /* See if a thread hit a thread-specific breakpoint that was meant for
+        another thread.  If so, then step that thread past the breakpoint,
+        and continue it.  */
 
       if (stop_signal == TARGET_SIGNAL_TRAP
+         && breakpoints_inserted
          && breakpoint_here_p (stop_pc - DECR_PC_AFTER_BREAK))
        {
+         random_signal = 0;
          if (!breakpoint_thread_match (stop_pc - DECR_PC_AFTER_BREAK, pid))
            {
              /* Saw a breakpoint, but it was hit by the wrong thread.  Just continue. */
-             if (breakpoints_inserted)
-               {
-                 if (pid != inferior_pid)
-                   {
-                     int save_pid = inferior_pid;
-
-                     inferior_pid = pid;
-                     registers_changed ();
-                     write_pc (stop_pc - DECR_PC_AFTER_BREAK);
-                     inferior_pid = save_pid;
-                     registers_changed ();
-                   }
-                 else
-                   write_pc (stop_pc - DECR_PC_AFTER_BREAK);
-
-                 remove_breakpoints ();
-                 target_resume (pid, 1, TARGET_SIGNAL_0); /* Single step */
-                 /* FIXME: What if a signal arrives instead of the single-step
-                    happening?  */
-                 target_wait (pid, &w);
-                 insert_breakpoints ();
-               }
-             target_resume (-1, 0, TARGET_SIGNAL_0);
+             write_pc (stop_pc - DECR_PC_AFTER_BREAK);
+
+             remove_breakpoints ();
+             target_resume (pid, 1, TARGET_SIGNAL_0); /* Single step */
+             /* FIXME: What if a signal arrives instead of the single-step
+                happening?  */
+
+             if (target_wait_hook)
+               target_wait_hook (pid, &w);
+             else
+               target_wait (pid, &w);
+             insert_breakpoints ();
+             target_resume (pid, 0, TARGET_SIGNAL_0);
              continue;
            }
-         else
-           if (pid != inferior_pid)
-             goto switch_thread;
        }
+      else
+       random_signal = 1;
+
+      /* See if something interesting happened to the non-current thread.  If
+         so, then switch to that thread, and eventually give control back to
+        the user.  */
 
       if (pid != inferior_pid)
        {
          int printed = 0;
 
-         if (!in_thread_list (pid))
+         /* If it's a random signal for a non-current thread, notify user
+            if he's expressed an interest.  */
+
+         if (random_signal
+             && signal_print[stop_signal])
            {
-             fprintf_unfiltered (gdb_stderr, "[New %s]\n", target_pid_to_str (pid));
-             add_thread (pid);
+             printed = 1;
+             target_terminal_ours_for_output ();
+             printf_filtered ("\nProgram received signal %s, %s.\n",
+                              target_signal_to_name (stop_signal),
+                              target_signal_to_string (stop_signal));
+             gdb_flush (gdb_stdout);
+           }
+
+         /* If it's not SIGTRAP and not a signal we want to stop for, then
+            continue the thread. */
+
+         if (stop_signal != TARGET_SIGNAL_TRAP
+             && !signal_stop[stop_signal])
+           {
+             if (printed)
+               target_terminal_inferior ();
+
+             /* Clear the signal if it should not be passed.  */
+             if (signal_program[stop_signal] == 0)
+               stop_signal = TARGET_SIGNAL_0;
 
-             target_resume (-1, 0, TARGET_SIGNAL_0);
+             target_resume (pid, 0, stop_signal);
              continue;
            }
-         else
-           {
-             if (signal_print[stop_signal])
-               {
-                 char *signame;
-
-                 printed = 1;
-                 target_terminal_ours_for_output ();
-                 printf_filtered ("\nProgram received signal %s, %s.\n",
-                                  target_signal_to_name (stop_signal),
-                                  target_signal_to_string (stop_signal));
-                 gdb_flush (gdb_stdout);
-               }
-
-             if (stop_signal == TARGET_SIGNAL_TRAP
-                 || signal_stop[stop_signal])
-               {
-switch_thread:
-                 inferior_pid = pid;
-                 printf_filtered ("[Switching to %s]\n", target_pid_to_str (pid));
-
-                 flush_cached_frames ();
-                 registers_changed ();
-                 trap_expected = 0;
-                 if (step_resume_breakpoint)
-                   {
-                     delete_breakpoint (step_resume_breakpoint);
-                     step_resume_breakpoint = NULL;
-                   }
-
-                 /* Not sure whether we need to blow this away too,
-                    but probably it is like the step-resume
-                    breakpoint.  */
-                 if (through_sigtramp_breakpoint)
-                   {
-                     delete_breakpoint (through_sigtramp_breakpoint);
-                     through_sigtramp_breakpoint = NULL;
-                   }
-                 prev_pc = 0;
-                 prev_sp = 0;
-                 prev_func_name = NULL;
-                 step_range_start = 0;
-                 step_range_end = 0;
-                 step_frame_address = 0;
-                 handling_longjmp = 0;
-                 another_trap = 0;
-               }
-             else
-               {
-                 if (printed)
-                   target_terminal_inferior ();
 
-                 /* Clear the signal if it should not be passed.  */
-                 if (signal_program[stop_signal] == 0)
-                   stop_signal = TARGET_SIGNAL_0;
+         /* It's a SIGTRAP or a signal we're interested in.  Switch threads,
+            and fall into the rest of wait_for_inferior().  */
 
-                 target_resume (pid, 0, stop_signal);
-                 continue;
-               }
+         inferior_pid = pid;
+         printf_filtered ("[Switching to %s]\n", target_pid_to_str (pid));
+
+         flush_cached_frames ();
+         trap_expected = 0;
+         if (step_resume_breakpoint)
+           {
+             delete_breakpoint (step_resume_breakpoint);
+             step_resume_breakpoint = NULL;
            }
+
+         /* Not sure whether we need to blow this away too,
+            but probably it is like the step-resume
+            breakpoint.  */
+         if (through_sigtramp_breakpoint)
+           {
+             delete_breakpoint (through_sigtramp_breakpoint);
+             through_sigtramp_breakpoint = NULL;
+           }
+         prev_pc = 0;
+         prev_func_name = NULL;
+         step_range_start = 0;
+         step_range_end = 0;
+         step_frame_address = 0;
+         handling_longjmp = 0;
+         another_trap = 0;
        }
 
 #ifdef NO_SINGLE_STEP
@@ -634,9 +666,6 @@ switch_thread:
          continue;
        }
 
-      set_current_frame (create_new_frame (read_fp (), stop_pc));
-      select_frame (get_current_frame (), 0);
-
 #ifdef HAVE_STEPPABLE_WATCHPOINT
       /* It may not be necessary to disable the watchpoint to stop over
         it.  For example, the PA can (with some kernel cooperation) 
@@ -657,13 +686,25 @@ switch_thread:
        {
          remove_breakpoints ();
          resume (1, 0);
+
+         /* FIXME: This is bogus.  You can't interact with the
+            inferior except when it is stopped.  It apparently
+            happens to work on Irix4, but it depends on /proc
+            allowing us to muck with the memory of a running process,
+            and the kernel deciding to run one instruction of the
+            inferior before it executes our insert_breakpoints code,
+            which seems like an awfully dubious assumption.  */
          insert_breakpoints ();
+
          continue;
        }
 #endif
 
-      stop_frame_address = FRAME_FP (get_current_frame ());
-      stop_sp = read_sp ();
+#ifdef HAVE_CONTINUABLE_WATCHPOINT
+      /* It may be possible to simply continue after a watchpoint.  */
+      STOPPED_BY_WATCHPOINT (w);
+#endif
+
       stop_func_start = 0;
       stop_func_name = 0;
       /* Don't care about return value; stop_func_start and stop_func_name
@@ -724,7 +765,7 @@ switch_thread:
            {
              /* See if there is a breakpoint at the current PC.  */
              stop_bpstat = bpstat_stop_status
-               (&stop_pc, stop_frame_address,
+               (&stop_pc,
 #if DECR_PC_AFTER_BREAK
                 /* Notice the case of stepping through a jump
                    that lands just after a breakpoint.
@@ -748,7 +789,8 @@ switch_thread:
              = !(bpstat_explains_signal (stop_bpstat)
                  || trap_expected
 #ifndef CALL_DUMMY_BREAKPOINT_OFFSET
-                 || PC_IN_CALL_DUMMY (stop_pc, stop_sp, stop_frame_address)
+                 || PC_IN_CALL_DUMMY (stop_pc, read_sp (),
+                                      FRAME_FP (get_current_frame ()))
 #endif /* No CALL_DUMMY_BREAKPOINT_OFFSET.  */
                  || (step_range_end && step_resume_breakpoint == NULL));
          else
@@ -759,7 +801,8 @@ switch_thread:
                       news) give another signal besides SIGTRAP,
                       so check here as well as above.  */
 #ifndef CALL_DUMMY_BREAKPOINT_OFFSET
-                   || PC_IN_CALL_DUMMY (stop_pc, stop_sp, stop_frame_address)
+                   || PC_IN_CALL_DUMMY (stop_pc, read_sp (),
+                                        FRAME_FP (get_current_frame ()))
 #endif /* No CALL_DUMMY_BREAKPOINT_OFFSET.  */
                    );
              if (!random_signal)
@@ -781,12 +824,18 @@ switch_thread:
          
          if (signal_print[stop_signal])
            {
-             char *signame;
              printed = 1;
              target_terminal_ours_for_output ();
-             printf_filtered ("\nProgram received signal %s, %s.\n",
-                              target_signal_to_name (stop_signal),
-                              target_signal_to_string (stop_signal));
+             annotate_signal ();
+             printf_filtered ("\nProgram received signal ");
+             annotate_signal_name ();
+             printf_filtered ("%s", target_signal_to_name (stop_signal));
+             annotate_signal_name_end ();
+             printf_filtered (", ");
+             annotate_signal_string ();
+             printf_filtered ("%s", target_signal_to_string (stop_signal));
+             annotate_signal_string_end ();
+             printf_filtered (".\n");
              gdb_flush (gdb_stdout);
            }
          if (signal_stop[stop_signal])
@@ -864,7 +913,7 @@ switch_thread:
 #if 0
            /* FIXME - Need to implement nested temporary breakpoints */
            if (step_over_calls
-               && (stop_frame_address
+               && (FRAME_FP (get_current_frame ())
                    INNER_THAN step_frame_address))
              {
                another_trap = 1;
@@ -910,7 +959,8 @@ switch_thread:
            break;
 
          case BPSTAT_WHAT_THROUGH_SIGTRAMP:
-           delete_breakpoint (through_sigtramp_breakpoint);
+           if (through_sigtramp_breakpoint)
+             delete_breakpoint (through_sigtramp_breakpoint);
            through_sigtramp_breakpoint = NULL;
 
            /* If were waiting for a trap, hitting the step_resume_break
@@ -943,7 +993,7 @@ switch_thread:
         just stop silently, unless the user was doing an si/ni, in which
         case she'd better know what she's doing.  */
 
-      if (PC_IN_CALL_DUMMY (stop_pc, stop_sp, stop_frame_address)
+      if (PC_IN_CALL_DUMMY (stop_pc, read_sp (), FRAME_FP (get_current_frame ()))
          && !step_range_end)
        {
          stop_print_frame = 0;
@@ -977,17 +1027,21 @@ switch_thread:
             step range and either the stack or frame pointers
             just changed, we've stepped outside */
          && !(stop_pc == step_range_start
-              && stop_frame_address
-              && (stop_sp INNER_THAN prev_sp
-                  || stop_frame_address != step_frame_address)))
+              && FRAME_FP (get_current_frame ())
+              && (read_sp () INNER_THAN step_sp
+                  || FRAME_FP (get_current_frame ()) != step_frame_address)))
        {
          /* We might be doing a BPSTAT_WHAT_SINGLE and getting a signal.
             So definately need to check for sigtramp here.  */
          goto check_sigtramp2;
        }
 
-      /* We stepped out of the stepping range.  See if that was due
-        to a subroutine call that we should proceed to the end of.  */
+      /* We stepped out of the stepping range.  */
+
+      /* We can't update step_sp every time through the loop, because
+        reading the stack pointer would slow down stepping too much.
+        But we can update it every time we leave the step range.  */
+      update_step_sp = 1;
 
       /* Did we just take a signal?  */
       if (IN_SIGTRAMP (stop_pc, stop_func_name)
@@ -1012,8 +1066,7 @@ switch_thread:
            sr_sal.symtab = NULL;
            sr_sal.line = 0;
            /* We could probably be setting the frame to
-              prev_frame_address; the reason we don't is that it didn't used
-              to exist.  */
+              step_frame_address; I don't think anyone thought to try it.  */
            step_resume_breakpoint =
              set_momentary_breakpoint (sr_sal, NULL, bp_step_resume);
            if (breakpoints_inserted)
@@ -1032,12 +1085,22 @@ switch_thread:
          goto keep_going;
        }
 
+#if 1
+      /* See if we left the step range due to a subroutine call that
+        we should proceed to the end of.  */
+
       if (stop_func_start)
        {
+         struct symtab *s;
+
          /* Do this after the IN_SIGTRAMP check; it might give
             an error.  */
          prologue_pc = stop_func_start;
-         SKIP_PROLOGUE (prologue_pc);
+
+         /* Don't skip the prologue if this is assembly source */
+         s = find_pc_symtab (stop_pc);
+         if (s && s->language != language_asm)
+           SKIP_PROLOGUE (prologue_pc);
        }
 
       if ((/* Might be a non-recursive call.  If the symbols are missing
@@ -1049,7 +1112,7 @@ switch_thread:
           /* Might be a recursive call if either we have a prologue
              or the call instruction itself saves the PC on the stack.  */
           || prologue_pc != stop_func_start
-          || stop_sp != prev_sp)
+          || read_sp () != step_sp)
          && (/* PC is completely out of bounds of any known objfiles.  Treat
                 like a subroutine call. */
              ! stop_func_start
@@ -1065,6 +1128,16 @@ switch_thread:
 
              || stop_pc < prologue_pc
 
+             /* ...and if it is a leaf function, the prologue might
+                consist of gp loading only, so the call transfers to
+                the first instruction after the prologue.  */
+             || (stop_pc == prologue_pc
+
+                 /* Distinguish this from the case where we jump back
+                    to the first instruction after the prologue,
+                    within a function.  */
+                  && stop_func_start != prev_func_start)
+
              /* If we end up in certain places, it means we did a subroutine
                 call.  I'm not completely sure this is necessary now that we
                 have the above checks with stop_func_start (and now that
@@ -1076,6 +1149,14 @@ switch_thread:
                 which can no longer happen here as long as the
                 handling_longjmp stuff is working.  */
              ))
+#else
+/* This is experimental code which greatly simplifies the subroutine call
+   test.  I've actually tested on the Alpha, and it works great. -Stu */
+
+       if (in_prologue (stop_pc, NULL)
+           || (prev_func_start != 0
+               && stop_func_start == 0))
+#endif
        {
          /* It's a subroutine call.  */
 
@@ -1128,7 +1209,7 @@ step_over_function:
            step_resume_breakpoint =
              set_momentary_breakpoint (sr_sal, get_current_frame (),
                                        bp_step_resume);
-           step_resume_breakpoint->frame = prev_frame_address;
+           step_resume_breakpoint->frame = step_frame_address;
            if (breakpoints_inserted)
              insert_breakpoints ();
          }
@@ -1137,7 +1218,13 @@ step_over_function:
 step_into_function:
          /* Subroutine call with source code we should not step over.
             Do step to the first line of code in it.  */
-         SKIP_PROLOGUE (stop_func_start);
+         {
+           struct symtab *s;
+
+           s = find_pc_symtab (stop_pc);
+           if (s && s->language != language_asm)
+             SKIP_PROLOGUE (stop_func_start);
+         }
          sal = find_pc_line (stop_func_start, 0);
          /* Use the step_resume_break to step until
             the end of the prologue, even if that involves jumps
@@ -1280,8 +1367,10 @@ step_into_function:
                                          been at the start of a
                                          function. */
       prev_func_name = stop_func_name;
-      prev_sp = stop_sp;
-      prev_frame_address = stop_frame_address;
+
+      if (update_step_sp)
+       step_sp = read_sp ();
+      update_step_sp = 0;
 
       /* If we did not do break;, it means we should keep
         running the inferior and not return to debugger.  */
@@ -1356,8 +1445,6 @@ step_into_function:
       prev_pc = read_pc ();
       prev_func_start = stop_func_start;
       prev_func_name = stop_func_name;
-      prev_sp = stop_sp;
-      prev_frame_address = stop_frame_address;
     }
   do_cleanups (old_cleanups);
 }
@@ -1410,7 +1497,7 @@ Further execution is probably impossible.\n");
     disable_current_display ();
 
   if (step_multi && stop_step)
-    return;
+    goto done;
 
   target_terminal_ours ();
 
@@ -1423,7 +1510,7 @@ Further execution is probably impossible.\n");
     }
 
   if (!target_has_stack)
-    return;
+    goto done;
 
   /* Select innermost stack frame except on return from a stack dummy routine,
      or if the program has exited.  Print it without a level number if
@@ -1431,6 +1518,8 @@ Further execution is probably impossible.\n");
      if we have one.  */
   if (!stop_stack_dummy)
     {
+      select_frame (get_current_frame (), 0);
+
       if (stop_print_frame)
        {
          int source_only;
@@ -1438,7 +1527,7 @@ Further execution is probably impossible.\n");
          source_only = bpstat_print (stop_bpstat);
          source_only = source_only ||
                (   stop_step
-                && step_frame_address == stop_frame_address
+                && step_frame_address == FRAME_FP (get_current_frame ())
                 && step_start_function == find_pc_function (stop_pc));
 
           print_stack_frame (selected_frame, -1, source_only? -1: 1);
@@ -1465,6 +1554,8 @@ Further execution is probably impossible.\n");
       stop_pc = read_pc();
       select_frame (get_current_frame (), 0);
     }
+ done:
+  annotate_stopped ();
 }
 
 static int
@@ -1765,7 +1856,6 @@ save_inferior_status (inf_status, restore_stack_info)
 {
   inf_status->stop_signal = stop_signal;
   inf_status->stop_pc = stop_pc;
-  inf_status->stop_frame_address = stop_frame_address;
   inf_status->stop_step = stop_step;
   inf_status->stop_stack_dummy = stop_stack_dummy;
   inf_status->stopped_by_random_signal = stopped_by_random_signal;
@@ -1835,7 +1925,6 @@ restore_inferior_status (inf_status)
 {
   stop_signal = inf_status->stop_signal;
   stop_pc = inf_status->stop_pc;
-  stop_frame_address = inf_status->stop_frame_address;
   stop_step = inf_status->stop_step;
   stop_stack_dummy = inf_status->stop_stack_dummy;
   stopped_by_random_signal = inf_status->stopped_by_random_signal;
This page took 0.030986 seconds and 4 git commands to generate.