This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
powerpc64 unaligned relocs
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Date: Tue, 17 Jun 2003 22:08:49 +0930
- Subject: powerpc64 unaligned relocs
Another one prompted by Jakub.
* elf64-ppc.c (ppc64_elf_relocate_section): Optimize unaligned relocs.
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.104
diff -u -p -r1.104 elf64-ppc.c
--- bfd/elf64-ppc.c 17 Jun 2003 09:10:41 -0000 1.104
+++ bfd/elf64-ppc.c 17 Jun 2003 12:28:13 -0000
@@ -8272,6 +8272,26 @@ ppc64_elf_relocate_section (output_bfd,
}
}
+ /* 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 ();
--
Alan Modra
IBM OzLabs - Linux Technology Centre