From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Keith.Walker" To: gdb-patches@sources.redhat.com Subject: Re: Patch to handle DWARF2 DW_FORM_indirect Date: Tue, 27 Nov 2001 04:01:00 -0000 Message-ID: <4.1.20011127115346.00bd8b60@mhsun1.maidenhead.arm.com> References: <48256B0B.00805439.00@TWALINS3> X-SW-Source: 2001-11/msg00491.html Message-ID: <20011127040100.s2y5brwhdVBQsAI_ho22Qt_dbwys7UaY8JwKuBbrRP0@z> >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: ChangeLog: 2001-11-27 Keith Walker * 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"); break; - case DW_FORM_indirect: /* we do not handle indirect yet */ 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