1
/* tc-arc.c -- Assembler for the ARC
2
Copyright 1994, 1995, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3
2006, 2007, 2009, 2011 Free Software Foundation, Inc.
4
Contributed by Doug Evans (dje@cygnus.com).
6
This file is part of GAS, the GNU Assembler.
8
GAS is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3, or (at your option)
13
GAS is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
GNU General Public License for more details.
18
You should have received a copy of the GNU General Public License
19
along with GAS; see the file COPYING. If not, write to the Free
20
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24
#include "struc-symbol.h"
25
#include "safe-ctype.h"
27
#include "opcode/arc.h"
28
#include "../opcodes/arc-ext.h"
30
#include "dwarf2dbg.h"
32
const struct suffix_classes
38
{ "SUFFIX_COND|SUFFIX_FLAG",23 },
39
{ "SUFFIX_FLAG", 11 },
40
{ "SUFFIX_COND", 11 },
44
#define MAXSUFFIXCLASS (sizeof (suffixclass) / sizeof (struct suffix_classes))
46
const struct syntax_classes
53
{ "SYNTAX_3OP|OP1_MUST_BE_IMM", 26, SYNTAX_3OP|OP1_MUST_BE_IMM|SYNTAX_VALID },
54
{ "OP1_MUST_BE_IMM|SYNTAX_3OP", 26, OP1_MUST_BE_IMM|SYNTAX_3OP|SYNTAX_VALID },
55
{ "SYNTAX_2OP|OP1_IMM_IMPLIED", 26, SYNTAX_2OP|OP1_IMM_IMPLIED|SYNTAX_VALID },
56
{ "OP1_IMM_IMPLIED|SYNTAX_2OP", 26, OP1_IMM_IMPLIED|SYNTAX_2OP|SYNTAX_VALID },
57
{ "SYNTAX_3OP", 10, SYNTAX_3OP|SYNTAX_VALID },
58
{ "SYNTAX_2OP", 10, SYNTAX_2OP|SYNTAX_VALID }
61
#define MAXSYNTAXCLASS (sizeof (syntaxclass) / sizeof (struct syntax_classes))
63
/* This array holds the chars that always start a comment. If the
64
pre-processor is disabled, these aren't very useful. */
65
const char comment_chars[] = "#;";
67
/* This array holds the chars that only start a comment at the beginning of
68
a line. If the line seems to have the form '# 123 filename'
69
.line and .file directives will appear in the pre-processed output */
70
/* Note that input_file.c hand checks for '#' at the beginning of the
71
first line of the input file. This is because the compiler outputs
72
#NO_APP at the beginning of its output. */
73
/* Also note that comments started like this one will always
74
work if '/' isn't otherwise defined. */
75
const char line_comment_chars[] = "#";
77
const char line_separator_chars[] = "";
79
/* Chars that can be used to separate mant from exp in floating point nums. */
80
const char EXP_CHARS[] = "eE";
82
/* Chars that mean this number is a floating point constant
83
As in 0f12.456 or 0d1.2345e12. */
84
const char FLT_CHARS[] = "rRsSfFdD";
87
extern int target_big_endian;
88
const char *arc_target_format = DEFAULT_TARGET_FORMAT;
89
static int byte_order = DEFAULT_BYTE_ORDER;
91
static segT arcext_section;
93
/* One of bfd_mach_arc_n. */
94
static int arc_mach_type = bfd_mach_arc_6;
96
/* Non-zero if the cpu type has been explicitly specified. */
97
static int mach_type_specified_p = 0;
99
/* Non-zero if opcode tables have been initialized.
100
A .option command must appear before any instructions. */
101
static int cpu_tables_init_p = 0;
103
static struct hash_control *arc_suffix_hash = NULL;
105
const char *md_shortopts = "";
109
OPTION_EB = OPTION_MD_BASE,
118
struct option md_longopts[] =
120
{ "EB", no_argument, NULL, OPTION_EB },
121
{ "EL", no_argument, NULL, OPTION_EL },
122
{ "marc5", no_argument, NULL, OPTION_ARC5 },
123
{ "pre-v6", no_argument, NULL, OPTION_ARC5 },
124
{ "marc6", no_argument, NULL, OPTION_ARC6 },
125
{ "marc7", no_argument, NULL, OPTION_ARC7 },
126
{ "marc8", no_argument, NULL, OPTION_ARC8 },
127
{ "marc", no_argument, NULL, OPTION_ARC },
128
{ NULL, no_argument, NULL, 0 }
130
size_t md_longopts_size = sizeof (md_longopts);
132
#define IS_SYMBOL_OPERAND(o) \
133
((o) == 'b' || (o) == 'c' || (o) == 's' || (o) == 'o' || (o) == 'O')
135
struct arc_operand_value *get_ext_suffix (char *s);
137
/* Invocation line includes a switch not recognized by the base assembler.
138
See if it's a processor-specific option. */
141
md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
146
arc_mach_type = bfd_mach_arc_5;
150
arc_mach_type = bfd_mach_arc_6;
153
arc_mach_type = bfd_mach_arc_7;
156
arc_mach_type = bfd_mach_arc_8;
159
byte_order = BIG_ENDIAN;
160
arc_target_format = "elf32-bigarc";
163
byte_order = LITTLE_ENDIAN;
164
arc_target_format = "elf32-littlearc";
173
md_show_usage (FILE *stream)
177
-marc[5|6|7|8] select processor variant (default arc%d)\n\
178
-EB assemble code for a big endian cpu\n\
179
-EL assemble code for a little endian cpu\n", arc_mach_type + 5);
182
/* This function is called once, at assembler startup time. It should
183
set up all the tables, etc. that the MD part of the assembler will need.
184
Opcode selection is deferred until later because we might see a .option
190
/* The endianness can be chosen "at the factory". */
191
target_big_endian = byte_order == BIG_ENDIAN;
193
if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, arc_mach_type))
194
as_warn (_("could not set architecture and machine"));
196
/* This call is necessary because we need to initialize `arc_operand_map'
197
which may be needed before we see the first insn. */
198
arc_opcode_init_tables (arc_get_opcode_mach (arc_mach_type,
202
/* Initialize the various opcode and operand tables.
203
MACH is one of bfd_mach_arc_xxx. */
206
init_opcode_tables (int mach)
211
if ((arc_suffix_hash = hash_new ()) == NULL)
212
as_fatal (_("virtual memory exhausted"));
214
if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
215
as_warn (_("could not set architecture and machine"));
217
/* This initializes a few things in arc-opc.c that we need.
218
This must be called before the various arc_xxx_supported fns. */
219
arc_opcode_init_tables (arc_get_opcode_mach (mach, target_big_endian));
221
/* Only put the first entry of each equivalently named suffix in the
224
for (i = 0; i < arc_suffixes_count; i++)
226
if (strcmp (arc_suffixes[i].name, last) != 0)
227
hash_insert (arc_suffix_hash, arc_suffixes[i].name, (void *) (arc_suffixes + i));
228
last = arc_suffixes[i].name;
231
/* Since registers don't have a prefix, we put them in the symbol table so
232
they can't be used as symbols. This also simplifies argument parsing as
233
we can let gas parse registers for us. The recorded register number is
234
the address of the register's entry in arc_reg_names.
236
If the register name is already in the table, then the existing
237
definition is assumed to be from an .ExtCoreRegister pseudo-op. */
239
for (i = 0; i < arc_reg_names_count; i++)
241
if (symbol_find (arc_reg_names[i].name))
243
/* Use symbol_create here instead of symbol_new so we don't try to
244
output registers into the object file's symbol table. */
245
symbol_table_insert (symbol_create (arc_reg_names[i].name,
247
(valueT) &arc_reg_names[i],
248
&zero_address_frag));
251
/* Tell `.option' it's too late. */
252
cpu_tables_init_p = 1;
255
/* Insert an operand value into an instruction.
256
If REG is non-NULL, it is a register number and ignore VAL. */
259
arc_insert_operand (arc_insn insn,
260
const struct arc_operand *operand,
262
const struct arc_operand_value *reg,
267
if (operand->bits != 32)
272
if ((operand->flags & ARC_OPERAND_SIGNED) != 0)
274
if ((operand->flags & ARC_OPERAND_SIGNOPT) != 0)
275
max = (1 << operand->bits) - 1;
277
max = (1 << (operand->bits - 1)) - 1;
278
min = - (1 << (operand->bits - 1));
282
max = (1 << operand->bits) - 1;
286
if ((operand->flags & ARC_OPERAND_NEGATIVE) != 0)
291
if (test < (offsetT) min || test > (offsetT) max)
292
as_warn_value_out_of_range (_("operand"), test, (offsetT) min, (offsetT) max, file, line);
300
insn = (*operand->insert) (insn, operand, mods, reg, (long) val, &errmsg);
301
if (errmsg != (const char *) NULL)
302
as_warn ("%s", errmsg);
305
insn |= (((long) val & ((1 << operand->bits) - 1))
311
/* We need to keep a list of fixups. We can't simply generate them as
312
we go, because that would require us to first create the frag, and
313
that would screw up references to ``.''. */
317
/* index into `arc_operands' */
324
#define MAX_SUFFIXES 5
326
/* Compute the reloc type of an expression.
327
The possibly modified expression is stored in EXPNEW.
329
This is used to convert the expressions generated by the %-op's into
330
the appropriate operand type. It is called for both data in instructions
331
(operands) and data outside instructions (variables, debugging info, etc.).
333
Currently supported %-ops:
335
%st(symbol): represented as "symbol >> 2"
336
"st" is short for STatus as in the status register (pc)
338
DEFAULT_TYPE is the type to use if no special processing is required.
340
DATA_P is non-zero for data or limm values, zero for insn operands.
341
Remember that the opcode "insertion fns" cannot be used on data, they're
342
only for inserting operands into insns. They also can't be used for limm
343
values as the insertion routines don't handle limm values. When called for
344
insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED). When
345
called for data or limm values we use real reloc types. */
348
get_arc_exp_reloc_type (int data_p,
353
/* If the expression is "symbol >> 2" we must change it to just "symbol",
354
as fix_new_exp can't handle it. Similarly for (symbol - symbol) >> 2.
355
That's ok though. What's really going on here is that we're using
356
">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26. */
358
if (exp->X_op == O_right_shift
359
&& exp->X_op_symbol != NULL
360
&& exp->X_op_symbol->sy_value.X_op == O_constant
361
&& exp->X_op_symbol->sy_value.X_add_number == 2
362
&& exp->X_add_number == 0)
364
if (exp->X_add_symbol != NULL
365
&& (exp->X_add_symbol->sy_value.X_op == O_constant
366
|| exp->X_add_symbol->sy_value.X_op == O_symbol))
369
expnew->X_op = O_symbol;
370
expnew->X_op_symbol = NULL;
371
return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
373
else if (exp->X_add_symbol != NULL
374
&& exp->X_add_symbol->sy_value.X_op == O_subtract)
376
*expnew = exp->X_add_symbol->sy_value;
377
return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
386
arc_set_ext_seg (void)
390
arcext_section = subseg_new (".arcextmap", 0);
391
bfd_set_section_flags (stdoutput, arcext_section,
392
SEC_READONLY | SEC_HAS_CONTENTS);
395
subseg_set (arcext_section, 0);
400
arc_extoper (int opertype)
408
struct arc_ext_operand_value *ext_oper;
414
name = input_line_pointer;
415
c = get_symbol_end ();
416
name = xstrdup (name);
425
/* just after name is now '\0' */
426
p = input_line_pointer;
430
if (*input_line_pointer != ',')
432
as_bad (_("expected comma after operand name"));
433
ignore_rest_of_line ();
438
input_line_pointer++; /* skip ',' */
439
number = get_absolute_expression ();
443
as_bad (_("negative operand number %d"), number);
444
ignore_rest_of_line ();
453
if (*input_line_pointer != ',')
455
as_bad (_("expected comma after register-number"));
456
ignore_rest_of_line ();
461
input_line_pointer++; /* skip ',' */
462
mode = input_line_pointer;
464
if (!strncmp (mode, "r|w", 3))
467
input_line_pointer += 3;
471
if (!strncmp (mode, "r", 1))
473
imode = ARC_REGISTER_READONLY;
474
input_line_pointer += 1;
478
if (strncmp (mode, "w", 1))
480
as_bad (_("invalid mode"));
481
ignore_rest_of_line ();
487
imode = ARC_REGISTER_WRITEONLY;
488
input_line_pointer += 1;
495
if (*input_line_pointer != ',')
497
as_bad (_("expected comma after register-mode"));
498
ignore_rest_of_line ();
503
input_line_pointer++; /* skip ',' */
505
if (!strncmp (input_line_pointer, "cannot_shortcut", 15))
507
imode |= arc_get_noshortcut_flag ();
508
input_line_pointer += 15;
512
if (strncmp (input_line_pointer, "can_shortcut", 12))
514
as_bad (_("shortcut designator invalid"));
515
ignore_rest_of_line ();
521
input_line_pointer += 12;
527
if ((opertype == 1) && number > 60)
529
as_bad (_("core register value (%d) too large"), number);
530
ignore_rest_of_line ();
535
if ((opertype == 0) && number > 31)
537
as_bad (_("condition code value (%d) too large"), number);
538
ignore_rest_of_line ();
543
ext_oper = (struct arc_ext_operand_value *)
544
xmalloc (sizeof (struct arc_ext_operand_value));
548
/* If the symbol already exists, point it at the new definition. */
549
if ((symbolP = symbol_find (name)))
551
if (S_GET_SEGMENT (symbolP) == reg_section)
552
S_SET_VALUE (symbolP, (valueT) &ext_oper->operand);
555
as_bad (_("attempt to override symbol: %s"), name);
556
ignore_rest_of_line ();
564
/* If its not there, add it. */
565
symbol_table_insert (symbol_create (name, reg_section,
566
(valueT) &ext_oper->operand,
567
&zero_address_frag));
571
ext_oper->operand.name = name;
572
ext_oper->operand.value = number;
573
ext_oper->operand.type = arc_operand_type (opertype);
574
ext_oper->operand.flags = imode;
576
ext_oper->next = arc_ext_operands;
577
arc_ext_operands = ext_oper;
579
/* OK, now that we know what this operand is, put a description in
580
the arc extension section of the output file. */
583
old_subsec = now_subseg;
591
*p = 3 + strlen (name) + 1;
596
p = frag_more (strlen (name) + 1);
601
*p = 3 + strlen (name) + 1;
603
*p = EXT_CORE_REGISTER;
606
p = frag_more (strlen (name) + 1);
611
*p = 6 + strlen (name) + 1;
613
*p = EXT_AUX_REGISTER;
615
*p = number >> 24 & 0xff;
617
*p = number >> 16 & 0xff;
619
*p = number >> 8 & 0xff;
622
p = frag_more (strlen (name) + 1);
626
as_bad (_("invalid opertype"));
627
ignore_rest_of_line ();
633
subseg_set (old_sec, old_subsec);
635
/* Enter all registers into the symbol table. */
637
demand_empty_rest_of_line ();
641
arc_extinst (int ignore ATTRIBUTE_UNUSED)
648
int opcode, subopcode;
652
struct arc_opcode *ext_op;
657
name = input_line_pointer;
658
c = get_symbol_end ();
659
name = xstrdup (name);
660
strcpy (syntax, name);
661
name_len = strlen (name);
663
/* just after name is now '\0' */
664
p = input_line_pointer;
669
if (*input_line_pointer != ',')
671
as_bad (_("expected comma after operand name"));
672
ignore_rest_of_line ();
676
input_line_pointer++; /* skip ',' */
677
opcode = get_absolute_expression ();
681
if (*input_line_pointer != ',')
683
as_bad (_("expected comma after opcode"));
684
ignore_rest_of_line ();
688
input_line_pointer++; /* skip ',' */
689
subopcode = get_absolute_expression ();
693
as_bad (_("negative subopcode %d"), subopcode);
694
ignore_rest_of_line ();
702
as_bad (_("subcode value found when opcode not equal 0x03"));
703
ignore_rest_of_line ();
708
if (subopcode < 0x09 || subopcode == 0x3f)
710
as_bad (_("invalid subopcode %d"), subopcode);
711
ignore_rest_of_line ();
719
if (*input_line_pointer != ',')
721
as_bad (_("expected comma after subopcode"));
722
ignore_rest_of_line ();
726
input_line_pointer++; /* skip ',' */
728
for (i = 0; i < (int) MAXSUFFIXCLASS; i++)
730
if (!strncmp (suffixclass[i].name,input_line_pointer, suffixclass[i].len))
733
input_line_pointer += suffixclass[i].len;
738
if (-1 == suffixcode)
740
as_bad (_("invalid suffix class"));
741
ignore_rest_of_line ();
747
if (*input_line_pointer != ',')
749
as_bad (_("expected comma after suffix class"));
750
ignore_rest_of_line ();
754
input_line_pointer++; /* skip ',' */
756
for (i = 0; i < (int) MAXSYNTAXCLASS; i++)
758
if (!strncmp (syntaxclass[i].name,input_line_pointer, syntaxclass[i].len))
760
s_class = syntaxclass[i].s_class;
761
input_line_pointer += syntaxclass[i].len;
766
if (0 == (SYNTAX_VALID & s_class))
768
as_bad (_("invalid syntax class"));
769
ignore_rest_of_line ();
773
if ((0x3 == opcode) & (s_class & SYNTAX_3OP))
775
as_bad (_("opcode 0x3 and SYNTAX_3OP invalid"));
776
ignore_rest_of_line ();
783
strcat (syntax, "%.q%.f ");
786
strcat (syntax, "%.f ");
789
strcat (syntax, "%.q ");
792
strcat (syntax, " ");
795
as_bad (_("unknown suffix class"));
796
ignore_rest_of_line ();
801
strcat (syntax, ((opcode == 0x3) ? "%a,%b" : ((s_class & SYNTAX_3OP) ? "%a,%b,%c" : "%b,%c")));
803
strcat (syntax, "%F");
804
strcat (syntax, "%S%L");
806
ext_op = (struct arc_opcode *) xmalloc (sizeof (struct arc_opcode));
807
ext_op->syntax = xstrdup (syntax);
809
ext_op->mask = I (-1) | ((0x3 == opcode) ? C (-1) : 0);
810
ext_op->value = I (opcode) | ((0x3 == opcode) ? C (subopcode) : 0);
811
ext_op->flags = s_class;
812
ext_op->next_asm = arc_ext_opcodes;
813
ext_op->next_dis = arc_ext_opcodes;
814
arc_ext_opcodes = ext_op;
816
/* OK, now that we know what this inst is, put a description in the
817
arc extension section of the output file. */
820
old_subsec = now_subseg;
825
*p = 5 + name_len + 1;
827
*p = EXT_INSTRUCTION;
833
*p = (s_class & (OP1_MUST_BE_IMM | OP1_IMM_IMPLIED) ? IGNORE_FIRST_OPD : 0);
834
p = frag_more (name_len);
835
strncpy (p, syntax, name_len);
839
subseg_set (old_sec, old_subsec);
841
demand_empty_rest_of_line ();
845
arc_common (int localScope)
853
name = input_line_pointer;
854
c = get_symbol_end ();
855
/* just after name is now '\0' */
856
p = input_line_pointer;
860
if (*input_line_pointer != ',')
862
as_bad (_("expected comma after symbol name"));
863
ignore_rest_of_line ();
867
input_line_pointer++; /* skip ',' */
868
size = get_absolute_expression ();
872
as_bad (_("negative symbol length"));
873
ignore_rest_of_line ();
878
symbolP = symbol_find_or_make (name);
881
if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
883
as_bad (_("ignoring attempt to re-define symbol"));
884
ignore_rest_of_line ();
887
if (((int) S_GET_VALUE (symbolP) != 0) \
888
&& ((int) S_GET_VALUE (symbolP) != size))
890
as_warn (_("length of symbol \"%s\" already %ld, ignoring %d"),
891
S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
893
gas_assert (symbolP->sy_frag == &zero_address_frag);
895
/* Now parse the alignment field. This field is optional for
896
local and global symbols. Default alignment is zero. */
897
if (*input_line_pointer == ',')
899
input_line_pointer++;
900
align = get_absolute_expression ();
904
as_warn (_("assuming symbol alignment of zero"));
917
old_subsec = now_subseg;
918
record_alignment (bss_section, align);
919
subseg_set (bss_section, 0); /* ??? subseg_set (bss_section, 1); ??? */
923
frag_align (align, 0, 0);
925
/* Detach from old frag. */
926
if (S_GET_SEGMENT (symbolP) == bss_section)
927
symbolP->sy_frag->fr_symbol = NULL;
929
symbolP->sy_frag = frag_now;
930
pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
931
(offsetT) size, (char *) 0);
934
S_SET_SIZE (symbolP, size);
935
S_SET_SEGMENT (symbolP, bss_section);
936
S_CLEAR_EXTERNAL (symbolP);
937
symbol_get_obj (symbolP)->local = 1;
938
subseg_set (old_sec, old_subsec);
942
S_SET_VALUE (symbolP, (valueT) size);
943
S_SET_ALIGN (symbolP, align);
944
S_SET_EXTERNAL (symbolP);
945
S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
948
symbolP->bsym->flags |= BSF_OBJECT;
950
demand_empty_rest_of_line ();
953
/* Select the cpu we're assembling for. */
956
arc_option (int ignore ATTRIBUTE_UNUSED)
958
extern int arc_get_mach (char *);
963
cpu = input_line_pointer;
964
c = get_symbol_end ();
965
mach = arc_get_mach (cpu);
966
*input_line_pointer = c;
968
/* If an instruction has already been seen, it's too late. */
969
if (cpu_tables_init_p)
971
as_bad (_("\".option\" directive must appear before any instructions"));
972
ignore_rest_of_line ();
979
if (mach_type_specified_p && mach != arc_mach_type)
981
as_bad (_("\".option\" directive conflicts with initial definition"));
982
ignore_rest_of_line ();
987
/* The cpu may have been selected on the command line. */
988
if (mach != arc_mach_type)
989
as_warn (_("\".option\" directive overrides command-line (default) value"));
990
arc_mach_type = mach;
991
if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
992
as_fatal (_("could not set architecture and machine"));
993
mach_type_specified_p = 1;
995
demand_empty_rest_of_line ();
999
as_bad (_("invalid identifier for \".option\""));
1000
ignore_rest_of_line ();
1004
md_atof (int type, char *litP, int *sizeP)
1006
return ieee_md_atof (type, litP, sizeP, TRUE);
1009
/* Write a value out to the object file, using the appropriate
1013
md_number_to_chars (char *buf, valueT val, int n)
1015
if (target_big_endian)
1016
number_to_chars_bigendian (buf, val, n);
1018
number_to_chars_littleendian (buf, val, n);
1021
/* Round up a section size to the appropriate boundary. */
1024
md_section_align (segT segment, valueT size)
1026
int align = bfd_get_section_alignment (stdoutput, segment);
1028
return ((size + (1 << align) - 1) & (-1 << align));
1031
/* We don't have any form of relaxing. */
1034
md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1035
asection *seg ATTRIBUTE_UNUSED)
1037
as_fatal (_("relaxation not supported\n"));
1041
/* Convert a machine dependent frag. We never generate these. */
1044
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1045
asection *sec ATTRIBUTE_UNUSED,
1046
fragS *fragp ATTRIBUTE_UNUSED)
1052
arc_code_symbol (expressionS *expressionP)
1054
if (expressionP->X_op == O_symbol && expressionP->X_add_number == 0)
1058
expressionP->X_op = O_right_shift;
1059
expressionP->X_add_symbol->sy_value.X_op = O_constant;
1060
two.X_op = O_constant;
1061
two.X_add_symbol = two.X_op_symbol = NULL;
1062
two.X_add_number = 2;
1063
expressionP->X_op_symbol = make_expr_symbol (&two);
1065
/* Allow %st(sym1-sym2) */
1066
else if (expressionP->X_op == O_subtract
1067
&& expressionP->X_add_symbol != NULL
1068
&& expressionP->X_op_symbol != NULL
1069
&& expressionP->X_add_number == 0)
1073
expressionP->X_add_symbol = make_expr_symbol (expressionP);
1074
expressionP->X_op = O_right_shift;
1075
two.X_op = O_constant;
1076
two.X_add_symbol = two.X_op_symbol = NULL;
1077
two.X_add_number = 2;
1078
expressionP->X_op_symbol = make_expr_symbol (&two);
1081
as_bad (_("expression too complex code symbol"));
1084
/* Parse an operand that is machine-specific.
1086
The ARC has a special %-op to adjust addresses so they're usable in
1087
branches. The "st" is short for the STatus register.
1088
??? Later expand this to take a flags value too.
1090
??? We can't create new expression types so we map the %-op's onto the
1091
existing syntax. This means that the user could use the chosen syntax
1092
to achieve the same effect. */
1095
md_operand (expressionS *expressionP)
1097
char *p = input_line_pointer;
1102
if (strncmp (p, "%st(", 4) == 0)
1104
input_line_pointer += 4;
1105
expression (expressionP);
1106
if (*input_line_pointer != ')')
1108
as_bad (_("missing ')' in %%-op"));
1111
++input_line_pointer;
1112
arc_code_symbol (expressionP);
1116
/* It could be a register. */
1118
struct arc_ext_operand_value *ext_oper = arc_ext_operands;
1123
l = strlen (ext_oper->operand.name);
1124
if (!strncmp (p, ext_oper->operand.name, l) && !ISALNUM (*(p + l)))
1126
input_line_pointer += l + 1;
1127
expressionP->X_op = O_register;
1128
expressionP->X_add_number = (offsetT) &ext_oper->operand;
1131
ext_oper = ext_oper->next;
1133
for (i = 0; i < arc_reg_names_count; i++)
1135
l = strlen (arc_reg_names[i].name);
1136
if (!strncmp (p, arc_reg_names[i].name, l) && !ISALNUM (*(p + l)))
1138
input_line_pointer += l + 1;
1139
expressionP->X_op = O_register;
1140
expressionP->X_add_number = (offsetT) &arc_reg_names[i];
1147
/* We have no need to default values of symbols.
1148
We could catch register names here, but that is handled by inserting
1149
them all in the symbol table to begin with. */
1152
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1157
/* Functions concerning expressions. */
1159
/* Parse a .byte, .word, etc. expression.
1161
Values for the status register are specified with %st(label).
1162
`label' will be right shifted by 2. */
1165
arc_parse_cons_expression (expressionS *exp,
1166
unsigned int nbytes ATTRIBUTE_UNUSED)
1168
char *p = input_line_pointer;
1169
int code_symbol_fix = 0;
1171
for (; ! is_end_of_line[(unsigned char) *p]; p++)
1172
if (*p == '@' && !strncmp (p, "@h30", 4))
1174
code_symbol_fix = 1;
1177
expression_and_evaluate (exp);
1178
if (code_symbol_fix)
1180
arc_code_symbol (exp);
1181
input_line_pointer = p;
1185
/* Record a fixup for a cons expression. */
1188
arc_cons_fix_new (fragS *frag,
1198
/* This may be a special ARC reloc (eg: %st()). */
1199
reloc_type = get_arc_exp_reloc_type (1, BFD_RELOC_32, exp, &exptmp);
1200
fix_new_exp (frag, where, nbytes, &exptmp, 0,
1201
(enum bfd_reloc_code_real) reloc_type);
1205
fix_new_exp (frag, where, nbytes, exp, 0,
1206
nbytes == 2 ? BFD_RELOC_16
1207
: nbytes == 8 ? BFD_RELOC_64
1212
/* Functions concerning relocs. */
1214
/* The location from which a PC relative jump should be calculated,
1215
given a PC relative reloc. */
1218
md_pcrel_from (fixS *fixP)
1220
/* Return the address of the delay slot. */
1221
return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size;
1224
/* Apply a fixup to the object code. This is called for all the
1225
fixups we generated by the call to fix_new_exp, above. In the call
1226
above we used a reloc code which was the largest legal reloc code
1227
plus the operand index. Here we undo that to recover the operand
1228
index. At this point all symbol values should be fully resolved,
1229
and we attempt to completely resolve the reloc. If we can not do
1230
that, we determine the correct reloc code and put it back in the fixup. */
1233
md_apply_fix (fixS *fixP, valueT * valP, segT seg)
1235
valueT value = * valP;
1237
if (fixP->fx_addsy == (symbolS *) NULL)
1240
else if (fixP->fx_pcrel)
1242
/* Hack around bfd_install_relocation brain damage. */
1243
if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
1244
value += md_pcrel_from (fixP);
1247
/* We can't actually support subtracting a symbol. */
1248
if (fixP->fx_subsy != NULL)
1249
as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1251
if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1254
const struct arc_operand *operand;
1258
opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1260
operand = &arc_operands[opindex];
1262
/* Fetch the instruction, insert the fully resolved operand
1263
value, and stuff the instruction back again. */
1264
where = fixP->fx_frag->fr_literal + fixP->fx_where;
1265
if (target_big_endian)
1266
insn = bfd_getb32 ((unsigned char *) where);
1268
insn = bfd_getl32 ((unsigned char *) where);
1269
insn = arc_insert_operand (insn, operand, -1, NULL, (offsetT) value,
1270
fixP->fx_file, fixP->fx_line);
1271
if (target_big_endian)
1272
bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1274
bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
1277
/* Nothing else to do here. */
1280
/* Determine a BFD reloc value based on the operand information.
1281
We are only prepared to turn a few of the operands into relocs.
1282
!!! Note that we can't handle limm values here. Since we're using
1283
implicit addends the addend must be inserted into the instruction,
1284
however, the opcode insertion routines currently do nothing with
1286
if (operand->fmt == 'B')
1288
gas_assert ((operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0
1289
&& operand->bits == 20
1290
&& operand->shift == 7);
1291
fixP->fx_r_type = BFD_RELOC_ARC_B22_PCREL;
1293
else if (operand->fmt == 'J')
1295
gas_assert ((operand->flags & ARC_OPERAND_ABSOLUTE_BRANCH) != 0
1296
&& operand->bits == 24
1297
&& operand->shift == 32);
1298
fixP->fx_r_type = BFD_RELOC_ARC_B26;
1300
else if (operand->fmt == 'L')
1302
gas_assert ((operand->flags & ARC_OPERAND_LIMM) != 0
1303
&& operand->bits == 32
1304
&& operand->shift == 32);
1305
fixP->fx_r_type = BFD_RELOC_32;
1309
as_bad_where (fixP->fx_file, fixP->fx_line,
1310
_("unresolved expression that must be resolved"));
1317
switch (fixP->fx_r_type)
1320
md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1324
md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1328
md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1331
case BFD_RELOC_ARC_B26:
1332
/* If !fixP->fx_done then `value' is an implicit addend.
1333
We must shift it right by 2 in this case as well because the
1334
linker performs the relocation and then adds this in (as opposed
1335
to adding this in and then shifting right by 2). */
1337
md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1346
/* Translate internal representation of relocation info to BFD target
1350
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED,
1355
reloc = (arelent *) xmalloc (sizeof (arelent));
1356
reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1358
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
1359
reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
1360
reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
1361
if (reloc->howto == (reloc_howto_type *) NULL)
1363
as_bad_where (fixP->fx_file, fixP->fx_line,
1364
_("internal error: can't export reloc type %d (`%s')"),
1366
bfd_get_reloc_code_name (fixP->fx_r_type));
1370
gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
1372
/* Set addend to account for PC being advanced one insn before the
1373
target address is computed. */
1375
reloc->addend = (fixP->fx_pcrel ? -4 : 0);
1380
const pseudo_typeS md_pseudo_table[] =
1382
{ "align", s_align_bytes, 0 }, /* Defaulting is invalid (0). */
1383
{ "comm", arc_common, 0 },
1384
{ "common", arc_common, 0 },
1385
{ "lcomm", arc_common, 1 },
1386
{ "lcommon", arc_common, 1 },
1387
{ "2byte", cons, 2 },
1388
{ "half", cons, 2 },
1389
{ "short", cons, 2 },
1390
{ "3byte", cons, 3 },
1391
{ "4byte", cons, 4 },
1392
{ "word", cons, 4 },
1393
{ "option", arc_option, 0 },
1394
{ "cpu", arc_option, 0 },
1395
{ "block", s_space, 0 },
1396
{ "extcondcode", arc_extoper, 0 },
1397
{ "extcoreregister", arc_extoper, 1 },
1398
{ "extauxregister", arc_extoper, 2 },
1399
{ "extinstruction", arc_extinst, 0 },
1403
/* This routine is called for each instruction to be assembled. */
1406
md_assemble (char *str)
1408
const struct arc_opcode *opcode;
1409
const struct arc_opcode *std_opcode;
1410
struct arc_opcode *ext_opcode;
1412
const char *last_errmsg = 0;
1414
static int init_tables_p = 0;
1416
/* Opcode table initialization is deferred until here because we have to
1417
wait for a possible .option command. */
1420
init_opcode_tables (arc_mach_type);
1424
/* Skip leading white space. */
1425
while (ISSPACE (*str))
1428
/* The instructions are stored in lists hashed by the first letter (though
1429
we needn't care how they're hashed). Get the first in the list. */
1431
ext_opcode = arc_ext_opcodes;
1432
std_opcode = arc_opcode_lookup_asm (str);
1434
/* Keep looking until we find a match. */
1436
for (opcode = (ext_opcode ? ext_opcode : std_opcode);
1438
opcode = (ARC_OPCODE_NEXT_ASM (opcode)
1439
? ARC_OPCODE_NEXT_ASM (opcode)
1440
: (ext_opcode ? ext_opcode = NULL, std_opcode : NULL)))
1442
int past_opcode_p, fc, num_suffixes;
1445
struct arc_fixup fixups[MAX_FIXUPS];
1446
/* Used as a sanity check. If we need a limm reloc, make sure we ask
1447
for an extra 4 bytes from frag_more. */
1450
const struct arc_operand_value *insn_suffixes[MAX_SUFFIXES];
1452
/* Is this opcode supported by the selected cpu? */
1453
if (! arc_opcode_supported (opcode))
1456
/* Scan the syntax string. If it doesn't match, try the next one. */
1457
arc_opcode_init_insert ();
1458
insn = opcode->value;
1465
/* We don't check for (*str != '\0') here because we want to parse
1466
any trailing fake arguments in the syntax string. */
1467
for (str = start, syn = opcode->syntax; *syn != '\0';)
1470
const struct arc_operand *operand;
1472
/* Non operand chars must match exactly. */
1473
if (*syn != '%' || *++syn == '%')
1487
/* We have an operand. Pick out any modifiers. */
1489
while (ARC_MOD_P (arc_operands[arc_operand_map[(int) *syn]].flags))
1491
mods |= arc_operands[arc_operand_map[(int) *syn]].flags & ARC_MOD_BITS;
1494
operand = arc_operands + arc_operand_map[(int) *syn];
1495
if (operand->fmt == 0)
1496
as_fatal (_("unknown syntax format character `%c'"), *syn);
1498
if (operand->flags & ARC_OPERAND_FAKE)
1500
const char *errmsg = NULL;
1501
if (operand->insert)
1503
insn = (*operand->insert) (insn, operand, mods, NULL, 0, &errmsg);
1504
if (errmsg != (const char *) NULL)
1506
last_errmsg = errmsg;
1507
if (operand->flags & ARC_OPERAND_ERROR)
1509
as_bad ("%s", errmsg);
1512
else if (operand->flags & ARC_OPERAND_WARN)
1513
as_warn ("%s", errmsg);
1517
&& (operand->flags && operand->flags & ARC_OPERAND_LIMM)
1518
&& (operand->flags &
1519
(ARC_OPERAND_ABSOLUTE_BRANCH | ARC_OPERAND_ADDRESS)))
1521
fixups[fix_up_at].opindex = arc_operand_map[operand->fmt];
1526
/* Are we finished with suffixes? */
1527
else if (!past_opcode_p)
1532
const struct arc_operand_value *suf, *suffix_end;
1533
const struct arc_operand_value *suffix = NULL;
1535
if (!(operand->flags & ARC_OPERAND_SUFFIX))
1538
/* If we're at a space in the input string, we want to skip the
1539
remaining suffixes. There may be some fake ones though, so
1540
just go on to try the next one. */
1548
if (mods & ARC_MOD_DOT)
1556
/* This can happen in "b.nd foo" and we're currently looking
1557
for "%q" (ie: a condition code suffix). */
1565
/* Pick the suffix out and look it up via the hash table. */
1566
for (t = s; *t && ISALNUM (*t); ++t)
1570
if ((suf = get_ext_suffix (s)))
1573
suf = (const struct arc_operand_value *)
1574
hash_find (arc_suffix_hash, s);
1577
/* This can happen in "blle foo" and we're currently using
1578
the template "b%q%.n %j". The "bl" insn occurs later in
1579
the table so "lle" isn't an illegal suffix. */
1584
/* Is it the right type? Note that the same character is used
1585
several times, so we have to examine all of them. This is
1586
relatively efficient as equivalent entries are kept
1587
together. If it's not the right type, don't increment `str'
1588
so we try the next one in the series. */
1590
if (ext_suffix_p && arc_operands[suf->type].fmt == *syn)
1592
/* Insert the suffix's value into the insn. */
1594
if (operand->insert)
1595
insn = (*operand->insert) (insn, operand,
1596
mods, NULL, suf->value,
1599
insn |= suf->value << operand->shift;
1607
suffix_end = arc_suffixes + arc_suffixes_count;
1609
suffix < suffix_end && strcmp (suffix->name, suf->name) == 0;
1612
if (arc_operands[suffix->type].fmt == *syn)
1614
/* Insert the suffix's value into the insn. */
1615
if (operand->insert)
1616
insn = (*operand->insert) (insn, operand,
1617
mods, NULL, suffix->value,
1620
insn |= suffix->value << operand->shift;
1630
/* Wrong type. Just go on to try next insn entry. */
1634
if (num_suffixes == MAX_SUFFIXES)
1635
as_bad (_("too many suffixes"));
1637
insn_suffixes[num_suffixes++] = suffix;
1641
/* This is either a register or an expression of some kind. */
1644
const struct arc_operand_value *reg = NULL;
1648
if (operand->flags & ARC_OPERAND_SUFFIX)
1651
/* Is there anything left to parse?
1652
We don't check for this at the top because we want to parse
1653
any trailing fake arguments in the syntax string. */
1654
if (is_end_of_line[(unsigned char) *str])
1657
/* Parse the operand. */
1658
hold = input_line_pointer;
1659
input_line_pointer = str;
1661
str = input_line_pointer;
1662
input_line_pointer = hold;
1664
if (exp.X_op == O_illegal)
1665
as_bad (_("illegal operand"));
1666
else if (exp.X_op == O_absent)
1667
as_bad (_("missing operand"));
1668
else if (exp.X_op == O_constant)
1669
value = exp.X_add_number;
1670
else if (exp.X_op == O_register)
1671
reg = (struct arc_operand_value *) exp.X_add_number;
1672
#define IS_REG_DEST_OPERAND(o) ((o) == 'a')
1673
else if (IS_REG_DEST_OPERAND (*syn))
1674
as_bad (_("symbol as destination register"));
1677
if (!strncmp (str, "@h30", 4))
1679
arc_code_symbol (&exp);
1682
/* We need to generate a fixup for this expression. */
1683
if (fc >= MAX_FIXUPS)
1684
as_fatal (_("too many fixups"));
1685
fixups[fc].exp = exp;
1686
/* We don't support shimm relocs. break here to force
1687
the assembler to output a limm. */
1688
#define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
1689
if (IS_REG_SHIMM_OFFSET (*syn))
1691
/* If this is a register constant (IE: one whose
1692
register value gets stored as 61-63) then this
1694
/* ??? This bit could use some cleaning up.
1695
Referencing the format chars like this goes
1697
if (IS_SYMBOL_OPERAND (*syn))
1701
/* Save this, we don't yet know what reloc to use. */
1703
/* Tell insert_reg we need a limm. This is
1704
needed because the value at this point is
1706
/* ??? We need a cleaner interface than this. */
1707
(*arc_operands[arc_operand_map['Q']].insert)
1708
(insn, operand, mods, reg, 0L, &junk);
1711
fixups[fc].opindex = arc_operand_map[(int) *syn];
1716
/* Insert the register or expression into the instruction. */
1717
if (operand->insert)
1719
const char *errmsg = NULL;
1720
insn = (*operand->insert) (insn, operand, mods,
1721
reg, (long) value, &errmsg);
1722
if (errmsg != (const char *) NULL)
1724
last_errmsg = errmsg;
1725
if (operand->flags & ARC_OPERAND_ERROR)
1727
as_bad ("%s", errmsg);
1730
else if (operand->flags & ARC_OPERAND_WARN)
1731
as_warn ("%s", errmsg);
1736
insn |= (value & ((1 << operand->bits) - 1)) << operand->shift;
1742
/* If we're at the end of the syntax string, we're done. */
1743
/* FIXME: try to move this to a separate function. */
1750
/* For the moment we assume a valid `str' can only contain blanks
1751
now. IE: We needn't try again with a longer version of the
1752
insn and it is assumed that longer versions of insns appear
1753
before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */
1755
while (ISSPACE (*str))
1758
if (!is_end_of_line[(unsigned char) *str])
1759
as_bad (_("junk at end of line: `%s'"), str);
1761
/* Is there a limm value? */
1762
limm_p = arc_opcode_limm_p (&limm);
1764
/* Perform various error and warning tests. */
1767
static int in_delay_slot_p = 0;
1768
static int prev_insn_needs_cc_nop_p = 0;
1769
/* delay slot type seen */
1770
int delay_slot_type = ARC_DELAY_NONE;
1771
/* conditional execution flag seen */
1772
int conditional = 0;
1773
/* 1 if condition codes are being set */
1775
/* 1 if conditional branch, including `b' "branch always" */
1776
int cond_branch_p = opcode->flags & ARC_OPCODE_COND_BRANCH;
1778
for (i = 0; i < num_suffixes; ++i)
1780
switch (arc_operands[insn_suffixes[i]->type].fmt)
1783
delay_slot_type = insn_suffixes[i]->value;
1786
conditional = insn_suffixes[i]->value;
1794
/* Putting an insn with a limm value in a delay slot is supposed to
1795
be legal, but let's warn the user anyway. Ditto for 8 byte
1796
jumps with delay slots. */
1797
if (in_delay_slot_p && limm_p)
1798
as_warn (_("8 byte instruction in delay slot"));
1799
if (delay_slot_type != ARC_DELAY_NONE
1800
&& limm_p && arc_insn_not_jl (insn)) /* except for jl addr */
1801
as_warn (_("8 byte jump instruction with delay slot"));
1802
in_delay_slot_p = (delay_slot_type != ARC_DELAY_NONE) && !limm_p;
1804
/* Warn when a conditional branch immediately follows a set of
1805
the condition codes. Note that this needn't be done if the
1806
insn that sets the condition codes uses a limm. */
1807
if (cond_branch_p && conditional != 0 /* 0 = "always" */
1808
&& prev_insn_needs_cc_nop_p && arc_mach_type == bfd_mach_arc_5)
1809
as_warn (_("conditional branch follows set of flags"));
1810
prev_insn_needs_cc_nop_p =
1811
/* FIXME: ??? not required:
1812
(delay_slot_type != ARC_DELAY_NONE) && */
1813
cc_set_p && !limm_p;
1816
/* Write out the instruction.
1817
It is important to fetch enough space in one call to `frag_more'.
1818
We use (f - frag_now->fr_literal) to compute where we are and we
1819
don't want frag_now to change between calls. */
1823
md_number_to_chars (f, insn, 4);
1824
md_number_to_chars (f + 4, limm, 4);
1825
dwarf2_emit_insn (8);
1827
else if (limm_reloc_p)
1828
/* We need a limm reloc, but the tables think we don't. */
1833
md_number_to_chars (f, insn, 4);
1834
dwarf2_emit_insn (4);
1837
/* Create any fixups. */
1838
for (i = 0; i < fc; ++i)
1840
int op_type, reloc_type;
1842
const struct arc_operand *operand;
1844
/* Create a fixup for this operand.
1845
At this point we do not use a bfd_reloc_code_real_type for
1846
operands residing in the insn, but instead just use the
1847
operand index. This lets us easily handle fixups for any
1848
operand type, although that is admittedly not a very exciting
1849
feature. We pick a BFD reloc type in md_apply_fix.
1851
Limm values (4 byte immediate "constants") must be treated
1852
normally because they're not part of the actual insn word
1853
and thus the insertion routines don't handle them. */
1855
if (arc_operands[fixups[i].opindex].flags & ARC_OPERAND_LIMM)
1857
/* Modify the fixup addend as required by the cpu. */
1858
fixups[i].exp.X_add_number += arc_limm_fixup_adjust (insn);
1859
op_type = fixups[i].opindex;
1860
/* FIXME: can we add this data to the operand table? */
1861
if (op_type == arc_operand_map['L']
1862
|| op_type == arc_operand_map['s']
1863
|| op_type == arc_operand_map['o']
1864
|| op_type == arc_operand_map['O'])
1865
reloc_type = BFD_RELOC_32;
1866
else if (op_type == arc_operand_map['J'])
1867
reloc_type = BFD_RELOC_ARC_B26;
1870
reloc_type = get_arc_exp_reloc_type (1, reloc_type,
1876
op_type = get_arc_exp_reloc_type (0, fixups[i].opindex,
1877
&fixups[i].exp, &exptmp);
1878
reloc_type = op_type + (int) BFD_RELOC_UNUSED;
1880
operand = &arc_operands[op_type];
1881
fix_new_exp (frag_now,
1882
((f - frag_now->fr_literal)
1883
+ (operand->flags & ARC_OPERAND_LIMM ? 4 : 0)), 4,
1885
(operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0,
1886
(bfd_reloc_code_real_type) reloc_type);
1892
if (NULL == last_errmsg)
1893
as_bad (_("bad instruction `%s'"), start);
1895
as_bad ("%s", last_errmsg);