/* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
- Copyright (C) 1998-2014 Free Software Foundation, Inc.
+ Copyright (C) 1998-2015 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
This file is part of GAS, the GNU Assembler.
return reg >= 64 && reg <= 111;
}
-/* Determine if application register REGNUM resides only in the memory
+/* Determine if application register REGNUM resides only in the memory
unit (as opposed to the integer unit). */
static int
ar_is_only_in_memory_unit (int reg)
return;
}
- sym_name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&sym_name);
if (input_line_pointer == sym_name)
{
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
as_bad (_("expected symbol name"));
ignore_rest_of_line ();
return;
}
symbolP = symbol_find_or_make (sym_name);
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
if ((S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
&& !S_IS_COMMON (symbolP))
if (is_it_end_of_statement ())
return;
- radix = input_line_pointer;
- ch = get_symbol_end ();
+ ch = get_symbol_name (&radix);
ia64_canonicalize_symbol_name (radix);
if (strcasecmp (radix, "C"))
as_bad (_("Radix `%s' unsupported or invalid"), radix);
- *input_line_pointer = ch;
+ (void) restore_line_pointer (ch);
demand_empty_rest_of_line ();
}
if (sep == ',')
{
+ char *name;
/* Parse a tag permitted for the current directive. */
int ch;
SKIP_WHITESPACE ();
- ch = get_symbol_end ();
+ ch = get_symbol_name (&name);
/* FIXME: For now, just issue a warning that this isn't implemented. */
{
static int warned;
as_warn (_("Tags on unwind pseudo-ops aren't supported, yet"));
}
}
- *input_line_pointer = ch;
+ (void) restore_line_pointer (ch);
}
if (sep != NOT_A_CHAR)
demand_empty_rest_of_line ();
if (! (unwind.prologue_mask & 2))
add_unwind_entry (output_psp_gr (reg), NOT_A_CHAR);
else if (reg != unwind.prologue_gr
- + (unsigned) popcount (unwind.prologue_mask & (-2 << 1)))
+ + (unsigned) popcount (unwind.prologue_mask & -(2 << 1)))
as_warn (_("Operand of .vframe contradicts .prologue"));
}
if (! (unwind.prologue_mask & 4))
add_unwind_entry (output_pfs_gr (reg2), NOT_A_CHAR);
else if (reg2 != unwind.prologue_gr
- + (unsigned) popcount (unwind.prologue_mask & (-4 << 1)))
+ + (unsigned) popcount (unwind.prologue_mask & -(4 << 1)))
as_warn (_("Second operand of .save contradicts .prologue"));
break;
case REG_AR + AR_LC:
if (! (unwind.prologue_mask & 1))
add_unwind_entry (output_preds_gr (reg2), NOT_A_CHAR);
else if (reg2 != unwind.prologue_gr
- + (unsigned) popcount (unwind.prologue_mask & (-1 << 1)))
+ + (unsigned) popcount (unwind.prologue_mask & -(1 << 1)))
as_warn (_("Second operand of .save contradicts .prologue"));
break;
case REG_PRIUNAT:
/* Set expression which points to start of unwind descriptor area. */
unwind.info = expr_build_dot ();
-
+
frag_var (rs_machine_dependent, size, size, 0, 0,
(offsetT) (long) unwind.personality_routine,
(char *) list);
dot_personality (int dummy ATTRIBUTE_UNUSED)
{
char *name, *p, c;
+
if (!in_procedure ("personality"))
return;
SKIP_WHITESPACE ();
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
p = input_line_pointer;
unwind.personality_routine = symbol_find_or_make (name);
unwind.force_unwind_entry = 1;
*p = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
demand_empty_rest_of_line ();
}
while (1)
{
SKIP_WHITESPACE ();
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
p = input_line_pointer;
if (!*name)
as_bad (_("Empty argument of .proc"));
symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
}
*p = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (*input_line_pointer != ',')
break;
++input_line_pointer;
char *name, *p, c;
SKIP_WHITESPACE ();
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
p = input_line_pointer;
if (!*name)
(md.unwind_check == unwind_check_warning
as_warn (_("`%s' was not specified with previous .proc"), name);
}
*p = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (*input_line_pointer != ',')
break;
++input_line_pointer;
drpp = &md.dynreg[type];
while (1)
{
- start = input_line_pointer;
- ch = get_symbol_end ();
+ ch = get_symbol_name (&start);
len = strlen (ia64_canonicalize_symbol_name (start));
*input_line_pointer = ch;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (*input_line_pointer != '[')
{
as_bad (_("Expected '['"));
while (1)
{
- option = input_line_pointer;
- ch = get_symbol_end ();
+ ch = get_symbol_name (&option);
if (strcmp (option, "lsb") == 0)
md.flags &= ~EF_IA_64_BE;
else if (strcmp (option, "msb") == 0)
as_bad (_("Unknown psr option `%s'"), option);
*input_line_pointer = ch;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (*input_line_pointer != ',')
break;
char *start, *end;
int saved_auto_align;
unsigned int section_count;
+ char *name;
+ char c;
SKIP_WHITESPACE ();
start = input_line_pointer;
- if (*start == '"')
+ c = get_symbol_name (&name);
+ if (input_line_pointer == start)
{
- int len;
- char *name;
-
- name = demand_copy_C_string (&len);
- obstack_free(¬es, name);
- if (!name)
- {
- ignore_rest_of_line ();
- return;
- }
- }
- else
- {
- char c = get_symbol_end ();
-
- if (input_line_pointer == start)
- {
- as_bad (_("Missing section name"));
- ignore_rest_of_line ();
- return;
- }
- *input_line_pointer = c;
+ as_bad (_("Missing section name"));
+ ignore_rest_of_line ();
+ return;
}
+ * input_line_pointer = c;
+ SKIP_WHITESPACE_AFTER_NAME ();
end = input_line_pointer;
- SKIP_WHITESPACE ();
if (*input_line_pointer != ',')
{
as_bad (_("Comma expected after section name"));
}
else if (*input_line_pointer == '@')
{
- char *form = ++input_line_pointer;
- char c = get_symbol_end();
+ char *form;
+ char c;
+
+ ++input_line_pointer;
+ c = get_symbol_name (&form);
if (strcmp (form, "mutex") == 0)
type = 'm';
type = 'c';
else if (strcmp (form, "imply") == 0)
type = 'i';
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
}
else
{
do
{
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
symbolP = symbol_find_or_make (name);
err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (void *) symbolP);
name, err);
*input_line_pointer = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
c = *input_line_pointer;
if (c == ',')
{
if (e->X_op == O_constant)
{
/* 5-bit signed scaled by 64 */
- if ((e->X_add_number <= ( 0xf << 6 ))
+ if ((e->X_add_number <= ( 0xf << 6 ))
&& (e->X_add_number >= -( 0x10 << 6 )))
{
-
+
/* Must be a multiple of 64 */
if ((e->X_add_number & 0x3f) != 0)
as_warn (_("stride must be a multiple of 64; lower 6 bits ignored"));
if (e->X_op == O_constant)
{
/* 6-bit unsigned biased by 1 -- count 0 is meaningless */
- if ((e->X_add_number <= 64)
+ if ((e->X_add_number <= 64)
&& (e->X_add_number > 0) )
{
return OPERAND_MATCH;
for (; ; ++i)
{
- if (i < NELEMS (CURR_SLOT.opnd))
+ if (i < NELEMS (CURR_SLOT.opnd))
{
sep = parse_operand_maybe_eval (CURR_SLOT.opnd + i, '=',
idesc->operands[i]);
as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
_("Missing '}' at end of file"));
}
-
+
know (md.num_slots_in_use < NUM_SLOTS);
t0 = end_of_insn_group | (template_val << 1) | (insn[0] << 5) | (insn[1] << 46);
recognize labels. */
if (is_name_beginner (*input_line_pointer))
{
- s = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&s);
}
else if (LOCAL_LABELS_FB
&& ISDIGIT (*input_line_pointer))
print_prmask (qp_mutexes[i].prmask);
fprintf (stderr, "\n");
}
-
+
/* Deal with the old mutex with more than 3+ PRs only if
the new mutex on the same execution path with it.
if (add == 0
&& (qp_mutexes[i].prmask & mask) == mask)
add = 1;
-
+
qp_mutexes[i].prmask &= ~mask;
if (qp_mutexes[i].prmask & (qp_mutexes[i].prmask - 1))
{
i++;
}
}
-
+
if (keep == 0)
/* Remove the mutex. */
qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
/* extract the opcode (mnemonic): */
- mnemonic = input_line_pointer;
- ch = get_symbol_end ();
+ ch = get_symbol_name (&mnemonic);
pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
if (pdesc)
{
- *input_line_pointer = ch;
+ (void) restore_line_pointer (ch);
(*pdesc->handler) (pdesc->arg);
goto done;
}
/* Find the instruction descriptor matching the arguments. */
idesc = ia64_find_opcode (mnemonic);
- *input_line_pointer = ch;
+ (void) restore_line_pointer (ch);
if (!idesc)
{
as_bad (_("Unknown opcode `%s'"), mnemonic);
{
enum ia64_opnd opnd1, opnd2;
int rop;
-
+
opnd1 = idesc->operands[0];
opnd2 = idesc->operands[1];
if (opnd1 == IA64_OPND_AR3)
bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
p = fragp->fr_literal + fragp->fr_fix;
- /* If no paddings are needed, we check if we need a stop bit. */
+ /* If no paddings are needed, we check if we need a stop bit. */
if (!bytes && fragp->tc_frag_data)
{
if (fragp->fr_fix < 16)
struct hash_control *ahash, *nhash;
const char *kind;
- name = input_line_pointer;
- delim = get_symbol_end ();
+ delim = get_symbol_name (&name);
end_name = input_line_pointer;
*end_name = delim;
return;
}
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (*input_line_pointer != ',')
{
h = (struct alias *) xmalloc (sizeof (struct alias));
as_where (&h->file, &h->line);
h->name = name;
-
+
error_string = hash_jam (ahash, alias, (void *) h);
if (error_string)
{
bname = xstrdup (lbasename (out_file_name));
if ((p = strrchr (bname, '.')))
*p = '\0';
-
+
/* VMS note header is 24 bytes long. */
p = frag_more (8 + 8 + 8);
number_to_chars_littleendian (p + 0, 8, 8);