Make it simpler to add events to Python
[deliverable/binutils-gdb.git] / gdb / infrun.c
index fb778d37728b4aa7f09eb72de1e773d2e810d43c..3f2ac85b919fe60fef399c673a0c05e82cc9ce72 100644 (file)
@@ -1,7 +1,7 @@
 /* Target-struct-independent code to start (run) and stop an inferior
    process.
 
-   Copyright (C) 1986-2016 Free Software Foundation, Inc.
+   Copyright (C) 1986-2017 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "event-loop.h"
 #include "thread-fsm.h"
 #include "common/enum-flags.h"
+#include "progspace-and-thread.h"
+#include "common/gdb_optional.h"
+#include "arch-utils.h"
 
 /* Prototypes for local functions */
 
-static void signals_info (char *, int);
+static void info_signals_command (char *, int);
 
 static void handle_command (char *, int);
 
@@ -92,8 +95,6 @@ static void set_schedlock_func (char *args, int from_tty,
 
 static int currently_stepping (struct thread_info *tp);
 
-void _initialize_infrun (void);
-
 void nullify_last_target_wait_ptid (void);
 
 static void insert_hp_step_resume_breakpoint_at_frame (struct frame_info *);
@@ -487,7 +488,6 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
       else
        {
          struct inferior *parent_inf, *child_inf;
-         struct cleanup *old_chain;
 
          /* Add process to GDB's tables.  */
          child_inf = add_inferior (ptid_get_pid (child_ptid));
@@ -498,11 +498,11 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
          child_inf->gdbarch = parent_inf->gdbarch;
          copy_inferior_target_desc_info (child_inf, parent_inf);
 
-         old_chain = save_inferior_ptid ();
-         save_current_program_space ();
+         scoped_restore_current_pspace_and_thread restore_pspace_thread;
 
          inferior_ptid = child_ptid;
          add_thread (inferior_ptid);
+         set_current_inferior (child_inf);
          child_inf->symfile_flags = SYMFILE_NO_READ;
 
          /* If this is a vfork child, then the address-space is
@@ -536,8 +536,6 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
                 required.  */
              solib_create_inferior_hook (0);
            }
-
-         do_cleanups (old_chain);
        }
 
       if (has_vforked)
@@ -631,6 +629,7 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
 
       inferior_ptid = child_ptid;
       add_thread (inferior_ptid);
+      set_current_inferior (child_inf);
 
       /* If this is a vfork child, then the address-space is shared
         with the parent.  If we detached from the parent, then we can
@@ -894,6 +893,22 @@ proceed_after_vfork_done (struct thread_info *thread,
   return 0;
 }
 
+/* Save/restore inferior_ptid, current program space and current
+   inferior.  Only use this if the current context points at an exited
+   inferior (and therefore there's no current thread to save).  */
+class scoped_restore_exited_inferior
+{
+public:
+  scoped_restore_exited_inferior ()
+    : m_saved_ptid (&inferior_ptid)
+  {}
+
+private:
+  scoped_restore_tmpl<ptid_t> m_saved_ptid;
+  scoped_restore_current_program_space m_pspace;
+  scoped_restore_current_inferior m_inferior;
+};
+
 /* Called whenever we notice an exec or exit event, to handle
    detaching or resuming a vfork parent.  */
 
@@ -913,7 +928,6 @@ handle_vfork_child_exec_or_exit (int exec)
       if (inf->vfork_parent->pending_detach)
        {
          struct thread_info *tp;
-         struct cleanup *old_chain;
          struct program_space *pspace;
          struct address_space *aspace;
 
@@ -921,16 +935,17 @@ handle_vfork_child_exec_or_exit (int exec)
 
          inf->vfork_parent->pending_detach = 0;
 
+         gdb::optional<scoped_restore_exited_inferior>
+           maybe_restore_inferior;
+         gdb::optional<scoped_restore_current_pspace_and_thread>
+           maybe_restore_thread;
+
+         /* If we're handling a child exit, then inferior_ptid points
+            at the inferior's pid, not to a thread.  */
          if (!exec)
-           {
-             /* If we're handling a child exit, then inferior_ptid
-                points at the inferior's pid, not to a thread.  */
-             old_chain = save_inferior_ptid ();
-             save_current_program_space ();
-             save_current_inferior ();
-           }
+           maybe_restore_inferior.emplace ();
          else
-           old_chain = save_current_space_and_thread ();
+           maybe_restore_thread.emplace ();
 
          /* We're letting loose of the parent.  */
          tp = any_live_thread_of_process (inf->vfork_parent->pid);
@@ -978,8 +993,6 @@ handle_vfork_child_exec_or_exit (int exec)
          /* Put it back.  */
          inf->pspace = pspace;
          inf->aspace = aspace;
-
-         do_cleanups (old_chain);
        }
       else if (exec)
        {
@@ -997,7 +1010,6 @@ handle_vfork_child_exec_or_exit (int exec)
        }
       else
        {
-         struct cleanup *old_chain;
          struct program_space *pspace;
 
          /* If this is a vfork child exiting, then the pspace and
@@ -1009,10 +1021,11 @@ handle_vfork_child_exec_or_exit (int exec)
             go ahead and create a new one for this exiting
             inferior.  */
 
-         /* Switch to null_ptid, so that clone_program_space doesn't want
-            to read the selected frame of a dead process.  */
-         old_chain = save_inferior_ptid ();
-         inferior_ptid = null_ptid;
+         /* Switch to null_ptid while running clone_program_space, so
+            that clone_program_space doesn't want to read the
+            selected frame of a dead process.  */
+         scoped_restore restore_ptid
+           = make_scoped_restore (&inferior_ptid, null_ptid);
 
          /* This inferior is dead, so avoid giving the breakpoints
             module the option to write through to it (cloning a
@@ -1027,10 +1040,6 @@ handle_vfork_child_exec_or_exit (int exec)
          inf->pspace = pspace;
          inf->aspace = pspace->aspace;
 
-         /* Put back inferior_ptid.  We'll continue mourning this
-            inferior.  */
-         do_cleanups (old_chain);
-
          resume_parent = inf->vfork_parent->pid;
          /* Break the bonds.  */
          inf->vfork_parent->vfork_child = NULL;
@@ -1044,7 +1053,7 @@ handle_vfork_child_exec_or_exit (int exec)
        {
          /* If the user wanted the parent to be running, let it go
             free now.  */
-         struct cleanup *old_chain = make_cleanup_restore_current_thread ();
+         scoped_restore_current_thread restore_thread;
 
          if (debug_infrun)
            fprintf_unfiltered (gdb_stdlog,
@@ -1052,8 +1061,6 @@ handle_vfork_child_exec_or_exit (int exec)
                                resume_parent);
 
          iterate_over_threads (proceed_after_vfork_done, &resume_parent);
-
-         do_cleanups (old_chain);
        }
     }
 }
@@ -1202,7 +1209,6 @@ follow_exec (ptid_t ptid, char *exec_file_target)
 
       set_current_inferior (inf);
       set_current_program_space (inf->pspace);
-      add_thread (ptid);
     }
   else
     {
@@ -1234,6 +1240,11 @@ follow_exec (ptid_t ptid, char *exec_file_target)
      registers.  */
   target_find_description ();
 
+  /* The add_thread call ends up reading registers, so do it after updating the
+     target description.  */
+  if (follow_exec_mode_string == follow_exec_mode_new)
+    add_thread (ptid);
+
   solib_create_inferior_hook (0);
 
   jit_inferior_created_hook ();
@@ -1702,12 +1713,8 @@ displaced_step_clear (struct displaced_step_inferior_state *displaced)
   /* Indicate that there is no cleanup pending.  */
   displaced->step_ptid = null_ptid;
 
-  if (displaced->step_closure)
-    {
-      gdbarch_displaced_step_free_closure (displaced->step_gdbarch,
-                                           displaced->step_closure);
-      displaced->step_closure = NULL;
-    }
+  xfree (displaced->step_closure);
+  displaced->step_closure = NULL;
 }
 
 static void
@@ -1751,7 +1758,7 @@ displaced_step_dump_bytes (struct ui_file *file,
 static int
 displaced_step_prepare_throw (ptid_t ptid)
 {
-  struct cleanup *old_cleanups, *ignore_cleanups;
+  struct cleanup *ignore_cleanups;
   struct thread_info *tp = find_thread_ptid (ptid);
   struct regcache *regcache = get_thread_regcache (ptid);
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
@@ -1803,7 +1810,7 @@ displaced_step_prepare_throw (ptid_t ptid)
 
   displaced_step_clear (displaced);
 
-  old_cleanups = save_inferior_ptid ();
+  scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
   inferior_ptid = ptid;
 
   original = regcache_read_pc (regcache);
@@ -1829,7 +1836,6 @@ displaced_step_prepare_throw (ptid_t ptid)
                              "Stepping over breakpoint in-line instead.\n");
        }
 
-      do_cleanups (old_cleanups);
       return -1;
     }
 
@@ -1859,7 +1865,7 @@ displaced_step_prepare_throw (ptid_t ptid)
       /* The architecture doesn't know how or want to displaced step
         this instruction or instruction sequence.  Fallback to
         stepping over the breakpoint in-line.  */
-      do_cleanups (old_cleanups);
+      do_cleanups (ignore_cleanups);
       return -1;
     }
 
@@ -1878,8 +1884,6 @@ displaced_step_prepare_throw (ptid_t ptid)
 
   discard_cleanups (ignore_cleanups);
 
-  do_cleanups (old_cleanups);
-
   if (debug_displaced)
     fprintf_unfiltered (gdb_stdlog, "displaced: displaced pc to %s\n",
                        paddress (gdbarch, copy));
@@ -1936,11 +1940,10 @@ static void
 write_memory_ptid (ptid_t ptid, CORE_ADDR memaddr,
                   const gdb_byte *myaddr, int len)
 {
-  struct cleanup *ptid_cleanup = save_inferior_ptid ();
+  scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
 
   inferior_ptid = ptid;
   write_memory (memaddr, myaddr, len);
-  do_cleanups (ptid_cleanup);
 }
 
 /* Restore the contents of the copy area for thread PTID.  */
@@ -2083,6 +2086,8 @@ start_step_over (void)
       step_over_what step_what;
       int must_be_in_line;
 
+      gdb_assert (!tp->stop_requested);
+
       next = thread_step_over_chain_next (tp);
 
       /* If this inferior already has a displaced step in process,
@@ -2331,6 +2336,8 @@ do_target_resume (ptid_t resume_ptid, int step, enum gdb_signal sig)
 {
   struct thread_info *tp = inferior_thread ();
 
+  gdb_assert (!tp->stop_requested);
+
   /* Install inferior's terminal modes.  */
   target_terminal_inferior ();
 
@@ -2395,6 +2402,7 @@ resume (enum gdb_signal sig)
      single-step).  */
   int step;
 
+  gdb_assert (!tp->stop_requested);
   gdb_assert (!thread_is_in_step_over_chain (tp));
 
   QUIT;
@@ -2403,15 +2411,14 @@ resume (enum gdb_signal sig)
     {
       if (debug_infrun)
        {
-         char *statstr;
+         std::string statstr
+           = target_waitstatus_to_string (&tp->suspend.waitstatus);
 
-         statstr = target_waitstatus_to_string (&tp->suspend.waitstatus);
          fprintf_unfiltered (gdb_stdlog,
-                             "infrun: resume: thread %s has pending wait status %s "
-                             "(currently_stepping=%d).\n",
-                             target_pid_to_str (tp->ptid),  statstr,
+                             "infrun: resume: thread %s has pending wait "
+                             "status %s (currently_stepping=%d).\n",
+                             target_pid_to_str (tp->ptid), statstr.c_str (),
                              currently_stepping (tp));
-         xfree (statstr);
        }
 
       tp->resumed = 1;
@@ -2814,16 +2821,15 @@ clear_proceed_status_thread (struct thread_info *tp)
        }
       else if (debug_infrun)
        {
-         char *statstr;
+         std::string statstr
+           = target_waitstatus_to_string (&tp->suspend.waitstatus);
 
-         statstr = target_waitstatus_to_string (&tp->suspend.waitstatus);
          fprintf_unfiltered (gdb_stdlog,
                              "infrun: clear_proceed_status_thread: thread %s "
                              "has pending wait status %s "
                              "(currently_stepping=%d).\n",
-                             target_pid_to_str (tp->ptid), statstr,
+                             target_pid_to_str (tp->ptid), statstr.c_str (),
                              currently_stepping (tp));
-         xfree (statstr);
        }
     }
 
@@ -3276,65 +3282,6 @@ static void keep_going (struct execution_control_state *ecs);
 static void process_event_stop_test (struct execution_control_state *ecs);
 static int switch_back_to_stepped_thread (struct execution_control_state *ecs);
 
-/* Callback for iterate over threads.  If the thread is stopped, but
-   the user/frontend doesn't know about that yet, go through
-   normal_stop, as if the thread had just stopped now.  ARG points at
-   a ptid.  If PTID is MINUS_ONE_PTID, applies to all threads.  If
-   ptid_is_pid(PTID) is true, applies to all threads of the process
-   pointed at by PTID.  Otherwise, apply only to the thread pointed by
-   PTID.  */
-
-static int
-infrun_thread_stop_requested_callback (struct thread_info *info, void *arg)
-{
-  ptid_t ptid = * (ptid_t *) arg;
-
-  if ((ptid_equal (info->ptid, ptid)
-       || ptid_equal (minus_one_ptid, ptid)
-       || (ptid_is_pid (ptid)
-          && ptid_get_pid (ptid) == ptid_get_pid (info->ptid)))
-      && is_running (info->ptid)
-      && !is_executing (info->ptid))
-    {
-      struct cleanup *old_chain;
-      struct execution_control_state ecss;
-      struct execution_control_state *ecs = &ecss;
-
-      memset (ecs, 0, sizeof (*ecs));
-
-      old_chain = make_cleanup_restore_current_thread ();
-
-      overlay_cache_invalid = 1;
-      /* Flush target cache before starting to handle each event.
-        Target was running and cache could be stale.  This is just a
-        heuristic.  Running threads may modify target memory, but we
-        don't get any event.  */
-      target_dcache_invalidate ();
-
-      /* Go through handle_inferior_event/normal_stop, so we always
-        have consistent output as if the stop event had been
-        reported.  */
-      ecs->ptid = info->ptid;
-      ecs->event_thread = info;
-      ecs->ws.kind = TARGET_WAITKIND_STOPPED;
-      ecs->ws.value.sig = GDB_SIGNAL_0;
-
-      handle_inferior_event (ecs);
-
-      if (!ecs->wait_some_more)
-       {
-         /* Cancel any running execution command.  */
-         thread_cancel_execution_command (info);
-
-         normal_stop ();
-       }
-
-      do_cleanups (old_chain);
-    }
-
-  return 0;
-}
-
 /* This function is attached as a "thread_stop_requested" observer.
    Cleanup local state that assumed the PTID was to be resumed, and
    report the stop to the frontend.  */
@@ -3344,17 +3291,51 @@ infrun_thread_stop_requested (ptid_t ptid)
 {
   struct thread_info *tp;
 
-  /* PTID was requested to stop.  Remove matching threads from the
-     step-over queue, so we don't try to resume them
-     automatically.  */
+  /* PTID was requested to stop.  If the thread was already stopped,
+     but the user/frontend doesn't know about that yet (e.g., the
+     thread had been temporarily paused for some step-over), set up
+     for reporting the stop now.  */
   ALL_NON_EXITED_THREADS (tp)
     if (ptid_match (tp->ptid, ptid))
       {
+       if (tp->state != THREAD_RUNNING)
+         continue;
+       if (tp->executing)
+         continue;
+
+       /* Remove matching threads from the step-over queue, so
+          start_step_over doesn't try to resume them
+          automatically.  */
        if (thread_is_in_step_over_chain (tp))
          thread_step_over_chain_remove (tp);
-      }
 
-  iterate_over_threads (infrun_thread_stop_requested_callback, &ptid);
+       /* If the thread is stopped, but the user/frontend doesn't
+          know about that yet, queue a pending event, as if the
+          thread had just stopped now.  Unless the thread already had
+          a pending event.  */
+       if (!tp->suspend.waitstatus_pending_p)
+         {
+           tp->suspend.waitstatus_pending_p = 1;
+           tp->suspend.waitstatus.kind = TARGET_WAITKIND_STOPPED;
+           tp->suspend.waitstatus.value.sig = GDB_SIGNAL_0;
+         }
+
+       /* Clear the inline-frame state, since we're re-processing the
+          stop.  */
+       clear_inline_frame_state (tp->ptid);
+
+       /* If this thread was paused because some other thread was
+          doing an inline-step over, let that finish first.  Once
+          that happens, we'll restart all threads and consume pending
+          stop events then.  */
+       if (step_over_info_valid_p ())
+         continue;
+
+       /* Otherwise we can process the (new) pending event now.  Set
+          it so this pending event is considered by
+          do_target_wait.  */
+       tp->resumed = 1;
+      }
 }
 
 static void
@@ -3437,41 +3418,31 @@ void
 print_target_wait_results (ptid_t waiton_ptid, ptid_t result_ptid,
                           const struct target_waitstatus *ws)
 {
-  char *status_string = target_waitstatus_to_string (ws);
-  struct ui_file *tmp_stream = mem_fileopen ();
+  std::string status_string = target_waitstatus_to_string (ws);
+  string_file stb;
 
   /* The text is split over several lines because it was getting too long.
      Call fprintf_unfiltered (gdb_stdlog) once so that the text is still
      output as a unit; we want only one timestamp printed if debug_timestamp
      is set.  */
 
-  fprintf_unfiltered (tmp_stream,
-                     "infrun: target_wait (%d.%ld.%ld",
-                     ptid_get_pid (waiton_ptid),
-                     ptid_get_lwp (waiton_ptid),
-                     ptid_get_tid (waiton_ptid));
+  stb.printf ("infrun: target_wait (%d.%ld.%ld",
+             ptid_get_pid (waiton_ptid),
+             ptid_get_lwp (waiton_ptid),
+             ptid_get_tid (waiton_ptid));
   if (ptid_get_pid (waiton_ptid) != -1)
-    fprintf_unfiltered (tmp_stream,
-                       " [%s]", target_pid_to_str (waiton_ptid));
-  fprintf_unfiltered (tmp_stream, ", status) =\n");
-  fprintf_unfiltered (tmp_stream,
-                     "infrun:   %d.%ld.%ld [%s],\n",
-                     ptid_get_pid (result_ptid),
-                     ptid_get_lwp (result_ptid),
-                     ptid_get_tid (result_ptid),
-                     target_pid_to_str (result_ptid));
-  fprintf_unfiltered (tmp_stream,
-                     "infrun:   %s\n",
-                     status_string);
-
-  std::string text = ui_file_as_string (tmp_stream);
+    stb.printf (" [%s]", target_pid_to_str (waiton_ptid));
+  stb.printf (", status) =\n");
+  stb.printf ("infrun:   %d.%ld.%ld [%s],\n",
+             ptid_get_pid (result_ptid),
+             ptid_get_lwp (result_ptid),
+             ptid_get_tid (result_ptid),
+             target_pid_to_str (result_ptid));
+  stb.printf ("infrun:   %s\n", status_string.c_str ());
 
   /* This uses %s in part to handle %'s in the text, but also to avoid
      a gcc error: the format attribute requires a string literal.  */
-  fprintf_unfiltered (gdb_stdlog, "%s", text.c_str ());
-
-  xfree (status_string);
-  ui_file_delete (tmp_stream);
+  fprintf_unfiltered (gdb_stdlog, "%s", stb.c_str ());
 }
 
 /* Select a thread at random, out of those which are resumed and have
@@ -3593,14 +3564,13 @@ do_target_wait (ptid_t ptid, struct target_waitstatus *status, int options)
     {
       if (debug_infrun)
        {
-         char *statstr;
+         std::string statstr
+           = target_waitstatus_to_string (&tp->suspend.waitstatus);
 
-         statstr = target_waitstatus_to_string (&tp->suspend.waitstatus);
          fprintf_unfiltered (gdb_stdlog,
                              "infrun: Using pending wait status %s for %s.\n",
-                             statstr,
+                             statstr.c_str (),
                              target_pid_to_str (tp->ptid));
-         xfree (statstr);
        }
 
       /* Now that we've selected our final event LWP, un-adjust its PC
@@ -3657,7 +3627,6 @@ prepare_for_detach (void)
 {
   struct inferior *inf = current_inferior ();
   ptid_t pid_ptid = pid_to_ptid (inf->pid);
-  struct cleanup *old_chain_1;
   struct displaced_step_inferior_state *displaced;
 
   displaced = get_displaced_stepping_state (inf->pid);
@@ -3671,8 +3640,7 @@ prepare_for_detach (void)
     fprintf_unfiltered (gdb_stdlog,
                        "displaced-stepping in-process while detaching");
 
-  old_chain_1 = make_cleanup_restore_integer (&inf->detaching);
-  inf->detaching = 1;
+  scoped_restore restore_detaching = make_scoped_restore (&inf->detaching, true);
 
   while (!ptid_equal (displaced->step_ptid, null_ptid))
     {
@@ -3712,12 +3680,12 @@ prepare_for_detach (void)
         inferior, so this must mean the process is gone.  */
       if (!ecs->wait_some_more)
        {
-         discard_cleanups (old_chain_1);
+         restore_detaching.release ();
          error (_("Program exited while detaching"));
        }
     }
 
-  discard_cleanups (old_chain_1);
+  restore_detaching.release ();
 }
 
 /* Wait for control to return from inferior to debugger.
@@ -3918,12 +3886,14 @@ fetch_inferior_event (void *client_data)
       set_current_traceframe (-1);
     }
 
+  gdb::optional<scoped_restore_current_thread> maybe_restore_thread;
+
   if (non_stop)
     /* In non-stop mode, the user/frontend should not notice a thread
        switch due to internal events.  Make sure we reverse to the
        user selected thread and frame after handling the event and
        running any breakpoint commands.  */
-    make_cleanup_restore_current_thread ();
+    maybe_restore_thread.emplace ();
 
   overlay_cache_invalid = 1;
   /* Flush target cache before starting to handle each event.  Target
@@ -4256,6 +4226,23 @@ stepped_in_from (struct frame_info *frame, struct frame_id step_frame_id)
   return 0;
 }
 
+/* If the event thread has the stop requested flag set, pretend it
+   stopped for a GDB_SIGNAL_0 (i.e., as if it stopped due to
+   target_stop).  */
+
+static bool
+handle_stop_requested (struct execution_control_state *ecs)
+{
+  if (ecs->event_thread->stop_requested)
+    {
+      ecs->ws.kind = TARGET_WAITKIND_STOPPED;
+      ecs->ws.value.sig = GDB_SIGNAL_0;
+      handle_signal_stop (ecs);
+      return true;
+    }
+  return false;
+}
+
 /* Auxiliary function that handles syscall entry/return events.
    It returns 1 if the inferior should keep going (and GDB
    should ignore the event), or 0 if the event deserves to be
@@ -4285,6 +4272,9 @@ handle_syscall_event (struct execution_control_state *ecs)
        = bpstat_stop_status (get_regcache_aspace (regcache),
                              stop_pc, ecs->ptid, &ecs->ws);
 
+      if (handle_stop_requested (ecs))
+       return 0;
+
       if (bpstat_causes_stop (ecs->event_thread->control.stop_bpstat))
        {
          /* Catchpoint hit.  */
@@ -4292,6 +4282,9 @@ handle_syscall_event (struct execution_control_state *ecs)
        }
     }
 
+  if (handle_stop_requested (ecs))
+    return 0;
+
   /* If no catchpoint triggered for this, then keep going.  */
   keep_going (ecs);
   return 1;
@@ -4366,17 +4359,10 @@ wait_one (struct target_waitstatus *ws)
 static int                                     \
 thread_stopped_by_ ## REASON (ptid_t ptid)     \
 {                                              \
-  struct cleanup *old_chain;                   \
-  int res;                                     \
-                                               \
-  old_chain = save_inferior_ptid ();           \
+  scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid); \
   inferior_ptid = ptid;                                \
                                                \
-  res = target_stopped_by_ ## REASON ();       \
-                                               \
-  do_cleanups (old_chain);                     \
-                                               \
-  return res;                                  \
+  return target_stopped_by_ ## REASON ();      \
 }
 
 /* Generate thread_stopped_by_watchpoint.  */
@@ -4406,16 +4392,14 @@ save_waitstatus (struct thread_info *tp, struct target_waitstatus *ws)
 
   if (debug_infrun)
     {
-      char *statstr;
+      std::string statstr = target_waitstatus_to_string (ws);
 
-      statstr = target_waitstatus_to_string (ws);
       fprintf_unfiltered (gdb_stdlog,
                          "infrun: saving status %s for %d.%ld.%ld\n",
-                         statstr,
+                         statstr.c_str (),
                          ptid_get_pid (tp->ptid),
                          ptid_get_lwp (tp->ptid),
                          ptid_get_tid (tp->ptid));
-      xfree (statstr);
     }
 
   /* Record for later.  */
@@ -4645,17 +4629,15 @@ stop_all_threads (void)
 
                  if (debug_infrun)
                    {
-                     char *statstr;
+                     std::string statstr = target_waitstatus_to_string (&ws);
 
-                     statstr = target_waitstatus_to_string (&ws);
                      fprintf_unfiltered (gdb_stdlog,
                                          "infrun: target_wait %s, saving "
                                          "status for %d.%ld.%ld\n",
-                                         statstr,
+                                         statstr.c_str (),
                                          ptid_get_pid (t->ptid),
                                          ptid_get_lwp (t->ptid),
                                          ptid_get_tid (t->ptid));
-                     xfree (statstr);
                    }
 
                  /* Record for later.  */
@@ -4982,6 +4964,9 @@ handle_inferior_event_1 (struct execution_control_state *ecs)
            = bpstat_stop_status (get_regcache_aspace (regcache),
                                  stop_pc, ecs->ptid, &ecs->ws);
 
+         if (handle_stop_requested (ecs))
+           return;
+
          if (bpstat_causes_stop (ecs->event_thread->control.stop_bpstat))
            {
              /* A catchpoint triggered.  */
@@ -5036,6 +5021,8 @@ handle_inferior_event_1 (struct execution_control_state *ecs)
     case TARGET_WAITKIND_SPURIOUS:
       if (debug_infrun)
         fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SPURIOUS\n");
+      if (handle_stop_requested (ecs))
+       return;
       if (!ptid_equal (ecs->ptid, inferior_ptid))
        context_switch (ecs->ptid);
       resume (GDB_SIGNAL_0);
@@ -5045,6 +5032,8 @@ handle_inferior_event_1 (struct execution_control_state *ecs)
     case TARGET_WAITKIND_THREAD_CREATED:
       if (debug_infrun)
         fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_THREAD_CREATED\n");
+      if (handle_stop_requested (ecs))
+       return;
       if (!ptid_equal (ecs->ptid, inferior_ptid))
        context_switch (ecs->ptid);
       if (!switch_back_to_stepped_thread (ecs))
@@ -5229,6 +5218,9 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
        = bpstat_stop_status (get_regcache_aspace (get_current_regcache ()),
                              stop_pc, ecs->ptid, &ecs->ws);
 
+      if (handle_stop_requested (ecs))
+       return;
+
       /* If no catchpoint triggered for this, then keep going.  Note
         that we're interested in knowing the bpstat actually causes a
         stop, not just if it may explain the signal.  Software
@@ -5303,6 +5295,10 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
 
       current_inferior ()->waiting_for_vfork_done = 0;
       current_inferior ()->pspace->breakpoints_not_allowed = 0;
+
+      if (handle_stop_requested (ecs))
+       return;
+
       /* This also takes care of reinserting breakpoints in the
         previously locked inferior.  */
       keep_going (ecs);
@@ -5315,8 +5311,6 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
       if (!ptid_equal (ecs->ptid, inferior_ptid))
        context_switch (ecs->ptid);
 
-      stop_pc = regcache_read_pc (get_thread_regcache (ecs->ptid));
-
       /* Do whatever is necessary to the parent branch of the vfork.  */
       handle_vfork_child_exec_or_exit (1);
 
@@ -5325,6 +5319,8 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
          stop.  */
       follow_exec (inferior_ptid, ecs->ws.value.execd_pathname);
 
+      stop_pc = regcache_read_pc (get_thread_regcache (ecs->ptid));
+
       /* In follow_exec we may have deleted the original thread and
         created a new one.  Make sure that the event thread is the
         execd thread for that case (this is a nop otherwise).  */
@@ -5339,6 +5335,9 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
       xfree (ecs->ws.value.execd_pathname);
       ecs->ws.value.execd_pathname = NULL;
 
+      if (handle_stop_requested (ecs))
+       return;
+
       /* If no catchpoint triggered for this, then keep going.  */
       if (!bpstat_causes_stop (ecs->event_thread->control.stop_bpstat))
        {
@@ -5376,7 +5375,6 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
     case TARGET_WAITKIND_STOPPED:
       if (debug_infrun)
         fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_STOPPED\n");
-      ecs->event_thread->suspend.stop_signal = ecs->ws.value.sig;
       handle_signal_stop (ecs);
       return;
 
@@ -5393,6 +5391,10 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
 
       delete_just_stopped_threads_single_step_breakpoints ();
       stop_pc = regcache_read_pc (get_thread_regcache (inferior_ptid));
+
+      if (handle_stop_requested (ecs))
+       return;
+
       observer_notify_no_history ();
       stop_waiting (ecs);
       return;
@@ -5482,6 +5484,8 @@ restart_threads (struct thread_info *event_thread)
          continue;
        }
 
+      gdb_assert (!tp->stop_requested);
+
       /* If some thread needs to start a step-over at this point, it
         should still be in the step-over queue, and thus skipped
         above.  */
@@ -5551,8 +5555,7 @@ finish_step_over (struct execution_control_state *ecs)
         back an event.  */
       gdb_assert (ecs->event_thread->control.trap_expected);
 
-      if (ecs->event_thread->suspend.stop_signal == GDB_SIGNAL_TRAP)
-       clear_step_over_info ();
+      clear_step_over_info ();
     }
 
   if (!target_is_non_stop_p ())
@@ -5664,6 +5667,8 @@ handle_signal_stop (struct execution_control_state *ecs)
 
   gdb_assert (ecs->ws.kind == TARGET_WAITKIND_STOPPED);
 
+  ecs->event_thread->suspend.stop_signal = ecs->ws.value.sig;
+
   /* Do we need to clean up the state of a thread that has
      completed a displaced single-step?  (Doing so usually affects
      the PC, so do it here, before we set stop_pc.)  */
@@ -5683,7 +5688,7 @@ handle_signal_stop (struct execution_control_state *ecs)
     {
       struct regcache *regcache = get_thread_regcache (ecs->ptid);
       struct gdbarch *gdbarch = get_regcache_arch (regcache);
-      struct cleanup *old_chain = save_inferior_ptid ();
+      scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
 
       inferior_ptid = ecs->ptid;
 
@@ -5703,8 +5708,6 @@ handle_signal_stop (struct execution_control_state *ecs)
             fprintf_unfiltered (gdb_stdlog,
                                 "infrun: (no data address available)\n");
        }
-
-      do_cleanups (old_chain);
     }
 
   /* This is originated from start_remote(), start_inferior() and
@@ -6053,6 +6056,15 @@ handle_signal_stop (struct execution_control_state *ecs)
   if (random_signal)
     random_signal = !stopped_by_watchpoint;
 
+  /* Always stop if the user explicitly requested this thread to
+     remain stopped.  */
+  if (ecs->event_thread->stop_requested)
+    {
+      random_signal = 1;
+      if (debug_infrun)
+       fprintf_unfiltered (gdb_stdlog, "infrun: user-requested stop\n");
+    }
+
   /* For the program's own signals, act according to
      the signal handling tables.  */
 
@@ -6099,8 +6111,6 @@ handle_signal_stop (struct execution_control_state *ecs)
          && ecs->event_thread->control.trap_expected
          && ecs->event_thread->control.step_resume_breakpoint == NULL)
        {
-         int was_in_line;
-
          /* We were just starting a new sequence, attempting to
             single-step off of a breakpoint and expecting a SIGTRAP.
             Instead this signal arrives.  This signal will take us out
@@ -6116,34 +6126,11 @@ handle_signal_stop (struct execution_control_state *ecs)
                                 "infrun: signal arrived while stepping over "
                                 "breakpoint\n");
 
-         was_in_line = step_over_info_valid_p ();
-         clear_step_over_info ();
          insert_hp_step_resume_breakpoint_at_frame (frame);
          ecs->event_thread->step_after_step_resume_breakpoint = 1;
          /* Reset trap_expected to ensure breakpoints are re-inserted.  */
          ecs->event_thread->control.trap_expected = 0;
 
-         if (target_is_non_stop_p ())
-           {
-             /* Either "set non-stop" is "on", or the target is
-                always in non-stop mode.  In this case, we have a bit
-                more work to do.  Resume the current thread, and if
-                we had paused all threads, restart them while the
-                signal handler runs.  */
-             keep_going (ecs);
-
-             if (was_in_line)
-               {
-                 restart_threads (ecs->event_thread);
-               }
-             else if (debug_infrun)
-               {
-                 fprintf_unfiltered (gdb_stdlog,
-                                     "infrun: no need to restart threads\n");
-               }
-             return;
-           }
-
          /* If we were nexting/stepping some other thread, switch to
             it, so that we don't continue it, losing control.  */
          if (!switch_back_to_stepped_thread (ecs))
@@ -6573,9 +6560,7 @@ process_event_stop_test (struct execution_control_state *ecs)
        {
          /* Set up a step-resume breakpoint at the address
             indicated by SKIP_SOLIB_RESOLVER.  */
-         struct symtab_and_line sr_sal;
-
-         init_sal (&sr_sal);
+         symtab_and_line sr_sal;
          sr_sal.pc = pc_after_resolver;
          sr_sal.pspace = get_frame_program_space (frame);
 
@@ -6626,9 +6611,7 @@ process_event_stop_test (struct execution_control_state *ecs)
       if (real_stop_pc)
        {
          /* And put the step-breakpoint there and go until there.  */
-         struct symtab_and_line sr_sal;
-
-         init_sal (&sr_sal);   /* initialize to zeroes */
+         symtab_and_line sr_sal;
          sr_sal.pc = real_stop_pc;
          sr_sal.section = find_pc_overlay (sr_sal.pc);
          sr_sal.pspace = get_frame_program_space (frame);
@@ -6726,10 +6709,8 @@ process_event_stop_test (struct execution_control_state *ecs)
                 to the caller.  */
              if (ecs->stop_func_start != stop_pc && ecs->stop_func_start != 0)
                {
-                 struct symtab_and_line sr_sal;
-
                  /* Normal function call return (static or dynamic).  */
-                 init_sal (&sr_sal);
+                 symtab_and_line sr_sal;
                  sr_sal.pc = ecs->stop_func_start;
                  sr_sal.pspace = get_frame_program_space (frame);
                  insert_step_resume_breakpoint_at_sal (gdbarch,
@@ -6756,9 +6737,7 @@ process_event_stop_test (struct execution_control_state *ecs)
 
       if (real_stop_pc != 0 && in_solib_dynsym_resolve_code (real_stop_pc))
        {
-         struct symtab_and_line sr_sal;
-
-         init_sal (&sr_sal);
+         symtab_and_line sr_sal;
          sr_sal.pc = ecs->stop_func_start;
          sr_sal.pspace = get_frame_program_space (frame);
 
@@ -6781,7 +6760,7 @@ process_event_stop_test (struct execution_control_state *ecs)
        tmp_sal = find_pc_line (ecs->stop_func_start, 0);
        if (tmp_sal.line != 0
            && !function_name_is_marked_for_skip (ecs->stop_func_name,
-                                                 &tmp_sal))
+                                                 tmp_sal))
          {
            if (execution_direction == EXEC_REVERSE)
              handle_step_into_function_backward (gdbarch, ecs);
@@ -6812,9 +6791,7 @@ process_event_stop_test (struct execution_control_state *ecs)
            {
              /* Set a breakpoint at callee's start address.
                 From there we can step once and be back in the caller.  */
-             struct symtab_and_line sr_sal;
-
-             init_sal (&sr_sal);
+             symtab_and_line sr_sal;
              sr_sal.pc = ecs->stop_func_start;
              sr_sal.pspace = get_frame_program_space (frame);
              insert_step_resume_breakpoint_at_sal (gdbarch,
@@ -6852,9 +6829,7 @@ process_event_stop_test (struct execution_control_state *ecs)
          /* Stepped backward into the solib dynsym resolver.
             Set a breakpoint at its start and continue, then
             one more step will take us out.  */
-         struct symtab_and_line sr_sal;
-
-         init_sal (&sr_sal);
+         symtab_and_line sr_sal;
          sr_sal.pc = ecs->stop_func_start;
          sr_sal.pspace = get_frame_program_space (frame);
          insert_step_resume_breakpoint_at_sal (gdbarch, 
@@ -6934,13 +6909,11 @@ process_event_stop_test (struct execution_control_state *ecs)
                   ecs->event_thread->control.step_frame_id)
       && inline_skipped_frames (ecs->ptid))
     {
-      struct symtab_and_line call_sal;
-
       if (debug_infrun)
        fprintf_unfiltered (gdb_stdlog,
                            "infrun: stepped into inlined function\n");
 
-      find_frame_sal (get_current_frame (), &call_sal);
+      symtab_and_line call_sal = find_frame_sal (get_current_frame ());
 
       if (ecs->event_thread->control.step_over_calls != STEP_OVER_ALL)
        {
@@ -7304,17 +7277,14 @@ static void
 handle_step_into_function (struct gdbarch *gdbarch,
                           struct execution_control_state *ecs)
 {
-  struct compunit_symtab *cust;
-  struct symtab_and_line stop_func_sal, sr_sal;
-
   fill_in_stop_func (gdbarch, ecs);
 
-  cust = find_pc_compunit_symtab (stop_pc);
+  compunit_symtab *cust = find_pc_compunit_symtab (stop_pc);
   if (cust != NULL && compunit_language (cust) != language_asm)
-    ecs->stop_func_start = gdbarch_skip_prologue (gdbarch,
-                                                 ecs->stop_func_start);
+    ecs->stop_func_start
+      = gdbarch_skip_prologue_noexcept (gdbarch, ecs->stop_func_start);
 
-  stop_func_sal = find_pc_line (ecs->stop_func_start, 0);
+  symtab_and_line stop_func_sal = find_pc_line (ecs->stop_func_start, 0);
   /* Use the step_resume_break to step until the end of the prologue,
      even if that involves jumps (as it seems to on the vax under
      4.2).  */
@@ -7358,7 +7328,7 @@ handle_step_into_function (struct gdbarch *gdbarch,
   else
     {
       /* Put the step-breakpoint there and go until there.  */
-      init_sal (&sr_sal);      /* initialize to zeroes */
+      symtab_and_line sr_sal;
       sr_sal.pc = ecs->stop_func_start;
       sr_sal.section = find_pc_overlay (ecs->stop_func_start);
       sr_sal.pspace = get_frame_program_space (get_current_frame ());
@@ -7390,8 +7360,8 @@ handle_step_into_function_backward (struct gdbarch *gdbarch,
 
   cust = find_pc_compunit_symtab (stop_pc);
   if (cust != NULL && compunit_language (cust) != language_asm)
-    ecs->stop_func_start = gdbarch_skip_prologue (gdbarch,
-                                                 ecs->stop_func_start);
+    ecs->stop_func_start
+      = gdbarch_skip_prologue_noexcept (gdbarch, ecs->stop_func_start);
 
   stop_func_sal = find_pc_line (stop_pc, 0);
 
@@ -7457,13 +7427,11 @@ insert_step_resume_breakpoint_at_sal (struct gdbarch *gdbarch,
 static void
 insert_hp_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
 {
-  struct symtab_and_line sr_sal;
-  struct gdbarch *gdbarch;
-
   gdb_assert (return_frame != NULL);
-  init_sal (&sr_sal);          /* initialize to zeros */
 
-  gdbarch = get_frame_arch (return_frame);
+  struct gdbarch *gdbarch = get_frame_arch (return_frame);
+
+  symtab_and_line sr_sal;
   sr_sal.pc = gdbarch_addr_bits_remove (gdbarch, get_frame_pc (return_frame));
   sr_sal.section = find_pc_overlay (sr_sal.pc);
   sr_sal.pspace = get_frame_program_space (return_frame);
@@ -7490,16 +7458,13 @@ insert_hp_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
 static void
 insert_step_resume_breakpoint_at_caller (struct frame_info *next_frame)
 {
-  struct symtab_and_line sr_sal;
-  struct gdbarch *gdbarch;
-
   /* We shouldn't have gotten here if we don't know where the call site
      is.  */
   gdb_assert (frame_id_p (frame_unwind_caller_id (next_frame)));
 
-  init_sal (&sr_sal);          /* initialize to zeros */
+  struct gdbarch *gdbarch = frame_unwind_caller_arch (next_frame);
 
-  gdbarch = frame_unwind_caller_arch (next_frame);
+  symtab_and_line sr_sal;
   sr_sal.pc = gdbarch_addr_bits_remove (gdbarch,
                                        frame_unwind_caller_pc (next_frame));
   sr_sal.section = find_pc_overlay (sr_sal.pc);
@@ -7684,8 +7649,6 @@ stop_waiting (struct execution_control_state *ecs)
   if (debug_infrun)
     fprintf_unfiltered (gdb_stdlog, "infrun: stop_waiting\n");
 
-  clear_step_over_info ();
-
   /* Let callers know we don't want to wait for the inferior anymore.  */
   ecs->wait_some_more = 0;
 
@@ -8165,7 +8128,7 @@ save_stop_context (void)
       /* Take a strong reference so that the thread can't be deleted
         yet.  */
       sc->thread = inferior_thread ();
-      sc->thread->refcount++;
+      sc->thread->incref ();
     }
   else
     sc->thread = NULL;
@@ -8182,7 +8145,7 @@ release_stop_context_cleanup (void *arg)
   struct stop_context *sc = (struct stop_context *) arg;
 
   if (sc->thread != NULL)
-    sc->thread->refcount--;
+    sc->thread->decref ();
   xfree (sc);
 }
 
@@ -8507,14 +8470,12 @@ sig_print_info (enum gdb_signal oursig)
 static void
 handle_command (char *args, int from_tty)
 {
-  char **argv;
   int digits, wordlen;
   int sigfirst, signum, siglast;
   enum gdb_signal oursig;
   int allsigs;
   int nsigs;
   unsigned char *sigs;
-  struct cleanup *old_chain;
 
   if (args == NULL)
     {
@@ -8529,24 +8490,23 @@ handle_command (char *args, int from_tty)
 
   /* Break the command line up into args.  */
 
-  argv = gdb_buildargv (args);
-  old_chain = make_cleanup_freeargv (argv);
+  gdb_argv built_argv (args);
 
   /* Walk through the args, looking for signal oursigs, signal names, and
      actions.  Signal numbers and signal names may be interspersed with
      actions, with the actions being performed for all signals cumulatively
      specified.  Signal ranges can be specified as <LOW>-<HIGH>.  */
 
-  while (*argv != NULL)
+  for (char *arg : built_argv)
     {
-      wordlen = strlen (*argv);
-      for (digits = 0; isdigit ((*argv)[digits]); digits++)
+      wordlen = strlen (arg);
+      for (digits = 0; isdigit (arg[digits]); digits++)
        {;
        }
       allsigs = 0;
       sigfirst = siglast = -1;
 
-      if (wordlen >= 1 && !strncmp (*argv, "all", wordlen))
+      if (wordlen >= 1 && !strncmp (arg, "all", wordlen))
        {
          /* Apply action to all signals except those used by the
             debugger.  Silently skip those.  */
@@ -8554,37 +8514,37 @@ handle_command (char *args, int from_tty)
          sigfirst = 0;
          siglast = nsigs - 1;
        }
-      else if (wordlen >= 1 && !strncmp (*argv, "stop", wordlen))
+      else if (wordlen >= 1 && !strncmp (arg, "stop", wordlen))
        {
          SET_SIGS (nsigs, sigs, signal_stop);
          SET_SIGS (nsigs, sigs, signal_print);
        }
-      else if (wordlen >= 1 && !strncmp (*argv, "ignore", wordlen))
+      else if (wordlen >= 1 && !strncmp (arg, "ignore", wordlen))
        {
          UNSET_SIGS (nsigs, sigs, signal_program);
        }
-      else if (wordlen >= 2 && !strncmp (*argv, "print", wordlen))
+      else if (wordlen >= 2 && !strncmp (arg, "print", wordlen))
        {
          SET_SIGS (nsigs, sigs, signal_print);
        }
-      else if (wordlen >= 2 && !strncmp (*argv, "pass", wordlen))
+      else if (wordlen >= 2 && !strncmp (arg, "pass", wordlen))
        {
          SET_SIGS (nsigs, sigs, signal_program);
        }
-      else if (wordlen >= 3 && !strncmp (*argv, "nostop", wordlen))
+      else if (wordlen >= 3 && !strncmp (arg, "nostop", wordlen))
        {
          UNSET_SIGS (nsigs, sigs, signal_stop);
        }
-      else if (wordlen >= 3 && !strncmp (*argv, "noignore", wordlen))
+      else if (wordlen >= 3 && !strncmp (arg, "noignore", wordlen))
        {
          SET_SIGS (nsigs, sigs, signal_program);
        }
-      else if (wordlen >= 4 && !strncmp (*argv, "noprint", wordlen))
+      else if (wordlen >= 4 && !strncmp (arg, "noprint", wordlen))
        {
          UNSET_SIGS (nsigs, sigs, signal_print);
          UNSET_SIGS (nsigs, sigs, signal_stop);
        }
-      else if (wordlen >= 4 && !strncmp (*argv, "nopass", wordlen))
+      else if (wordlen >= 4 && !strncmp (arg, "nopass", wordlen))
        {
          UNSET_SIGS (nsigs, sigs, signal_program);
        }
@@ -8597,11 +8557,11 @@ handle_command (char *args, int from_tty)
             SIGHUP, SIGINT, SIGALRM, etc. will work right anyway.  */
 
          sigfirst = siglast = (int)
-           gdb_signal_from_command (atoi (*argv));
-         if ((*argv)[digits] == '-')
+           gdb_signal_from_command (atoi (arg));
+         if (arg[digits] == '-')
            {
              siglast = (int)
-               gdb_signal_from_command (atoi ((*argv) + digits + 1));
+               gdb_signal_from_command (atoi (arg + digits + 1));
            }
          if (sigfirst > siglast)
            {
@@ -8613,7 +8573,7 @@ handle_command (char *args, int from_tty)
        }
       else
        {
-         oursig = gdb_signal_from_name (*argv);
+         oursig = gdb_signal_from_name (arg);
          if (oursig != GDB_SIGNAL_UNKNOWN)
            {
              sigfirst = siglast = (int) oursig;
@@ -8621,7 +8581,7 @@ handle_command (char *args, int from_tty)
          else
            {
              /* Not a number and not a recognized flag word => complain.  */
-             error (_("Unrecognized or ambiguous flag word: \"%s\"."), *argv);
+             error (_("Unrecognized or ambiguous flag word: \"%s\"."), arg);
            }
        }
 
@@ -8659,8 +8619,6 @@ Are you sure you want to change it? "),
              break;
            }
        }
-
-      argv++;
     }
 
   for (signum = 0; signum < nsigs; signum++)
@@ -8681,17 +8639,15 @@ Are you sure you want to change it? "),
 
        break;
       }
-
-  do_cleanups (old_chain);
 }
 
 /* Complete the "handle" command.  */
 
-static VEC (char_ptr) *
+static void
 handle_completer (struct cmd_list_element *ignore,
+                 completion_tracker &tracker,
                  const char *text, const char *word)
 {
-  VEC (char_ptr) *vec_signals, *vec_keywords, *return_val;
   static const char * const keywords[] =
     {
       "all",
@@ -8706,13 +8662,8 @@ handle_completer (struct cmd_list_element *ignore,
       NULL,
     };
 
-  vec_signals = signal_completer (ignore, text, word);
-  vec_keywords = complete_on_enum (keywords, word, word);
-
-  return_val = VEC_merge (char_ptr, vec_signals, vec_keywords);
-  VEC_free (char_ptr, vec_signals);
-  VEC_free (char_ptr, vec_keywords);
-  return return_val;
+  signal_completer (ignore, tracker, text, word);
+  complete_on_enum (tracker, keywords, word, word);
 }
 
 enum gdb_signal
@@ -8730,7 +8681,7 @@ Use \"info signals\" for a list of symbolic signals."));
    targets, all signals should be in the signal tables).  */
 
 static void
-signals_info (char *signum_exp, int from_tty)
+info_signals_command (char *signum_exp, int from_tty)
 {
   enum gdb_signal oursig;
 
@@ -9123,32 +9074,6 @@ discard_infcall_control_state (struct infcall_control_state *inf_status)
   xfree (inf_status);
 }
 \f
-/* restore_inferior_ptid() will be used by the cleanup machinery
-   to restore the inferior_ptid value saved in a call to
-   save_inferior_ptid().  */
-
-static void
-restore_inferior_ptid (void *arg)
-{
-  ptid_t *saved_ptid_ptr = (ptid_t *) arg;
-
-  inferior_ptid = *saved_ptid_ptr;
-  xfree (arg);
-}
-
-/* Save the value of inferior_ptid so that it may be restored by a
-   later call to do_cleanups().  Returns the struct cleanup pointer
-   needed for later doing the cleanup.  */
-
-struct cleanup *
-save_inferior_ptid (void)
-{
-  ptid_t *saved_ptid_ptr = XNEW (ptid_t);
-
-  *saved_ptid_ptr = inferior_ptid;
-  return make_cleanup (restore_inferior_ptid, saved_ptid_ptr);
-}
-
 /* See infrun.h.  */
 
 void
@@ -9246,7 +9171,7 @@ _initialize_infrun (void)
   infrun_async_inferior_event_token
     = create_async_event_handler (infrun_async_inferior_event_handler, NULL);
 
-  add_info ("signals", signals_info, _("\
+  add_info ("signals", info_signals_command, _("\
 What debugger does when program gets various signals.\n\
 Specify a signal as argument to print info on that signal only."));
   add_info_alias ("handle", "signals", 0);
This page took 0.042409 seconds and 4 git commands to generate.