mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-20 07:43:36 +08:00
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:
parent
c1166ca9f3
commit
f7efd54948
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user