aboutsummaryrefslogtreecommitdiff
path: root/bfd/dwarf2.c
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2012-04-27 19:03:04 +0000
committerMark Wielaard <mjw@redhat.com>2012-04-27 19:03:04 +0000
commitc49ead2f3873ca2ac8af4fd961ad64d88e66b5f6 (patch)
tree45433c7db58e44c28301c2d2509583dfea4f78e1 /bfd/dwarf2.c
parent91da14142c0171e58a91ad58a32fd010b700e761 (diff)
downloadgdb-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/dwarf2.c')
-rw-r--r--bfd/dwarf2.c9
1 files changed, 9 insertions, 0 deletions
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))