diff options
author | Keith Walker <keith.walker@arm.com> | 2001-11-29 13:19:06 +0000 |
---|---|---|
committer | Keith Walker <keith.walker@arm.com> | 2001-11-29 13:19:06 +0000 |
commit | a8329558c71d9640692c6a96c7feeb632c7b240f (patch) | |
tree | 0adbc4c081940d5a31489d2cec24b25c14c45ac1 | |
parent | aedf1c5b27aeedc495013020f059ecc84a28fdbb (diff) | |
download | gdb-a8329558c71d9640692c6a96c7feeb632c7b240f.zip gdb-a8329558c71d9640692c6a96c7feeb632c7b240f.tar.gz gdb-a8329558c71d9640692c6a96c7feeb632c7b240f.tar.bz2 |
* dwarf2read.c (read_attribute_value): New function to handle DW_FORM_indirect
(read_attribute): uses read_attribute_value
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 35 |
2 files changed, 33 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2d12545..dc25ee8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +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 + 2001-11-29 Jim Blandy <jimb@redhat.com> * s390-tdep.c (s390_frame_saved_pc_nofix): If the prologue didn't diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index ec03071..2ac7e6a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -605,6 +605,9 @@ static char *read_full_die (struct die_info **, bfd *, char *, 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 @@ read_full_die (struct die_info **diep, bfd *abfd, char *info_ptr, 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 @@ read_attribute (struct attribute *attr, struct attr_abbrev *abbrev, 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 @@ -5625,7 +5642,11 @@ dump_die (struct die_info *die) else fprintf (stderr, "flag: FALSE"); break; - 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 form" so this form should not occur */ + fprintf (stderr, "unexpected attribute form: DW_FORM_indirect"); + break; default: fprintf (stderr, "unsupported attribute form: %d.", die->attrs[i].form); |