diff options
author | Mark Wielaard <mjw@redhat.com> | 2012-04-27 19:03:04 +0000 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2012-04-27 19:03:04 +0000 |
commit | c49ead2f3873ca2ac8af4fd961ad64d88e66b5f6 (patch) | |
tree | 45433c7db58e44c28301c2d2509583dfea4f78e1 /bfd | |
parent | 91da14142c0171e58a91ad58a32fd010b700e761 (diff) | |
download | gdb-c49ead2f3873ca2ac8af4fd961ad64d88e66b5f6.zip gdb-c49ead2f3873ca2ac8af4fd961ad64d88e66b5f6.tar.gz gdb-c49ead2f3873ca2ac8af4fd961ad64d88e66b5f6.tar.bz2 |
* dwarf2.c (scan_unit_for_symbols): Account for DW_AT_high_pc
possibly being relative to DW_AT_low_pc.
(parse_comp_unit): Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/dwarf2.c | 9 |
2 files changed, 15 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a85cee11..91cd11a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2012-04-26 Mark Wielaard <mjw@redhat.com> + + * dwarf2.c (scan_unit_for_symbols): Account for DW_AT_high_pc + possibly being relative to DW_AT_low_pc. + (parse_comp_unit): Likewise. + 2012-04-26 Andreas Schwab <schwab@linux-m68k.org> * elf32-m68k.c (elf_m68k_check_relocs): Mark non-GOT references diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 66fd16f..51e27b4 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -2092,6 +2092,7 @@ scan_unit_for_symbols (struct comp_unit *unit) struct varinfo *var; bfd_vma low_pc = 0; bfd_vma high_pc = 0; + bfd_boolean high_pc_relative = FALSE; abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); info_ptr += bytes_read; @@ -2197,6 +2198,7 @@ scan_unit_for_symbols (struct comp_unit *unit) case DW_AT_high_pc: high_pc = attr.u.val; + high_pc_relative = attr.form != DW_FORM_addr; break; case DW_AT_ranges: @@ -2275,6 +2277,9 @@ scan_unit_for_symbols (struct comp_unit *unit) } } + if (high_pc_relative) + high_pc += low_pc; + if (func && high_pc != 0) { if (!arange_add (unit->abfd, &func->arange, low_pc, high_pc)) @@ -2338,6 +2343,7 @@ parse_comp_unit (struct dwarf2_debug *stash, bfd_vma low_pc = 0; bfd_vma high_pc = 0; bfd *abfd = stash->bfd_ptr; + bfd_boolean high_pc_relative = FALSE; version = read_2_bytes (abfd, info_ptr); info_ptr += 2; @@ -2440,6 +2446,7 @@ parse_comp_unit (struct dwarf2_debug *stash, case DW_AT_high_pc: high_pc = attr.u.val; + high_pc_relative = attr.form != DW_FORM_addr; break; case DW_AT_ranges: @@ -2467,6 +2474,8 @@ parse_comp_unit (struct dwarf2_debug *stash, break; } } + if (high_pc_relative) + high_pc += low_pc; if (high_pc != 0) { if (!arange_add (unit->abfd, &unit->arange, low_pc, high_pc)) |