40 static int have_warned = 0;
44 warning (_(
"Can not parse XML syscalls information; XML support was "
45 "disabled at compile time."));
57 int syscall_number,
struct syscall *s)
60 s->
number = syscall_number;
66 std::vector<int> *syscall_numbers)
81 std::vector<int> *syscall_numbers)
99 syscall_desc (
int number_, std::string name_, std::string alias_)
100 : number (number_),
name (name_),
alias (alias_)
116typedef std::unique_ptr<syscall_desc> syscall_desc_up;
119struct syscall_group_desc
121 syscall_group_desc (
const std::string &name_)
132 std::vector<syscall_desc *> syscalls;
135typedef std::unique_ptr<syscall_group_desc> syscall_group_desc_up;
142 std::vector<syscall_desc_up> syscalls;
146 std::vector<syscall_group_desc_up> groups;
152 std::string my_gdb_datadir;
155typedef std::unique_ptr<syscalls_info> syscalls_info_up;
158struct syscall_parsing_data
162 struct syscalls_info *syscalls_info;
168static struct syscall_group_desc *
169syscall_group_create_syscall_group_desc (
struct syscalls_info *syscalls_info,
172 syscall_group_desc *groupdesc =
new syscall_group_desc (group);
174 syscalls_info->groups.emplace_back (groupdesc);
182syscall_group_add_syscall (
struct syscalls_info *syscalls_info,
187 std::vector<syscall_group_desc_up>::iterator it
188 = syscalls_info->groups.begin ();
190 for (; it != syscalls_info->groups.end (); it++)
192 if ((*it)->name == group)
196 syscall_group_desc *groupdesc;
198 if (it != syscalls_info->groups.end ())
199 groupdesc = it->get ();
204 groupdesc = syscall_group_create_syscall_group_desc (syscalls_info,
208 groupdesc->syscalls.push_back (
syscall);
212syscall_create_syscall_desc (
struct syscalls_info *syscalls_info,
213 const char *
name,
int number,
const char *
alias,
216 syscall_desc *sysdesc =
new syscall_desc (number,
name,
219 syscalls_info->syscalls.emplace_back (sysdesc);
225 for (
char *group = strtok_r (groups,
",", &saveptr);
227 group = strtok_r (NULL,
",", &saveptr))
228 syscall_group_add_syscall (syscalls_info, sysdesc, group);
234syscall_start_syscall (
struct gdb_xml_parser *parser,
239 struct syscall_parsing_data *
data = (
struct syscall_parsing_data *) user_data;
248 if (strcmp (attr.name,
"name") == 0)
249 name = (
char *) attr.value.get ();
250 else if (strcmp (attr.name,
"number") == 0)
251 number = * (ULONGEST *) attr.value.get ();
252 else if (strcmp (attr.name,
"alias") == 0)
253 alias = (
char *) attr.value.get ();
254 else if (strcmp (attr.name,
"groups") == 0)
255 groups = (
char *) attr.value.get ();
257 internal_error (_(
"Unknown attribute name '%s'."), attr.name);
261 syscall_create_syscall_desc (
data->syscalls_info,
name, number,
alias,
276 {
"syscall", syscall_attr, NULL,
278 syscall_start_syscall, NULL },
283 {
"syscalls_info", NULL, syscalls_info_children,
288static struct syscalls_info *
291 struct syscall_parsing_data
data;
292 syscalls_info_up sysinfo (
new syscalls_info ());
294 data.syscalls_info = sysinfo.get ();
297 syselements, document, &data) == 0)
300 return sysinfo.release ();
304 warning (_(
"Could not load XML syscalls info; ignoring"));
314static struct syscalls_info *
315xml_init_syscalls_info (
const char *filename)
317 gdb::optional<gdb::char_vector> full_file
323 const std::string dirname =
ldirname (filename);
324 auto fetch_another = [&dirname] (
const char *
name)
329 return syscall_parse_xml (full_file->data (), fetch_another);
341 if (syscalls_info != NULL && !syscalls_info->my_gdb_datadir.empty ()
342 && filename_cmp (syscalls_info->my_gdb_datadir.c_str (),
347 delete syscalls_info;
348 syscalls_info = NULL;
353 if (syscalls_info != NULL)
356 syscalls_info = xml_init_syscalls_info (xml_syscall_file);
361 if (syscalls_info == NULL)
362 syscalls_info =
new struct syscalls_info ();
364 if (syscalls_info->syscalls.empty ())
366 if (xml_syscall_file != NULL)
367 warning (_(
"Could not load the syscall XML file `%s/%s'."),
370 warning (_(
"There is no XML file to open."));
372 warning (_(
"GDB will not be able to display "
373 "syscall names nor to verify if\n"
374 "any provided syscall numbers are valid."));
378 syscalls_info->my_gdb_datadir.assign (
gdb_datadir);
386static struct syscall_group_desc *
387syscall_group_get_group_by_name (
const struct syscalls_info *syscalls_info,
390 if (syscalls_info == NULL)
397 for (
const syscall_group_desc_up &groupdesc : syscalls_info->groups)
399 if (groupdesc->name == group)
400 return groupdesc.get ();
407xml_get_syscalls_by_name (
struct gdbarch *
gdbarch,
const char *syscall_name,
408 std::vector<int> *syscall_numbers)
413 if (syscalls_info != NULL && syscall_name != NULL && syscall_numbers != NULL)
414 for (
const syscall_desc_up &sysdesc : syscalls_info->syscalls)
415 if (sysdesc->
name == syscall_name || sysdesc->
alias == syscall_name)
417 syscall_numbers->push_back (sysdesc->number);
430 if (syscalls_info == NULL
431 || syscall_number < 0)
434 for (
const syscall_desc_up &sysdesc : syscalls_info->syscalls)
435 if (sysdesc->number == syscall_number)
446 if (syscalls_info == NULL)
449 int nsyscalls = syscalls_info->syscalls.size ();
450 const char **names = XNEWVEC (
const char *, nsyscalls + 1);
453 for (i = 0; i < syscalls_info->syscalls.size (); i++)
454 names[i] = syscalls_info->syscalls[i]->name.c_str ();
466xml_list_syscalls_by_group (
struct gdbarch *
gdbarch,
const char *group,
467 std::vector<int> *syscalls)
470 struct syscall_group_desc *groupdesc;
472 if (syscalls_info == NULL || syscalls == NULL)
475 groupdesc = syscall_group_get_group_by_name (syscalls_info, group);
476 if (groupdesc == NULL)
479 for (
const syscall_desc *sysdesc : groupdesc->syscalls)
480 syscalls->push_back (sysdesc->number);
493 const char **names = NULL;
497 if (syscalls_info == NULL)
500 ngroups = syscalls_info->groups.size ();
501 names = (
const char**)
xmalloc ((ngroups + 1) *
sizeof (
char *));
503 for (i = 0; i < syscalls_info->groups.size (); i++)
504 names[i] = syscalls_info->groups[i]->name.c_str ();
519 int syscall_number,
struct syscall *s)
523 s->
number = syscall_number;
524 s->
name = xml_get_syscall_name (
gdbarch, syscall_number);
529 std::vector<int> *syscall_numbers)
533 return xml_get_syscalls_by_name (
gdbarch, syscall_name, syscall_numbers);
541 return xml_list_of_syscalls (
gdbarch);
548 std::vector<int> *syscall_numbers)
552 return xml_list_syscalls_by_group (
gdbarch, group, syscall_numbers);
562 return xml_list_of_groups (
gdbarch);
static struct @5 attributes[]
struct syscalls_info * gdbarch_syscalls_info(struct gdbarch *gdbarch)
const char * gdbarch_xml_syscall_file(struct gdbarch *gdbarch)
void set_gdbarch_syscalls_info(struct gdbarch *gdbarch, struct syscalls_info *syscalls_info)
void set_gdbarch_xml_syscall_file(struct gdbarch *gdbarch, const char *xml_syscall_file)
std::string ldirname(const char *filename)
gdb::optional< gdb::char_vector > xml_fetch_content_from_file(const char *filename, const char *dirname)
int gdb_xml_parse_quick(const char *name, const char *dtd_name, const struct gdb_xml_element *elements, const char *document, void *user_data)
gdb_xml_attribute_handler gdb_xml_parse_attr_ulongest
gdb::function_view< gdb::optional< gdb::char_vector >(const char *)> xml_fetch_another
const char ** get_syscall_group_names(struct gdbarch *gdbarch)
void set_xml_syscall_file_name(struct gdbarch *gdbarch, const char *name)
bool get_syscalls_by_group(struct gdbarch *gdbarch, const char *group, std::vector< int > *syscall_numbers)
const char ** get_syscall_names(struct gdbarch *gdbarch)
static void syscall_warn_user(void)
bool get_syscalls_by_name(struct gdbarch *gdbarch, const char *syscall_name, std::vector< int > *syscall_numbers)
void get_syscall_by_number(struct gdbarch *gdbarch, int syscall_number, struct syscall *s)