From: Alan Modra Date: Wed, 14 Aug 2019 07:01:05 +0000 (+0930) Subject: Aligned vs. unaligned ppc32 relocs X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=63f6e94fb3cc5b6a2cfb8c28686f150e7226ab7e;p=binutils-gdb.git Aligned vs. unaligned ppc32 relocs Given R_PPC_ADDR32 or R_PPC_UADDR32 relocs, this patch generates R_PPC_ADDR32 or R_PPC_UADDR32 dynamic relocs from either type depending on whether r_offset is 4-byte aligned, and similarly for R_PPC_ADDR16/R_PPC_UADDR16. * elf32-ppc.c (ppc_elf_relocate_section): Optimize unaligned relocs. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8e63c9b8f9d..5c3efb94c88 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,7 @@ +2019-08-16 Alan Modra + + * elf32-ppc.c (ppc_elf_relocate_section): Optimize unaligned relocs. + 2019-08-15 Jim Wilson * elfnn-riscv.c (perform_relocation) : If diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index e683590f417..78d39efe48c 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -8157,6 +8157,14 @@ ppc_elf_relocate_section (bfd *output_bfd, outrel.r_offset += (input_section->output_section->vma + input_section->output_offset); + /* Optimize unaligned reloc use. */ + if ((r_type == R_PPC_ADDR32 && (outrel.r_offset & 3) != 0) + || (r_type == R_PPC_UADDR32 && (outrel.r_offset & 3) == 0)) + r_type ^= R_PPC_ADDR32 ^ R_PPC_UADDR32; + if ((r_type == R_PPC_ADDR16 && (outrel.r_offset & 1) != 0) + || (r_type == R_PPC_UADDR16 && (outrel.r_offset & 1) == 0)) + r_type ^= R_PPC_ADDR16 ^ R_PPC_UADDR16; + if (skip) memset (&outrel, 0, sizeof outrel); else if (!SYMBOL_REFERENCES_LOCAL (info, h))