This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]