diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 348eb65ec7..9f2d1ccd5e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,15 @@
+2018-11-30  John Baldwin  <jhb@FreeBSD.org>
+
+	* break-catch-syscall.c (catch_syscall_split_args): Pass 'result'
+	to get_syscalls_by_group.
+	* xml-syscall.c [!HAVE_LIBEXPAT] (get_syscalls_by_group): Return
+	false.
+	[HAVE_LIBEXPAT] (xml_list_syscalls_by_group): Append syscall
+	numbers to an existing vector of integers and return a bool.
+	(get_syscalls_by_group): Accept pointer to vector of integers
+	and change return type to bool.
+	* xml-syscall.h (get_syscalls_by_group): Likewise.
+
 2018-11-30  John Baldwin  <jhb@FreeBSD.org>
 
 	* fbsd-nat.c [__FreeBSD_version >= 700009] (USE_SIGINFO): Macro
diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c
index 93ef74c249..bad34d6fd8 100644
--- a/gdb/break-catch-syscall.c
+++ b/gdb/break-catch-syscall.c
@@ -409,25 +409,13 @@ catch_syscall_split_args (const char *arg)
 	{
 	  /* We have a syscall group.  Let's expand it into a syscall
 	     list before inserting.  */
-	  struct syscall *syscall_list;
 	  const char *group_name;
 
 	  /* Skip over "g:" and "group:" prefix strings.  */
 	  group_name = strchr (cur_name, ':') + 1;
 
-	  syscall_list = get_syscalls_by_group (gdbarch, group_name);
-
-	  if (syscall_list == NULL)
+	  if (!get_syscalls_by_group (gdbarch, group_name, &result))
 	    error (_("Unknown syscall group '%s'."), group_name);
-
-	  for (i = 0; syscall_list[i].name != NULL; i++)
-	    {
-	      /* Insert each syscall that are part of the group.  No
-		 need to check if it is valid.  */
-	      result.push_back (syscall_list[i].number);
-	    }
-
-	  xfree (syscall_list);
 	}
       else
 	{
diff --git a/gdb/xml-syscall.c b/gdb/xml-syscall.c
index bf17642911..d1b5bf8a2f 100644
--- a/gdb/xml-syscall.c
+++ b/gdb/xml-syscall.c
@@ -77,11 +77,12 @@ get_syscall_names (struct gdbarch *gdbarch)
   return NULL;
 }
 
-struct syscall *
-get_syscalls_by_group (struct gdbarch *gdbarch, const char *group)
+bool
+get_syscalls_by_group (struct gdbarch *gdbarch, const char *group,
+		       std::vector<int> *syscall_numbers)
 {
   syscall_warn_user ();
-  return NULL;
+  return false;
 }
 
 const char **
@@ -444,40 +445,27 @@ xml_list_of_syscalls (struct gdbarch *gdbarch)
 }
 
 /* Iterate over the syscall_group_desc element to return a list of
-   syscalls that are part of the given group, terminated by an empty
-   element.  If the syscall group doesn't exist, return NULL.  */
+   syscalls that are part of the given group.  If the syscall group
+   doesn't exist, return false.  */
 
-static struct syscall *
-xml_list_syscalls_by_group (struct gdbarch *gdbarch, const char *group)
+static bool
+xml_list_syscalls_by_group (struct gdbarch *gdbarch, const char *group,
+			    std::vector<int> *syscalls)
 {
   struct syscalls_info *syscalls_info = gdbarch_syscalls_info (gdbarch);
   struct syscall_group_desc *groupdesc;
-  struct syscall *syscalls = NULL;
-  int nsyscalls;
-  int i;
 
-  if (syscalls_info == NULL)
-    return NULL;
+  if (syscalls_info == NULL || syscalls == NULL)
+    return false;
 
   groupdesc = syscall_group_get_group_by_name (syscalls_info, group);
   if (groupdesc == NULL)
-    return NULL;
+    return false;
 
-  nsyscalls = groupdesc->syscalls.size ();
-  syscalls = (struct syscall*) xmalloc ((nsyscalls + 1)
-					* sizeof (struct syscall));
+  for (const struct syscall_desc *sysdesc : groupdesc->syscalls)
+    syscalls->push_back (sysdesc->number);
 
-  for (i = 0; i < groupdesc->syscalls.size (); i++)
-    {
-      syscalls[i].name = groupdesc->syscalls[i]->name.c_str ();
-      syscalls[i].number = groupdesc->syscalls[i]->number;
-    }
-
-  /* Add final element marker.  */
-  syscalls[i].name = NULL;
-  syscalls[i].number = 0;
-
-  return syscalls;
+  return true;
 }
 
 /* Return a NULL terminated list of syscall groups or an empty list, if
@@ -542,12 +530,13 @@ get_syscall_names (struct gdbarch *gdbarch)
 
 /* See comment in xml-syscall.h.  */
 
-struct syscall *
-get_syscalls_by_group (struct gdbarch *gdbarch, const char *group)
+bool
+get_syscalls_by_group (struct gdbarch *gdbarch, const char *group,
+		       std::vector<int> *syscall_numbers)
 {
   init_syscalls_info (gdbarch);
 
-  return xml_list_syscalls_by_group (gdbarch, group);
+  return xml_list_syscalls_by_group (gdbarch, group, syscall_numbers);
 }
 
 /* See comment in xml-syscall.h.  */
diff --git a/gdb/xml-syscall.h b/gdb/xml-syscall.h
index 4429d66400..012a4b75a4 100644
--- a/gdb/xml-syscall.h
+++ b/gdb/xml-syscall.h
@@ -51,13 +51,11 @@ void get_syscall_by_name (struct gdbarch *gdbarch,
 const char **get_syscall_names (struct gdbarch *gdbarch);
 
 /* Function used to retrieve the list of syscalls of a given group in
-   the system.  Return a list of syscalls that are element of the
-   group, terminated by an empty element. The list is malloc'ed
-   and must be freed by the caller.  If group doesn't exist, return
-   NULL.  */
+   the system.  The syscall numbers are appended to SYSCALL_NUMBERS.
+   If the group doesn't exist, return false.  */
 
-struct syscall *get_syscalls_by_group (struct gdbarch *gdbarch,
-				       const char *group);
+bool get_syscalls_by_group (struct gdbarch *gdbarch, const char *group,
+			    std::vector<int> *syscall_numbers);
 
 /* Function used to retrieve the list of syscall groups in the system.
    Return an array of strings terminated by a NULL element.  The list
