/* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
- Copyright (C) 1998-2015 Free Software Foundation, Inc.
+ Copyright (C) 1998-2016 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
This file is part of GAS, the GNU Assembler.
struct label_fix *tag_fixups;
struct unw_rec_list *unwind_record; /* Unwind directive. */
expressionS opnd[6];
- char *src_file;
+ const char *src_file;
unsigned int src_line;
struct dwarf2_line_info debug_line;
}
int insn_srlz; /* current insn serialization state */
int data_srlz; /* current data serialization state */
int qp_regno; /* qualifying predicate for this usage */
- char *file; /* what file marked this dependency */
+ const char *file; /* what file marked this dependency */
unsigned int line; /* what line marked this dependency */
struct mem_offset mem_offset; /* optional memory offset hint */
enum { CMP_NONE, CMP_OR, CMP_AND } cmp_type; /* OR or AND compare? */
/* Map 's' to SHF_IA_64_SHORT. */
bfd_vma
-ia64_elf_section_letter (int letter, char **ptr_msg)
+ia64_elf_section_letter (int letter, const char **ptr_msg)
{
if (letter == 's')
return SHF_IA_64_SHORT;
as_bad (_("qualifying predicate not followed by instruction"));
}
-static void
-ia64_do_align (int nbytes)
-{
- char *saved_input_line_pointer = input_line_pointer;
-
- input_line_pointer = "";
- s_align_bytes (nbytes);
- input_line_pointer = saved_input_line_pointer;
-}
-
void
ia64_cons_align (int nbytes)
{
if (md.auto_align)
{
- char *saved_input_line_pointer = input_line_pointer;
- input_line_pointer = "";
- s_align_bytes (nbytes);
- input_line_pointer = saved_input_line_pointer;
+ int log;
+ for (log = 0; (nbytes & 1) != 1; nbytes >>= 1)
+ log++;
+
+ do_align (log, NULL, 0, 0);
}
}
static void
obj_elf_vms_common (int ignore ATTRIBUTE_UNUSED)
{
- char *sec_name;
+ const char *sec_name;
char *sym_name;
char c;
offsetT size;
add_unwind_entry (output_spill_reg (ab, reg, 0, 0, qp), sep);
}
-static char *special_linkonce_name[] =
+static const char *special_linkonce_name[] =
{
".gnu.linkonce.ia64unw.", ".gnu.linkonce.ia64unwi."
};
char *sec_name;
const char *prefix = special_section_name [sec_index];
const char *suffix;
- size_t prefix_len, suffix_len, sec_name_len;
sec_text_name = segment_name (text_seg);
text_name = sec_text_name;
suffix += sizeof (".gnu.linkonce.t.") - 1;
}
- prefix_len = strlen (prefix);
- suffix_len = strlen (suffix);
- sec_name_len = prefix_len + suffix_len;
- sec_name = alloca (sec_name_len + 1);
- memcpy (sec_name, prefix, prefix_len);
- memcpy (sec_name + prefix_len, suffix, suffix_len);
- sec_name [sec_name_len] = '\0';
+ sec_name = concat (prefix, suffix, NULL);
/* Handle COMDAT group. */
if ((text_seg->flags & SEC_LINK_ONCE) != 0
&& (elf_section_flags (text_seg) & SHF_GROUP) != 0)
{
char *section;
- size_t len, group_name_len;
const char *group_name = elf_group_name (text_seg);
if (group_name == NULL)
as_bad (_("Group section `%s' has no group signature"),
sec_text_name);
ignore_rest_of_line ();
+ free (sec_name);
return;
}
- /* We have to construct a fake section directive. */
- group_name_len = strlen (group_name);
- len = (sec_name_len
- + 16 /* ,"aG",@progbits, */
- + group_name_len /* ,group_name */
- + 7); /* ,comdat */
-
- section = alloca (len + 1);
- memcpy (section, sec_name, sec_name_len);
- memcpy (section + sec_name_len, ",\"aG\",@progbits,", 16);
- memcpy (section + sec_name_len + 16, group_name, group_name_len);
- memcpy (section + len - 7, ",comdat", 7);
- section [len] = '\0';
+
+ /* We have to construct a fake section directive. */
+ section = concat (sec_name, ",\"aG\",@progbits,", group_name, ",comdat", NULL);
set_section (section);
+ free (section);
}
else
{
}
elf_linked_to_section (now_seg) = text_seg;
+ free (sec_name);
}
static void
}
static void
-free_saved_prologue_counts ()
+free_saved_prologue_counts (void)
{
label_prologue_count *lpc = unwind.saved_prologue_counts;
label_prologue_count *next;
}
last_pending->next = NULL;
demand_empty_rest_of_line ();
- ia64_do_align (16);
+ do_align (4, NULL, 0, 0);
unwind.prologue = 0;
unwind.prologue_count = 0;
as_warn (_("Pointless use of zero first operand to .prologue"));
else
mask = e.X_add_number;
- n = popcount (mask);
+
+ n = popcount (mask);
if (sep == ',')
parse_operand_and_eval (&e, 0);
else
e.X_op = O_absent;
+
if (e.X_op == O_constant
&& e.X_add_number >= 0
&& e.X_add_number < 128)
as_bad (_("Second operand to .prologue must be the first of %d general registers"), n);
grsave = 0;
}
-
}
if (mask)
switch (kind)
{
case 'd':
- alignment = 8;
+ alignment = 3;
break;
case 'x':
case 'X':
- alignment = 16;
+ alignment = 4;
break;
case 'f':
default:
- alignment = 4;
+ alignment = 2;
break;
}
- ia64_do_align (alignment);
+ do_align (alignment, NULL, 0, 0);
float_cons (kind);
}
print_prmask (valueT mask)
{
int regno;
- char *comma = "";
+ const char *comma = "";
for (regno = 0; regno < 64; regno++)
{
if (mask & ((valueT) 1 << regno))
}
int
-md_parse_option (int c, char *arg)
+md_parse_option (int c, const char *arg)
{
switch (c)
}
}
- end = alloca (strlen (name) + 1);
- strcpy (end, name);
+ end = xstrdup (name);
name = ia64_canonicalize_symbol_name (end);
if ((dr = hash_find (md.dynreg_hash, name)))
{
bits. */
e->X_op = O_register;
e->X_add_number = dr->base | (dr->num_regs << 16);
+ free (end);
return 1;
}
+ free (end);
return 0;
}
void
md_assemble (char *str)
{
- char *saved_input_line_pointer, *mnemonic;
+ char *saved_input_line_pointer, *temp;
+ const char *mnemonic;
const struct pseudo_opcode *pdesc;
struct ia64_opcode *idesc;
unsigned char qp_regno;
/* extract the opcode (mnemonic): */
- ch = get_symbol_name (&mnemonic);
+ ch = get_symbol_name (&temp);
+ mnemonic = temp;
pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
if (pdesc)
{
/* Build the instruction. */
CURR_SLOT.qp_regno = qp_regno;
CURR_SLOT.idesc = idesc;
- as_where (&CURR_SLOT.src_file, &CURR_SLOT.src_line);
+ CURR_SLOT.src_file = as_where (&CURR_SLOT.src_line);
dwarf2_where (&CURR_SLOT.debug_line);
dwarf2_consume_line_info ();
{
arelent *reloc;
- reloc = xmalloc (sizeof (*reloc));
- reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+ reloc = XNEW (arelent);
+ 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;
reloc->addend = fixp->fx_offset;
#define MAX_LITTLENUMS 5
-char *
+const char *
md_atof (int type, char *lit, int *size)
{
LITTLENUM_TYPE words[MAX_LITTLENUMS];
the relocatable file. */
struct alias
{
- char *file; /* The file where the directive is seen. */
+ const char *file; /* The file where the directive is seen. */
unsigned int line; /* The line number the directive is at. */
const char *name; /* The original name of the symbol. */
};
}
h = (struct alias *) xmalloc (sizeof (struct alias));
- as_where (&h->file, &h->line);
+ h->file = as_where (&h->line);
h->name = name;
error_string = hash_jam (ahash, alias, (void *) h);