+2018-12-13  John Baldwin  <jhb@FreeBSD.org>
+
+       * NEWS: Add entry documenting system call aliases.
+       * break-catch-syscall.c (catch_syscall_split_args): Pass 'result'
+       to get_syscalls_by_name.
+       * gdbarch.sh (UNKNOWN_SYSCALL): Remove.
+       * gdbarch.h: Regenerate.
+       * syscalls/gdb-syscalls.dtd (syscall): Add alias attribute.
+       * xml-syscall.c [!HAVE_LIBEXPAT] (get_syscalls_by_name): Rename
+       from get_syscall_by_name.  Now accepts a pointer to a vector of
+       integers and returns a bool.
+       [HAVE_LIBEXPAT] (struct syscall_desc): Add alias member.
+       (syscall_create_syscall_desc): Add alias parameter and pass it to
+       syscall_desc constructor.
+       (syscall_start_syscall): Handle alias attribute.
+       (syscall_attr): Add alias attribute.
+       (xml_get_syscalls_by_name): Rename from xml_get_syscall_number.
+       Now accepts a pointer to a vector of integers and returns a
+       bool.  Add syscalls whose alias or name matches the requested
+       name.
+       (get_syscalls_by_name): Rename from get_syscall_by_name.  Now
+       accepts a pointer to a vector of integers and returns a bool.
+       * xml-syscall.h (get_syscalls_by_name): Likewise.
+
 2018-12-13  John Baldwin  <jhb@FreeBSD.org>
 
        * break-catch-syscall.c (catch_syscall_split_args): Pass 'result'
 
 
 * The RISC-V target now supports target descriptions.
 
+* System call catchpoints now support system call aliases on FreeBSD.
+  When the ABI of a system call changes in FreeBSD, this is
+  implemented by leaving a compatibility system call using the old ABI
+  at the existing number and allocating a new system call number for
+  the new ABI.  For example, FreeBSD 12 altered the layout of 'struct
+  kevent' used by the 'kevent' system call.  As a result, FreeBSD 12
+  kernels ship with both 'kevent' and 'freebsd11_kevent' system calls.
+  The 'freebsd11_kevent' system call is assigned an alias of 'kevent'
+  so that a system call catchpoint for the 'kevent' system call will
+  catch invocations of both the 'kevent' and 'freebsd11_kevent'
+  binaries.  This ensures that 'kevent' system calls are caught for
+  binaries using either the old or new ABIs.
+
 * New targets
 
   NXP S12Z             s12z-*-elf
 
        }
       else
        {
-         /* We have a name.  Let's check if it's valid and convert it
-            to a number.  */
-         get_syscall_by_name (gdbarch, cur_name, &s);
-
-         if (s.number == UNKNOWN_SYSCALL)
+         /* We have a name.  Let's check if it's valid and fetch a
+            list of matching numbers.  */
+         if (!get_syscalls_by_name (gdbarch, cur_name, &result))
            /* Here we have to issue an error instead of a warning,
               because GDB cannot do anything useful if there's no
               syscall number to be caught.  */
            error (_("Unknown syscall name '%s'."), cur_name);
-
-         /* Ok, it's valid.  */
-         result.push_back (s.number);
        }
     }
 
 
+2018-12-13  John Baldwin  <jhb@FreeBSD.org>
+
+       * gdb.texinfo (Set Catchpoints): Add an anchor for 'catch syscall'.
+       (Native): Add a FreeBSD subsection.
+       (FreeBSD): Document use of system call aliases for compatibility
+       system calls.
+
 2018-11-21  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gdb.texinfo (Standard Target Features): Add RISC-V Features
 
 @cindex break on fork/exec
 A call to @code{exec}.
 
+@anchor{catch syscall}
 @item syscall
 @itemx syscall @r{[}@var{name} @r{|} @var{number} @r{|} @r{group:}@var{groupname} @r{|} @r{g:}@var{groupname}@r{]} @dots{}
 @kindex catch syscall
 * Cygwin Native::              Features specific to the Cygwin port
 * Hurd Native::                 Features specific to @sc{gnu} Hurd
 * Darwin::                     Features specific to Darwin
+* FreeBSD::                    Features specific to FreeBSD
 @end menu
 
 @node BSD libkvm Interface
 Show the current state of exceptions trapping.
 @end table
 
+@node FreeBSD
+@subsection FreeBSD
+@cindex FreeBSD
+
+When the ABI of a system call is changed in the FreeBSD kernel, this
+is implemented by leaving a compatibility system call using the old
+ABI at the existing number and allocating a new system call number for
+the version using the new ABI.  As a convenience, when a system call
+is caught by name (@pxref{catch syscall}), compatibility system calls
+are also caught.
+
+For example, FreeBSD 12 introduced a new variant of the @code{kevent}
+system call and catching the @code{kevent} system call by name catches
+both variants:
+
+@smallexample
+(@value{GDBP}) catch syscall kevent
+Catchpoint 1 (syscalls 'freebsd11_kevent' [363] 'kevent' [560])
+(@value{GDBP})
+@end smallexample
+
 
 @node Embedded OS
 @section Embedded Operating Systems
 
 extern ULONGEST gdbarch_type_align (struct gdbarch *gdbarch, struct type *type);
 extern void set_gdbarch_type_align (struct gdbarch *gdbarch, gdbarch_type_align_ftype *type_align);
 
-/* Definition for an unknown syscall, used basically in error-cases.  */
-#define UNKNOWN_SYSCALL (-1)
-
 extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
 
 
 
 # close it off
 cat <<EOF
 
-/* Definition for an unknown syscall, used basically in error-cases.  */
-#define UNKNOWN_SYSCALL (-1)
-
 extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
 
 
 
 <!ATTLIST syscall
        name                    CDATA   #REQUIRED
        number                  CDATA   #REQUIRED
+       alias                   CDATA   #IMPLIED
        groups                  CDATA   #IMPLIED>
 
   s->name = NULL;
 }
 
-void
-get_syscall_by_name (struct gdbarch *gdbarch, const char *syscall_name,
-                    struct syscall *s)
+bool
+get_syscalls_by_name (struct gdbarch *gdbarch, const char *syscall_name,
+                     std::vector<int> *syscall_numbers)
 {
   syscall_warn_user ();
-  s->number = UNKNOWN_SYSCALL;
-  s->name = syscall_name;
+  return false;
 }
 
 const char **
 /* Structure which describes a syscall.  */
 struct syscall_desc
 {
-  syscall_desc (int number_, std::string name_)
-  : number (number_), name (name_)
+  syscall_desc (int number_, std::string name_, std::string alias_)
+  : number (number_), name (name_), alias (alias_)
   {}
 
   /* The syscall number.  */
   /* The syscall name.  */
 
   std::string name;
+
+  /* An optional alias.  */
+
+  std::string alias;
 };
 
 typedef std::unique_ptr<syscall_desc> syscall_desc_up;
 
 static void
 syscall_create_syscall_desc (struct syscalls_info *syscalls_info,
-                            const char *name, int number,
+                            const char *name, int number, const char *alias,
                             char *groups)
 {
-  syscall_desc *sysdesc = new syscall_desc (number, name);
+  syscall_desc *sysdesc = new syscall_desc (number, name,
+                                           alias != NULL ? alias : "");
 
   syscalls_info->syscalls.emplace_back (sysdesc);
 
   /* syscall info.  */
   char *name = NULL;
   int number = 0;
+  char *alias = NULL;
   char *groups = NULL;
 
   for (const gdb_xml_value &attr : attributes)
         name = (char *) attr.value.get ();
       else if (strcmp (attr.name, "number") == 0)
         number = * (ULONGEST *) attr.value.get ();
+      else if (strcmp (attr.name, "alias") == 0)
+        alias = (char *) attr.value.get ();
       else if (strcmp (attr.name, "groups") == 0)
         groups = (char *) attr.value.get ();
       else
     }
 
   gdb_assert (name);
-  syscall_create_syscall_desc (data->syscalls_info, name, number, groups);
+  syscall_create_syscall_desc (data->syscalls_info, name, number, alias,
+                              groups);
 }
 
 
 static const struct gdb_xml_attribute syscall_attr[] = {
   { "number", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
   { "name", GDB_XML_AF_NONE, NULL, NULL },
+  { "alias", GDB_XML_AF_OPTIONAL, NULL, NULL },
   { "groups", GDB_XML_AF_OPTIONAL, NULL, NULL },
   { NULL, GDB_XML_AF_NONE, NULL, NULL }
 };
   return NULL;
 }
 
-static int
-xml_get_syscall_number (struct gdbarch *gdbarch,
-                        const char *syscall_name)
+static bool
+xml_get_syscalls_by_name (struct gdbarch *gdbarch, const char *syscall_name,
+                         std::vector<int> *syscall_numbers)
 {
   struct syscalls_info *syscalls_info = gdbarch_syscalls_info (gdbarch);
 
-  if (syscalls_info == NULL
-      || syscall_name == NULL)
-    return UNKNOWN_SYSCALL;
-
-  for (const syscall_desc_up &sysdesc : syscalls_info->syscalls)
-    if (sysdesc->name == syscall_name)
-      return sysdesc->number;
+  bool found = false;
+  if (syscalls_info != NULL && syscall_name != NULL && syscall_numbers != NULL)
+    for (const syscall_desc_up &sysdesc : syscalls_info->syscalls)
+      if (sysdesc->name == syscall_name || sysdesc->alias == syscall_name)
+       {
+         syscall_numbers->push_back (sysdesc->number);
+         found = true;
+       }
 
-  return UNKNOWN_SYSCALL;
+  return found;
 }
 
 static const char *
   s->name = xml_get_syscall_name (gdbarch, syscall_number);
 }
 
-void
-get_syscall_by_name (struct gdbarch *gdbarch,
-                    const char *syscall_name, struct syscall *s)
+bool
+get_syscalls_by_name (struct gdbarch *gdbarch, const char *syscall_name,
+                     std::vector<int> *syscall_numbers)
 {
   init_syscalls_info (gdbarch);
 
-  s->number = xml_get_syscall_number (gdbarch, syscall_name);
-  s->name = syscall_name;
+  return xml_get_syscalls_by_name (gdbarch, syscall_name, syscall_numbers);
 }
 
 const char **
 
 void get_syscall_by_number (struct gdbarch *gdbarch,
                            int syscall_number, struct syscall *s);
 
-/* Function that retrieves the syscall number corresponding to the given
-   name.  It puts the requested information inside 'struct syscall'.  */
+/* Function that retrieves the syscall numbers corresponding to the
+   given name.  The numbers of all syscalls with either a name or
+   alias equal to SYSCALL_NAME are appended to SYSCALL_NUMBERS.  If no
+   matching syscalls are found, return false.  */
 
-void get_syscall_by_name (struct gdbarch *gdbarch,
-                         const char *syscall_name, struct syscall *s);
+bool get_syscalls_by_name (struct gdbarch *gdbarch, const char *syscall_name,
+                          std::vector<int> *syscall_numbers);
 
 /* Function used to retrieve the list of syscalls in the system.  This list
    is returned as an array of strings.  Returns the list of syscalls in the