2012/12/22 Franck Jullien <[email protected]>: > 2012/12/22 Jeremy Bennett <[email protected]>: >> On Sat, 2012-12-22 at 01:00 +0100, Franck Jullien wrote: >>> In order to get registers names and groups from the target descriptor >>> file, some new functions are needed. >>> >>> This patch adds: >>> >>> - tdesc_find_register_name: Search FEATURE for a register REGNO and >>> return its name. >>> >>> - tdesc_nb_feature: Return the number of features available in the >>> target descriptor. >>> >>> - tdesc_feature_idx_name: Return the name of feature given it's index. >>> >>> - tdesc_set_register_group_early: Search FEATURE for a register named >>> NAME and set its group to GROUP. >>> >>> - tdesc_register_group: Search GDBARCH for a register REGNO and return >>> its group. >> >> This is good - the above description should go in ChangeLog.or32 for >> target-descriptions.c and target-descriptions.h. >> > > OK > >> However, I'm not sure these functions are all needed generically, in >> which case they belong in or32-tdep.c. target-descriptions.h already has >> a wide range of functions, and if you extend this, you need to explain >> why they must be generic and not specific to a particular architecture. >> > > OK. > >> I think it is because you are introducing the concept of register >> groups, which as far as I know is an OR1K specific concept. I'm not yet >> really clear how your use of groups relates to the general concept of >> features - could you explain a bit more about this. >> > > I think the concept of groups can be extended to other arch. If you > have more than > one auxiliary register related to one function (eg. timer, uart,...) > then it is a group. > > I decided to create groups from feature name because the xml format only > allows > to put a register in a general, float or vector group (gdb doc.): > > "The register group to which this register belongs. group must be > either general, > float, or vector. If no group is specified, gdb will not display the register > in > info registers." > > We could also change the xml format to allow generic register group name. >
Jeremy, did you have some time to think about this ? I'd like to know if I should stay with my new "feature becomes a group" approach or if I should modify the xml definition, adding the possibility to use any group name. The former also needs new functions in target-descriptor.c to handle group creation on the fly.... Thanks. >> Best wishes, >> >> >> Jeremy >> >>> Signed-off-by: Franck Jullien <[email protected]> >>> --- >>> gdb/target-descriptions.c | 69 >>> +++++++++++++++++++++++++++++++++++++++++++++ >>> gdb/target-descriptions.h | 24 +++++++++++++++ >>> 2 files changed, 93 insertions(+), 0 deletions(-) >>> >>> diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c >>> index 7206166..b8cd05b 100644 >>> --- a/gdb/target-descriptions.c >>> +++ b/gdb/target-descriptions.c >>> @@ -455,6 +455,27 @@ tdesc_find_feature (const struct target_desc >>> *target_desc, >>> return NULL; >>> } >>> >>> +/* Return the number of features available in the target descriptor. */ >>> +int >>> +tdesc_nb_feature (const struct target_desc *target_desc) >>> +{ >>> + return VEC_length(tdesc_feature_p, target_desc->features); >>> +} >>> + >>> +/* Return the name of feature given it's index. */ >>> +const char * >>> +tdesc_feature_idx_name (const struct target_desc *target_desc, int index) >>> +{ >>> + struct tdesc_feature *feature; >>> + >>> + feature = VEC_index(tdesc_feature_p, target_desc->features, index); >>> + >>> + if (feature != NULL) >>> + return feature->name; >>> + else >>> + return NULL; >>> +} >>> + >>> /* Return the name of FEATURE. */ >>> >>> const char * >>> @@ -779,6 +800,42 @@ tdesc_find_register_early (const struct tdesc_feature >>> *feature, >>> return NULL; >>> } >>> >>> +/* Search FEATURE for a register named NAME and set its group to GROUP. */ >>> +int >>> +tdesc_set_register_group_early (const struct tdesc_feature *feature, >>> + const char *name, const char *group) >>> +{ >>> + int ixr; >>> + struct tdesc_reg *reg; >>> + >>> + for (ixr = 0; >>> + VEC_iterate (tdesc_reg_p, feature->registers, ixr, reg); >>> + ixr++) >>> + if (strcasecmp (reg->name, name) == 0) { >>> + reg->group = strdup(group); >>> + return 1; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +/* Search FEATURE for a register REGNO and return its name. */ >>> +char * >>> +tdesc_find_register_name (const struct tdesc_feature *feature, >>> + int regno) >>> +{ >>> + int ixr; >>> + struct tdesc_reg *reg; >>> + >>> + for (ixr = 0; >>> + VEC_iterate (tdesc_reg_p, feature->registers, ixr, reg); >>> + ixr++) >>> + if (ixr == regno) >>> + return reg->name; >>> + >>> + return NULL; >>> +} >>> + >>> /* Search FEATURE for a register named NAME. Assign REGNO to it. */ >>> >>> int >>> @@ -892,6 +949,18 @@ tdesc_register_name (struct gdbarch *gdbarch, int >>> regno) >>> return ""; >>> } >>> >>> +/* Search GDBARCH for a register REGNO and return its group. */ >>> +const char * >>> +tdesc_register_group (struct gdbarch *gdbarch, int regno) >>> +{ >>> + struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno); >>> + >>> + if (reg != NULL) >>> + return reg->group; >>> + else >>> + return ""; >>> +} >>> + >>> struct type * >>> tdesc_register_type (struct gdbarch *gdbarch, int regno) >>> { >>> diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h >>> index caa7230..c4b87dd 100644 >>> --- a/gdb/target-descriptions.h >>> +++ b/gdb/target-descriptions.h >>> @@ -187,6 +187,30 @@ struct type *tdesc_find_type (struct gdbarch *gdbarch, >>> const char *id); >>> int tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno, >>> struct reggroup *reggroup); >>> >>> +/* Search FEATURE for a register REGNO and return its name. */ >>> + >>> +char *tdesc_find_register_name (const struct tdesc_feature *feature, >>> + int regno); >>> + >>> +/* Return the number of features available in the target descriptor. */ >>> + >>> +int tdesc_nb_feature (const struct target_desc *target_desc); >>> + >>> +/* Return the name of feature given it's index. */ >>> + >>> +const char * >>> +tdesc_feature_idx_name (const struct target_desc *target_desc, int index); >>> + >>> +/* Search FEATURE for a register named NAME and set its group to GROUP. */ >>> + >>> +int tdesc_set_register_group_early (const struct tdesc_feature *feature, >>> + const char *name, const char *group); >>> + >>> +/* Search GDBARCH for a register REGNO and return its group. */ >>> + >>> +const char * >>> +tdesc_register_group (struct gdbarch *gdbarch, int regno); >>> + >>> /* Methods for constructing a target description. */ >>> >>> struct target_desc *allocate_target_description (void); >> >> -- >> Tel: +44 (1590) 610184 >> Cell: +44 (7970) 676050 >> SkypeID: jeremybennett >> Email: [email protected] >> Web: www.embecosm.com >> >> _______________________________________________ >> OpenRISC mailing list >> [email protected] >> http://lists.openrisc.net/listinfo/openrisc _______________________________________________ OpenRISC mailing list [email protected] http://lists.openrisc.net/listinfo/openrisc
