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]

Re: [patch] MIPS: Use BFD_RELOC_UNUSED when no relocation


On Tue, 29 Jun 2004, Thiemo Seufer wrote:

> > --- binutils-2.15.91-20040625.macro/gas/config/tc-mips.c	2004-06-15 03:25:28.000000000 +0000
> > +++ binutils-2.15.91-20040625/gas/config/tc-mips.c	2004-06-27 11:09:41.000000000 +0000
> > @@ -2079,7 +2079,7 @@ append_insn (struct mips_cl_insn *ip, ex
> >      }
> >  
> >    fixp[0] = fixp[1] = fixp[2] = NULL;
> > -  if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
> > +  if (address_expr != NULL)
> 
> This may break the mips16 support, I'd use "<= BFD_RELOC_UNUSED".

 Indeed -- I've missed mips16 playing tricks with relocation codes beyond 
what "enum bfd_reloc_code_real" defines, sorry.

> >      {
> >        if (address_expr->X_op == O_constant)
> >  	{
> > @@ -2112,6 +2112,7 @@ append_insn (struct mips_cl_insn *ip, ex
> >  	      ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
> >  	      break;
> >  
> > +	    case BFD_RELOC_UNUSED:
> >  	    case BFD_RELOC_LO16:
> >  	    case BFD_RELOC_MIPS_GOT_DISP:
> >  	      ip->insn_opcode |= address_expr->X_add_number & 0xffff;
> > @@ -2147,7 +2148,7 @@ append_insn (struct mips_cl_insn *ip, ex
> >  	      internalError ();
> >  	    }
> >  	}
> > -      else
> > +      else if (*reloc_type < BFD_RELOC_UNUSED)
> >  	need_reloc:
> 
> Same problem, AFAICS this shouldn't change.

 OTOH, this is OK -- mips16 uses "BFD_RELOC_UNUSED + c", where "c" is a
character from an opcode argument format string.  The only case where "c"  
is '\0' happens close to the top of mips16_ip() and is handled as expected
-- there is no relocation to be emitted and the associated expression is
actually removed (marked as "O_absent").

 Here is an update.

2004-07-19  Maciej W. Rozycki  <macro@linux-mips.org>

	* config/tc-mips.c (append_insn): Handle constant expressions with
	no associated relocation.
	(mips_ip): Cancel the expression after use for the Q format
	specifier.
	(parse_relocation): Return no relocation for unsupported
	operators.
	(my_getSmallExpression): Return no relocation if no relocation
	operators are used.

 OK to apply?

  Maciej

binutils-2.15.91-20040715-mips-reloc-unused.patch
diff -up --recursive --new-file binutils-2.15.91-20040715.macro/gas/config/tc-mips.c binutils-2.15.91-20040715/gas/config/tc-mips.c
--- binutils-2.15.91-20040715.macro/gas/config/tc-mips.c	2004-07-09 03:25:24.000000000 +0000
+++ binutils-2.15.91-20040715/gas/config/tc-mips.c	2004-07-18 18:49:22.000000000 +0000
@@ -2083,7 +2083,7 @@ append_insn (struct mips_cl_insn *ip, ex
     }
 
   fixp[0] = fixp[1] = fixp[2] = NULL;
-  if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
+  if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
     {
       if (address_expr->X_op == O_constant)
 	{
@@ -2116,6 +2116,7 @@ append_insn (struct mips_cl_insn *ip, ex
 	      ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
 	      break;
 
+	    case BFD_RELOC_UNUSED:
 	    case BFD_RELOC_LO16:
 	    case BFD_RELOC_MIPS_GOT_DISP:
 	      ip->insn_opcode |= address_expr->X_add_number & 0xffff;
@@ -2151,7 +2152,7 @@ append_insn (struct mips_cl_insn *ip, ex
 	      internalError ();
 	    }
 	}
-      else
+      else if (*reloc_type < BFD_RELOC_UNUSED)
 	need_reloc:
 	{
 	  reloc_howto_type *howto;
@@ -8600,6 +8601,7 @@ do_msbd:
 			  ip->insn_opcode |= (imm_expr.X_add_number
 					      << (OP_SH_VSEL +
 						  (is_qh ? 2 : 1)));
+			  imm_expr.X_op = O_absent;
 			  if (*s != ']')
 			    as_warn(_("Expecting ']' found '%s'"), s);
 			  else
@@ -9813,7 +9815,7 @@ parse_relocation (char **str, bfd_reloc_
 	  {
 	    as_bad ("relocation %s isn't supported by the current ABI",
 		    percent_op[i].str);
-	    *reloc = BFD_RELOC_LO16;
+	    *reloc = BFD_RELOC_UNUSED;
 	  }
 	return TRUE;
       }
@@ -9825,8 +9827,7 @@ parse_relocation (char **str, bfd_reloc_
    expression in *EP and the relocations in the array starting
    at RELOC.  Return the number of relocation operators used.
 
-   On exit, EXPR_END points to the first character after the expression.
-   If no relocation operators are used, RELOC[0] is set to BFD_RELOC_LO16.  */
+   On exit, EXPR_END points to the first character after the expression.  */
 
 static size_t
 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
@@ -9872,9 +9873,7 @@ my_getSmallExpression (expressionS *ep, 
 
   expr_end = str;
 
-  if (reloc_index == 0)
-    reloc[0] = BFD_RELOC_LO16;
-  else
+  if (reloc_index != 0)
     {
       prev_reloc_op_frag = frag_now;
       for (i = 0; i < reloc_index; i++)


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