From: Alan Modra Date: Tue, 17 Oct 2017 14:03:05 +0000 (+1030) Subject: [GOLD] Fix powerpc64 optimization of TOC accesses X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ac7c988b464401474d73c68f1bd59dffe42a84a8;p=thirdparty%2Fbinutils-gdb.git [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. (cherry picked from commit 412294daf8786fd9060059b8be7fc59a35e13922) --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 32c0e21f549..622a63a2142 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2017-10-18 Kyle Butt + Alan Modra + + * powerpc.cc (Target_powerpc::Scan::local): Correct dst_off + calculation for TOC16 relocs. + (Target_powerpc::Scan::global): Likewise. + 2017-09-28 Alan Modra * powerpc.cc (Target_powerpc<64,*>::powerpc_info): Set diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 22590c1e435..b5db66549ef 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -6649,7 +6649,7 @@ Target_powerpc::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; @@ -7317,7 +7317,7 @@ Target_powerpc::Scan::global( if (shndx == sym_object->toc_shndx()) { Sized_symbol* sym = symtab->get_sized_symbol(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;