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]

[PATCH] Gas fixes for BFD_RELOC_MIPS16_LO16 relocations


Hello,

 We've discovered two problems with recently added BFD_RELOC_MIPS16_LO16 
relocations:

1. Relocation adjustment in mergeable sections is not inhibited which 
   makes them not pair with their corresponding BFD_RELOC_MIPS16_HI16_S 
   ones.

2. Matching with the corresponding BFD_RELOC_MIPS16_HI16_S relocations is 
   not enabled.

These relocations should behave like BFD_RELOC_LO16 ones in these cases.

 The following fix has been tested successfully with the HEAD for the 
"mips64-linux-gnu", "mipsel-linux-gnu", "mips64el-elf" and "mips64-elf" 
targets with no regressions.

2005-03-17  Maciej W. Rozycki  <macro@mips.com>

	* config/tc-mips.c (mips_frob_file): Sort BFD_RELOC_MIPS16_LO16
	relocations correctly as well.
	(mips_fix_adjustable): Don't make BFD_RELOC_MIPS16_LO16
	relocations in mergeable sections section-relative either.

 OK to apply?  As it's a bug fix -- OK for 2.16, too?

  Maciej

binutils-2.16.90-20050317-mips16-hilo-fix.patch
diff -up --recursive --new-file binutils-2.16.90-20050317.macro/gas/config/tc-mips.c binutils-2.16.90-20050317/gas/config/tc-mips.c
--- binutils-2.16.90-20050317.macro/gas/config/tc-mips.c	2005-03-17 11:29:25.000000000 +0000
+++ binutils-2.16.90-20050317/gas/config/tc-mips.c	2005-03-17 13:25:27.000000000 +0000
@@ -10748,7 +10748,8 @@ mips_frob_file (void)
 	  if (*pos == l->fixp)
 	    hi_pos = pos;
 
-	  if ((*pos)->fx_r_type == BFD_RELOC_LO16
+	  if (((*pos)->fx_r_type == BFD_RELOC_LO16
+	       || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
 	      && (*pos)->fx_addsy == l->fixp->fx_addsy
 	      && (*pos)->fx_offset >= l->fixp->fx_offset
 	      && (lo_pos == NULL
@@ -12689,7 +12690,9 @@ mips_fix_adjustable (fixS *fixp)
      placed anywhere.  Rather than break backwards compatibility by changing
      this, it seems better not to force the issue, and instead keep the
      original symbol.  This will work with either linker behavior.  */
-  if ((fixp->fx_r_type == BFD_RELOC_LO16 || reloc_needs_lo_p (fixp->fx_r_type))
+  if ((fixp->fx_r_type == BFD_RELOC_LO16
+       || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
+       || reloc_needs_lo_p (fixp->fx_r_type))
       && HAVE_IN_PLACE_ADDENDS
       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
     return 0;


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