This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [patch] MIPS: Use BFD_RELOC_UNUSED when no relocation
- From: "Maciej W. Rozycki" <macro at linux-mips dot org>
- To: Thiemo Seufer <ica2_ts at csv dot ica dot uni-stuttgart dot de>
- Cc: binutils at sources dot redhat dot com
- Date: Mon, 19 Jul 2004 16:34:29 +0200 (CEST)
- Subject: Re: [patch] MIPS: Use BFD_RELOC_UNUSED when no relocation
- References: <Pine.LNX.4.55.0406281736300.23162@jurand.ds.pg.gda.pl><20040629112714.GH23952@rembrandt.csv.ica.uni-stuttgart.de>
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++)