[GOLD] Fix powerpc64 optimization of TOC accesses

Fixes a thinko.  Given code that puts variables into the TOC (a bad
idea, but some see the TOC as a small data section) this bug could
result in an attempt to optimize a sequence that should not be
optimized.

	* powerpc.cc (Target_powerpc::Scan::local): Correct dst_off
	calculation for TOC16 relocs.
	(Target_powerpc::Scan::global): Likewise.
This commit is contained in:
Alan Modra 2017-10-18 00:33:05 +10:30
parent b27de576d4
commit 412294daf8
2 changed files with 9 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2017-10-18 Kyle Butt <iteratee@google.com>
Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Scan::local): Correct dst_off
calculation for TOC16 relocs.
(Target_powerpc::Scan::global): Likewise.
2017-09-26 Cary Coutant <ccoutant@gmail.com>
PR gold/22213

View File

@ -6917,7 +6917,7 @@ Target_powerpc<size, big_endian>::Scan::local(
shndx = ppc_object->adjust_sym_shndx(r_sym, shndx, &is_ordinary);
if (is_ordinary && shndx == ppc_object->toc_shndx())
{
Address dst_off = lsym.get_st_value() + reloc.get_r_offset();
Address dst_off = lsym.get_st_value() + reloc.get_r_addend();
if (dst_off < ppc_object->section_size(shndx))
{
bool ok = false;
@ -7591,7 +7591,7 @@ Target_powerpc<size, big_endian>::Scan::global(
if (shndx == sym_object->toc_shndx())
{
Sized_symbol<size>* sym = symtab->get_sized_symbol<size>(gsym);
Address dst_off = sym->value() + reloc.get_r_offset();
Address dst_off = sym->value() + reloc.get_r_addend();
if (dst_off < sym_object->section_size(shndx))
{
bool ok = false;