summaryrefslogtreecommitdiff
path: root/gold/gdb-index.cc
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2012-05-01 19:12:21 +0000
committerMark Wielaard <mjw@redhat.com>2012-05-01 19:12:21 +0000
commit57923f48a1e2e9129fdb3dd536b38e8d1cd46089 (patch)
tree96aef3be136a701f422e7ddb4ab49a993af8b660 /gold/gdb-index.cc
parent57402f1e314550ef28cc63b16d5ac69270c02984 (diff)
downloadbinutils-gdb-57923f48a1e2e9129fdb3dd536b38e8d1cd46089.tar.gz
gold: Handle DW_AT_high_pc as offset from DW_AT_low_pc in gdb-index.cc.
* dwarf_reader.cc (Dwarf_die::address_attribute): New function. * dwarf_reader.h (Dwarf_die::address_attribute): Likewise. * gdb-index.cc (Gdb_index_info_reader::record_cu_ranges): Handle DW_AT_high_pc as offset from DW_AT_low_pc. * testsuite/Makefile.am (gdb_index_test_3.sh): New test case. * testsuite/Makefile.in: Regenerate. * testsuite/gdb_index_test_3.c: New test source file. * testsuite/gdb_index_test_3.sh: New test source file.
Diffstat (limited to 'gold/gdb-index.cc')
-rw-r--r--gold/gdb-index.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/gold/gdb-index.cc b/gold/gdb-index.cc
index a6db505fa8e..66669888487 100644
--- a/gold/gdb-index.cc
+++ b/gold/gdb-index.cc
@@ -823,9 +823,15 @@ Gdb_index_info_reader::record_cu_ranges(Dwarf_die* die)
return;
}
- off_t low_pc = die->ref_attribute(elfcpp::DW_AT_low_pc, &shndx);
- off_t high_pc = die->ref_attribute(elfcpp::DW_AT_high_pc, &shndx2);
- if ((low_pc != 0 || high_pc != 0) && low_pc != -1 && high_pc != -1)
+ off_t low_pc = die->address_attribute(elfcpp::DW_AT_low_pc, &shndx);
+ off_t high_pc = die->address_attribute(elfcpp::DW_AT_high_pc, &shndx2);
+ if (high_pc == -1)
+ {
+ high_pc = die->uint_attribute(elfcpp::DW_AT_high_pc);
+ high_pc += low_pc;
+ shndx2 = shndx;
+ }
+ if ((low_pc != 0 || high_pc != 0) && low_pc != -1)
{
if (shndx != shndx2)
{