* tc-arm.c (all error messages): Normalize capitalization of messages.
* tc-arm.h (md_operand): Delete define. * tc-arm.c (in_my_get_expression): New static variable. (my_get_expression): Set and clear it. (md_operand): New function. If called from my_get_expression put the error in inst.error. (output_inst): Now takes argument of instruction being assembled. Print it out with any error message. (do_ldst, do_ldstv4, thumb_load_store): Fault attempt to use a store with '=' syntax. (end_of_line): Don't update inst.error if it is already set.
This commit is contained in:
parent
2ad6300c8e
commit
f03698e661
3 changed files with 160 additions and 102 deletions
|
@ -1,3 +1,18 @@
|
|||
2002-01-14 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
* tc-arm.c (all error messages): Normalize capitalization of messages.
|
||||
|
||||
* tc-arm.h (md_operand): Delete define.
|
||||
* tc-arm.c (in_my_get_expression): New static variable.
|
||||
(my_get_expression): Set and clear it.
|
||||
(md_operand): New function. If called from my_get_expression
|
||||
put the error in inst.error.
|
||||
(output_inst): Now takes argument of instruction being assembled.
|
||||
Print it out with any error message.
|
||||
(do_ldst, do_ldstv4, thumb_load_store): Fault attempt to use a store
|
||||
with '=' syntax.
|
||||
(end_of_line): Don't update inst.error if it is already set.
|
||||
|
||||
2002-01-11 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
* tc-arm.c ((do_ldst): Fix handling an immediate expression pseudo
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* tc-arm.c -- Assemble for the ARM
|
||||
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
|
||||
Modified by David Taylor (dtaylor@armltd.co.uk)
|
||||
|
@ -592,8 +592,8 @@ struct reg_map
|
|||
struct reg_map all_reg_maps[] =
|
||||
{
|
||||
{rn_table, 15, NULL, N_("ARM register expected")},
|
||||
{cp_table, 15, NULL, N_("Bad or missing co-processor number")},
|
||||
{cn_table, 15, NULL, N_("Co-processor register expected")},
|
||||
{cp_table, 15, NULL, N_("bad or missing co-processor number")},
|
||||
{cn_table, 15, NULL, N_("co-processor register expected")},
|
||||
{fn_table, 7, NULL, N_("FPA register expected")},
|
||||
{mav_mvf_table, 15, NULL, N_("Maverick MVF register expected")},
|
||||
{mav_mvd_table, 15, NULL, N_("Maverick MVD register expected")},
|
||||
|
@ -800,7 +800,7 @@ static valueT md_chars_to_number PARAMS ((char *, int));
|
|||
static void build_reg_hsh PARAMS ((struct reg_map *));
|
||||
static void insert_reg_alias PARAMS ((char *, int, struct hash_control *));
|
||||
static int create_register_alias PARAMS ((char *, char *));
|
||||
static void output_inst PARAMS ((void));
|
||||
static void output_inst PARAMS ((const char *));
|
||||
static int accum0_required_here PARAMS ((char **));
|
||||
static int ld_mode_required_here PARAMS ((char **));
|
||||
static void do_branch25 PARAMS ((char *));
|
||||
|
@ -1788,9 +1788,9 @@ static const struct thumb_opcode tinsns[] =
|
|||
{"bkpt", 0xbe00, 2, ARM_EXT_V5T, do_t_bkpt},
|
||||
};
|
||||
|
||||
#define BAD_ARGS _("Bad arguments to instruction")
|
||||
#define BAD_ARGS _("bad arguments to instruction")
|
||||
#define BAD_PC _("r15 not allowed here")
|
||||
#define BAD_COND _("Instruction is not conditional")
|
||||
#define BAD_COND _("instruction is not conditional")
|
||||
#define ERR_NO_ACCUM _("acc0 expected")
|
||||
|
||||
static struct hash_control * arm_ops_hsh = NULL;
|
||||
|
@ -1930,7 +1930,7 @@ add_to_lit_pool ()
|
|||
{
|
||||
if (next_literal_pool_place >= MAX_LITERAL_POOL_SIZE)
|
||||
{
|
||||
inst.error = _("Literal Pool Overflow");
|
||||
inst.error = _("literal pool overflow");
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
|
@ -2072,7 +2072,7 @@ static void
|
|||
s_req (a)
|
||||
int a ATTRIBUTE_UNUSED;
|
||||
{
|
||||
as_bad (_("Invalid syntax for .req directive."));
|
||||
as_bad (_("invalid syntax for .req directive"));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2147,10 +2147,10 @@ s_align (unused)
|
|||
|
||||
temp = get_absolute_expression ();
|
||||
if (temp > max_alignment)
|
||||
as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
|
||||
as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
|
||||
else if (temp < 0)
|
||||
{
|
||||
as_bad (_("Alignment negative. 0 assumed."));
|
||||
as_bad (_("alignment negative. 0 assumed."));
|
||||
temp = 0;
|
||||
}
|
||||
|
||||
|
@ -2234,7 +2234,7 @@ s_thumb_set (equiv)
|
|||
if (*input_line_pointer != ',')
|
||||
{
|
||||
*end_name = 0;
|
||||
as_bad (_("Expected comma after name \"%s\""), name);
|
||||
as_bad (_("expected comma after name \"%s\""), name);
|
||||
*end_name = delim;
|
||||
ignore_rest_of_line ();
|
||||
return;
|
||||
|
@ -2421,12 +2421,12 @@ s_code (unused)
|
|||
|
||||
static void
|
||||
end_of_line (str)
|
||||
char * str;
|
||||
char *str;
|
||||
{
|
||||
skip_whitespace (str);
|
||||
|
||||
if (* str != '\0')
|
||||
inst.error = _("Garbage following instruction");
|
||||
if (*str != '\0' && !inst.error)
|
||||
inst.error = _("garbage following instruction");
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -2476,7 +2476,7 @@ reg_required_here (str, shift)
|
|||
|
||||
/* In the few cases where we might be able to accept something else
|
||||
this error can be overridden. */
|
||||
sprintf (buff, _("Register expected, not '%.100s'"), start);
|
||||
sprintf (buff, _("register expected, not '%.100s'"), start);
|
||||
inst.error = buff;
|
||||
|
||||
return FAIL;
|
||||
|
@ -2582,14 +2582,14 @@ co_proc_number (str)
|
|||
processor = processor * 10 + *(*str)++ - '0';
|
||||
if (processor > 15)
|
||||
{
|
||||
inst.error = _("Illegal co-processor number");
|
||||
inst.error = _("illegal co-processor number");
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
inst.error = _("Bad or missing co-processor number");
|
||||
inst.error = _("bad or missing co-processor number");
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
@ -2644,7 +2644,7 @@ cp_reg_required_here (str, where)
|
|||
|
||||
/* In the few cases where we might be able to accept something else
|
||||
this error can be overridden. */
|
||||
inst.error = _("Co-processor register expected");
|
||||
inst.error = _("co-processor register expected");
|
||||
|
||||
/* Restore the start point. */
|
||||
*str = start;
|
||||
|
@ -2667,7 +2667,7 @@ fp_reg_required_here (str, where)
|
|||
|
||||
/* In the few cases where we might be able to accept something else
|
||||
this error can be overridden. */
|
||||
inst.error = _("Floating point register expected");
|
||||
inst.error = _("floating point register expected");
|
||||
|
||||
/* Restore the start point. */
|
||||
*str = start;
|
||||
|
@ -2863,7 +2863,7 @@ do_mrs (str)
|
|||
skip = 8;
|
||||
else
|
||||
{
|
||||
inst.error = _("{C|S}PSR expected");
|
||||
inst.error = _("CPSR or SPSR expected");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2944,7 +2944,7 @@ do_msr (str)
|
|||
|
||||
if (value == (unsigned) FAIL)
|
||||
{
|
||||
inst.error = _("Invalid constant");
|
||||
inst.error = _("invalid constant");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3434,7 +3434,7 @@ do_co_reg2c (str)
|
|||
/* Unpredictable result if rd or rn is R15. */
|
||||
if (rd == REG_PC || rn == REG_PC)
|
||||
as_tsktsk
|
||||
(_("Warning: Instruction unpredictable when using r15"));
|
||||
(_("Warning: instruction unpredictable when using r15"));
|
||||
|
||||
if (skip_past_comma (& str) == FAIL
|
||||
|| cp_reg_required_here (& str, 0) == FAIL)
|
||||
|
@ -4064,7 +4064,7 @@ do_ldrd (str)
|
|||
/* inst.instruction has now been zapped with Rd and the addressing mode. */
|
||||
if (rd & 1) /* Unpredictable result if Rd is odd. */
|
||||
{
|
||||
inst.error = _("Destination register must be even");
|
||||
inst.error = _("destination register must be even");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4182,6 +4182,8 @@ walk_no_bignums (sp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int in_my_get_expression = 0;
|
||||
|
||||
static int
|
||||
my_get_expression (ep, str)
|
||||
expressionS * ep;
|
||||
|
@ -4192,7 +4194,17 @@ my_get_expression (ep, str)
|
|||
|
||||
save_in = input_line_pointer;
|
||||
input_line_pointer = *str;
|
||||
in_my_get_expression = 1;
|
||||
seg = expression (ep);
|
||||
in_my_get_expression = 0;
|
||||
|
||||
if (ep->X_op == O_illegal)
|
||||
{
|
||||
/* We found a bad expression in md_operand(). */
|
||||
*str = input_line_pointer;
|
||||
input_line_pointer = save_in;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef OBJ_AOUT
|
||||
if (seg != absolute_section
|
||||
|
@ -4217,7 +4229,7 @@ my_get_expression (ep, str)
|
|||
|| (ep->X_op_symbol
|
||||
&& walk_no_bignums (ep->X_op_symbol)))))
|
||||
{
|
||||
inst.error = _("Invalid constant");
|
||||
inst.error = _("invalid constant");
|
||||
*str = input_line_pointer;
|
||||
input_line_pointer = save_in;
|
||||
return 1;
|
||||
|
@ -4228,6 +4240,20 @@ my_get_expression (ep, str)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* We handle all bad expressions here, so that we can report the faulty
|
||||
instruction in the error message. */
|
||||
void
|
||||
md_operand(expr)
|
||||
expressionS *expr;
|
||||
{
|
||||
if (in_my_get_expression)
|
||||
{
|
||||
expr->X_op = O_illegal;
|
||||
if (inst.error == NULL)
|
||||
inst.error = _("bad expression");
|
||||
}
|
||||
}
|
||||
|
||||
/* UNRESTRICT should be one if <shift> <register> is permitted for this
|
||||
instruction. */
|
||||
|
||||
|
@ -4247,7 +4273,7 @@ decode_shift (str, unrestrict)
|
|||
|
||||
if (p == * str)
|
||||
{
|
||||
inst.error = _("Shift expression expected");
|
||||
inst.error = _("shift expression expected");
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
|
@ -4258,7 +4284,7 @@ decode_shift (str, unrestrict)
|
|||
|
||||
if (shift == NULL)
|
||||
{
|
||||
inst.error = _("Shift expression expected");
|
||||
inst.error = _("shift expression expected");
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
|
@ -4313,13 +4339,13 @@ decode_shift (str, unrestrict)
|
|||
about this though. */
|
||||
if (num == 0)
|
||||
{
|
||||
as_warn (_("Shift of 0 ignored."));
|
||||
as_warn (_("shift of 0 ignored."));
|
||||
shift = & shift_names[0];
|
||||
assert (shift->properties->index == SHIFT_LSL);
|
||||
}
|
||||
else
|
||||
{
|
||||
inst.error = _("Invalid immediate shift");
|
||||
inst.error = _("invalid immediate shift");
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
@ -4474,7 +4500,7 @@ data_op2 (str)
|
|||
|
||||
if (expr.X_op != O_constant)
|
||||
{
|
||||
inst.error = _("Constant expression expected");
|
||||
inst.error = _("constant expression expected");
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
|
@ -4483,7 +4509,7 @@ data_op2 (str)
|
|||
|| (expr.X_add_number & 1) != 0
|
||||
|| ((unsigned) inst.reloc.exp.X_add_number) > 255)
|
||||
{
|
||||
inst.error = _("Invalid constant");
|
||||
inst.error = _("invalid constant");
|
||||
return FAIL;
|
||||
}
|
||||
inst.instruction |= INST_IMMEDIATE;
|
||||
|
@ -4503,7 +4529,7 @@ data_op2 (str)
|
|||
inst.reloc.exp.X_add_number))
|
||||
== FAIL)
|
||||
{
|
||||
inst.error = _("Invalid constant");
|
||||
inst.error = _("invalid constant");
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
@ -4516,7 +4542,7 @@ data_op2 (str)
|
|||
}
|
||||
|
||||
(*str)++;
|
||||
inst.error = _("Register or shift expression expected");
|
||||
inst.error = _("register or shift expression expected");
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
@ -4569,11 +4595,11 @@ fp_op2 (str)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
inst.error = _("Invalid floating point immediate expression");
|
||||
inst.error = _("invalid floating point immediate expression");
|
||||
return FAIL;
|
||||
}
|
||||
inst.error =
|
||||
_("Floating point register or immediate expression expected");
|
||||
_("floating point register or immediate expression expected");
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
@ -4785,7 +4811,7 @@ do_ldst (str)
|
|||
|
||||
if (skip_past_comma (&str) == FAIL)
|
||||
{
|
||||
inst.error = _("Address expected");
|
||||
inst.error = _("address expected");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4874,6 +4900,12 @@ do_ldst (str)
|
|||
}
|
||||
else if (*str == '=')
|
||||
{
|
||||
if ((inst.instruction & LOAD_BIT) == 0)
|
||||
{
|
||||
inst.error = _("invalid pseudo operation");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Parse an "ldr Rd, =expr" instruction; this is another pseudo op. */
|
||||
str++;
|
||||
|
||||
|
@ -4885,7 +4917,7 @@ do_ldst (str)
|
|||
if (inst.reloc.exp.X_op != O_constant
|
||||
&& inst.reloc.exp.X_op != O_symbol)
|
||||
{
|
||||
inst.error = _("Constant expression expected");
|
||||
inst.error = _("constant expression expected");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4969,7 +5001,7 @@ do_ldstt (str)
|
|||
|
||||
if (skip_past_comma (& str) == FAIL)
|
||||
{
|
||||
inst.error = _("Address expected");
|
||||
inst.error = _("address expected");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5111,7 +5143,7 @@ do_ldstv4 (str)
|
|||
|
||||
if (skip_past_comma (& str) == FAIL)
|
||||
{
|
||||
inst.error = _("Address expected");
|
||||
inst.error = _("address expected");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5202,6 +5234,12 @@ do_ldstv4 (str)
|
|||
}
|
||||
else if (*str == '=')
|
||||
{
|
||||
if ((inst.instruction & LOAD_BIT) == 0)
|
||||
{
|
||||
inst.error = _("invalid pseudo operation");
|
||||
return;
|
||||
}
|
||||
|
||||
/* XXX Does this work correctly for half-word/byte ops? */
|
||||
/* Parse an "ldr Rd, =expr" instruction; this is another pseudo op. */
|
||||
str++;
|
||||
|
@ -5214,7 +5252,7 @@ do_ldstv4 (str)
|
|||
if (inst.reloc.exp.X_op != O_constant
|
||||
&& inst.reloc.exp.X_op != O_symbol)
|
||||
{
|
||||
inst.error = _("Constant expression expected");
|
||||
inst.error = _("constant expression expected");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5315,7 +5353,7 @@ reg_list (strp)
|
|||
|
||||
if (reg <= cur_reg)
|
||||
{
|
||||
inst.error = _("Bad range in register list");
|
||||
inst.error = _("bad range in register list");
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
|
@ -5323,7 +5361,7 @@ reg_list (strp)
|
|||
{
|
||||
if (range & (1 << i))
|
||||
as_tsktsk
|
||||
(_("Warning: Duplicated register (r%d) in register list"),
|
||||
(_("Warning: duplicated register (r%d) in register list"),
|
||||
i);
|
||||
else
|
||||
range |= 1 << i;
|
||||
|
@ -5332,10 +5370,10 @@ reg_list (strp)
|
|||
}
|
||||
|
||||
if (range & (1 << reg))
|
||||
as_tsktsk (_("Warning: Duplicated register (r%d) in register list"),
|
||||
as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
|
||||
reg);
|
||||
else if (reg <= cur_reg)
|
||||
as_tsktsk (_("Warning: Register range not in ascending order"));
|
||||
as_tsktsk (_("Warning: register range not in ascending order"));
|
||||
|
||||
range |= 1 << reg;
|
||||
cur_reg = reg;
|
||||
|
@ -5347,7 +5385,7 @@ reg_list (strp)
|
|||
|
||||
if (*str++ != '}')
|
||||
{
|
||||
inst.error = _("Missing `}'");
|
||||
inst.error = _("missing `}'");
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
@ -5374,7 +5412,7 @@ reg_list (strp)
|
|||
regno &= -regno;
|
||||
regno = (1 << regno) - 1;
|
||||
as_tsktsk
|
||||
(_("Warning: Duplicated register (r%d) in register list"),
|
||||
(_("Warning: duplicated register (r%d) in register list"),
|
||||
regno);
|
||||
}
|
||||
|
||||
|
@ -5595,7 +5633,7 @@ do_bx (str)
|
|||
|
||||
/* Note - it is not illegal to do a "bx pc". Useless, but not illegal. */
|
||||
if (reg == REG_PC)
|
||||
as_tsktsk (_("Use of r15 in bx in ARM mode is not really useful"));
|
||||
as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
|
||||
|
||||
end_of_line (str);
|
||||
}
|
||||
|
@ -5829,7 +5867,7 @@ do_fpa_ldmstm (str)
|
|||
|
||||
if (inst.reloc.exp.X_op != O_constant)
|
||||
{
|
||||
inst.error = _("Constant value required for number of registers");
|
||||
inst.error = _("constant value required for number of registers");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5898,7 +5936,7 @@ do_fpa_ldmstm (str)
|
|||
if (reg == REG_PC)
|
||||
{
|
||||
inst.error =
|
||||
_("R15 not allowed as base register with write-back");
|
||||
_("r15 not allowed as base register with write-back");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -6373,7 +6411,7 @@ thumb_shift (str, shift)
|
|||
|
||||
if (shift_value > 32 || (shift_value == 32 && shift == THUMB_LSL))
|
||||
{
|
||||
inst.error = _("Invalid immediate for shift");
|
||||
inst.error = _("invalid immediate for shift");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -6532,6 +6570,12 @@ thumb_load_store (str, load_store, size)
|
|||
}
|
||||
else if (*str == '=')
|
||||
{
|
||||
if (load_store != THUMB_LOAD)
|
||||
{
|
||||
inst.error = _("invalid pseudo operation");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Parse an "ldr Rd, =expr" instruction; this is another pseudo op. */
|
||||
str++;
|
||||
|
||||
|
@ -6597,12 +6641,12 @@ thumb_load_store (str, load_store, size)
|
|||
}
|
||||
else if (Rb == REG_PC && load_store != THUMB_LOAD)
|
||||
{
|
||||
inst.error = _("R15 based store not allowed");
|
||||
inst.error = _("r15 based store not allowed");
|
||||
return;
|
||||
}
|
||||
else if (Ro != FAIL)
|
||||
{
|
||||
inst.error = _("Invalid base register for register offset");
|
||||
inst.error = _("invalid base register for register offset");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -6655,7 +6699,7 @@ thumb_load_store (str, load_store, size)
|
|||
|
||||
if (offset & ~(0x1f << size))
|
||||
{
|
||||
inst.error = _("Invalid offset");
|
||||
inst.error = _("invalid offset");
|
||||
return;
|
||||
}
|
||||
inst.instruction |= (offset >> size) << 6;
|
||||
|
@ -7522,7 +7566,7 @@ do_t_ldmstm (str)
|
|||
return;
|
||||
|
||||
if (*str != '!')
|
||||
as_warn (_("Inserted missing '!': load/store multiple always writes back base register"));
|
||||
as_warn (_("inserted missing '!': load/store multiple always writes back base register"));
|
||||
else
|
||||
str++;
|
||||
|
||||
|
@ -7538,7 +7582,7 @@ do_t_ldmstm (str)
|
|||
{
|
||||
/* This really doesn't seem worth it. */
|
||||
inst.reloc.type = BFD_RELOC_NONE;
|
||||
inst.error = _("Expression too complex");
|
||||
inst.error = _("expression too complex");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -7590,7 +7634,7 @@ do_t_lds (str)
|
|||
|| *str++ != ']')
|
||||
{
|
||||
if (! inst.error)
|
||||
inst.error = _("Syntax: ldrs[b] Rd, [Rb, Ro]");
|
||||
inst.error = _("syntax: ldrs[b] Rd, [Rb, Ro]");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -7638,7 +7682,7 @@ do_t_push_pop (str)
|
|||
{
|
||||
/* This really doesn't seem worth it. */
|
||||
inst.reloc.type = BFD_RELOC_NONE;
|
||||
inst.error = _("Expression too complex");
|
||||
inst.error = _("expression too complex");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -7766,7 +7810,7 @@ build_reg_hsh (map)
|
|||
const struct reg_entry *r;
|
||||
|
||||
if ((map->htab = hash_new ()) == NULL)
|
||||
as_fatal (_("Virtual memory exhausted"));
|
||||
as_fatal (_("virtual memory exhausted"));
|
||||
|
||||
for (r = map->names; r->name != NULL; r++)
|
||||
insert_reg (r, map->htab);
|
||||
|
@ -7944,7 +7988,7 @@ md_begin ()
|
|||
|| (arm_cond_hsh = hash_new ()) == NULL
|
||||
|| (arm_shift_hsh = hash_new ()) == NULL
|
||||
|| (arm_psr_hsh = hash_new ()) == NULL)
|
||||
as_fatal (_("Virtual memory exhausted"));
|
||||
as_fatal (_("virtual memory exhausted"));
|
||||
|
||||
build_arm_ops_hsh ();
|
||||
for (i = 0; i < sizeof (tinsns) / sizeof (struct thumb_opcode); i++)
|
||||
|
@ -8139,7 +8183,7 @@ md_atof (type, litP, sizeP)
|
|||
|
||||
default:
|
||||
*sizeP = 0;
|
||||
return _("Bad call to MD_ATOF()");
|
||||
return _("bad call to MD_ATOF()");
|
||||
}
|
||||
|
||||
t = atof_ieee (input_line_pointer, type, words);
|
||||
|
@ -8398,7 +8442,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
else
|
||||
{
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Unable to compute ADRL instructions for PC offset of 0x%lx"),
|
||||
_("unable to compute ADRL instructions for PC offset of 0x%lx"),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
|
@ -8508,7 +8552,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
{
|
||||
if (((unsigned long) value) > 0xff)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid swi expression"));
|
||||
_("invalid swi expression"));
|
||||
newval = md_chars_to_number (buf, THUMB_SIZE) & 0xff00;
|
||||
newval |= value;
|
||||
md_number_to_chars (buf, newval, THUMB_SIZE);
|
||||
|
@ -8517,7 +8561,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
{
|
||||
if (((unsigned long) value) > 0x00ffffff)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid swi expression"));
|
||||
_("invalid swi expression"));
|
||||
newval = md_chars_to_number (buf, INSN_SIZE) & 0xff000000;
|
||||
newval |= value;
|
||||
md_number_to_chars (buf, newval, INSN_SIZE);
|
||||
|
@ -8527,7 +8571,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
case BFD_RELOC_ARM_MULTI:
|
||||
if (((unsigned long) value) > 0xffff)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid expression in load/store multiple"));
|
||||
_("invalid expression in load/store multiple"));
|
||||
newval = value | md_chars_to_number (buf, INSN_SIZE);
|
||||
md_number_to_chars (buf, newval, INSN_SIZE);
|
||||
break;
|
||||
|
@ -8580,7 +8624,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
if (! fixP->fx_done)
|
||||
#endif
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("gas can't handle same-section branch dest >= 0x04000000"));
|
||||
_("GAS can't handle same-section branch dest >= 0x04000000"));
|
||||
}
|
||||
|
||||
value >>= 2;
|
||||
|
@ -8622,7 +8666,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
value += diff;
|
||||
if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Branch out of range"));
|
||||
_("branch out of range"));
|
||||
newval = (newval & 0xff00) | ((value & 0x1ff) >> 1);
|
||||
}
|
||||
md_number_to_chars (buf, newval, THUMB_SIZE);
|
||||
|
@ -8638,7 +8682,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
value += diff;
|
||||
if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Branch out of range"));
|
||||
_("branch out of range"));
|
||||
newval = (newval & 0xf800) | ((value & 0xfff) >> 1);
|
||||
}
|
||||
md_number_to_chars (buf, newval, THUMB_SIZE);
|
||||
|
@ -8661,7 +8705,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
value += diff;
|
||||
if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Branch with link out of range"));
|
||||
_("branch with link out of range"));
|
||||
|
||||
newval = (newval & 0xf800) | ((value & 0x7fffff) >> 12);
|
||||
newval2 = (newval2 & 0xf800) | ((value & 0xfff) >> 1);
|
||||
|
@ -8737,7 +8781,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
sign = value >= 0;
|
||||
if (value < -1023 || value > 1023 || (value & 3))
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Illegal value for co-processor offset"));
|
||||
_("illegal value for co-processor offset"));
|
||||
if (value < 0)
|
||||
value = -value;
|
||||
newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00;
|
||||
|
@ -8761,13 +8805,13 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
|
||||
if ((fixP->fx_frag->fr_address + fixP->fx_where + value) & 3)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid offset, target not word aligned (0x%08X)"),
|
||||
_("invalid offset, target not word aligned (0x%08X)"),
|
||||
(unsigned int) (fixP->fx_frag->fr_address
|
||||
+ fixP->fx_where + value));
|
||||
|
||||
if ((value + 2) & ~0x3fe)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid offset, value too big (0x%08lX)"), value);
|
||||
_("invalid offset, value too big (0x%08lX)"), value);
|
||||
|
||||
/* Round up, since pc will be rounded down. */
|
||||
newval |= (value + 2) >> 2;
|
||||
|
@ -8776,28 +8820,28 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
case 9: /* SP load/store. */
|
||||
if (value & ~0x3fc)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid offset, value too big (0x%08lX)"), value);
|
||||
_("invalid offset, value too big (0x%08lX)"), value);
|
||||
newval |= value >> 2;
|
||||
break;
|
||||
|
||||
case 6: /* Word load/store. */
|
||||
if (value & ~0x7c)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid offset, value too big (0x%08lX)"), value);
|
||||
_("invalid offset, value too big (0x%08lX)"), value);
|
||||
newval |= value << 4; /* 6 - 2. */
|
||||
break;
|
||||
|
||||
case 7: /* Byte load/store. */
|
||||
if (value & ~0x1f)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid offset, value too big (0x%08lX)"), value);
|
||||
_("invalid offset, value too big (0x%08lX)"), value);
|
||||
newval |= value << 6;
|
||||
break;
|
||||
|
||||
case 8: /* Halfword load/store. */
|
||||
if (value & ~0x3e)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid offset, value too big (0x%08lX)"), value);
|
||||
_("invalid offset, value too big (0x%08lX)"), value);
|
||||
newval |= value << 5; /* 6 - 1. */
|
||||
break;
|
||||
|
||||
|
@ -8836,7 +8880,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
{
|
||||
if (value & ~0x1fc)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid immediate for stack address calculation"));
|
||||
_("invalid immediate for stack address calculation"));
|
||||
newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
|
||||
newval |= value >> 2;
|
||||
}
|
||||
|
@ -8845,7 +8889,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
if (subtract ||
|
||||
value & ~0x3fc)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid immediate for address calculation (value = 0x%08lX)"),
|
||||
_("invalid immediate for address calculation (value = 0x%08lX)"),
|
||||
(unsigned long) value);
|
||||
newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
|
||||
newval |= rd << 8;
|
||||
|
@ -8855,7 +8899,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
{
|
||||
if (value & ~0xff)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid 8bit immediate"));
|
||||
_("invalid 8bit immediate"));
|
||||
newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
|
||||
newval |= (rd << 8) | value;
|
||||
}
|
||||
|
@ -8863,7 +8907,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
{
|
||||
if (value & ~0x7)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid 3bit immediate"));
|
||||
_("invalid 3bit immediate"));
|
||||
newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
|
||||
newval |= rd | (rs << 3) | (value << 6);
|
||||
}
|
||||
|
@ -8879,7 +8923,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
case 0x05: /* 8bit immediate CMP. */
|
||||
if (value < 0 || value > 255)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Invalid immediate: %ld is too large"),
|
||||
_("invalid immediate: %ld is too large"),
|
||||
(long) value);
|
||||
newval |= value;
|
||||
break;
|
||||
|
@ -8894,7 +8938,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
/* 5bit shift value (0..31). */
|
||||
if (value < 0 || value > 31)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Illegal Thumb shift value: %ld"), (long) value);
|
||||
_("illegal Thumb shift value: %ld"), (long) value);
|
||||
newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf03f;
|
||||
newval |= value << 6;
|
||||
md_number_to_chars (buf, newval, THUMB_SIZE);
|
||||
|
@ -8908,7 +8952,7 @@ md_apply_fix3 (fixP, valP, seg)
|
|||
case BFD_RELOC_NONE:
|
||||
default:
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("Bad relocation fixup type (%d)"), fixP->fx_r_type);
|
||||
_("bad relocation fixup type (%d)"), fixP->fx_r_type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8979,7 +9023,7 @@ tc_gen_reloc (section, fixp)
|
|||
/* If this is called then the a literal has been referenced across
|
||||
a section boundary - possibly due to an implicit dump. */
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("Literal referenced across section boundary (Implicit dump?)"));
|
||||
_("literal referenced across section boundary (Implicit dump?)"));
|
||||
return NULL;
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
|
@ -8992,7 +9036,7 @@ tc_gen_reloc (section, fixp)
|
|||
|
||||
case BFD_RELOC_ARM_IMMEDIATE:
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("Internal_relocation (type %d) not fixed up (IMMEDIATE)"),
|
||||
_("internal relocation (type %d) not fixed up (IMMEDIATE)"),
|
||||
fixp->fx_r_type);
|
||||
return NULL;
|
||||
|
||||
|
@ -9003,7 +9047,7 @@ tc_gen_reloc (section, fixp)
|
|||
|
||||
case BFD_RELOC_ARM_OFFSET_IMM:
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("Internal_relocation (type %d) not fixed up (OFFSET_IMM)"),
|
||||
_("internal_relocation (type %d) not fixed up (OFFSET_IMM)"),
|
||||
fixp->fx_r_type);
|
||||
return NULL;
|
||||
|
||||
|
@ -9027,7 +9071,7 @@ tc_gen_reloc (section, fixp)
|
|||
default: type = _("<unknown>"); break;
|
||||
}
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("Cannot represent %s relocation in this object file format"),
|
||||
_("cannot represent %s relocation in this object file format"),
|
||||
type);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -9048,7 +9092,7 @@ tc_gen_reloc (section, fixp)
|
|||
if (reloc->howto == NULL)
|
||||
{
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("Can not represent %s relocation in this object file format"),
|
||||
_("cannot represent %s relocation in this object file format"),
|
||||
bfd_get_reloc_code_name (code));
|
||||
return NULL;
|
||||
}
|
||||
|
@ -9071,13 +9115,14 @@ md_estimate_size_before_relax (fragP, segtype)
|
|||
}
|
||||
|
||||
static void
|
||||
output_inst PARAMS ((void))
|
||||
output_inst (str)
|
||||
const char *str;
|
||||
{
|
||||
char * to = NULL;
|
||||
|
||||
if (inst.error)
|
||||
{
|
||||
as_bad (inst.error);
|
||||
as_bad ("%s -- `%s'", inst.error, str);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -9144,7 +9189,7 @@ md_assemble (str)
|
|||
|
||||
if (p == str)
|
||||
{
|
||||
as_bad (_("No operator -- statement `%s'\n"), str);
|
||||
as_bad (_("no operator -- statement `%s'\n"), str);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -9162,14 +9207,14 @@ md_assemble (str)
|
|||
/* Check that this instruction is supported for this CPU. */
|
||||
if (thumb_mode == 1 && (opcode->variant & cpu_variant) == 0)
|
||||
{
|
||||
as_bad (_("selected processor does not support this opcode"));
|
||||
as_bad (_("selected processor does not support `%s'"), str);
|
||||
return;
|
||||
}
|
||||
|
||||
inst.instruction = opcode->value;
|
||||
inst.size = opcode->size;
|
||||
(*opcode->parms) (p);
|
||||
output_inst ();
|
||||
output_inst (str);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -9187,14 +9232,14 @@ md_assemble (str)
|
|||
/* Check that this instruction is supported for this CPU. */
|
||||
if ((opcode->variant & cpu_variant) == 0)
|
||||
{
|
||||
as_bad (_("selected processor does not support this opcode"));
|
||||
as_bad (_("selected processor does not support `%s'"), str);
|
||||
return;
|
||||
}
|
||||
|
||||
inst.instruction = opcode->value;
|
||||
inst.size = INSN_SIZE;
|
||||
(*opcode->parms) (p);
|
||||
output_inst ();
|
||||
output_inst (str);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -9378,7 +9423,7 @@ md_parse_option (c, arg)
|
|||
return 1;
|
||||
}
|
||||
|
||||
as_bad (_("Unrecognised APCS switch -m%s"), arg);
|
||||
as_bad (_("unrecognised APCS switch -m%s"), arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -9539,7 +9584,7 @@ md_parse_option (c, arg)
|
|||
cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2;
|
||||
break;
|
||||
default:
|
||||
as_bad (_("Invalid architecture variant -m%s"), arg);
|
||||
as_bad (_("invalid architecture variant -m%s"), arg);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -9552,7 +9597,7 @@ md_parse_option (c, arg)
|
|||
case 'm': cpu_variant |= ARM_EXT_V3M; break;
|
||||
case 0: break;
|
||||
default:
|
||||
as_bad (_("Invalid architecture variant -m%s"), arg);
|
||||
as_bad (_("invalid architecture variant -m%s"), arg);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -9565,7 +9610,7 @@ md_parse_option (c, arg)
|
|||
case 't': cpu_variant |= ARM_EXT_V4T; break;
|
||||
case 0: break;
|
||||
default:
|
||||
as_bad (_("Invalid architecture variant -m%s"), arg);
|
||||
as_bad (_("invalid architecture variant -m%s"), arg);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -9578,20 +9623,20 @@ md_parse_option (c, arg)
|
|||
case 'e': cpu_variant |= ARM_EXT_V5E; break;
|
||||
case 0: break;
|
||||
default:
|
||||
as_bad (_("Invalid architecture variant -m%s"), arg);
|
||||
as_bad (_("invalid architecture variant -m%s"), arg);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
as_bad (_("Invalid architecture variant -m%s"), arg);
|
||||
as_bad (_("invalid architecture variant -m%s"), arg);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
bad:
|
||||
as_bad (_("Invalid processor variant -m%s"), arg);
|
||||
as_bad (_("invalid processor variant -m%s"), arg);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -169,8 +169,6 @@ void armelf_frob_symbol PARAMS ((symbolS *, int *));
|
|||
|
||||
#define OPTIONAL_REGISTER_PREFIX '%'
|
||||
|
||||
#define md_operand(x)
|
||||
|
||||
#define LOCAL_LABEL(name) (name[0] == '.' && (name[1] == 'L'))
|
||||
#define LOCAL_LABELS_FB 1
|
||||
#ifdef OBJ_ELF
|
||||
|
|
Loading…
Add table
Reference in a new issue