This is the mail archive of the binutils@sourceware.org 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]

complex reloc tidy


I started looking at enabling complex relocations for powerpc but gave
up after realising that I'd need to rewrite use_complex_relocs_for,
and I don't have the time at the moment.  This is a small cleanup that
came out of that work.

	* elf-bfd.h (bfd_elf_perform_complex_relocation): Update prototype.
	* elflink.c (bfd_elf_perform_complex_relocation): Return status.
	Don't print reloc overflow message.
	* elf32-mep.c (mep_elf_relocate_section): Handle status from
	bfd_elf_perform_complex_relocation.

Index: bfd/elf-bfd.h
===================================================================
RCS file: /cvs/src/src/bfd/elf-bfd.h,v
retrieving revision 1.246
diff -u -p -r1.246 elf-bfd.h
--- bfd/elf-bfd.h	31 Oct 2007 07:36:46 -0000	1.246
+++ bfd/elf-bfd.h	19 Nov 2007 00:14:50 -0000
@@ -1814,7 +1814,7 @@ extern bfd_boolean _bfd_elf_dynamic_symb
 extern bfd_boolean _bfd_elf_symbol_refs_local_p
   (struct elf_link_hash_entry *, struct bfd_link_info *, bfd_boolean);
 
-extern void bfd_elf_perform_complex_relocation
+extern bfd_reloc_status_type bfd_elf_perform_complex_relocation
   (bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, bfd_vma);
 
 extern bfd_boolean _bfd_elf_setup_sections
Index: bfd/elf32-mep.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-mep.c,v
retrieving revision 1.8
diff -u -p -r1.8 elf32-mep.c
--- bfd/elf32-mep.c	30 Sep 2007 13:33:03 -0000	1.8
+++ bfd/elf32-mep.c	19 Nov 2007 00:14:50 -0000
@@ -513,18 +513,12 @@ mep_elf_relocate_section
       if (info->relocatable)
 	continue;
 
-      switch (r_type)
-	{
-	case R_RELC:
-	  bfd_elf_perform_complex_relocation (input_bfd, input_section,
-					      contents, rel, relocation);
-	  continue;
-
-	default:
-	  r = mep_final_link_relocate (howto, input_bfd, input_section,
-					 contents, rel, relocation);
-	  break;
-	}
+      if (r_type == R_RELC)
+	r = bfd_elf_perform_complex_relocation (input_bfd, input_section,
+						contents, rel, relocation);
+      else
+	r = mep_final_link_relocate (howto, input_bfd, input_section,
+				     contents, rel, relocation);
 
       if (r != bfd_reloc_ok)
 	{
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.285
diff -u -p -r1.285 elflink.c
--- bfd/elflink.c	31 Oct 2007 07:36:46 -0000	1.285
+++ bfd/elflink.c	19 Nov 2007 00:15:01 -0000
@@ -7646,15 +7646,16 @@ decode_complex_addend (unsigned long *st
   * trunc_p   = (encoded >> 29) & 1;
 }
 
-void
+bfd_reloc_status_type
 bfd_elf_perform_complex_relocation (bfd *input_bfd,
-				    asection *input_section,
+				    asection *input_section ATTRIBUTE_UNUSED,
 				    bfd_byte *contents,
 				    Elf_Internal_Rela *rel,
 				    bfd_vma relocation)
 {
   bfd_vma shift, x, mask;
   unsigned long start, oplen, len, wordsz, chunksz, lsb0_p, signed_p, trunc_p;
+  bfd_reloc_status_type r;
 
   /*  Perform this reloc, since it is complex.
       (this is not to say that it necessarily refers to a complex
@@ -7684,20 +7685,14 @@ bfd_elf_perform_complex_relocation (bfd 
 	  oplen, x, mask,  relocation);
 #endif
 
+  r = bfd_reloc_ok;
   if (! trunc_p)
-    {
-      /* Now do an overflow check.  */
-      if (bfd_check_overflow ((signed_p
-			       ? complain_overflow_signed
-			       : complain_overflow_unsigned),
-			      len, 0, (8 * wordsz),
-			      relocation) == bfd_reloc_overflow)
-	(*_bfd_error_handler)
-	  ("%s (%s + 0x%lx): relocation overflow: 0x%lx %sdoes not fit "
-	   "within 0x%lx",
-	   input_bfd->filename, input_section->name, rel->r_offset,
-	   relocation, (signed_p ? "(signed) " : ""), mask);
-    }
+    /* Now do an overflow check.  */
+    r = bfd_check_overflow ((signed_p
+			     ? complain_overflow_signed
+			     : complain_overflow_unsigned),
+			    len, 0, (8 * wordsz),
+			    relocation);
 
   /* Do the deed.  */
   x = (x & ~(mask << shift)) | ((relocation & mask) << shift);
@@ -7711,6 +7706,7 @@ bfd_elf_perform_complex_relocation (bfd 
 	  ((relocation & mask) << shift), x);
 #endif
   put_value (wordsz, chunksz, input_bfd, x, contents + rel->r_offset);
+  return r;
 }
 
 /* When performing a relocatable link, the input relocations are

-- 
Alan Modra
Australia Development Lab, IBM


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