/* tc-iq2000.c -- Assembler for the Sitera IQ2000.
- Copyright (C) 2003, 2004, 2005 Free Software Foundation.
+ Copyright (C) 2003-2021 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
+ the Free Software Foundation; either version 3, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to
- the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ the Free Software Foundation, 51 Franklin Street - Fifth Floor,
+ Boston, MA 02110-1301, USA. */
-#include <stdio.h>
#include "as.h"
#include "safe-ctype.h"
#include "subsegs.h"
#include "cgen.h"
#include "elf/common.h"
#include "elf/iq2000.h"
-#include "libbfd.h"
-#include "hash.h"
+#include "sb.h"
#include "macro.h"
/* Structure to hold all of the different components describing
iq2000_insn;
const char comment_chars[] = "#";
-const char line_comment_chars[] = "";
+const char line_comment_chars[] = "#";
const char line_separator_chars[] = ";";
const char EXP_CHARS[] = "eE";
const char FLT_CHARS[] = "dD";
static struct iq2000_hi_fixup * iq2000_hi_fixup_list;
/* Macro hash table, which we will add to. */
-extern struct hash_control *macro_hash;
+extern struct htab *macro_hash;
\f
const char *md_shortopts = "";
struct option md_longopts[] =
int
md_parse_option (int c ATTRIBUTE_UNUSED,
- char * arg ATTRIBUTE_UNUSED)
+ const char * arg ATTRIBUTE_UNUSED)
{
return 0;
}
sb macro_name;
const char *namestr;
- macro = xmalloc (sizeof (macro_entry));
+ macro = XNEW (macro_entry);
sb_new (& macro->sub);
sb_new (& macro_name);
formal_entry ** p = ¯o->formals;
macro->formal_count = 0;
- macro->formal_hash = hash_new ();
+ macro->formal_hash = htab_create_alloc (7, hash_formal_entry,
+ eq_formal_entry,
+ NULL, xcalloc, free);
+
while (*arguments != NULL)
{
formal_entry *formal;
- formal = xmalloc (sizeof (formal_entry));
+ formal = XNEW (formal_entry);
sb_new (& formal->name);
sb_new (& formal->def);
sb_add_string (& formal->name, *arguments);
/* Add to macro's hash table. */
- hash_jam (macro->formal_hash, sb_terminate (& formal->name), formal);
-
+ htab_insert (macro->formal_hash,
+ formal_entry_alloc (sb_terminate (& formal->name),
+ formal),
+ 1);
formal->index = macro->formal_count;
macro->formal_count++;
*p = formal;
sb_add_string (¯o_name, name);
namestr = sb_terminate (¯o_name);
- hash_jam (macro_hash, namestr, macro);
+ htab_insert (macro_hash, macro_entry_alloc (namestr, macro), 1);
macro_defined = 1;
}
valueT
md_section_align (segT segment, valueT size)
{
- int align = bfd_get_section_alignment (stdoutput, segment);
- return ((size + (1 << align) - 1) & (-1 << align));
+ int align = bfd_section_alignment (segment);
+ return ((size + (1 << align) - 1) & -(1 << align));
}
symbolS *
{
struct iq2000_hi_fixup * hi_fixup;
- assert (reloc_type == BFD_RELOC_HI16);
+ gas_assert (reloc_type == BFD_RELOC_HI16);
- hi_fixup = xmalloc (sizeof * hi_fixup);
+ hi_fixup = XNEW (struct iq2000_hi_fixup);
hi_fixup->fixp = fixP;
hi_fixup->seg = now_seg;
hi_fixup->next = iq2000_hi_fixup_list;
#define FX_OPINFO_R_TYPE(f) ((f)->fx_cgen.opinfo)
/* Sort any unmatched HI16 relocs so that they immediately precede
- the corresponding LO16 reloc. This is called before md_apply_fix3 and
+ the corresponding LO16 reloc. This is called before md_apply_fix and
tc_gen_reloc. */
void
segment_info_type * seginfo;
int pass;
- assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_HI16
+ gas_assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_HI16
|| FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_LO16);
/* Check quickly whether the next fixup happens to be a matching low. */
for (pf = &seginfo->fix_root;
* pf != l->fixp;
pf = & (* pf)->fx_next)
- assert (* pf != NULL);
+ gas_assert (* pf != NULL);
* pf = l->fixp->fx_next;
gas_cgen_md_operand (exp);
}
-/* Turn a string in input_line_pointer into a floating point constant
- of type type, and store the appropriate bytes in *litP. The number
- of LITTLENUMS emitted is stored in *sizeP . An error message is
- returned, or NULL on OK. */
-
-/* Equal to MAX_PRECISION in atof-ieee.c */
-#define MAX_LITTLENUMS 6
-
-char *
+const char *
md_atof (int type, char * litP, int * sizeP)
{
- int i;
- int prec;
- LITTLENUM_TYPE words [MAX_LITTLENUMS];
- char * t;
-
- switch (type)
- {
- case 'f':
- case 'F':
- case 's':
- case 'S':
- prec = 2;
- break;
-
- case 'd':
- case 'D':
- case 'r':
- case 'R':
- prec = 4;
- break;
-
- /* FIXME: Some targets allow other format chars for bigger sizes here. */
-
- default:
- * sizeP = 0;
- return _("Bad call to md_atof()");
- }
-
- t = atof_ieee (input_line_pointer, type, words);
- if (t)
- input_line_pointer = t;
- * sizeP = prec * sizeof (LITTLENUM_TYPE);
-
- for (i = 0; i < prec; i++)
- {
- md_number_to_chars (litP, (valueT) words[i],
- sizeof (LITTLENUM_TYPE));
- litP += sizeof (LITTLENUM_TYPE);
- }
-
- return 0;
+ return ieee_md_atof (type, litP, sizeP, TRUE);
}
-
bfd_boolean
iq2000_fix_adjustable (fixS * fixP)
{
return TRUE;
/* Prevent all adjustments to global symbols. */
- if (S_IS_EXTERN (fixP->fx_addsy))
+ if (S_IS_EXTERNAL (fixP->fx_addsy))
return FALSE;
if (S_IS_WEAK (fixP->fx_addsy))
char *name;
symbolS *p;
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
p = (symbolS *) symbol_find_or_make (name);
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
return p;
}
else
p = NULL;
- if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
+ if ((bfd_section_flags (now_seg) & SEC_CODE) != 0)
maybe_text = 1;
else
maybe_text = 0;
if (p != NULL)
{
- assert (S_GET_NAME (p));
+ gas_assert (S_GET_NAME (p));
if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
as_warn (_(".end symbol does not match .ent symbol."));
}
static void
s_iq2000_ent (int aent)
{
- int number = 0;
symbolS *symbolP;
int maybe_text;
input_line_pointer++;
SKIP_WHITESPACE ();
if (ISDIGIT (*input_line_pointer) || *input_line_pointer == '-')
- number = get_number ();
+ get_number ();
- if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
+ if ((bfd_section_flags (now_seg) & SEC_CODE) != 0)
maybe_text = 1;
else
maybe_text = 0;