Re: Patch to handle DWARF2 DW_FORM_indirect

Elena Zannoni
2001-11-27T07:59:00Z

> >Your patch won't apply cleanly to gdb anymore, after Jakub's patch for
> >DW_FORM_strp was committed.
>
> Updated to matched the latest file from CVS which has Jakub's patch applied
>
> >One comment: the 'case DW_FORM_indirect:' resulting in an error
> >message of unsupported attribute, is not correct anymore. Could you emit
> >a more pertinent message?
>
> It will now output "unexpected attribute form: DW_FORM_indirect".
>
> >Other than that, it's fine. Could you repost an updated patch, just for
> >the record?
>
> Here is the updated patch for gdb:
>

Yes, go ahead.

Thanks.

Elena

> ChangeLog:
>
> 2001-11-27 Keith Walker <keith.walker@arm.com>
> * dwarf2read.c (read_attribute_value): New function to handle
> DW_FORM_indirect
> (read_attribute): uses read_attribute_value
>
>
> Index: dwarf2read.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/dwarf2read.c,v
> retrieving revision 1.35
> diff -u -r1.35 dwarf2read.c
> --- dwarf2read.c 2001/11/17 00:08:10 1.35
> +++ dwarf2read.c 2001/11/27 11:40:43
> @@ -605,6 +605,9 @@
> static char *read_attribute (struct attribute *, struct attr_abbrev *,
> bfd *, char *, const struct comp_unit_head *);
>
> +static char *read_attribute_value (struct attribute *, unsigned,
> + bfd *, char *, const struct comp_unit_head *);
> +
> static unsigned int read_1_byte (bfd *, char *);
>
> static int read_1_signed_byte (bfd *, char *);
> @@ -3360,19 +3363,18 @@
> return info_ptr;
> }
>
> -/* Read an attribute described by an abbreviated attribute. */
> +/* Read an attribute value described by an attribute form. */
>
> static char *
> -read_attribute (struct attribute *attr, struct attr_abbrev *abbrev,
> +read_attribute_value (struct attribute *attr, unsigned form,
> bfd *abfd, char *info_ptr,
> const struct comp_unit_head *cu_header)
> {
> unsigned int bytes_read;
> struct dwarf_block *blk;
>
> - attr->name = abbrev->name;
> - attr->form = abbrev->form;
> - switch (abbrev->form)
> + attr->form = form;
> + switch (form)
> {
> case DW_FORM_addr:
> case DW_FORM_ref_addr:
> @@ -3469,13 +3471,28 @@
> info_ptr += bytes_read;
> break;
> case DW_FORM_indirect:
> + form = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
> + info_ptr += bytes_read;
> + info_ptr = read_attribute_value (attr, form, abfd, info_ptr, cu_header);
> + break;
> default:
> error ("Dwarf Error: Cannot handle %s in DWARF reader.",
> - dwarf_form_name (abbrev->form));
> + dwarf_form_name (form));
> }
> return info_ptr;
> }
>
> +/* Read an attribute described by an abbreviated attribute. */
> +
> +static char *
> +read_attribute (struct attribute *attr, struct attr_abbrev *abbrev,
> + bfd *abfd, char *info_ptr,
> + const struct comp_unit_head *cu_header)
> +{
> + attr->name = abbrev->name;
> + return read_attribute_value (attr, abbrev->form, abfd, info_ptr, cu_header);
> +}
> +
> /* read dwarf information from a buffer */
>
> static unsigned int
> @@ -5624,8 +5641,12 @@
> fprintf (stderr, "flag: TRUE");
> else
> fprintf (stderr, "flag: FALSE");
> + break;
> + case DW_FORM_indirect:
> + /* the reader will have reduced the indirect form to
> + the "base form" so this form should not occur */
> + fprintf (stderr, "unexpected attribute form: DW_FORM_indirect");