reggroups: Add reggroup_gdbarch_new, reggroup_find for dynamic reggroups

Traditionally reggroups have been created via reggroup_new() during
initialization code and never freed.  Now, if we want to initialize
reggroups dynamically (i.e. in target description) we should be able to
free them.  Create this function reggroup_gdbarch_new() which will
allocate the reggroup memory onto the passed gdbarch obstack.

Also creating reggroup_find() as a utility to find a gdbarch registered
reggroup object by name.

gdb/ChangeLog:

yyyy-mm-dd  Stafford Horne  <shorne@gmail.com>

	* reggroups.c (reggroup_gdbarch_new): New function.
	(reggroup_find): New function.
	* reggroups.h (reggroup_gdbarch_new): New function.
	(reggroup_find): New function.
This commit is contained in:
Stafford Horne 2017-12-27 23:36:31 +09:00
parent c1166ca9f3
commit f7efd54948
3 changed files with 44 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2017-12-27 Stafford Horne <shorne@gmail.com>
* reggroups.c (reggroup_gdbarch_new): New function.
(reggroup_find): New function.
* reggroups.h (reggroup_gdbarch_new): New function.
(reggroup_find): New function.
2017-12-27 Stafford Horne <shorne@gmail.com>
* reggroups.c (reggroups_init): Change to depend only on

View File

@ -46,6 +46,20 @@ reggroup_new (const char *name, enum reggroup_type type)
return group;
}
/* See reggroups.h. */
struct reggroup *
reggroup_gdbarch_new (struct gdbarch *gdbarch, const char *name,
enum reggroup_type type)
{
struct reggroup *group = GDBARCH_OBSTACK_ZALLOC (gdbarch,
struct reggroup);
group->name = gdbarch_obstack_strdup (gdbarch, name);
group->type = type;
return group;
}
/* Register group attributes. */
const char *
@ -201,6 +215,23 @@ default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
return 0;
}
/* See reggroups.h. */
reggroup *
reggroup_find (struct gdbarch *gdbarch, const char *name)
{
struct reggroup *group;
for (group = reggroup_next (gdbarch, NULL);
group != NULL;
group = reggroup_next (gdbarch, group))
{
if (strcmp (name, reggroup_name (group)) == 0)
return group;
}
return NULL;
}
/* Dump out a table of register groups for the current architecture. */
static void

View File

@ -41,6 +41,10 @@ extern struct reggroup *const restore_reggroup;
/* Create a new local register group. */
extern struct reggroup *reggroup_new (const char *name,
enum reggroup_type type);
/* Create a new register group allocated onto the gdbarch obstack. */
extern struct reggroup *reggroup_gdbarch_new (struct gdbarch *gdbarch,
const char *name,
enum reggroup_type type);
/* Add a register group (with attribute values) to the pre-defined list. */
extern void reggroup_add (struct gdbarch *gdbarch, struct reggroup *group);
@ -57,6 +61,8 @@ extern struct reggroup *reggroup_next (struct gdbarch *gdbarch,
struct reggroup *last);
extern struct reggroup *reggroup_prev (struct gdbarch *gdbarch,
struct reggroup *curr);
/* Find a reggroup by name. */
extern reggroup *reggroup_find (struct gdbarch *gdbarch, const char *name);
/* Is REGNUM a member of REGGROUP? */
extern int default_register_reggroup_p (struct gdbarch *gdbarch, int regnum,