X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Freggroups.c;h=ae7d4ceeb722c29547fbcfe13d2e5a51a68b4030;hb=2f91880f3afb3cc521111dfcc99b214c77aa97a1;hp=01dbe34cd0f8ab641bfcc677beb92438215e8f98;hpb=4c38e0a4fcb69f8586d8db0b9cdb8dbab5980811;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/reggroups.c b/gdb/reggroups.c index 01dbe34cd0..ae7d4ceeb7 100644 --- a/gdb/reggroups.c +++ b/gdb/reggroups.c @@ -1,7 +1,6 @@ /* Register groupings for GDB, the GNU debugger. - Copyright (C) 2002, 2003, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 2002-2017 Free Software Foundation, Inc. Contributed by Red Hat. @@ -24,7 +23,6 @@ #include "arch-utils.h" #include "reggroups.h" #include "gdbtypes.h" -#include "gdb_assert.h" #include "regcache.h" #include "command.h" #include "gdbcmd.h" /* For maintenanceprintlist. */ @@ -40,7 +38,8 @@ struct reggroup struct reggroup * reggroup_new (const char *name, enum reggroup_type type) { - struct reggroup *group = XMALLOC (struct reggroup); + struct reggroup *group = XNEW (struct reggroup); + group->name = name; group->type = type; return group; @@ -81,6 +80,7 @@ reggroups_init (struct gdbarch *gdbarch) { struct reggroups *groups = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct reggroups); + groups->last = &groups->first; return groups; } @@ -102,13 +102,14 @@ add_group (struct reggroups *groups, struct reggroup *group, void reggroup_add (struct gdbarch *gdbarch, struct reggroup *group) { - struct reggroups *groups = gdbarch_data (gdbarch, reggroups_data); + struct reggroups *groups + = (struct reggroups *) gdbarch_data (gdbarch, reggroups_data); if (groups == NULL) { /* ULGH, called during architecture initialization. Patch things up. */ - groups = reggroups_init (gdbarch); + groups = (struct reggroups *) reggroups_init (gdbarch); deprecated_set_gdbarch_data (gdbarch, reggroups_data, groups); } add_group (groups, group, @@ -129,7 +130,7 @@ reggroup_next (struct gdbarch *gdbarch, struct reggroup *last) /* Don't allow this function to be called during architecture creation. If there are no groups, use the default groups list. */ - groups = gdbarch_data (gdbarch, reggroups_data); + groups = (struct reggroups *) gdbarch_data (gdbarch, reggroups_data); gdb_assert (groups != NULL); if (groups->first == NULL) groups = &default_groups; @@ -150,6 +151,35 @@ reggroup_next (struct gdbarch *gdbarch, struct reggroup *last) return NULL; } +/* See reggroups.h. */ + +struct reggroup * +reggroup_prev (struct gdbarch *gdbarch, struct reggroup *curr) +{ + struct reggroups *groups; + struct reggroup_el *el; + struct reggroup *prev; + + /* Don't allow this function to be called during architecture + creation. If there are no groups, use the default groups list. */ + groups = (struct reggroups *) gdbarch_data (gdbarch, reggroups_data); + gdb_assert (groups != NULL); + if (groups->first == NULL) + groups = &default_groups; + + prev = NULL; + for (el = groups->first; el != NULL; el = el->next) + { + gdb_assert (el->group != NULL); + if (el->group == curr) + return prev; + prev = el->group; + } + if (curr == NULL) + return prev; + return NULL; +} + /* Is REGNUM a member of REGGROUP? */ int default_register_reggroup_p (struct gdbarch *gdbarch, int regnum, @@ -190,6 +220,7 @@ reggroups_dump (struct gdbarch *gdbarch, struct ui_file *file) /* Group name. */ { const char *name; + if (group == NULL) name = "Group"; else @@ -200,6 +231,7 @@ reggroups_dump (struct gdbarch *gdbarch, struct ui_file *file) /* Group type. */ { const char *type; + if (group == NULL) type = "Type"; else @@ -238,13 +270,11 @@ maintenance_print_reggroups (char *args, int from_tty) reggroups_dump (gdbarch, gdb_stdout); else { - struct cleanup *cleanups; - struct ui_file *file = gdb_fopen (args, "w"); - if (file == NULL) + stdio_file file; + + if (!file.open (args, "w")) perror_with_name (_("maintenance print reggroups")); - cleanups = make_cleanup_ui_file_delete (file); - reggroups_dump (gdbarch, file); - do_cleanups (cleanups); + reggroups_dump (gdbarch, &file); } } @@ -273,13 +303,13 @@ _initialize_reggroup (void) reggroups_data = gdbarch_data_register_post_init (reggroups_init); /* The pre-defined list of groups. */ - add_group (&default_groups, general_reggroup, XMALLOC (struct reggroup_el)); - add_group (&default_groups, float_reggroup, XMALLOC (struct reggroup_el)); - add_group (&default_groups, system_reggroup, XMALLOC (struct reggroup_el)); - add_group (&default_groups, vector_reggroup, XMALLOC (struct reggroup_el)); - add_group (&default_groups, all_reggroup, XMALLOC (struct reggroup_el)); - add_group (&default_groups, save_reggroup, XMALLOC (struct reggroup_el)); - add_group (&default_groups, restore_reggroup, XMALLOC (struct reggroup_el)); + add_group (&default_groups, general_reggroup, XNEW (struct reggroup_el)); + add_group (&default_groups, float_reggroup, XNEW (struct reggroup_el)); + add_group (&default_groups, system_reggroup, XNEW (struct reggroup_el)); + add_group (&default_groups, vector_reggroup, XNEW (struct reggroup_el)); + add_group (&default_groups, all_reggroup, XNEW (struct reggroup_el)); + add_group (&default_groups, save_reggroup, XNEW (struct reggroup_el)); + add_group (&default_groups, restore_reggroup, XNEW (struct reggroup_el)); add_cmd ("reggroups", class_maintenance, maintenance_print_reggroups, _("\