mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-23 09:13:28 +08:00
* config/tc-mips.c (md_begin): Add the general registers to the
symbol table. (mips16_ip): First parse the expression, and then see whether it came up with a register, rather than trying to first see whether we are looking at a register.
This commit is contained in:
parent
508f2139b6
commit
ebf2837264
@ -1,3 +1,11 @@
|
|||||||
|
Wed Feb 12 14:36:29 1997 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* config/tc-mips.c (md_begin): Add the general registers to the
|
||||||
|
symbol table.
|
||||||
|
(mips16_ip): First parse the expression, and then see whether it
|
||||||
|
came up with a register, rather than trying to first see whether
|
||||||
|
we are looking at a register.
|
||||||
|
|
||||||
start-sanitize-tic80
|
start-sanitize-tic80
|
||||||
Tue Feb 11 15:13:39 1997 Fred Fish <fnf@cygnus.com>
|
Tue Feb 11 15:13:39 1997 Fred Fish <fnf@cygnus.com>
|
||||||
|
|
||||||
|
@ -934,6 +934,31 @@ md_begin ()
|
|||||||
&& strcmp (mips16_opcodes[i].name, name) == 0);
|
&& strcmp (mips16_opcodes[i].name, name) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We add all the general register names to the symbol table. This
|
||||||
|
helps us detect invalid uses of them. */
|
||||||
|
for (i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
char buf[5];
|
||||||
|
|
||||||
|
sprintf (buf, "$%d", i);
|
||||||
|
symbol_table_insert (symbol_new (buf, reg_section, i,
|
||||||
|
&zero_address_frag));
|
||||||
|
}
|
||||||
|
symbol_table_insert (symbol_new ("$fp", reg_section, FP,
|
||||||
|
&zero_address_frag));
|
||||||
|
symbol_table_insert (symbol_new ("$sp", reg_section, SP,
|
||||||
|
&zero_address_frag));
|
||||||
|
symbol_table_insert (symbol_new ("$gp", reg_section, GP,
|
||||||
|
&zero_address_frag));
|
||||||
|
symbol_table_insert (symbol_new ("$at", reg_section, AT,
|
||||||
|
&zero_address_frag));
|
||||||
|
symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
|
||||||
|
&zero_address_frag));
|
||||||
|
symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
|
||||||
|
&zero_address_frag));
|
||||||
|
symbol_table_insert (symbol_new ("$pc", reg_section, -1,
|
||||||
|
&zero_address_frag));
|
||||||
|
|
||||||
mips_no_prev_insn ();
|
mips_no_prev_insn ();
|
||||||
|
|
||||||
mips_gprmask = 0;
|
mips_gprmask = 0;
|
||||||
@ -7176,27 +7201,6 @@ mips16_ip (str, ip)
|
|||||||
case 'U':
|
case 'U':
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'K':
|
case 'K':
|
||||||
if (s[0] == '$' && isdigit (s[1]))
|
|
||||||
{
|
|
||||||
/* Looks like a register name. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s[0] == '('
|
|
||||||
&& args[1] == '('
|
|
||||||
&& s[1] == '$')
|
|
||||||
{
|
|
||||||
/* It looks like the expression was omitted before a
|
|
||||||
register indirection, which means that the
|
|
||||||
expression is implicitly zero. We still set up
|
|
||||||
imm_expr, so that we handle explicit extensions
|
|
||||||
correctly. */
|
|
||||||
imm_expr.X_op = O_constant;
|
|
||||||
imm_expr.X_add_number = 0;
|
|
||||||
imm_reloc = (int) BFD_RELOC_UNUSED + c;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s[0] == '%'
|
if (s[0] == '%'
|
||||||
&& strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
|
&& strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
|
||||||
{
|
{
|
||||||
@ -7222,6 +7226,27 @@ mips16_ip (str, ip)
|
|||||||
my_getExpression (&imm_expr, s);
|
my_getExpression (&imm_expr, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (imm_expr.X_op == O_register)
|
||||||
|
{
|
||||||
|
/* What we thought was an expression turned out to
|
||||||
|
be a register. */
|
||||||
|
|
||||||
|
if (s[0] == '(' && args[1] == '(')
|
||||||
|
{
|
||||||
|
/* It looks like the expression was omitted
|
||||||
|
before a register indirection, which means
|
||||||
|
that the expression is implicitly zero. We
|
||||||
|
still set up imm_expr, so that we handle
|
||||||
|
explicit extensions correctly. */
|
||||||
|
imm_expr.X_op = O_constant;
|
||||||
|
imm_expr.X_add_number = 0;
|
||||||
|
imm_reloc = (int) BFD_RELOC_UNUSED + c;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* We need to relax this instruction. */
|
/* We need to relax this instruction. */
|
||||||
imm_reloc = (int) BFD_RELOC_UNUSED + c;
|
imm_reloc = (int) BFD_RELOC_UNUSED + c;
|
||||||
s = expr_end;
|
s = expr_end;
|
||||||
@ -7235,12 +7260,11 @@ mips16_ip (str, ip)
|
|||||||
/* We use offset_reloc rather than imm_reloc for the PC
|
/* We use offset_reloc rather than imm_reloc for the PC
|
||||||
relative operands. This lets macros with both
|
relative operands. This lets macros with both
|
||||||
immediate and address operands work correctly. */
|
immediate and address operands work correctly. */
|
||||||
if (s[0] == '$' && isdigit (s[1]))
|
|
||||||
{
|
|
||||||
/* Looks like a register name. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
my_getExpression (&offset_expr, s);
|
my_getExpression (&offset_expr, s);
|
||||||
|
|
||||||
|
if (offset_expr.X_op == O_register)
|
||||||
|
break;
|
||||||
|
|
||||||
/* We need to relax this instruction. */
|
/* We need to relax this instruction. */
|
||||||
offset_reloc = (int) BFD_RELOC_UNUSED + c;
|
offset_reloc = (int) BFD_RELOC_UNUSED + c;
|
||||||
s = expr_end;
|
s = expr_end;
|
||||||
|
Loading…
Reference in New Issue
Block a user