Re: Patch to handle DWARF2 DW_FORM_indirect

Elena Zannoni
2001-11-22T07:08:14Z

Keith.Walker writes:
> The DWARF2 specification allows the form of attributes to be described
> "inline" with DW_FORM_indirect rather than the form being specified in a
> separate abbreviation table. The following patch adds support for
> DW_FORM_indirect in BFD, binutils and GDB.
>
> If there are no objections, can this patch be approved and applied by the
> GDB and binutils maintainers.
>
> Keith
>

Your patch won't apply cleanly to gdb anymore, after Jakub's patch for
DW_FORM_strp was committed.

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?

Other than that, it's fine. Could you repost an updated patch, just for
the record?

Thanks
Elena

>
> Index: gdb/ChangeLog
> ===================================================================
> RCS file: /cvs/src/src/gdb/ChangeLog,v
> retrieving revision 1.1758
> diff -u -r1.1758 ChangeLog
> --- ChangeLog 2001/11/13 03:10:33 1.1758
> +++ ChangeLog 2001/11/13 17:24:15
> @@ -1,3 +1,8 @@
> +2001-11-13 Keith Walker <keith.walker@arm.com>
> + * dwarf2read.c (read_attribute_value): New function to handle
> + DW_FORM_indirect
> + (read_attribute): uses read_attribute_value
> +
> 2001-11-10 Andrew Cagney <ac131313@redhat.com>
>
> * config/i960/tm-nindy960.h (REGISTER_CONVERTIBLE)
>
>
> Index: gdb/dwarf2read.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/dwarf2read.c,v
> retrieving revision 1.34
> diff -u -r1.34 dwarf2read.c
> --- dwarf2read.c 2001/11/12 20:36:55 1.34
> +++ dwarf2read.c 2001/11/13 17:24:25
> @@ -593,6 +593,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 *);
> @@ -3333,19 +3336,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:
> @@ -3436,15 +3438,30 @@
> DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
> info_ptr += bytes_read;
> break;
> - case DW_FORM_strp:
> 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;
> + case DW_FORM_strp:
> 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
> @@ -5602,7 +5619,9 @@
> break;
> case DW_FORM_strp: /* we do not support separate string
> section yet */
> - case DW_FORM_indirect: /* we do not handle indirect yet */
> + case DW_FORM_indirect: /* the reader will have reduced the indirect
> + form to the base type so this form
> + should not occur */
> default:
> fprintf (stderr, "unsupported attribute form: %d.",
> die->attrs[i].form);
>
>
>
> Keith Walker keith.walker@arm.com Tel:+44 (1628) 427732
> ARM Ltd http://www.arm.com