diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-04-01 05:24:52 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2010-04-01 05:24:52 +0000 |
commit | c07cbdd706fb9521b85fa100bb7507c44f92653f (patch) | |
tree | 132e6be1203a55c6cdafac3074cd24e530fcf7b5 /bfd/dwarf2.c | |
parent | 0db9b91c94a19133307e24644b54bbad1f1c0033 (diff) | |
download | gdb-c07cbdd706fb9521b85fa100bb7507c44f92653f.zip gdb-c07cbdd706fb9521b85fa100bb7507c44f92653f.tar.gz gdb-c07cbdd706fb9521b85fa100bb7507c44f92653f.tar.bz2 |
* dwarf2.c (read_attribute_value): Handle CU version 4
for DW_FORM_ref_addr, handle DW_FORM_sec_offset, DW_FORM_exprloc
and DW_FORM_flag_present. For unknown form value return NULL.
(scan_unit_for_symbols): For DW_AT_location handle DW_FORM_exprloc
like DW_FORM_block.
(parse_comp_unit): Allow CU version 4.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r-- | bfd/dwarf2.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 1eae5e1..adc8314 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -760,7 +760,7 @@ read_attribute_value (struct attribute *attr, case DW_FORM_ref_addr: /* DW_FORM_ref_addr is an address in DWARF2, and an offset in DWARF3. */ - if (unit->version == 3) + if (unit->version == 3 || unit->version == 4) { if (unit->offset_size == 4) attr->u.val = read_4_bytes (unit->abfd, info_ptr); @@ -774,6 +774,13 @@ read_attribute_value (struct attribute *attr, attr->u.val = read_address (unit, info_ptr); info_ptr += unit->addr_size; break; + case DW_FORM_sec_offset: + if (unit->offset_size == 4) + attr->u.val = read_4_bytes (unit->abfd, info_ptr); + else + attr->u.val = read_8_bytes (unit->abfd, info_ptr); + info_ptr += unit->offset_size; + break; case DW_FORM_block2: amt = sizeof (struct dwarf_block); blk = (struct dwarf_block *) bfd_alloc (abfd, amt); @@ -816,6 +823,7 @@ read_attribute_value (struct attribute *attr, attr->u.str = read_indirect_string (unit, info_ptr, &bytes_read); info_ptr += bytes_read; break; + case DW_FORM_exprloc: case DW_FORM_block: amt = sizeof (struct dwarf_block); blk = (struct dwarf_block *) bfd_alloc (abfd, amt); @@ -846,6 +854,9 @@ read_attribute_value (struct attribute *attr, attr->u.val = read_1_byte (abfd, info_ptr); info_ptr += 1; break; + case DW_FORM_flag_present: + attr->u.val = 1; + break; case DW_FORM_sdata: attr->u.sval = read_signed_leb128 (abfd, info_ptr, &bytes_read); info_ptr += bytes_read; @@ -887,6 +898,7 @@ read_attribute_value (struct attribute *attr, (*_bfd_error_handler) (_("Dwarf Error: Invalid or unhandled FORM value: %u."), form); bfd_set_error (bfd_error_bad_value); + return NULL; } return info_ptr; } @@ -2113,6 +2125,7 @@ scan_unit_for_symbols (struct comp_unit *unit) case DW_FORM_block1: case DW_FORM_block2: case DW_FORM_block4: + case DW_FORM_exprloc: if (*attr.u.blk->data == DW_OP_addr) { var->stack = 0; @@ -2216,9 +2229,9 @@ parse_comp_unit (struct dwarf2_debug *stash, addr_size = read_1_byte (abfd, info_ptr); info_ptr += 1; - if (version != 2 && version != 3) + if (version != 2 && version != 3 && version != 4) { - (*_bfd_error_handler) (_("Dwarf Error: found dwarf version '%u', this reader only handles version 2 and 3 information."), version); + (*_bfd_error_handler) (_("Dwarf Error: found dwarf version '%u', this reader only handles version 2, 3 and 4 information."), version); bfd_set_error (bfd_error_bad_value); return 0; } |