Change valid_command_p to return bool
[deliverable/binutils-gdb.git] / gdb / fbsd-nat.c
index 107a729b3cf50cb7f89147b80fb4c1bec00b6c74..d4f4c8cf3592b5eaf61ccdd7b3514287feef9d54 100644 (file)
@@ -1,6 +1,6 @@
 /* Native-dependent code for FreeBSD.
 
-   Copyright (C) 2002-2018 Free Software Foundation, Inc.
+   Copyright (C) 2002-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include "byte-vector.h"
+#include "common/byte-vector.h"
 #include "gdbcore.h"
 #include "inferior.h"
 #include "regcache.h"
 #include "regset.h"
 #include "gdbcmd.h"
 #include "gdbthread.h"
-#include "gdb_wait.h"
+#include "common/gdb_wait.h"
 #include "inf-ptrace.h"
 #include <sys/types.h>
 #include <sys/procfs.h>
@@ -37,7 +37,7 @@
 #include <libutil.h>
 #endif
 #if !defined(HAVE_KINFO_GETVMMAP)
-#include "filestuff.h"
+#include "common/filestuff.h"
 #endif
 
 #include "elf-bfd.h"
@@ -231,6 +231,13 @@ fbsd_fetch_cmdline (pid_t pid)
   if (sysctl (mib, 4, cmdline.get (), &len, NULL, 0) == -1)
     return nullptr;
 
+  /* Join the arguments with spaces to form a single string.  */
+  char *cp = cmdline.get ();
+  for (size_t i = 0; i < len - 1; i++)
+    if (cp[i] == '\0')
+      cp[i] = ' ';
+  cp[len - 1] = '\0';
+
   return cmdline;
 }
 
@@ -532,9 +539,17 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what)
   return true;
 }
 
-#ifdef KERN_PROC_AUXV
+/*
+ * The current layout of siginfo_t on FreeBSD was adopted in SVN
+ * revision 153154 which shipped in FreeBSD versions 7.0 and later.
+ * Don't bother supporting the older layout on older kernels.  The
+ * older format was also never used in core dump notes.
+ */
+#if __FreeBSD_version >= 700009
+#define USE_SIGINFO
+#endif
 
-#ifdef PT_LWPINFO
+#ifdef USE_SIGINFO
 /* Return the size of siginfo for the current inferior.  */
 
 #ifdef __LP64__
@@ -676,7 +691,7 @@ fbsd_nat_target::xfer_partial (enum target_object object,
 
   switch (object)
     {
-#ifdef PT_LWPINFO
+#ifdef USE_SIGINFO
     case TARGET_OBJECT_SIGNAL_INFO:
       {
        struct ptrace_lwpinfo pl;
@@ -708,6 +723,7 @@ fbsd_nat_target::xfer_partial (enum target_object object,
        return TARGET_XFER_OK;
       }
 #endif
+#ifdef KERN_PROC_AUXV
     case TARGET_OBJECT_AUXV:
       {
        gdb::byte_vector buf_storage;
@@ -749,6 +765,8 @@ fbsd_nat_target::xfer_partial (enum target_object object,
          }
        return TARGET_XFER_E_IO;
       }
+#endif
+#if defined(KERN_PROC_VMMAP) && defined(KERN_PROC_PS_STRINGS)
     case TARGET_OBJECT_FREEBSD_VMMAP:
     case TARGET_OBJECT_FREEBSD_PS_STRINGS:
       {
@@ -804,13 +822,13 @@ fbsd_nat_target::xfer_partial (enum target_object object,
        *xfered_len = len;
        return TARGET_XFER_OK;
       }
+#endif
     default:
       return inf_ptrace_target::xfer_partial (object, annex,
                                              readbuf, writebuf, offset,
                                              len, xfered_len);
     }
 }
-#endif
 
 #ifdef PT_LWPINFO
 static int debug_fbsd_lwp;
@@ -879,10 +897,9 @@ fbsd_nat_target::thread_alive (ptid_t ptid)
   return true;
 }
 
-/* Convert PTID to a string.  Returns the string in a static
-   buffer.  */
+/* Convert PTID to a string.  */
 
-const char *
+std::string
 fbsd_nat_target::pid_to_str (ptid_t ptid)
 {
   lwpid_t lwp;
@@ -890,11 +907,9 @@ fbsd_nat_target::pid_to_str (ptid_t ptid)
   lwp = ptid.lwp ();
   if (lwp != 0)
     {
-      static char buf[64];
       int pid = ptid.pid ();
 
-      xsnprintf (buf, sizeof buf, "LWP %d of process %d", lwp, pid);
-      return buf;
+      return string_printf ("LWP %d of process %d", lwp, pid);
     }
 
   return normal_pid_to_str (ptid);
@@ -1158,13 +1173,11 @@ fbsd_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
   if (ptid.lwp_p ())
     {
       /* If ptid is a specific LWP, suspend all other LWPs in the process.  */
-      struct thread_info *tp;
-      int request;
+      inferior *inf = find_inferior_ptid (ptid);
 
-      ALL_NON_EXITED_THREADS (tp)
+      for (thread_info *tp : inf->non_exited_threads ())
         {
-         if (tp->ptid.pid () != ptid.pid ())
-           continue;
+         int request;
 
          if (tp->ptid.lwp () == ptid.lwp ())
            request = PT_RESUME;
@@ -1179,16 +1192,9 @@ fbsd_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
     {
       /* If ptid is a wildcard, resume all matching threads (they won't run
         until the process is continued however).  */
-      struct thread_info *tp;
-
-      ALL_NON_EXITED_THREADS (tp)
-        {
-         if (!tp->ptid.matches (ptid))
-           continue;
-
-         if (ptrace (PT_RESUME, tp->ptid.lwp (), NULL, 0) == -1)
-           perror_with_name (("ptrace"));
-       }
+      for (thread_info *tp : all_non_exited_threads (ptid))
+       if (ptrace (PT_RESUME, tp->ptid.lwp (), NULL, 0) == -1)
+         perror_with_name (("ptrace"));
       ptid = inferior_ptid;
     }
 
@@ -1236,8 +1242,14 @@ fbsd_handle_debug_trap (ptid_t ptid, const struct ptrace_lwpinfo &pl)
 {
 
   /* Ignore traps without valid siginfo or for signals other than
-     SIGTRAP.  */
-  if (! (pl.pl_flags & PL_FLAG_SI) || pl.pl_siginfo.si_signo != SIGTRAP)
+     SIGTRAP.
+
+     FreeBSD kernels prior to r341800 can return stale siginfo for at
+     least some events, but those events can be identified by
+     additional flags set in pl_flags.  True breakpoint and
+     single-step traps should not have other flags set in
+     pl_flags.  */
+  if (pl.pl_flags != PL_FLAG_SI || pl.pl_siginfo.si_signo != SIGTRAP)
     return false;
 
   /* Trace traps are either a single step or a hardware watchpoint or
@@ -1335,8 +1347,8 @@ fbsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
                                        "FLWP: deleting thread for LWP %u\n",
                                        pl.pl_lwpid);
                  if (print_thread_events)
-                   printf_unfiltered (_("[%s exited]\n"), target_pid_to_str
-                                      (wptid));
+                   printf_unfiltered (_("[%s exited]\n"),
+                                      target_pid_to_str (wptid).c_str ());
                  delete_thread (thr);
                }
              if (ptrace (PT_CONTINUE, pid, (caddr_t) 1, 0) == -1)
@@ -1515,7 +1527,7 @@ fbsd_nat_target::stopped_by_sw_breakpoint ()
              sizeof pl) == -1)
     return false;
 
-  return ((pl.pl_flags & PL_FLAG_SI)
+  return (pl.pl_flags == PL_FLAG_SI
          && pl.pl_siginfo.si_signo == SIGTRAP
          && pl.pl_siginfo.si_code == TRAP_BRKPT);
 }
This page took 0.027247 seconds and 4 git commands to generate.