* config/tc-mips.c (mips_pseudo_table): Add weakext entry.

(s_mips_weakext): Define.
	* ecoff.c (ecoff_directive_weakext): Don't define if defined(TC_MIPS).
	* config/obj-ecoff.c (obj_pseudo_table): Don't add weakext if
	defined(TC_MIPS).
This commit is contained in:
Gavin Romig-Koch 1998-04-03 14:13:52 +00:00
parent af54556ad3
commit 3c69baf939
2 changed files with 93 additions and 3 deletions

View file

@ -1,3 +1,11 @@
Fri Apr 3 09:12:23 1998 Gavin Koch <gavin@cetus.cygnus.com>
* config/tc-mips.c (mips_pseudo_table): Add weakext entry.
(s_mips_weakext): Define.
* ecoff.c (ecoff_directive_weakext): Don't define if defined(TC_MIPS).
* config/obj-ecoff.c (obj_pseudo_table): Don't add weakext if
defined(TC_MIPS).
Thu Apr 2 22:42:02 1998 Jeffrey A Law (law@cygnus.com)
* config/tc-mn10200.c (tc_gen_reloc): The difference of two symbols

View file

@ -674,8 +674,10 @@ static void s_ent PARAMS ((int));
static void s_mipsend PARAMS ((int));
static void s_file PARAMS ((int));
static void s_mips_stab PARAMS ((int));
static void s_mips_weakext PARAMS ((int));
static int mips16_extended_frag PARAMS ((fragS *, asection *, long));
static int validate_mips_insn PARAMS ((const struct mips_opcode *));
/* Pseudo-op table.
@ -694,7 +696,7 @@ static int validate_mips_insn PARAMS ((const struct mips_opcode *));
not MIPS CPU specific, but are also not specific to the object file
format. This file is probably the best place to define them, but
they are not currently supported: .asm0, .endr, .lab, .repeat,
.struct, .weakext. */
.struct. */
static const pseudo_typeS mips_pseudo_table[] =
{
@ -718,6 +720,7 @@ static const pseudo_typeS mips_pseudo_table[] =
{"err", s_err, 0},
{"half", s_cons, 1},
{"dword", s_cons, 3},
{"weakext", s_mips_weakext, 0},
/* These pseudo-ops are defined in read.c, but must be overridden
here for one reason or another. */
@ -1794,11 +1797,11 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
| ((address_expr->X_add_number & 0x3fffc) >> 2));
break;
/* start-sanitize-r5900
/* start-sanitize-r5900 */
case BFD_RELOC_MIPS15_S3:
ip->insn_opcode |= ((imm_expr.X_add_number & 0x7fff) >> 3) << 6;
break;
/* end-sanitize-r5900
/* end-sanitize-r5900 */
case BFD_RELOC_16_PCREL_S2:
goto need_reloc;
@ -6912,6 +6915,36 @@ validate_mips_insn (opc)
case 'x': break;
case 'z': break;
case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
/* start-sanitize-r5900 */
case '0': USE_BITS (OP_MASK_VADDI, OP_SH_VADDI); break;
case '1': USE_BITS (OP_MASK_VUTREG, OP_SH_VUTREG); break;
case '2': USE_BITS (OP_MASK_VUSREG, OP_SH_VUSREG); break;
case '3': USE_BITS (OP_MASK_VUDREG, OP_SH_VUDREG); break;
case '4': USE_BITS (OP_MASK_VUTREG, OP_SH_VUTREG); break;
case '5': USE_BITS (OP_MASK_VUSREG, OP_SH_VUSREG); break;
case '6': USE_BITS (OP_MASK_VUDREG, OP_SH_VUDREG); break;
case '7':
USE_BITS (OP_MASK_VUTREG, OP_SH_VUTREG);
USE_BITS (OP_MASK_VUFTF, OP_SH_VUFTF);
break;
case '8':
USE_BITS (OP_MASK_VUSREG, OP_SH_VUSREG);
USE_BITS (OP_MASK_VUFSF, OP_SH_VUFSF);
break;
case '9': break;
case 'K': break;
case 'X': break;
case 'U': break;
case 'Q': break;
case 'J': break;
case 'O': USE_BITS (OP_MASK_VUCALLMS, OP_SH_VUCALLMS);break;
case '&': USE_BITS (OP_MASK_VUDEST, OP_SH_VUDEST); break;
case '#':
p++;
break;
case '-': break;
case '+': break;
/* end-sanitize-r5900 */
/* start-sanitize-vr5400 */
case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
@ -10722,6 +10755,55 @@ s_mips_stab (type)
s_stab (type);
}
/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
*/
static void
s_mips_weakext (ignore)
int ignore;
{
char *name;
int c;
symbolS *symbolP;
expressionS exp;
name = input_line_pointer;
c = get_symbol_end ();
symbolP = symbol_find_or_make (name);
S_SET_WEAK (symbolP);
*input_line_pointer = c;
SKIP_WHITESPACE ();
if (! is_end_of_line[(unsigned char) *input_line_pointer])
{
if (S_IS_DEFINED (symbolP))
{
as_bad ("Ignoring attempt to redefine symbol `%s'.",
S_GET_NAME (symbolP));
ignore_rest_of_line ();
return;
}
if (*input_line_pointer == ',')
{
++input_line_pointer;
SKIP_WHITESPACE ();
}
expression (&exp);
if (exp.X_op != O_symbol)
{
as_bad ("bad .weakext directive");
ignore_rest_of_line();
return;
}
symbolP->sy_value = exp;
}
demand_empty_rest_of_line ();
}
/* Parse a register string into a number. Called from the ECOFF code
to parse .frame. The argument is non-zero if this is the frame
register, so that we can record it in mips_frame_reg. */