[GOLD] PowerPC style fix

* powerpc.cc (Target_powerpc::Relocate::relocate): New constant
	d_offset.  Use throughout.
	(Target_powerpc::relocate_relocs): Likewise.
This commit is contained in:
Alan Modra 2015-12-09 10:30:18 +10:30
parent e3a7574e2e
commit dcfc7dd477
2 changed files with 33 additions and 22 deletions

View File

@ -1,3 +1,9 @@
2015-12-09 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Relocate::relocate): New constant
d_offset. Use throughout.
(Target_powerpc::relocate_relocs): Likewise.
2015-12-09 Alan Modra <amodra@gmail.com> 2015-12-09 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Relocate::relocate): Edit ELFv2 * powerpc.cc (Target_powerpc::Relocate::relocate): Edit ELFv2

View File

@ -7029,6 +7029,9 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
typedef typename elfcpp::Swap<32, big_endian>::Valtype Insn; typedef typename elfcpp::Swap<32, big_endian>::Valtype Insn;
typedef typename Reloc_types<elfcpp::SHT_RELA, typedef typename Reloc_types<elfcpp::SHT_RELA,
size, big_endian>::Reloc Reltype; size, big_endian>::Reloc Reltype;
// Offset from start of insn to d-field reloc.
const int d_offset = big_endian ? 2 : 0;
Powerpc_relobj<size, big_endian>* const object Powerpc_relobj<size, big_endian>* const object
= static_cast<Powerpc_relobj<size, big_endian>*>(relinfo->object); = static_cast<Powerpc_relobj<size, big_endian>*>(relinfo->object);
Address value = 0; Address value = 0;
@ -7212,7 +7215,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
if (r_type == elfcpp::R_POWERPC_GOT_TLSGD16 if (r_type == elfcpp::R_POWERPC_GOT_TLSGD16
|| r_type == elfcpp::R_POWERPC_GOT_TLSGD16_LO) || r_type == elfcpp::R_POWERPC_GOT_TLSGD16_LO)
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = elfcpp::Swap<32, big_endian>::readval(iview); Insn insn = elfcpp::Swap<32, big_endian>::readval(iview);
insn &= (1 << 26) - (1 << 16); // extract rt,ra from addi insn &= (1 << 26) - (1 << 16); // extract rt,ra from addi
if (size == 32) if (size == 32)
@ -7229,7 +7232,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
if (r_type == elfcpp::R_POWERPC_GOT_TLSGD16 if (r_type == elfcpp::R_POWERPC_GOT_TLSGD16
|| r_type == elfcpp::R_POWERPC_GOT_TLSGD16_LO) || r_type == elfcpp::R_POWERPC_GOT_TLSGD16_LO)
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = elfcpp::Swap<32, big_endian>::readval(iview); Insn insn = elfcpp::Swap<32, big_endian>::readval(iview);
insn &= (1 << 26) - (1 << 21); // extract rt insn &= (1 << 26) - (1 << 21); // extract rt
if (size == 32) if (size == 32)
@ -7242,7 +7245,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
} }
else else
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = nop; Insn insn = nop;
elfcpp::Swap<32, big_endian>::writeval(iview, insn); elfcpp::Swap<32, big_endian>::writeval(iview, insn);
r_type = elfcpp::R_POWERPC_NONE; r_type = elfcpp::R_POWERPC_NONE;
@ -7267,7 +7270,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
if (r_type == elfcpp::R_POWERPC_GOT_TLSLD16 if (r_type == elfcpp::R_POWERPC_GOT_TLSLD16
|| r_type == elfcpp::R_POWERPC_GOT_TLSLD16_LO) || r_type == elfcpp::R_POWERPC_GOT_TLSLD16_LO)
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = elfcpp::Swap<32, big_endian>::readval(iview); Insn insn = elfcpp::Swap<32, big_endian>::readval(iview);
insn &= (1 << 26) - (1 << 21); // extract rt insn &= (1 << 26) - (1 << 21); // extract rt
if (size == 32) if (size == 32)
@ -7280,7 +7283,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
} }
else else
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = nop; Insn insn = nop;
elfcpp::Swap<32, big_endian>::writeval(iview, insn); elfcpp::Swap<32, big_endian>::writeval(iview, insn);
r_type = elfcpp::R_POWERPC_NONE; r_type = elfcpp::R_POWERPC_NONE;
@ -7336,7 +7339,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
if (r_type == elfcpp::R_POWERPC_GOT_TPREL16 if (r_type == elfcpp::R_POWERPC_GOT_TPREL16
|| r_type == elfcpp::R_POWERPC_GOT_TPREL16_LO) || r_type == elfcpp::R_POWERPC_GOT_TPREL16_LO)
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = elfcpp::Swap<32, big_endian>::readval(iview); Insn insn = elfcpp::Swap<32, big_endian>::readval(iview);
insn &= (1 << 26) - (1 << 21); // extract rt from ld insn &= (1 << 26) - (1 << 21); // extract rt from ld
if (size == 32) if (size == 32)
@ -7349,7 +7352,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
} }
else else
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = nop; Insn insn = nop;
elfcpp::Swap<32, big_endian>::writeval(iview, insn); elfcpp::Swap<32, big_endian>::writeval(iview, insn);
r_type = elfcpp::R_POWERPC_NONE; r_type = elfcpp::R_POWERPC_NONE;
@ -7381,7 +7384,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
Insn insn = addi_3_3; Insn insn = addi_3_3;
elfcpp::Swap<32, big_endian>::writeval(iview, insn); elfcpp::Swap<32, big_endian>::writeval(iview, insn);
r_type = elfcpp::R_POWERPC_TPREL16_LO; r_type = elfcpp::R_POWERPC_TPREL16_LO;
view += 2 * big_endian; view += d_offset;
value = psymval->value(object, rela.get_r_addend()); value = psymval->value(object, rela.get_r_addend());
} }
this->skip_next_tls_get_addr_call(); this->skip_next_tls_get_addr_call();
@ -7401,7 +7404,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
elfcpp::Swap<32, big_endian>::writeval(iview, insn); elfcpp::Swap<32, big_endian>::writeval(iview, insn);
this->skip_next_tls_get_addr_call(); this->skip_next_tls_get_addr_call();
r_type = elfcpp::R_POWERPC_TPREL16_LO; r_type = elfcpp::R_POWERPC_TPREL16_LO;
view += 2 * big_endian; view += d_offset;
value = dtp_offset; value = dtp_offset;
} }
} }
@ -7419,7 +7422,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
gold_assert(insn != 0); gold_assert(insn != 0);
elfcpp::Swap<32, big_endian>::writeval(iview, insn); elfcpp::Swap<32, big_endian>::writeval(iview, insn);
r_type = elfcpp::R_POWERPC_TPREL16_LO; r_type = elfcpp::R_POWERPC_TPREL16_LO;
view += 2 * big_endian; view += d_offset;
value = psymval->value(object, rela.get_r_addend()); value = psymval->value(object, rela.get_r_addend());
} }
} }
@ -7612,7 +7615,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
case elfcpp::R_PPC64_TOC16_HA: case elfcpp::R_PPC64_TOC16_HA:
if (parameters->options().toc_optimize()) if (parameters->options().toc_optimize())
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = elfcpp::Swap<32, big_endian>::readval(iview); Insn insn = elfcpp::Swap<32, big_endian>::readval(iview);
if ((insn & ((0x3f << 26) | 0x1f << 16)) if ((insn & ((0x3f << 26) | 0x1f << 16))
!= ((15u << 26) | (2 << 16)) /* addis rt,2,imm */) != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */)
@ -7637,7 +7640,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
case elfcpp::R_PPC64_TOC16_LO_DS: case elfcpp::R_PPC64_TOC16_LO_DS:
if (parameters->options().toc_optimize()) if (parameters->options().toc_optimize())
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = elfcpp::Swap<32, big_endian>::readval(iview); Insn insn = elfcpp::Swap<32, big_endian>::readval(iview);
if (!ok_lo_toc_insn(insn)) if (!ok_lo_toc_insn(insn))
gold_error_at_location(relinfo, relnum, rela.get_r_offset(), gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
@ -7728,7 +7731,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
&& prev_rela.get_r_offset() + 4 == rela.get_r_offset() && prev_rela.get_r_offset() + 4 == rela.get_r_offset()
&& prev_rela.get_r_addend() + 4 == rela.get_r_addend()) && prev_rela.get_r_addend() + 4 == rela.get_r_addend())
{ {
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn1 = elfcpp::Swap<32, big_endian>::readval(iview - 1); Insn insn1 = elfcpp::Swap<32, big_endian>::readval(iview - 1);
Insn insn2 = elfcpp::Swap<32, big_endian>::readval(iview); Insn insn2 = elfcpp::Swap<32, big_endian>::readval(iview);
@ -7846,7 +7849,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
break; break;
} }
Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian); Insn* iview = reinterpret_cast<Insn*>(view - d_offset);
Insn insn = 0; Insn insn = 0;
if (overflow == Reloc::CHECK_LOW_INSN if (overflow == Reloc::CHECK_LOW_INSN
@ -8283,6 +8286,8 @@ Target_powerpc<size, big_endian>::relocate_relocs(
Reltype_write; Reltype_write;
const int reloc_size const int reloc_size
= Reloc_types<elfcpp::SHT_RELA, size, big_endian>::reloc_size; = Reloc_types<elfcpp::SHT_RELA, size, big_endian>::reloc_size;
// Offset from start of insn to d-field reloc.
const int d_offset = big_endian ? 2 : 0;
Powerpc_relobj<size, big_endian>* const object Powerpc_relobj<size, big_endian>* const object
= static_cast<Powerpc_relobj<size, big_endian>*>(relinfo->object); = static_cast<Powerpc_relobj<size, big_endian>*>(relinfo->object);
@ -8416,12 +8421,12 @@ Target_powerpc<size, big_endian>::relocate_relocs(
else if (r_type == elfcpp::R_POWERPC_REL16_HA) else if (r_type == elfcpp::R_POWERPC_REL16_HA)
{ {
r_type = elfcpp::R_POWERPC_ADDR16_HA; r_type = elfcpp::R_POWERPC_ADDR16_HA;
addend -= 2 * big_endian; addend -= d_offset;
} }
else if (r_type == elfcpp::R_POWERPC_REL16_LO) else if (r_type == elfcpp::R_POWERPC_REL16_LO)
{ {
r_type = elfcpp::R_POWERPC_ADDR16_LO; r_type = elfcpp::R_POWERPC_ADDR16_LO;
addend -= 2 * big_endian + 4; addend -= d_offset + 4;
} }
} }
else else
@ -8450,7 +8455,7 @@ Target_powerpc<size, big_endian>::relocate_relocs(
else else
{ {
r_type = elfcpp::R_POWERPC_NONE; r_type = elfcpp::R_POWERPC_NONE;
offset -= 2 * big_endian; offset -= d_offset;
} }
break; break;
default: default:
@ -8480,7 +8485,7 @@ Target_powerpc<size, big_endian>::relocate_relocs(
else else
{ {
r_type = elfcpp::R_POWERPC_NONE; r_type = elfcpp::R_POWERPC_NONE;
offset -= 2 * big_endian; offset -= d_offset;
} }
} }
} }
@ -8499,7 +8504,7 @@ Target_powerpc<size, big_endian>::relocate_relocs(
else else
{ {
r_type = elfcpp::R_POWERPC_NONE; r_type = elfcpp::R_POWERPC_NONE;
offset -= 2 * big_endian; offset -= d_offset;
} }
} }
} }
@ -8517,7 +8522,7 @@ Target_powerpc<size, big_endian>::relocate_relocs(
break; break;
case tls::TLSOPT_TO_LE: case tls::TLSOPT_TO_LE:
r_type = elfcpp::R_POWERPC_TPREL16_LO; r_type = elfcpp::R_POWERPC_TPREL16_LO;
offset += 2 * big_endian; offset += d_offset;
zap_next = true; zap_next = true;
break; break;
default: default:
@ -8538,7 +8543,7 @@ Target_powerpc<size, big_endian>::relocate_relocs(
r_sym = os->symtab_index(); r_sym = os->symtab_index();
addend = dtp_offset; addend = dtp_offset;
r_type = elfcpp::R_POWERPC_TPREL16_LO; r_type = elfcpp::R_POWERPC_TPREL16_LO;
offset += 2 * big_endian; offset += d_offset;
zap_next = true; zap_next = true;
} }
} }
@ -8549,7 +8554,7 @@ Target_powerpc<size, big_endian>::relocate_relocs(
if (this->optimize_tls_ie(final) == tls::TLSOPT_TO_LE) if (this->optimize_tls_ie(final) == tls::TLSOPT_TO_LE)
{ {
r_type = elfcpp::R_POWERPC_TPREL16_LO; r_type = elfcpp::R_POWERPC_TPREL16_LO;
offset += 2 * big_endian; offset += d_offset;
} }
} }
} }