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]

mn10300 GAS: remove a gross, disgusting hack :-)


Ok to install?

Index: gas/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>
	* config/tc-mn10300.c (md_assemble): Simplify offset adjustment of
	pc-relative relocations not placed at the end of the instruction.

Index: gas/config/tc-mn10300.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-mn10300.c,v
retrieving revision 1.20
diff -u -p -r1.20 tc-mn10300.c
--- gas/config/tc-mn10300.c 2001/04/06 07:50:48 1.20
+++ gas/config/tc-mn10300.c 2001/04/12 21:22:03
@@ -937,7 +937,7 @@ md_assemble (str)
   struct mn10300_opcode *next_opcode;
   const unsigned char *opindex_ptr;
   int next_opindex, relaxable;
-  unsigned long insn, extension, size = 0, real_size;
+  unsigned long insn, extension, size = 0;
   char *f;
   int i;
   int match;
@@ -1513,8 +1513,6 @@ keep_going:
   if (opcode->format == FMT_D4)
     size = 6;
 
-  real_size = size;
-
   if (relaxable && fc > 0)
     {
       int type;
@@ -1729,25 +1727,14 @@ keep_going:
 	      /* Is the reloc pc-relative?  */
 	      pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
 
-	      /* Gross.  This disgusting hack is to make sure we
-		 get the right offset for the 16/32 bit reloc in
-		 "call" instructions.  Basically they're a pain
-		 because the reloc isn't at the end of the instruction.  */
-	      if ((size == 5 || size == 7)
-		  && (((insn >> 24) & 0xff) == 0xcd
-		      || ((insn >> 24) & 0xff) == 0xdd))
-		size -= 2;
-
-	      /* Similarly for certain bit instructions which don't
-		 hav their 32bit reloc at the tail of the instruction.  */
-	      if (size == 7
-		  && (((insn >> 16) & 0xffff) == 0xfe00
-		      || ((insn >> 16) & 0xffff) == 0xfe01
-		      || ((insn >> 16) & 0xffff) == 0xfe02))
-		size -= 1;
-
 	      offset = size - reloc_size / 8;
 
+	      /* If the pcrel relocation isn't at the end of the insn,
+		 we have to adjust the offset for the relocation to be
+		 correct.  */
+	      if (pcrel)
+		offset -= operand->shift / 8;
+
 	      /* Choose a proper BFD relocation type.  */
 	      if (pcrel)
 		{
@@ -1791,7 +1778,7 @@ keep_going:
 	}
     }
 
-  dwarf2_emit_insn (real_size);
+  dwarf2_emit_insn (size);
 }
 
 /* If while processing a fixup, a reloc really needs to be created

-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                  aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist    *Please* write to mailing lists, not to me

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