/* tc-dlx.c -- Assemble for the DLX
- Copyright (C) 2002-2015 Free Software Foundation, Inc.
+ Copyright (C) 2002-2019 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
#include "safe-ctype.h"
#include "tc-dlx.h"
#include "opcode/dlx.h"
+#include "elf/dlx.h"
+#include "bfd/elf32-dlx.h"
/* Make it easier to clone this machine desc into another one. */
#define machine_opcode dlx_opcode
int pcrel;
int size;
int reloc_offset; /* Offset of reloc within insn. */
- int reloc;
+ bfd_reloc_code_real_type reloc;
int HI;
int LO;
}
const char FLT_CHARS[] = "rRsSfFdDxXpP";
static void
-insert_sreg (char *regname, int regnum)
+insert_sreg (const char *regname, int regnum)
{
/* Must be large enough to hold the names of the special registers. */
char buf[80];
#define MAX_REG_NO 35
/* Currently we have 35 software registers defined -
we borrowed from MIPS. */
- static char *soft_reg[] =
+ static const char *soft_reg[] =
{
"zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9",
return;
}
- name = input_line_pointer;
- delim1 = get_symbol_end ();
+ delim1 = get_symbol_name (&name);
name = xstrdup (name);
*input_line_pointer = delim1;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (*input_line_pointer != ',')
{
if (leading_char)
{
unsigned len = strlen (name) + 1;
- label = xmalloc (len + 1);
+ label = XNEWVEC (char, len + 1);
label[0] = leading_char;
memcpy (label + 1, name, len);
}
{
++input_line_pointer;
SKIP_WHITESPACE ();
- label = input_line_pointer;
- delim2 = get_symbol_end ();
+ delim2 = get_symbol_name (&label);
label = xstrdup (label);
- *input_line_pointer = delim2;
+ (void) restore_line_pointer (delim2);
}
current_name = name;
/* Macro move operand/reg. */
if (operand->X_op == O_register)
{
- /* Its a register. */
+ /* It's a register. */
reg_shift = 21;
goto general_reg;
}
+ /* Fall through. */
/* The immediate 16 bits literal, bit 0-15. */
case 'i':
continue;
}
- the_insn.reloc = (the_insn.HI) ? RELOC_DLX_HI16
+ the_insn.reloc = (the_insn.HI) ? RELOC_DLX_HI16
: (the_insn.LO ? RELOC_DLX_LO16 : RELOC_DLX_16);
the_insn.reloc_offset = 2;
the_insn.size = 2;
switch (fixP->fx_r_type)
{
case RELOC_DLX_REL26:
- bitP = malloc (sizeof (bit_fixS));
+ bitP = XNEW (bit_fixS);
bitP->fx_bit_size = 26;
bitP->fx_bit_offset = 25;
bitP->fx_bit_base = the_insn.opcode & 0xFC000000;
break;
case RELOC_DLX_LO16:
case RELOC_DLX_REL16:
- bitP = malloc (sizeof (bit_fixS));
+ bitP = XNEW (bit_fixS);
bitP->fx_bit_size = 16;
bitP->fx_bit_offset = 15;
bitP->fx_bit_base = the_insn.opcode & 0xFFFF0000;
fixP->fx_bit_fixP = bitP;
break;
case RELOC_DLX_HI16:
- bitP = malloc (sizeof (bit_fixS));
+ bitP = XNEW (bit_fixS);
bitP->fx_bit_size = 16;
bitP->fx_bit_offset = 15;
bitP->fx_bit_base = the_insn.opcode & 0xFFFF0000;
but I'm not sure. Dlx will not use it anyway, so I just leave it
here for now. */
-char *
+const char *
md_atof (int type, char *litP, int *sizeP)
{
return ieee_md_atof (type, litP, sizeP, TRUE);
free (fixP->fx_bit_fixP);
fixP->fx_bit_fixP = NULL;
}
-#ifdef DEBUG
- else
- know ((fixP->fx_bit_fixP != NULL));
-#endif
break;
case RELOC_DLX_HI16:
free (fixP->fx_bit_fixP);
fixP->fx_bit_fixP = NULL;
}
-#ifdef DEBUG
- else
- know ((fixP->fx_bit_fixP != NULL));
-#endif
break;
case RELOC_DLX_REL26:
free (fixP->fx_bit_fixP);
fixP->fx_bit_fixP = NULL;
}
-#ifdef DEBUG
- else
- know ((fixP->fx_bit_fixP != NULL));
-#endif
break;
case BFD_RELOC_VTABLE_INHERIT:
number_to_chars_bigendian (place, val, fixP->fx_size);
if (fixP->fx_addsy == NULL)
fixP->fx_done = 1;
+ if (fixP->fx_bit_fixP != NULL)
+ fixP->fx_no_overflow = 1;
}
const char *md_shortopts = "";
int
md_parse_option (int c ATTRIBUTE_UNUSED,
- char *arg ATTRIBUTE_UNUSED)
+ const char *arg ATTRIBUTE_UNUSED)
{
return 0;
}
{
arelent * reloc;
- reloc = xmalloc (sizeof (arelent));
+ reloc = XNEW (arelent);
reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
if (reloc->howto == NULL)
gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
- reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
+ reloc->sym_ptr_ptr = XNEW (asymbol *);
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;