aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2003-06-17 12:37:26 +0000
committerAlan Modra <amodra@gmail.com>2003-06-17 12:37:26 +0000
commitdad27d18ac0175ce7d0a2859b9b0e638c3eb46a5 (patch)
tree9a5ebaabbc752808e3e74477c7293d9b641e159d
parentfea39bcb0781e1ee232093500d9ad8844fd23732 (diff)
downloadfsf-binutils-gdb-dad27d18ac0175ce7d0a2859b9b0e638c3eb46a5.zip
fsf-binutils-gdb-dad27d18ac0175ce7d0a2859b9b0e638c3eb46a5.tar.gz
fsf-binutils-gdb-dad27d18ac0175ce7d0a2859b9b0e638c3eb46a5.tar.bz2
* elf64-ppc.c (ppc64_elf_relocate_section): Optimize unaligned relocs.
-rw-r--r--bfd/ChangeLog4
-rw-r--r--bfd/elf64-ppc.c20
2 files changed, 24 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c6b6b1e..f738d5a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,7 @@
+2003-06-17 Alan Modra <amodra@bigpond.net.au>
+
+ * elf64-ppc.c (ppc64_elf_relocate_section): Optimize unaligned relocs.
+
2003-06-17 Nick Clifton <nickc@redhat.com>
* elflink.h (elf_gc_record_vtentry): Allocate an extra element
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 371abb1..ca58c10 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -8272,6 +8272,26 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
}
+ /* Optimize unaligned reloc use. */
+ if ((ELF64_R_TYPE (outrel.r_info) == R_PPC64_ADDR64
+ && (outrel.r_offset & 7) != 0)
+ || (ELF64_R_TYPE (outrel.r_info) == R_PPC64_UADDR64
+ && (outrel.r_offset & 7) == 0))
+ outrel.r_info ^= (ELF64_R_INFO (0, R_PPC64_ADDR64)
+ ^ ELF64_R_INFO (0, R_PPC64_UADDR64));
+ else if ((ELF64_R_TYPE (outrel.r_info) == R_PPC64_ADDR32
+ && (outrel.r_offset & 3) != 0)
+ || (ELF64_R_TYPE (outrel.r_info) == R_PPC64_UADDR32
+ && (outrel.r_offset & 3) == 0))
+ outrel.r_info ^= (ELF64_R_INFO (0, R_PPC64_ADDR32)
+ ^ ELF64_R_INFO (0, R_PPC64_UADDR32));
+ else if ((ELF64_R_TYPE (outrel.r_info) == R_PPC64_ADDR16
+ && (outrel.r_offset & 1) != 0)
+ || (ELF64_R_TYPE (outrel.r_info) == R_PPC64_UADDR16
+ && (outrel.r_offset & 1) == 0))
+ outrel.r_info ^= (ELF64_R_INFO (0, R_PPC64_ADDR16)
+ ^ ELF64_R_INFO (0, R_PPC64_UADDR16));
+
sreloc = elf_section_data (input_section)->sreloc;
if (sreloc == NULL)
abort ();