2012/12/27 Franck Jullien <[email protected]>:
> 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
I just saw some xml files in gdb/features directory use non standart
names (e.g. mips-linux.xml) :
<feature name="org.gnu.gdb.mips.linux">
<reg name="restart" bitsize="32" group="system"/>
</feature>
I'll write a patch using this approach and see how it looks like.
Franck.
_______________________________________________
OpenRISC mailing list
[email protected]
http://lists.openrisc.net/listinfo/openrisc