remove comment in machoread.c (macho_symfile_read)
[deliverable/binutils-gdb.git] / gdb / linux-nat.c
index cd88df8a2a9fa8fad6d45c3efe47ba0a5600836d..ec4c78844006d78ddf1326d53267baf0c17de28c 100644 (file)
@@ -30,6 +30,7 @@
 #endif
 #include <sys/ptrace.h>
 #include "linux-nat.h"
+#include "linux-ptrace.h"
 #include "linux-fork.h"
 #include "gdbthread.h"
 #include "gdbcmd.h"
@@ -160,49 +161,11 @@ blocked.  */
 #define O_LARGEFILE 0
 #endif
 
-/* If the system headers did not provide the constants, hard-code the normal
-   values.  */
-#ifndef PTRACE_EVENT_FORK
-
-#define PTRACE_SETOPTIONS      0x4200
-#define PTRACE_GETEVENTMSG     0x4201
-
-/* Options set using PTRACE_SETOPTIONS.  */
-#define PTRACE_O_TRACESYSGOOD  0x00000001
-#define PTRACE_O_TRACEFORK     0x00000002
-#define PTRACE_O_TRACEVFORK    0x00000004
-#define PTRACE_O_TRACECLONE    0x00000008
-#define PTRACE_O_TRACEEXEC     0x00000010
-#define PTRACE_O_TRACEVFORKDONE        0x00000020
-#define PTRACE_O_TRACEEXIT     0x00000040
-
-/* Wait extended result codes for the above trace options.  */
-#define PTRACE_EVENT_FORK      1
-#define PTRACE_EVENT_VFORK     2
-#define PTRACE_EVENT_CLONE     3
-#define PTRACE_EVENT_EXEC      4
-#define PTRACE_EVENT_VFORK_DONE        5
-#define PTRACE_EVENT_EXIT      6
-
-#endif /* PTRACE_EVENT_FORK */
-
 /* Unlike other extended result codes, WSTOPSIG (status) on
    PTRACE_O_TRACESYSGOOD syscall events doesn't return SIGTRAP, but
    instead SIGTRAP with bit 7 set.  */
 #define SYSCALL_SIGTRAP (SIGTRAP | 0x80)
 
-/* We can't always assume that this flag is available, but all systems
-   with the ptrace event handlers also have __WALL, so it's safe to use
-   here.  */
-#ifndef __WALL
-#define __WALL          0x40000000 /* Wait for any child.  */
-#endif
-
-#ifndef PTRACE_GETSIGINFO
-# define PTRACE_GETSIGINFO    0x4202
-# define PTRACE_SETSIGINFO    0x4203
-#endif
-
 /* The single-threaded native GNU/Linux target_ops.  We save a pointer for
    the use of the multi-threaded target.  */
 static struct target_ops *linux_ops;
@@ -235,16 +198,6 @@ show_debug_linux_nat (struct ui_file *file, int from_tty,
                    value);
 }
 
-static int debug_linux_nat_async = 0;
-static void
-show_debug_linux_nat_async (struct ui_file *file, int from_tty,
-                           struct cmd_list_element *c, const char *value)
-{
-  fprintf_filtered (file,
-                   _("Debugging of GNU/Linux async lwp module is %s.\n"),
-                   value);
-}
-
 static int disable_randomization = 1;
 
 static void
@@ -297,15 +250,11 @@ static int linux_supports_tracesysgood_flag = -1;
 
 static int linux_supports_tracevforkdone_flag = -1;
 
-/* Async mode support.  */
-
-/* Zero if the async mode, although enabled, is masked, which means
-   linux_nat_wait should behave as if async mode was off.  */
-static int linux_nat_async_mask_value = 1;
-
 /* Stores the current used ptrace() options.  */
 static int current_ptrace_options = 0;
 
+/* Async mode support.  */
+
 /* The read/write ends of the pipe registered as waitable file in the
    event loop.  */
 static int linux_nat_event_pipe[2] = { -1, -1 };
@@ -353,7 +302,6 @@ static void linux_nat_async (void (*callback)
                             (enum inferior_event_type event_type,
                              void *context),
                             void *context);
-static int linux_nat_async_mask (int mask);
 static int kill_lwp (int lwpid, int signo);
 
 static int stop_callback (struct lwp_info *lp, void *data);
@@ -980,18 +928,36 @@ linux_child_insert_fork_catchpoint (int pid)
   return !linux_supports_tracefork (pid);
 }
 
+static int
+linux_child_remove_fork_catchpoint (int pid)
+{
+  return 0;
+}
+
 static int
 linux_child_insert_vfork_catchpoint (int pid)
 {
   return !linux_supports_tracefork (pid);
 }
 
+static int
+linux_child_remove_vfork_catchpoint (int pid)
+{
+  return 0;
+}
+
 static int
 linux_child_insert_exec_catchpoint (int pid)
 {
   return !linux_supports_tracefork (pid);
 }
 
+static int
+linux_child_remove_exec_catchpoint (int pid)
+{
+  return 0;
+}
+
 static int
 linux_child_set_syscall_catchpoint (int pid, int needed, int any_count,
                                    int table_size, int *table)
@@ -1078,6 +1044,26 @@ restore_child_signals_mask (sigset_t *prev_mask)
 {
   sigprocmask (SIG_SETMASK, prev_mask, NULL);
 }
+
+/* Mask of signals to pass directly to the inferior.  */
+static sigset_t pass_mask;
+
+/* Update signals to pass to the inferior.  */
+static void
+linux_nat_pass_signals (int numsigs, unsigned char *pass_signals)
+{
+  int signo;
+
+  sigemptyset (&pass_mask);
+
+  for (signo = 1; signo < NSIG; signo++)
+    {
+      int target_signo = target_signal_from_host (signo);
+      if (target_signo < numsigs && pass_signals[target_signo])
+        sigaddset (&pass_mask, signo);
+    }
+}
+
 \f
 
 /* Prototypes for local functions.  */
@@ -1475,7 +1461,10 @@ lin_lwp_attach_lwp (ptid_t ptid)
 
       status = linux_nat_post_attach_wait (ptid, 0, &cloned, &signalled);
       if (!WIFSTOPPED (status))
-       return -1;
+       {
+         restore_child_signals_mask (&prev_mask);
+         return -1;
+       }
 
       lp = add_lwp (ptid);
       lp->stopped = 1;
@@ -1543,6 +1532,9 @@ linux_nat_create_inferior (struct target_ops *ops,
     }
 #endif /* HAVE_PERSONALITY */
 
+  /* Make sure we report all signals during startup.  */
+  linux_nat_pass_signals (0, NULL);
+
   linux_ops->to_create_inferior (ops, exec_file, allargs, env, from_tty);
 
 #ifdef HAVE_PERSONALITY
@@ -1564,6 +1556,9 @@ linux_nat_attach (struct target_ops *ops, char *args, int from_tty)
   int status;
   ptid_t ptid;
 
+  /* Make sure we report all signals during attach.  */
+  linux_nat_pass_signals (0, NULL);
+
   linux_ops->to_attach (ops, args, from_tty);
 
   /* The ptrace base target adds the main thread with (pid,0,0)
@@ -1922,19 +1917,9 @@ linux_nat_resume (struct target_ops *ops,
 
   if (lp->status && WIFSTOPPED (lp->status))
     {
-      enum target_signal saved_signo;
-      struct inferior *inf;
-
-      inf = find_inferior_pid (ptid_get_pid (lp->ptid));
-      gdb_assert (inf);
-      saved_signo = target_signal_from_host (WSTOPSIG (lp->status));
-
-      /* Defer to common code if we're gaining control of the
-        inferior.  */
-      if (inf->control.stop_soon == NO_STOP_QUIETLY
-         && signal_stop_state (saved_signo) == 0
-         && signal_print_state (saved_signo) == 0
-         && signal_pass_state (saved_signo) == 1)
+      if (!lp->step
+         && WSTOPSIG (lp->status)
+         && sigismember (&pass_mask, WSTOPSIG (lp->status)))
        {
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog,
@@ -1944,7 +1929,7 @@ linux_nat_resume (struct target_ops *ops,
          /* FIXME: What should we do if we are supposed to continue
             this thread with a signal?  */
          gdb_assert (signo == TARGET_SIGNAL_0);
-         signo = saved_signo;
+         signo = target_signal_from_host (WSTOPSIG (lp->status));
          lp->status = 0;
        }
     }
@@ -2198,8 +2183,6 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
       if (event == PTRACE_EVENT_FORK
          && linux_fork_checkpointing_p (GET_PID (lp->ptid)))
        {
-         struct fork_info *fp;
-
          /* Handle checkpointing by linux-fork.c here as a special
             case.  We don't want the follow-fork-mode or 'catch fork'
             to interfere with this.  */
@@ -2209,9 +2192,8 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
          detach_breakpoints (new_pid);
 
          /* Retain child fork in ptrace (stopped) state.  */
-         fp = find_fork_pid (new_pid);
-         if (!fp)
-           fp = add_fork (new_pid);
+         if (!find_fork_pid (new_pid))
+           add_fork (new_pid);
 
          /* Report as spurious, so that infrun doesn't want to follow
             this fork.  We're actually doing an infcall in
@@ -2369,6 +2351,33 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
                  _("unknown ptrace event %d"), event);
 }
 
+/* Return non-zero if LWP is a zombie.  */
+
+static int
+linux_lwp_is_zombie (long lwp)
+{
+  char buffer[MAXPATHLEN];
+  FILE *procfile;
+  int retval = 0;
+
+  xsnprintf (buffer, sizeof (buffer), "/proc/%ld/status", lwp);
+  procfile = fopen (buffer, "r");
+  if (procfile == NULL)
+    {
+      warning (_("unable to open /proc file '%s'"), buffer);
+      return 0;
+    }
+  while (fgets (buffer, sizeof (buffer), procfile) != NULL)
+    if (strcmp (buffer, "State:\tZ (zombie)\n") == 0)
+      {
+       retval = 1;
+       break;
+      }
+  fclose (procfile);
+
+  return retval;
+}
+
 /* Wait for LP to stop.  Returns the wait status, or 0 if the LWP has
    exited.  */
 
@@ -2376,28 +2385,76 @@ static int
 wait_lwp (struct lwp_info *lp)
 {
   pid_t pid;
-  int status;
+  int status = 0;
   int thread_dead = 0;
+  sigset_t prev_mask;
 
   gdb_assert (!lp->stopped);
   gdb_assert (lp->status == 0);
 
-  pid = my_waitpid (GET_LWP (lp->ptid), &status, 0);
-  if (pid == -1 && errno == ECHILD)
+  /* Make sure SIGCHLD is blocked for sigsuspend avoiding a race below.  */
+  block_child_signals (&prev_mask);
+
+  for (;;)
     {
-      pid = my_waitpid (GET_LWP (lp->ptid), &status, __WCLONE);
+      /* If my_waitpid returns 0 it means the __WCLONE vs. non-__WCLONE kind
+        was right and we should just call sigsuspend.  */
+
+      pid = my_waitpid (GET_LWP (lp->ptid), &status, WNOHANG);
       if (pid == -1 && errno == ECHILD)
+       pid = my_waitpid (GET_LWP (lp->ptid), &status, __WCLONE | WNOHANG);
+      if (pid != 0)
+       break;
+
+      /* Bugs 10970, 12702.
+        Thread group leader may have exited in which case we'll lock up in
+        waitpid if there are other threads, even if they are all zombies too.
+        Basically, we're not supposed to use waitpid this way.
+        __WCLONE is not applicable for the leader so we can't use that.
+        LINUX_NAT_THREAD_ALIVE cannot be used here as it requires a STOPPED
+        process; it gets ESRCH both for the zombie and for running processes.
+
+        As a workaround, check if we're waiting for the thread group leader and
+        if it's a zombie, and avoid calling waitpid if it is.
+
+        This is racy, what if the tgl becomes a zombie right after we check?
+        Therefore always use WNOHANG with sigsuspend - it is equivalent to
+        waiting waitpid but the linux_lwp_is_zombie is safe this way.  */
+
+      if (GET_PID (lp->ptid) == GET_LWP (lp->ptid)
+         && linux_lwp_is_zombie (GET_LWP (lp->ptid)))
        {
-         /* The thread has previously exited.  We need to delete it
-            now because, for some vendor 2.4 kernels with NPTL
-            support backported, there won't be an exit event unless
-            it is the main thread.  2.6 kernels will report an exit
-            event for each thread that exits, as expected.  */
          thread_dead = 1;
          if (debug_linux_nat)
-           fprintf_unfiltered (gdb_stdlog, "WL: %s vanished.\n",
+           fprintf_unfiltered (gdb_stdlog,
+                               "WL: Thread group leader %s vanished.\n",
                                target_pid_to_str (lp->ptid));
+         break;
        }
+
+      /* Wait for next SIGCHLD and try again.  This may let SIGCHLD handlers
+        get invoked despite our caller had them intentionally blocked by
+        block_child_signals.  This is sensitive only to the loop of
+        linux_nat_wait_1 and there if we get called my_waitpid gets called
+        again before it gets to sigsuspend so we can safely let the handlers
+        get executed here.  */
+
+      sigsuspend (&suspend_mask);
+    }
+
+  restore_child_signals_mask (&prev_mask);
+
+  if (pid == -1 && errno == ECHILD)
+    {
+      /* The thread has previously exited.  We need to delete it
+        now because, for some vendor 2.4 kernels with NPTL
+        support backported, there won't be an exit event unless
+        it is the main thread.  2.6 kernels will report an exit
+        event for each thread that exits, as expected.  */
+      thread_dead = 1;
+      if (debug_linux_nat)
+       fprintf_unfiltered (gdb_stdlog, "WL: %s vanished.\n",
+                           target_pid_to_str (lp->ptid));
     }
 
   if (!thread_dead)
@@ -2828,7 +2885,7 @@ status_callback (struct lwp_info *lp, void *data)
   if (lp->waitstatus.kind != TARGET_WAITKIND_IGNORE)
     {
       /* A ptrace event, like PTRACE_FORK|VFORK|EXEC, syscall event,
-        or a pending process exit.  Note that `W_EXITCODE(0,0) ==
+        or a pending process exit.  Note that `W_EXITCODE(0,0) ==
         0', so a clean process exit can not be stored pending in
         lp->status, it is indistinguishable from
         no-pending-status.  */
@@ -3263,7 +3320,7 @@ linux_nat_wait_1 (struct target_ops *ops,
   int status = 0;
   pid_t pid;
 
-  if (debug_linux_nat_async)
+  if (debug_linux_nat)
     fprintf_unfiltered (gdb_stdlog, "LLW: enter\n");
 
   /* The first time we get here after starting a new inferior, we may
@@ -3306,7 +3363,7 @@ retry:
     {
       ourstatus->kind = TARGET_WAITKIND_IGNORE;
 
-      if (debug_linux_nat_async)
+      if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog, "LLW: exit (no resumed LWP)\n");
 
       restore_child_signals_mask (&prev_mask);
@@ -3549,7 +3606,7 @@ retry:
                  /* No interesting event.  */
                  ourstatus->kind = TARGET_WAITKIND_IGNORE;
 
-                 if (debug_linux_nat_async)
+                 if (debug_linux_nat)
                    fprintf_unfiltered (gdb_stdlog, "LLW: exit (ignore)\n");
 
                  restore_child_signals_mask (&prev_mask);
@@ -3564,7 +3621,7 @@ retry:
          /* No interesting event for PID yet.  */
          ourstatus->kind = TARGET_WAITKIND_IGNORE;
 
-         if (debug_linux_nat_async)
+         if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog, "LLW: exit (ignore)\n");
 
          restore_child_signals_mask (&prev_mask);
@@ -3593,20 +3650,11 @@ retry:
   if (WIFSTOPPED (status))
     {
       enum target_signal signo = target_signal_from_host (WSTOPSIG (status));
-      struct inferior *inf;
-
-      inf = find_inferior_pid (ptid_get_pid (lp->ptid));
-      gdb_assert (inf);
 
-      /* Defer to common code if we get a signal while
-        single-stepping, since that may need special care, e.g. to
-        skip the signal handler, or, if we're gaining control of the
-        inferior.  */
+      /* When using hardware single-step, we need to report every signal.
+        Otherwise, signals in pass_mask may be short-circuited.  */
       if (!lp->step
-         && inf->control.stop_soon == NO_STOP_QUIETLY
-         && signal_stop_state (signo) == 0
-         && signal_print_state (signo) == 0
-         && signal_pass_state (signo) == 1)
+         && WSTOPSIG (status) && sigismember (&pass_mask, WSTOPSIG (status)))
        {
          /* FIMXE: kettenis/2001-06-06: Should we resume all threads
             here?  It is not clear we should.  GDB may not expect
@@ -3702,7 +3750,7 @@ retry:
   else
     store_waitstatus (ourstatus, status);
 
-  if (debug_linux_nat_async)
+  if (debug_linux_nat)
     fprintf_unfiltered (gdb_stdlog, "LLW: exit\n");
 
   restore_child_signals_mask (&prev_mask);
@@ -3802,6 +3850,18 @@ linux_nat_wait (struct target_ops *ops,
 static int
 kill_callback (struct lwp_info *lp, void *data)
 {
+  /* PTRACE_KILL may resume the inferior.  Send SIGKILL first.  */
+
+  errno = 0;
+  kill (GET_LWP (lp->ptid), SIGKILL);
+  if (debug_linux_nat)
+    fprintf_unfiltered (gdb_stdlog,
+                       "KC:  kill (SIGKILL) %s, 0, 0 (%s)\n",
+                       target_pid_to_str (lp->ptid),
+                       errno ? safe_strerror (errno) : "OK");
+
+  /* Some kernels ignore even SIGKILL for processes under ptrace.  */
+
   errno = 0;
   ptrace (PTRACE_KILL, GET_LWP (lp->ptid), 0, 0);
   if (debug_linux_nat)
@@ -4035,7 +4095,7 @@ linux_nat_xfer_partial (struct target_ops *ops, enum target_object object,
 static int
 linux_thread_alive (ptid_t ptid)
 {
-  int err;
+  int err, tmp_errno;
 
   gdb_assert (is_lwp (ptid));
 
@@ -4043,12 +4103,12 @@ linux_thread_alive (ptid_t ptid)
      running thread errors out claiming that the thread doesn't
      exist.  */
   err = kill_lwp (GET_LWP (ptid), 0);
-
+  tmp_errno = errno;
   if (debug_linux_nat)
     fprintf_unfiltered (gdb_stdlog,
                        "LLTA: KILL(SIG0) %s (%s)\n",
                        target_pid_to_str (ptid),
-                       err ? safe_strerror (err) : "OK");
+                       err ? safe_strerror (tmp_errno) : "OK");
 
   if (err != 0)
     return 0;
@@ -4494,7 +4554,7 @@ linux_nat_make_corefile_notes (bfd *obfd, int *note_size)
 
   if (get_exec_file (0))
     {
-      strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
+      strncpy (fname, lbasename (get_exec_file (0)), sizeof (fname));
       strncpy (psargs, get_exec_file (0), sizeof (psargs));
       if (get_inferior_args ())
        {
@@ -5145,16 +5205,16 @@ linux_nat_xfer_osdata (struct target_ops *ops, enum target_object object,
 
                  if ((f = fopen (pathname, "r")) != NULL)
                    {
-                     size_t len = fread (cmd, 1, sizeof (cmd) - 1, f);
+                     size_t length = fread (cmd, 1, sizeof (cmd) - 1, f);
 
-                     if (len > 0)
+                     if (length > 0)
                        {
                          int i;
 
-                         for (i = 0; i < len; i++)
+                         for (i = 0; i < length; i++)
                            if (cmd[i] == '\0')
                              cmd[i] = ' ';
-                         cmd[len] = '\0';
+                         cmd[length] = '\0';
 
                          obstack_xml_printf (
                            &obstack,
@@ -5247,8 +5307,11 @@ static void
 linux_target_install_ops (struct target_ops *t)
 {
   t->to_insert_fork_catchpoint = linux_child_insert_fork_catchpoint;
+  t->to_remove_fork_catchpoint = linux_child_remove_fork_catchpoint;
   t->to_insert_vfork_catchpoint = linux_child_insert_vfork_catchpoint;
+  t->to_remove_vfork_catchpoint = linux_child_remove_vfork_catchpoint;
   t->to_insert_exec_catchpoint = linux_child_insert_exec_catchpoint;
+  t->to_remove_exec_catchpoint = linux_child_remove_exec_catchpoint;
   t->to_set_syscall_catchpoint = linux_child_set_syscall_catchpoint;
   t->to_pid_to_exec_file = linux_child_pid_to_exec_file;
   t->to_post_startup_inferior = linux_child_post_startup_inferior;
@@ -5291,11 +5354,7 @@ linux_nat_is_async_p (void)
   /* NOTE: palves 2008-03-21: We're only async when the user requests
      it explicitly with the "set target-async" command.
      Someday, linux will always be async.  */
-  if (!target_async_permitted)
-    return 0;
-
-  /* See target.h/target_async_mask.  */
-  return linux_nat_async_mask_value;
+  return target_async_permitted;
 }
 
 /* target_can_async_p implementation.  */
@@ -5306,11 +5365,7 @@ linux_nat_can_async_p (void)
   /* NOTE: palves 2008-03-21: We're only async when the user requests
      it explicitly with the "set target-async" command.
      Someday, linux will always be async.  */
-  if (!target_async_permitted)
-    return 0;
-
-  /* See target.h/target_async_mask.  */
-  return linux_nat_async_mask_value;
+  return target_async_permitted;
 }
 
 static int
@@ -5330,37 +5385,6 @@ linux_nat_supports_multi_process (void)
   return linux_multi_process;
 }
 
-/* target_async_mask implementation.  */
-
-static int
-linux_nat_async_mask (int new_mask)
-{
-  int curr_mask = linux_nat_async_mask_value;
-
-  if (curr_mask != new_mask)
-    {
-      if (new_mask == 0)
-       {
-         linux_nat_async (NULL, 0);
-         linux_nat_async_mask_value = new_mask;
-       }
-      else
-       {
-         linux_nat_async_mask_value = new_mask;
-
-         /* If we're going out of async-mask in all-stop, then the
-            inferior is stopped.  The next resume will call
-            target_async.  In non-stop, the target event source
-            should be always registered in the event loop.  Do so
-            now.  */
-         if (non_stop)
-           linux_nat_async (inferior_event_handler, 0);
-       }
-    }
-
-  return curr_mask;
-}
-
 static int async_terminal_is_ours = 1;
 
 /* target_terminal_inferior implementation.  */
@@ -5425,8 +5449,9 @@ sigchld_handler (int signo)
 {
   int old_errno = errno;
 
-  if (debug_linux_nat_async)
-    fprintf_unfiltered (gdb_stdlog, "sigchld\n");
+  if (debug_linux_nat)
+    ui_file_write_async_safe (gdb_stdlog,
+                             "sigchld\n", sizeof ("sigchld\n") - 1);
 
   if (signo == SIGCHLD
       && linux_nat_event_pipe[0] != -1)
@@ -5486,10 +5511,6 @@ static void
 linux_nat_async (void (*callback) (enum inferior_event_type event_type,
                                   void *context), void *context)
 {
-  if (linux_nat_async_mask_value == 0 || !target_async_permitted)
-    internal_error (__FILE__, __LINE__,
-                   "Calling target_async when async is masked");
-
   if (callback != NULL)
     {
       async_client_callback = callback;
@@ -5582,9 +5603,6 @@ linux_nat_close (int quitting)
   if (target_is_async_p ())
     target_async (NULL, 0);
 
-  /* Reset the async_masking.  */
-  linux_nat_async_mask_value = 1;
-
   if (linux_ops->to_close)
     linux_ops->to_close (quitting);
 }
@@ -5715,6 +5733,7 @@ linux_nat_add_target (struct target_ops *t)
   t->to_detach = linux_nat_detach;
   t->to_resume = linux_nat_resume;
   t->to_wait = linux_nat_wait;
+  t->to_pass_signals = linux_nat_pass_signals;
   t->to_xfer_partial = linux_nat_xfer_partial;
   t->to_kill = linux_nat_kill;
   t->to_mourn_inferior = linux_nat_mourn_inferior;
@@ -5730,7 +5749,6 @@ linux_nat_add_target (struct target_ops *t)
   t->to_is_async_p = linux_nat_is_async_p;
   t->to_supports_non_stop = linux_nat_supports_non_stop;
   t->to_async = linux_nat_async;
-  t->to_async_mask = linux_nat_async_mask;
   t->to_terminal_inferior = linux_nat_terminal_inferior;
   t->to_terminal_ours = linux_nat_terminal_ours;
   t->to_close = linux_nat_close;
@@ -5809,15 +5827,6 @@ Enables printf debugging output."),
                            show_debug_linux_nat,
                            &setdebuglist, &showdebuglist);
 
-  add_setshow_zinteger_cmd ("lin-lwp-async", class_maintenance,
-                           &debug_linux_nat_async, _("\
-Set debugging of GNU/Linux async lwp module."), _("\
-Show debugging of GNU/Linux async lwp module."), _("\
-Enables printf debugging output."),
-                           NULL,
-                           show_debug_linux_nat_async,
-                           &setdebuglist, &showdebuglist);
-
   /* Save this mask as the default.  */
   sigprocmask (SIG_SETMASK, NULL, &normal_mask);
 
This page took 0.030969 seconds and 4 git commands to generate.