aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/break-catch-syscall.c14
-rw-r--r--gdb/xml-syscall.c49
-rw-r--r--gdb/xml-syscall.h10
4 files changed, 36 insertions, 49 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index bf40e68..93ee629 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,15 @@
+2018-12-13 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-12-13 Jim Wilson <jimw@sifive.com>
* riscv-tdep.c (riscv_print_one_register_info): For MSTATUS, add
diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c
index 93ef74c..bad34d6 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 bf17642..d1b5bf8 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;
-
- nsyscalls = groupdesc->syscalls.size ();
- syscalls = (struct syscall*) xmalloc ((nsyscalls + 1)
- * sizeof (struct syscall));
-
- for (i = 0; i < groupdesc->syscalls.size (); i++)
- {
- syscalls[i].name = groupdesc->syscalls[i]->name.c_str ();
- syscalls[i].number = groupdesc->syscalls[i]->number;
- }
+ return false;
- /* Add final element marker. */
- syscalls[i].name = NULL;
- syscalls[i].number = 0;
+ for (const struct syscall_desc *sysdesc : groupdesc->syscalls)
+ syscalls->push_back (sysdesc->number);
- 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 4429d66..012a4b7 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