/* tc-arc.c -- Assembler for the ARC
- Copyright (C) 1994, 1995, 1997, 2000 Free Software Foundation, Inc.
+ Copyright 1994, 1995, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ Free Software Foundation, Inc.
Contributed by Doug Evans (dje@cygnus.com).
This file is part of GAS, the GNU Assembler.
GNU General Public License for more details.
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. */
+ 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. */
#include <stdio.h>
-#include <ctype.h>
#include "libiberty.h"
#include "as.h"
+#include "struc-symbol.h"
+#include "safe-ctype.h"
#include "subsegs.h"
#include "opcode/arc.h"
#include "../opcodes/arc-ext.h"
#include "elf/arc.h"
+#include "dwarf2dbg.h"
extern int arc_get_mach PARAMS ((char *));
extern int arc_operand_type PARAMS ((int));
extern int arc_limm_fixup_adjust PARAMS ((arc_insn));
extern int arc_get_noshortcut_flag PARAMS ((void));
extern int arc_set_ext_seg PARAMS ((void));
-extern void arc_code_symbol PARAMS((expressionS *));
+extern void arc_code_symbol PARAMS ((expressionS *));
static arc_insn arc_insert_operand PARAMS ((arc_insn,
const struct arc_operand *, int,
static void arc_extinst PARAMS ((int));
static void arc_extoper PARAMS ((int));
static void arc_option PARAMS ((int));
-static int get_arc_exp_reloc_type PARAMS ((int, int, expressionS *,
+static int get_arc_exp_reloc_type PARAMS ((int, int, expressionS *,
expressionS *));
+static void init_opcode_tables PARAMS ((int));
+
const struct suffix_classes {
char *name;
int len;
#define MAXSYNTAXCLASS (sizeof (syntaxclass) / sizeof (struct syntax_classes))
-const pseudo_typeS md_pseudo_table[] =
-{
- { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0) */
+const pseudo_typeS md_pseudo_table[] = {
+ { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0). */
{ "comm", arc_common, 0 },
{ "common", arc_common, 0 },
{ "lcomm", arc_common, 1 },
{ "4byte", cons, 4 },
{ "word", cons, 4 },
{ "option", arc_option, 0 },
+ { "cpu", arc_option, 0 },
{ "block", s_space, 0 },
{ "extcondcode", arc_extoper, 0 },
{ "extcoreregister", arc_extoper, 1 },
};
/* This array holds the chars that always start a comment. If the
- pre-processor is disabled, these aren't very useful */
+ pre-processor is disabled, these aren't very useful. */
const char comment_chars[] = "#;";
/* This array holds the chars that only start a comment at the beginning of
const char line_separator_chars[] = "";
-/* Chars that can be used to separate mant from exp in floating point nums */
+/* Chars that can be used to separate mant from exp in floating point nums. */
const char EXP_CHARS[] = "eE";
-/* Chars that mean this number is a floating point constant */
-/* As in 0f12.456 */
-/* or 0d1.2345e12 */
+/* Chars that mean this number is a floating point constant
+ As in 0f12.456 or 0d1.2345e12. */
const char FLT_CHARS[] = "rRsSfFdD";
/* Byte order. */
static segT arcext_section;
/* One of bfd_mach_arc_n. */
-static int arc_mach_type = bfd_mach_arc_5;
+static int arc_mach_type = bfd_mach_arc_6;
/* Non-zero if the cpu type has been explicitly specified. */
static int mach_type_specified_p = 0;
/* Non-zero if opcode tables have been initialized.
- A .cpu command must appear before any instructions. */
+ A .option command must appear before any instructions. */
static int cpu_tables_init_p = 0;
static struct hash_control *arc_suffix_hash = NULL;
\f
const char *md_shortopts = "";
-struct option md_longopts[] =
-{
+struct option md_longopts[] = {
#define OPTION_EB (OPTION_MD_BASE + 0)
- {"EB", no_argument, NULL, OPTION_EB},
+ { "EB", no_argument, NULL, OPTION_EB },
#define OPTION_EL (OPTION_MD_BASE + 1)
- {"EL", no_argument, NULL, OPTION_EL},
+ { "EL", no_argument, NULL, OPTION_EL },
#define OPTION_ARC5 (OPTION_MD_BASE + 2)
- {"marc5", no_argument, NULL, OPTION_ARC5},
+ { "marc5", no_argument, NULL, OPTION_ARC5 },
+ { "pre-v6", no_argument, NULL, OPTION_ARC5 },
#define OPTION_ARC6 (OPTION_MD_BASE + 3)
- {"marc6", no_argument, NULL, OPTION_ARC6},
+ { "marc6", no_argument, NULL, OPTION_ARC6 },
#define OPTION_ARC7 (OPTION_MD_BASE + 4)
- {"marc7", no_argument, NULL, OPTION_ARC7},
+ { "marc7", no_argument, NULL, OPTION_ARC7 },
#define OPTION_ARC8 (OPTION_MD_BASE + 5)
- {"marc8", no_argument, NULL, OPTION_ARC8},
+ { "marc8", no_argument, NULL, OPTION_ARC8 },
#define OPTION_ARC (OPTION_MD_BASE + 6)
- {"marc", no_argument, NULL, OPTION_ARC},
+ { "marc", no_argument, NULL, OPTION_ARC },
{ NULL, no_argument, NULL, 0 }
};
size_t md_longopts_size = sizeof (md_longopts);
#define IS_SYMBOL_OPERAND(o) \
((o) == 'b' || (o) == 'c' || (o) == 's' || (o) == 'o' || (o) == 'O')
-struct arc_operand_value *get_ext_suffix(char *s);
+struct arc_operand_value *get_ext_suffix (char *s);
-/*
- * md_parse_option
- *
- * Invocation line includes a switch not recognized by the base assembler.
- * See if it's a processor-specific option.
- */
+/* Invocation line includes a switch not recognized by the base assembler.
+ See if it's a processor-specific option. */
int
md_parse_option (c, arg)
{
switch (c)
{
- case OPTION_ARC:
case OPTION_ARC5:
arc_mach_type = bfd_mach_arc_5;
break;
+ case OPTION_ARC:
case OPTION_ARC6:
arc_mach_type = bfd_mach_arc_6;
break;
/* This function is called once, at assembler startup time. It should
set up all the tables, etc. that the MD part of the assembler will need.
- Opcode selection is defered until later because we might see a .cpu
+ Opcode selection is deferred until later because we might see a .option
command. */
void
if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, arc_mach_type))
as_warn ("could not set architecture and machine");
- /* This call is necessary because we need to
- initialize `arc_operand_map' which may be needed before we see the
- first insn. */
+ /* This call is necessary because we need to initialize `arc_operand_map'
+ which may be needed before we see the first insn. */
arc_opcode_init_tables (arc_get_opcode_mach (arc_mach_type,
target_big_endian));
}
/* Initialize the various opcode and operand tables.
MACH is one of bfd_mach_arc_xxx. */
-
static void
init_opcode_tables (mach)
int mach;
for (i = 0; i < arc_reg_names_count; i++)
{
- if (symbol_find(arc_reg_names[i].name))
+ if (symbol_find (arc_reg_names[i].name))
continue;
/* Use symbol_create here instead of symbol_new so we don't try to
output registers into the object file's symbol table. */
- symbol_table_insert (symbol_create (arc_reg_names[i].name, reg_section,
- (int) &arc_reg_names[i], &zero_address_frag));
+ symbol_table_insert (symbol_create (arc_reg_names[i].name,
+ reg_section,
+ (int) &arc_reg_names[i],
+ &zero_address_frag));
}
/* Tell `.option' it's too late. */
test = val;
if (test < (offsetT) min || test > (offsetT) max)
- {
- const char *err =
- "operand out of range (%s not between %ld and %ld)";
- char buf[100];
-
- sprint_value (buf, test);
- if (file == (char *) NULL)
- as_warn (err, buf, min, max);
- else
- as_warn_where (file, line, err, buf, min, max);
- }
+ as_warn_value_out_of_range (_("operand"), test, (offsetT) min, (offsetT) max, file, line);
}
if (operand->insert)
we go, because that would require us to first create the frag, and
that would screw up references to ``.''. */
-struct arc_fixup
-{
- /* index into `arc_operands' */
+struct arc_fixup {
+ /* index into `arc_operands' */
int opindex;
expressionS exp;
};
static int init_tables_p = 0;
/* Opcode table initialization is deferred until here because we have to
- wait for a possible .cpu command. */
+ wait for a possible .option command. */
if (!init_tables_p)
{
init_opcode_tables (arc_mach_type);
}
/* Skip leading white space. */
- while (isspace (*str))
+ while (ISSPACE (*str))
str++;
/* The instructions are stored in lists hashed by the first letter (though
/* Keep looking until we find a match. */
start = str;
- for (opcode = (ext_opcode ? ext_opcode : std_opcode) ;
+ for (opcode = (ext_opcode ? ext_opcode : std_opcode);
opcode != NULL;
opcode = (ARC_OPCODE_NEXT_ASM (opcode)
? ARC_OPCODE_NEXT_ASM (opcode)
/* We don't check for (*str != '\0') here because we want to parse
any trailing fake arguments in the syntax string. */
- for (str = start, syn = opcode->syntax; *syn != '\0'; )
+ for (str = start, syn = opcode->syntax; *syn != '\0';)
{
int mods;
const struct arc_operand *operand;
as_warn (errmsg);
break;
}
- if(limm_reloc_p
- && (operand->flags && operand->flags & ARC_OPERAND_LIMM)
- && (operand->flags &
- (ARC_OPERAND_ABSOLUTE_BRANCH | ARC_OPERAND_ADDRESS)))
+ if (limm_reloc_p
+ && (operand->flags && operand->flags & ARC_OPERAND_LIMM)
+ && (operand->flags &
+ (ARC_OPERAND_ABSOLUTE_BRANCH | ARC_OPERAND_ADDRESS)))
{
fixups[fix_up_at].opindex = arc_operand_map[operand->fmt];
}
{
int found;
char c;
- char *s,*t;
- const struct arc_operand_value *suf,*suffix_end;
+ char *s, *t;
+ const struct arc_operand_value *suf, *suffix_end;
const struct arc_operand_value *suffix = NULL;
if (!(operand->flags & ARC_OPERAND_SUFFIX))
}
/* Pick the suffix out and look it up via the hash table. */
- for (t = s; *t && isalnum (*t); ++t)
+ for (t = s; *t && ISALNUM (*t); ++t)
continue;
c = *t;
*t = '\0';
- if ((suf = get_ext_suffix(s)))
+ if ((suf = get_ext_suffix (s)))
ext_suffix_p = 1;
else
suf = hash_find (arc_suffix_hash, s);
}
++syn;
if (!found)
- ; /* Wrong type. Just go on to try next insn entry. */
+ /* Wrong type. Just go on to try next insn entry. */
+ ;
else
{
if (num_suffixes == MAX_SUFFIXES)
/* Is there anything left to parse?
We don't check for this at the top because we want to parse
any trailing fake arguments in the syntax string. */
- if (*str == '\0')
+ if (is_end_of_line[(unsigned char) *str])
break;
/* Parse the operand. */
}
#define IS_REG_DEST_OPERAND(o) ((o) == 'a')
else if (IS_REG_DEST_OPERAND (*syn))
- as_bad("symbol as destination register");
+ as_bad ("symbol as destination register");
else
{
- if(!strncmp(str,"@h30",4))
+ if (!strncmp (str, "@h30", 4))
{
- arc_code_symbol(&exp);
+ arc_code_symbol (&exp);
str += 4;
}
/* We need to generate a fixup for this expression. */
as_fatal ("too many fixups");
fixups[fc].exp = exp;
/* We don't support shimm relocs. break here to force
- the assembler to output a limm */
+ the assembler to output a limm. */
#define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
- if(IS_REG_SHIMM_OFFSET(*syn))
+ if (IS_REG_SHIMM_OFFSET (*syn))
break;
/* If this is a register constant (IE: one whose
register value gets stored as 61-63) then this
{
const char *junk;
limm_reloc_p = 1;
- /* save this, we don't yet know what reloc to use */
+ /* Save this, we don't yet know what reloc to use. */
fix_up_at = fc;
/* Tell insert_reg we need a limm. This is
needed because the value at this point is
insn and it is assumed that longer versions of insns appear
before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
- while (isspace (*str))
+ while (ISSPACE (*str))
++str;
- if (*str != '\0')
+ if (!is_end_of_line[(unsigned char) *str])
as_bad ("junk at end of line: `%s'", str);
/* Is there a limm value? */
{
switch (arc_operands[insn_suffixes[i]->type].fmt)
{
- case 'n' :
+ case 'n':
delay_slot_type = insn_suffixes[i]->value;
break;
- case 'q' :
+ case 'q':
conditional = insn_suffixes[i]->value;
break;
- case 'f' :
+ case 'f':
cc_set_p = 1;
break;
}
if (in_delay_slot_p && limm_p)
as_warn ("8 byte instruction in delay slot");
if (delay_slot_type != ARC_DELAY_NONE
- && limm_p && arc_insn_not_jl(insn)) /* except for jl addr */
+ && limm_p && arc_insn_not_jl (insn)) /* except for jl addr */
as_warn ("8 byte jump instruction with delay slot");
in_delay_slot_p = (delay_slot_type != ARC_DELAY_NONE) && !limm_p;
f = frag_more (8);
md_number_to_chars (f, insn, 4);
md_number_to_chars (f + 4, limm, 4);
+ dwarf2_emit_insn (8);
}
else if (limm_reloc_p)
{
{
f = frag_more (4);
md_number_to_chars (f, insn, 4);
+ dwarf2_emit_insn (4);
}
/* Create any fixups. */
operands residing in the insn, but instead just use the
operand index. This lets us easily handle fixups for any
operand type, although that is admittedly not a very exciting
- feature. We pick a BFD reloc type in md_apply_fix.
+ feature. We pick a BFD reloc type in md_apply_fix3.
Limm values (4 byte immediate "constants") must be treated
normally because they're not part of the actual insn word
if (arc_operands[fixups[i].opindex].flags & ARC_OPERAND_LIMM)
{
- /* modify the fixup addend as required by the cpu */
- fixups[i].exp.X_add_number += arc_limm_fixup_adjust(insn);
+ /* Modify the fixup addend as required by the cpu. */
+ fixups[i].exp.X_add_number += arc_limm_fixup_adjust (insn);
op_type = fixups[i].opindex;
/* FIXME: can we add this data to the operand table? */
if (op_type == arc_operand_map['L']
/* Try the next entry. */
}
- if(NULL == last_errmsg)
+ if (NULL == last_errmsg)
as_bad ("bad instruction `%s'", start);
else
as_bad (last_errmsg);
}
-
\f
-
static void
arc_extoper (opertype)
int opertype;
name = input_line_pointer;
c = get_symbol_end ();
- name = xstrdup(name);
- if (NULL == name)
- {
- ignore_rest_of_line();
- return;
- }
+ name = xstrdup (name);
p = name;
while (*p)
{
- if (isupper(*p))
- *p = tolower(*p);
+ *p = TOLOWER (*p);
p++;
}
- /* just after name is now '\0' */
+ /* just after name is now '\0' */
p = input_line_pointer;
*p = c;
SKIP_WHITESPACE ();
{
as_bad ("expected comma after operand name");
ignore_rest_of_line ();
- free(name);
+ free (name);
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
number = get_absolute_expression ();
- if(number < 0)
+ if (number < 0)
{
- as_bad ("negative operand number %d",number);
- ignore_rest_of_line();
- free(name);
+ as_bad ("negative operand number %d", number);
+ ignore_rest_of_line ();
+ free (name);
return;
}
if (opertype)
{
- SKIP_WHITESPACE();
+ SKIP_WHITESPACE ();
if (*input_line_pointer != ',')
{
as_bad ("expected comma after register-number");
ignore_rest_of_line ();
- free(name);
+ free (name);
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
mode = input_line_pointer;
- if (!strncmp(mode, "r|w",3))
+ if (!strncmp (mode, "r|w", 3))
{
imode = 0;
input_line_pointer += 3;
}
else
{
- if (!strncmp(mode,"r",1))
+ if (!strncmp (mode, "r", 1))
{
imode = ARC_REGISTER_READONLY;
input_line_pointer += 1;
}
else
{
- if (strncmp(mode,"w",1))
+ if (strncmp (mode, "w", 1))
{
as_bad ("invalid mode");
- ignore_rest_of_line();
- free(name);
+ ignore_rest_of_line ();
+ free (name);
return;
}
else
}
}
}
- SKIP_WHITESPACE();
+ SKIP_WHITESPACE ();
if (1 == opertype)
{
if (*input_line_pointer != ',')
{
as_bad ("expected comma after register-mode");
ignore_rest_of_line ();
- free(name);
+ free (name);
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
- if(!strncmp(input_line_pointer,"cannot_shortcut",15))
+ if (!strncmp (input_line_pointer, "cannot_shortcut", 15))
{
- imode |= arc_get_noshortcut_flag();
+ imode |= arc_get_noshortcut_flag ();
input_line_pointer += 15;
}
else
{
- if(strncmp(input_line_pointer,"can_shortcut",12))
+ if (strncmp (input_line_pointer, "can_shortcut", 12))
{
as_bad ("shortcut designator invalid");
- ignore_rest_of_line();
- free(name);
+ ignore_rest_of_line ();
+ free (name);
return;
}
else
if ((opertype == 1) && number > 60)
{
- as_bad("core register value (%d) too large", number);
- ignore_rest_of_line();
- free(name);
+ as_bad ("core register value (%d) too large", number);
+ ignore_rest_of_line ();
+ free (name);
return;
}
if ((opertype == 0) && number > 31)
{
- as_bad("condition code value (%d) too large", number);
- ignore_rest_of_line();
- free(name);
+ as_bad ("condition code value (%d) too large", number);
+ ignore_rest_of_line ();
+ free (name);
return;
}
ext_oper = (struct arc_ext_operand_value *) \
- xmalloc(sizeof (struct arc_ext_operand_value));
+ xmalloc (sizeof (struct arc_ext_operand_value));
- if(opertype)
+ if (opertype)
{
- /* if the symbol already exists, point it at the new definition */
+ /* If the symbol already exists, point it at the new definition. */
if ((symbolP = symbol_find (name)))
{
- if (S_GET_SEGMENT(symbolP) == reg_section)
- S_SET_VALUE(symbolP,(int)&ext_oper->operand);
+ if (S_GET_SEGMENT (symbolP) == reg_section)
+ S_SET_VALUE (symbolP, (int) &ext_oper->operand);
else
{
- as_bad("attempt to override symbol: %s",name);
- ignore_rest_of_line();
- free(name);
- free(ext_oper);
+ as_bad ("attempt to override symbol: %s", name);
+ ignore_rest_of_line ();
+ free (name);
+ free (ext_oper);
return;
}
}
else
{
- /* If its not there, add it */
+ /* If its not there, add it. */
symbol_table_insert (symbol_create (name, reg_section,
(int) &ext_oper->operand, &zero_address_frag));
}
ext_oper->operand.name = name;
ext_oper->operand.value = number;
- ext_oper->operand.type = arc_operand_type(opertype);
+ ext_oper->operand.type = arc_operand_type (opertype);
ext_oper->operand.flags = imode;
ext_oper->next = arc_ext_operands;
arc_ext_operands = ext_oper;
- /* ok, now that we know what this operand is, put a description
- in the arc extension section of the output file */
+ /* OK, now that we know what this operand is, put a description in
+ the arc extension section of the output file. */
old_sec = now_seg;
old_subsec = now_subseg;
- arc_set_ext_seg();
+ arc_set_ext_seg ();
switch (opertype)
{
case 0:
- p = frag_more(1);
- *p = 3 + strlen(name) + 1;
- p = frag_more(1);
+ p = frag_more (1);
+ *p = 3 + strlen (name) + 1;
+ p = frag_more (1);
*p = EXT_COND_CODE;
- p = frag_more(1);
+ p = frag_more (1);
*p = number;
- p = frag_more(strlen(name) + 1);
- strcpy(p,name);
+ p = frag_more (strlen (name) + 1);
+ strcpy (p, name);
break;
case 1:
- p = frag_more(1);
- *p = 3 + strlen(name) + 1;
- p = frag_more(1);
+ p = frag_more (1);
+ *p = 3 + strlen (name) + 1;
+ p = frag_more (1);
*p = EXT_CORE_REGISTER;
- p = frag_more(1);
+ p = frag_more (1);
*p = number;
- p = frag_more(strlen(name) + 1);
- strcpy(p,name);
+ p = frag_more (strlen (name) + 1);
+ strcpy (p, name);
break;
case 2:
- p = frag_more(1);
- *p = 6 + strlen(name) + 1;
- p = frag_more(1);
+ p = frag_more (1);
+ *p = 6 + strlen (name) + 1;
+ p = frag_more (1);
*p = EXT_AUX_REGISTER;
- p = frag_more(1);
+ p = frag_more (1);
*p = number >> 24 & 0xff;
- p = frag_more(1);
+ p = frag_more (1);
*p = number >> 16 & 0xff;
- p = frag_more(1);
+ p = frag_more (1);
*p = number >> 8 & 0xff;
- p = frag_more(1);
+ p = frag_more (1);
*p = number & 0xff;
- p = frag_more(strlen(name) + 1);
- strcpy(p,name);
+ p = frag_more (strlen (name) + 1);
+ strcpy (p, name);
break;
default:
- as_bad("invalid opertype");
- ignore_rest_of_line();
- free(name);
+ as_bad ("invalid opertype");
+ ignore_rest_of_line ();
+ free (name);
return;
break;
}
subseg_set (old_sec, old_subsec);
- /* enter all registers into the symbol table */
+ /* Enter all registers into the symbol table. */
- demand_empty_rest_of_line();
+ demand_empty_rest_of_line ();
}
static void
arc_extinst (ignore)
- int ignore ATTRIBUTE_UNUSED;
+ int ignore ATTRIBUTE_UNUSED;
{
unsigned char syntax[129];
char *name;
char *p;
char c;
int suffixcode = -1;
- int opcode,subopcode;
+ int opcode, subopcode;
int i;
int class = 0;
int name_len;
name = input_line_pointer;
c = get_symbol_end ();
- name = xstrdup(name);
- if (NULL == name)
- {
- ignore_rest_of_line();
- return;
- }
- strcpy(syntax,name);
- name_len = strlen(name);
+ name = xstrdup (name);
+ strcpy (syntax, name);
+ name_len = strlen (name);
- /* just after name is now '\0' */
+ /* just after name is now '\0' */
p = input_line_pointer;
*p = c;
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
opcode = get_absolute_expression ();
SKIP_WHITESPACE ();
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
subopcode = get_absolute_expression ();
- if(subopcode < 0)
+ if (subopcode < 0)
{
- as_bad ("negative subopcode %d",subopcode);
- ignore_rest_of_line();
+ as_bad ("negative subopcode %d", subopcode);
+ ignore_rest_of_line ();
return;
}
- if(subopcode)
+ if (subopcode)
{
- if(3 != opcode)
+ if (3 != opcode)
{
as_bad ("subcode value found when opcode not equal 0x03");
- ignore_rest_of_line();
+ ignore_rest_of_line ();
return;
}
else
if (subopcode < 0x09 || subopcode == 0x3f)
{
as_bad ("invalid subopcode %d", subopcode);
- ignore_rest_of_line();
+ ignore_rest_of_line ();
return;
}
}
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
- for(i = 0; i < (int) MAXSUFFIXCLASS; i++)
+ for (i = 0; i < (int) MAXSUFFIXCLASS; i++)
{
- if(!strncmp(suffixclass[i].name,input_line_pointer, suffixclass[i].len))
+ if (!strncmp (suffixclass[i].name,input_line_pointer, suffixclass[i].len))
{
suffixcode = i;
input_line_pointer += suffixclass[i].len;
}
}
- if(-1 == suffixcode)
+ if (-1 == suffixcode)
{
as_bad ("invalid suffix class");
ignore_rest_of_line ();
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
- for(i = 0; i < (int) MAXSYNTAXCLASS; i++)
+ for (i = 0; i < (int) MAXSYNTAXCLASS; i++)
{
- if(!strncmp(syntaxclass[i].name,input_line_pointer, syntaxclass[i].len))
+ if (!strncmp (syntaxclass[i].name,input_line_pointer, syntaxclass[i].len))
{
class = syntaxclass[i].class;
input_line_pointer += syntaxclass[i].len;
}
}
- if(0 == (SYNTAX_VALID & class))
+ if (0 == (SYNTAX_VALID & class))
{
as_bad ("invalid syntax class");
ignore_rest_of_line ();
return;
}
- if ((0x3 == opcode) & (class & SYNTAX_3OP))
+ if ((0x3 == opcode) & (class & SYNTAX_3OP))
{
as_bad ("opcode 0x3 and SYNTAX_3OP invalid");
ignore_rest_of_line ();
switch (suffixcode)
{
case 0:
- strcat(syntax,"%.q%.f ");
+ strcat (syntax, "%.q%.f ");
break;
case 1:
- strcat(syntax,"%.f ");
+ strcat (syntax, "%.f ");
break;
case 2:
- strcat(syntax,"%.q ");
+ strcat (syntax, "%.q ");
break;
case 3:
- strcat(syntax," ");
+ strcat (syntax, " ");
break;
default:
- as_bad("unknown suffix class");
- ignore_rest_of_line();
+ as_bad ("unknown suffix class");
+ ignore_rest_of_line ();
return;
break;
};
- strcat(syntax,((opcode == 0x3) ? "%a,%b" : ((class & SYNTAX_3OP) ? "%a,%b,%c" : "%b,%c")));
- if(suffixcode < 2)
- strcat(syntax,"%F");
- strcat(syntax,"%S%L");
+ strcat (syntax, ((opcode == 0x3) ? "%a,%b" : ((class & SYNTAX_3OP) ? "%a,%b,%c" : "%b,%c")));
+ if (suffixcode < 2)
+ strcat (syntax, "%F");
+ strcat (syntax, "%S%L");
- ext_op = (struct arc_opcode *) xmalloc(sizeof (struct arc_opcode));
- if(NULL == ext_op)
- {
- ignore_rest_of_line ();
- return;
- }
-
- ext_op->syntax = xstrdup(syntax);
- if (NULL == ext_op->syntax)
- {
- ignore_rest_of_line ();
- return;
- }
+ ext_op = (struct arc_opcode *) xmalloc (sizeof (struct arc_opcode));
+ ext_op->syntax = xstrdup (syntax);
- ext_op->mask = I(-1) | ((0x3 == opcode) ? C(-1) : 0 );
- ext_op->value = I(opcode) | ((0x3 == opcode) ? C(subopcode) : 0 );
+ ext_op->mask = I (-1) | ((0x3 == opcode) ? C (-1) : 0);
+ ext_op->value = I (opcode) | ((0x3 == opcode) ? C (subopcode) : 0);
ext_op->flags = class;
ext_op->next_asm = arc_ext_opcodes;
ext_op->next_dis = arc_ext_opcodes;
arc_ext_opcodes = ext_op;
- /* ok, now that we know what this inst is, put a description in
- the arc extension section of the output file */
+ /* OK, now that we know what this inst is, put a description in the
+ arc extension section of the output file. */
old_sec = now_seg;
old_subsec = now_subseg;
- arc_set_ext_seg();
+ arc_set_ext_seg ();
- p = frag_more(1);
- *p = 5 + name_len +1;
- p = frag_more(1);
+ p = frag_more (1);
+ *p = 5 + name_len + 1;
+ p = frag_more (1);
*p = EXT_INSTRUCTION;
- p = frag_more(1);
+ p = frag_more (1);
*p = opcode;
- p = frag_more(1);
+ p = frag_more (1);
*p = subopcode;
- p = frag_more(1);
+ p = frag_more (1);
*p = (class & (OP1_MUST_BE_IMM | OP1_IMM_IMPLIED) ? IGNORE_FIRST_OPD : 0);
- p = frag_more(name_len);
- strncpy(p,syntax,name_len);
- p = frag_more(1);
+ p = frag_more (name_len);
+ strncpy (p, syntax, name_len);
+ p = frag_more (1);
*p = '\0';
subseg_set (old_sec, old_subsec);
- demand_empty_rest_of_line();
+ demand_empty_rest_of_line ();
}
int
-arc_set_ext_seg()
+arc_set_ext_seg ()
{
if (!arcext_section)
{
arcext_section = subseg_new (".arcextmap", 0);
bfd_set_section_flags (stdoutput, arcext_section,
- SEC_READONLY | SEC_HAS_CONTENTS);
+ SEC_READONLY | SEC_HAS_CONTENTS);
}
else
subseg_set (arcext_section, 0);
char *name;
char c;
char *p;
- int align, size;
+ int align, size;
symbolS *symbolP;
name = input_line_pointer;
c = get_symbol_end ();
- /* just after name is now '\0' */
+ /* just after name is now '\0' */
p = input_line_pointer;
*p = c;
SKIP_WHITESPACE ();
return;
}
- input_line_pointer++; /* skip ',' */
+ input_line_pointer++; /* skip ',' */
size = get_absolute_expression ();
if (size < 0)
ignore_rest_of_line ();
return;
}
- if ( ((int) S_GET_VALUE (symbolP) != 0) \
- && ((int) S_GET_VALUE (symbolP) != size) )
+ if (((int) S_GET_VALUE (symbolP) != 0) \
+ && ((int) S_GET_VALUE (symbolP) != size))
{
as_warn ("length of symbol \"%s\" already %ld, ignoring %d",
S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
old_sec = now_seg;
old_subsec = now_subseg;
record_alignment (bss_section, align);
- subseg_set (bss_section, 0); /* ??? subseg_set (bss_section, 1); ??? */
+ subseg_set (bss_section, 0); /* ??? subseg_set (bss_section, 1); ??? */
if (align)
- frag_align (align, 0, 0); /* do alignment */
+ /* Do alignment. */
+ frag_align (align, 0, 0);
- /* detach from old frag */
+ /* Detach from old frag. */
if (S_GET_SEGMENT (symbolP) == bss_section)
symbolP->sy_frag->fr_symbol = NULL;
symbolP->sy_frag = frag_now;
pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
- (offsetT) size, (char *) 0);
+ (offsetT) size, (char *) 0);
*pfrag = 0;
S_SET_SIZE (symbolP, size);
symbolP->bsym->flags |= BSF_OBJECT;
demand_empty_rest_of_line ();
- return;
}
-
\f
-
/* Select the cpu we're assembling for. */
static void
arc_option (ignore)
- int ignore ATTRIBUTE_UNUSED;
+ int ignore ATTRIBUTE_UNUSED;
{
int mach;
char c;
as_bad ("invalid identifier for \".option\"");
ignore_rest_of_line ();
}
-
\f
-/* 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. */
+/* 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 *
md_atof (type, litP, sizeP)
- char type;
- char *litP;
- int *sizeP;
+ int type;
+ char *litP;
+ int *sizeP;
{
int prec;
LITTLENUM_TYPE words[MAX_LITTLENUMS];
LITTLENUM_TYPE *wordP;
char *t;
- char *atof_ieee ();
switch (type)
{
}
void
-arc_code_symbol(expressionP)
+arc_code_symbol (expressionP)
expressionS *expressionP;
{
- if (expressionP->X_op == O_symbol && expressionP->X_add_number == 0
- /* I think this test is unnecessary but just as a sanity check... */
- && expressionP->X_op_symbol == NULL)
+ if (expressionP->X_op == O_symbol && expressionP->X_add_number == 0)
{
expressionS two;
expressionP->X_op = O_right_shift;
+ expressionP->X_add_symbol->sy_value.X_op = O_constant;
two.X_op = O_constant;
two.X_add_symbol = two.X_op_symbol = NULL;
two.X_add_number = 2;
expressionP->X_op_symbol = make_expr_symbol (&two);
}
- /* allow %st(sym1-sym2) */
- else if (expressionP->X_op == O_subtract && expressionP->X_add_symbol != NULL
- && expressionP->X_op_symbol != NULL && expressionP->X_add_number == 0)
+ /* Allow %st(sym1-sym2) */
+ else if (expressionP->X_op == O_subtract
+ && expressionP->X_add_symbol != NULL
+ && expressionP->X_op_symbol != NULL
+ && expressionP->X_add_number == 0)
{
expressionS two;
expressionP->X_add_symbol = make_expr_symbol (expressionP);
{
char *p = input_line_pointer;
- if (*p == '%')
- if(strncmp (p, "%st(", 4) == 0)
- {
- input_line_pointer += 4;
- expression (expressionP);
- if (*input_line_pointer != ')')
- {
- as_bad ("missing ')' in %%-op");
- return;
- }
- ++input_line_pointer;
- arc_code_symbol(expressionP);
- }
- else
- { /* it could be a register */
- int i,l;
- struct arc_ext_operand_value *ext_oper = arc_ext_operands;
- p++;
+ if (*p != '%')
+ return;
- while (ext_oper)
- {
- l = strlen(ext_oper->operand.name);
- if(!strncmp(p,ext_oper->operand.name,l) && !isalnum(*(p + l)))
- {
- input_line_pointer += l + 1;
- expressionP->X_op = O_register;
- expressionP->X_add_number = (int) &ext_oper->operand;
- return;
- }
- ext_oper = ext_oper->next;
- }
- for (i = 0; i < arc_reg_names_count; i++)
- {
- l = strlen(arc_reg_names[i].name);
- if(!strncmp(p,arc_reg_names[i].name,l) && !isalnum(*(p + l)))
- {
- input_line_pointer += l + 1;
- expressionP->X_op = O_register;
- expressionP->X_add_number = (int) &arc_reg_names[i];
- break;
- }
- }
- }
+ if (strncmp (p, "%st(", 4) == 0)
+ {
+ input_line_pointer += 4;
+ expression (expressionP);
+ if (*input_line_pointer != ')')
+ {
+ as_bad ("missing ')' in %%-op");
+ return;
+ }
+ ++input_line_pointer;
+ arc_code_symbol (expressionP);
+ }
+ else
+ {
+ /* It could be a register. */
+ int i, l;
+ struct arc_ext_operand_value *ext_oper = arc_ext_operands;
+ p++;
+
+ while (ext_oper)
+ {
+ l = strlen (ext_oper->operand.name);
+ if (!strncmp (p, ext_oper->operand.name, l) && !ISALNUM (*(p + l)))
+ {
+ input_line_pointer += l + 1;
+ expressionP->X_op = O_register;
+ expressionP->X_add_number = (int) &ext_oper->operand;
+ return;
+ }
+ ext_oper = ext_oper->next;
+ }
+ for (i = 0; i < arc_reg_names_count; i++)
+ {
+ l = strlen (arc_reg_names[i].name);
+ if (!strncmp (p, arc_reg_names[i].name, l) && !ISALNUM (*(p + l)))
+ {
+ input_line_pointer += l + 1;
+ expressionP->X_op = O_register;
+ expressionP->X_add_number = (int) &arc_reg_names[i];
+ break;
+ }
+ }
+ }
}
/* We have no need to default values of symbols.
void
arc_parse_cons_expression (exp, nbytes)
- expressionS *exp;
- unsigned int nbytes ATTRIBUTE_UNUSED;
+ expressionS *exp;
+ unsigned int nbytes ATTRIBUTE_UNUSED;
{
char *p = input_line_pointer;
int code_symbol_fix = 0;
- for (;! is_end_of_line[(unsigned char) *p]; p++)
- if (*p == '@' && !strncmp(p,"@h30",4))
+ for (; ! is_end_of_line[(unsigned char) *p]; p++)
+ if (*p == '@' && !strncmp (p, "@h30", 4))
{
code_symbol_fix = 1;
- strcpy(p,"; ");
+ strcpy (p, "; ");
}
expr (0, exp);
if (code_symbol_fix)
{
- arc_code_symbol(exp);
+ arc_code_symbol (exp);
input_line_pointer = p;
}
}
md_pcrel_from (fixP)
fixS *fixP;
{
- if (fixP->fx_addsy != (symbolS *) NULL
- && ! S_IS_DEFINED (fixP->fx_addsy))
- {
- /* The symbol is undefined. Let the linker figure it out. */
- return 0;
- }
-
/* Return the address of the delay slot. */
return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size;
}
expressionS *expnew;
{
/* If the expression is "symbol >> 2" we must change it to just "symbol",
- as fix_new_exp can't handle it. Similarily for (symbol - symbol) >> 2.
+ as fix_new_exp can't handle it. Similarly for (symbol - symbol) >> 2.
That's ok though. What's really going on here is that we're using
">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26. */
and we attempt to completely resolve the reloc. If we can not do
that, we determine the correct reloc code and put it back in the fixup. */
-int
-md_apply_fix3 (fixP, valueP, seg)
+void
+md_apply_fix3 (fixP, valP, seg)
fixS *fixP;
- valueT *valueP;
+ valueT * valP;
segT seg;
{
- /*char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;*/
- valueT value;
-
- /* FIXME FIXME FIXME: The value we are passed in *valueP includes
- the symbol values. Since we are using BFD_ASSEMBLER, if we are
- doing this relocation the code in write.c is going to call
- bfd_perform_relocation, which is also going to use the symbol
- value. That means that if the reloc is fully resolved we want to
- use *valueP since bfd_perform_relocation is not being used.
- However, if the reloc is not fully resolved we do not want to use
- *valueP, and must use fx_offset instead. However, if the reloc
- is PC relative, we do want to use *valueP since it includes the
- result of md_pcrel_from. This is confusing. */
+ valueT value = * valP;
if (fixP->fx_addsy == (symbolS *) NULL)
- {
- value = *valueP;
- fixP->fx_done = 1;
- }
+ fixP->fx_done = 1;
+
else if (fixP->fx_pcrel)
{
- value = *valueP;
- /* ELF relocations are against symbols.
- If this symbol is in a different section then we need to leave it for
- the linker to deal with. Unfortunately, md_pcrel_from can't tell,
- so we have to undo it's effects here. */
- if (S_IS_DEFINED (fixP->fx_addsy)
- && S_GET_SEGMENT (fixP->fx_addsy) != seg)
+ /* Hack around bfd_install_relocation brain damage. */
+ if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
value += md_pcrel_from (fixP);
}
- else
- {
- value = fixP->fx_offset;
- if (fixP->fx_subsy != (symbolS *) NULL)
- {
- if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)
- value -= S_GET_VALUE (fixP->fx_subsy);
- else
- {
- /* We can't actually support subtracting a symbol. */
- as_bad_where (fixP->fx_file, fixP->fx_line,
- "expression too complex");
- }
- }
- }
+
+ /* We can't actually support subtracting a symbol. */
+ if (fixP->fx_subsy != NULL)
+ as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
{
if (fixP->fx_done)
{
/* Nothing else to do here. */
- return 1;
+ return;
}
/* Determine a BFD reloc value based on the operand information.
as_bad_where (fixP->fx_file, fixP->fx_line,
"unresolved expression that must be resolved");
fixP->fx_done = 1;
- return 1;
+ return;
}
}
else
md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
value, 4);
break;
-#if 0
- case BFD_RELOC_64:
- md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
- value, 8);
- break;
-#endif
case BFD_RELOC_ARC_B26:
/* If !fixP->fx_done then `value' is an implicit addend.
We must shift it right by 2 in this case as well because the
abort ();
}
}
-
- fixP->fx_addnumber = value;
-
- return 1;
}
/* Translate internal representation of relocation info to BFD target
arelent *reloc;
reloc = (arelent *) xmalloc (sizeof (arelent));
+ reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
- reloc->sym_ptr_ptr = &fixP->fx_addsy->bsym;
+ *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
if (reloc->howto == (reloc_howto_type *) NULL)
{
as_bad_where (fixP->fx_file, fixP->fx_line,
"internal error: can't export reloc type %d (`%s')",
- fixP->fx_r_type, bfd_get_reloc_code_name (fixP->fx_r_type));
+ fixP->fx_r_type,
+ bfd_get_reloc_code_name (fixP->fx_r_type));
return NULL;
}
assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
-/* set addend to account for PC being advanced one insn before the target
- address is computed, drop fx_addnumber as it is handled elsewhere mlm */
+ /* Set addend to account for PC being advanced one insn before the
+ target address is computed. */
- reloc->addend = ( fixP->fx_pcrel ? -4 : 0 );
+ reloc->addend = (fixP->fx_pcrel ? -4 : 0);
return reloc;
}