This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb/binutils-2_25-branch] Tidy PowerPC gold find_global_entry uses
- From: Alan Modra <amodra at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 5 Jun 2015 14:58:26 -0000
- Subject: [binutils-gdb/binutils-2_25-branch] Tidy PowerPC gold find_global_entry uses
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7860336b6c64b3b54b654f8b7894b568cfd82d2b
commit 7860336b6c64b3b54b654f8b7894b568cfd82d2b
Author: Alan Modra <amodra@gmail.com>
Date: Tue Apr 28 16:45:34 2015 +0930
Tidy PowerPC gold find_global_entry uses
Completely removing the assert probably wasn't the best idea, so
reinstate it for allocated sections. Also cope with debug info
potentially referring to a missing plt call stub.
And a tidy. find_global_entry now returns an Address, so make temps
holding the return value of type Address, and compare against
invalid_address.
* powerpc.cc (Target_powerpc::do_dynsym_value): Use Address rather
than unsigned int for find_global_entry result temp. Compare
against invalid_address.
(Target_powerpc::do_plt_address_for_global): Likewise.
(Target_powerpc::Relocate::relocate): Likewise. Don't assert
on plt call stub existence for debug info. Do assert for plt
and global entry stub existence if an alloc section.
Diff:
---
gold/ChangeLog | 9 +++++++++
gold/powerpc.cc | 42 +++++++++++++++++++++++++-----------------
2 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/gold/ChangeLog b/gold/ChangeLog
index f554ee8..31b1893 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -2,6 +2,15 @@
Apply from master
2015-04-28 Alan Modra <amodra@gmail.com>
+ * powerpc.cc (Target_powerpc::do_dynsym_value): Use Address rather
+ than unsigned int for find_global_entry result temp. Compare
+ against invalid_address.
+ (Target_powerpc::do_plt_address_for_global): Likewise.
+ (Target_powerpc::Relocate::relocate): Likewise. Don't assert
+ on plt call stub existence for debug info. Do assert for plt
+ and global entry stub existence if an alloc section.
+
+ 2015-04-28 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Relocate::relocate): Don't assert
on missing global entry stub due to bogus debug info.
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index 3766f72..22a4a10 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -6747,8 +6747,8 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
&& !parameters->options().output_is_position_independent()
&& !is_branch_reloc(r_type))
{
- unsigned int off = target->glink_section()->find_global_entry(gsym);
- if (off != (unsigned int)-1)
+ Address off = target->glink_section()->find_global_entry(gsym);
+ if (off != invalid_address)
{
value = target->glink_section()->global_entry_address() + off;
has_stub_value = true;
@@ -6764,18 +6764,26 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
if (target->stub_tables().size() != 0)
stub_table = target->stub_tables()[0];
}
- gold_assert(stub_table != NULL);
- Address off;
- if (gsym != NULL)
- off = stub_table->find_plt_call_entry(object, gsym, r_type,
- rela.get_r_addend());
- else
- off = stub_table->find_plt_call_entry(object, r_sym, r_type,
- rela.get_r_addend());
- gold_assert(off != invalid_address);
- value = stub_table->stub_address() + off;
- has_stub_value = true;
+ if (stub_table != NULL)
+ {
+ Address off;
+ if (gsym != NULL)
+ off = stub_table->find_plt_call_entry(object, gsym, r_type,
+ rela.get_r_addend());
+ else
+ off = stub_table->find_plt_call_entry(object, r_sym, r_type,
+ rela.get_r_addend());
+ if (off != invalid_address)
+ {
+ value = stub_table->stub_address() + off;
+ has_stub_value = true;
+ }
+ }
}
+ // We don't care too much about bogus debug references to
+ // non-local functions, but otherwise there had better be a plt
+ // call stub or global entry stub as appropriate.
+ gold_assert(has_stub_value || !(os->flags() & elfcpp::SHF_ALLOC));
}
if (r_type == elfcpp::R_POWERPC_GOT16
@@ -8152,8 +8160,8 @@ Target_powerpc<size, big_endian>::do_dynsym_value(const Symbol* gsym) const
}
else if (this->abiversion() >= 2)
{
- unsigned int off = this->glink_section()->find_global_entry(gsym);
- if (off != (unsigned int)-1)
+ Address off = this->glink_section()->find_global_entry(gsym);
+ if (off != invalid_address)
return this->glink_section()->global_entry_address() + off;
}
gold_unreachable();
@@ -8202,8 +8210,8 @@ Target_powerpc<size, big_endian>::do_plt_address_for_global(
}
else if (this->abiversion() >= 2)
{
- unsigned int off = this->glink_section()->find_global_entry(gsym);
- if (off != (unsigned int)-1)
+ Address off = this->glink_section()->find_global_entry(gsym);
+ if (off != invalid_address)
return this->glink_section()->global_entry_address() + off;
}
gold_unreachable();