gas reloc rewrite.
[external/binutils.git] / gas / config / tc-arc.c
1 /* tc-arc.c -- Assembler for the ARC
2    Copyright 1994, 1995, 1997, 1999, 2000, 2001, 2002
3    Free Software Foundation, Inc.
4    Contributed by Doug Evans (dje@cygnus.com).
5
6    This file is part of GAS, the GNU Assembler.
7
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 2, or (at your option)
11    any later version.
12
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.
17
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, 59 Temple Place - Suite 330, Boston, MA
21    02111-1307, USA.  */
22
23 #include <stdio.h>
24 #include "libiberty.h"
25 #include "as.h"
26 #include "struc-symbol.h"
27 #include "safe-ctype.h"
28 #include "subsegs.h"
29 #include "opcode/arc.h"
30 #include "../opcodes/arc-ext.h"
31 #include "elf/arc.h"
32 #include "dwarf2dbg.h"
33
34 extern int arc_get_mach PARAMS ((char *));
35 extern int arc_operand_type PARAMS ((int));
36 extern int arc_insn_not_jl PARAMS ((arc_insn));
37 extern int arc_limm_fixup_adjust PARAMS ((arc_insn));
38 extern int arc_get_noshortcut_flag PARAMS ((void));
39 extern int arc_set_ext_seg PARAMS ((void));
40 extern void arc_code_symbol PARAMS ((expressionS *));
41
42 static arc_insn arc_insert_operand PARAMS ((arc_insn,
43                                             const struct arc_operand *, int,
44                                             const struct arc_operand_value *,
45                                             offsetT, char *, unsigned int));
46 static void arc_common PARAMS ((int));
47 static void arc_extinst PARAMS ((int));
48 static void arc_extoper PARAMS ((int));
49 static void arc_option PARAMS ((int));
50 static int  get_arc_exp_reloc_type PARAMS ((int, int, expressionS *,
51                                            expressionS *));
52
53 static void init_opcode_tables PARAMS ((int));
54
55 const struct suffix_classes {
56   char *name;
57   int  len;
58 } suffixclass[] = {
59   { "SUFFIX_COND|SUFFIX_FLAG",23 },
60   { "SUFFIX_FLAG", 11 },
61   { "SUFFIX_COND", 11 },
62   { "SUFFIX_NONE", 11 }
63 };
64
65 #define MAXSUFFIXCLASS (sizeof (suffixclass) / sizeof (struct suffix_classes))
66
67 const struct syntax_classes {
68   char *name;
69   int  len;
70   int  class;
71 } syntaxclass[] = {
72   { "SYNTAX_3OP|OP1_MUST_BE_IMM", 26, SYNTAX_3OP|OP1_MUST_BE_IMM|SYNTAX_VALID },
73   { "OP1_MUST_BE_IMM|SYNTAX_3OP", 26, OP1_MUST_BE_IMM|SYNTAX_3OP|SYNTAX_VALID },
74   { "SYNTAX_2OP|OP1_IMM_IMPLIED", 26, SYNTAX_2OP|OP1_IMM_IMPLIED|SYNTAX_VALID },
75   { "OP1_IMM_IMPLIED|SYNTAX_2OP", 26, OP1_IMM_IMPLIED|SYNTAX_2OP|SYNTAX_VALID },
76   { "SYNTAX_3OP",                 10, SYNTAX_3OP|SYNTAX_VALID },
77   { "SYNTAX_2OP",                 10, SYNTAX_2OP|SYNTAX_VALID }
78 };
79
80 #define MAXSYNTAXCLASS (sizeof (syntaxclass) / sizeof (struct syntax_classes))
81
82 const pseudo_typeS md_pseudo_table[] = {
83   { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
84   { "comm", arc_common, 0 },
85   { "common", arc_common, 0 },
86   { "lcomm", arc_common, 1 },
87   { "lcommon", arc_common, 1 },
88   { "2byte", cons, 2 },
89   { "half", cons, 2 },
90   { "short", cons, 2 },
91   { "3byte", cons, 3 },
92   { "4byte", cons, 4 },
93   { "word", cons, 4 },
94   { "option", arc_option, 0 },
95   { "cpu", arc_option, 0 },
96   { "block", s_space, 0 },
97   { "file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0 },
98   { "loc", dwarf2_directive_loc, 0 },
99   { "extcondcode", arc_extoper, 0 },
100   { "extcoreregister", arc_extoper, 1 },
101   { "extauxregister", arc_extoper, 2 },
102   { "extinstruction", arc_extinst, 0 },
103   { NULL, 0, 0 },
104 };
105
106 /* This array holds the chars that always start a comment.  If the
107    pre-processor is disabled, these aren't very useful.  */
108 const char comment_chars[] = "#;";
109
110 /* This array holds the chars that only start a comment at the beginning of
111    a line.  If the line seems to have the form '# 123 filename'
112    .line and .file directives will appear in the pre-processed output */
113 /* Note that input_file.c hand checks for '#' at the beginning of the
114    first line of the input file.  This is because the compiler outputs
115    #NO_APP at the beginning of its output.  */
116 /* Also note that comments started like this one will always
117    work if '/' isn't otherwise defined.  */
118 const char line_comment_chars[] = "#";
119
120 const char line_separator_chars[] = "";
121
122 /* Chars that can be used to separate mant from exp in floating point nums.  */
123 const char EXP_CHARS[] = "eE";
124
125 /* Chars that mean this number is a floating point constant
126    As in 0f12.456 or 0d1.2345e12.  */
127 const char FLT_CHARS[] = "rRsSfFdD";
128
129 /* Byte order.  */
130 extern int target_big_endian;
131 const char *arc_target_format = DEFAULT_TARGET_FORMAT;
132 static int byte_order = DEFAULT_BYTE_ORDER;
133
134 static segT arcext_section;
135
136 /* One of bfd_mach_arc_n.  */
137 static int arc_mach_type = bfd_mach_arc_6;
138
139 /* Non-zero if the cpu type has been explicitly specified.  */
140 static int mach_type_specified_p = 0;
141
142 /* Non-zero if opcode tables have been initialized.
143    A .option command must appear before any instructions.  */
144 static int cpu_tables_init_p = 0;
145
146 static struct hash_control *arc_suffix_hash = NULL;
147 \f
148 const char *md_shortopts = "";
149 struct option md_longopts[] = {
150 #define OPTION_EB (OPTION_MD_BASE + 0)
151   { "EB", no_argument, NULL, OPTION_EB },
152 #define OPTION_EL (OPTION_MD_BASE + 1)
153   { "EL", no_argument, NULL, OPTION_EL },
154 #define OPTION_ARC5 (OPTION_MD_BASE + 2)
155   { "marc5", no_argument, NULL, OPTION_ARC5 },
156   { "pre-v6", no_argument, NULL, OPTION_ARC5 },
157 #define OPTION_ARC6 (OPTION_MD_BASE + 3)
158   { "marc6", no_argument, NULL, OPTION_ARC6 },
159 #define OPTION_ARC7 (OPTION_MD_BASE + 4)
160   { "marc7", no_argument, NULL, OPTION_ARC7 },
161 #define OPTION_ARC8 (OPTION_MD_BASE + 5)
162   { "marc8", no_argument, NULL, OPTION_ARC8 },
163 #define OPTION_ARC (OPTION_MD_BASE + 6)
164   { "marc", no_argument, NULL, OPTION_ARC },
165   { NULL, no_argument, NULL, 0 }
166 };
167 size_t md_longopts_size = sizeof (md_longopts);
168
169 #define IS_SYMBOL_OPERAND(o) \
170  ((o) == 'b' || (o) == 'c' || (o) == 's' || (o) == 'o' || (o) == 'O')
171
172 struct arc_operand_value *get_ext_suffix (char *s);
173
174 /* Invocation line includes a switch not recognized by the base assembler.
175    See if it's a processor-specific option.  */
176
177 int
178 md_parse_option (c, arg)
179      int c;
180      char *arg ATTRIBUTE_UNUSED;
181 {
182   switch (c)
183     {
184     case OPTION_ARC5:
185       arc_mach_type = bfd_mach_arc_5;
186       break;
187     case OPTION_ARC:
188     case OPTION_ARC6:
189       arc_mach_type = bfd_mach_arc_6;
190       break;
191     case OPTION_ARC7:
192       arc_mach_type = bfd_mach_arc_7;
193       break;
194     case OPTION_ARC8:
195       arc_mach_type = bfd_mach_arc_8;
196       break;
197     case OPTION_EB:
198       byte_order = BIG_ENDIAN;
199       arc_target_format = "elf32-bigarc";
200       break;
201     case OPTION_EL:
202       byte_order = LITTLE_ENDIAN;
203       arc_target_format = "elf32-littlearc";
204       break;
205     default:
206       return 0;
207     }
208   return 1;
209 }
210
211 void
212 md_show_usage (stream)
213      FILE *stream;
214 {
215   fprintf (stream, "\
216 ARC Options:\n\
217   -marc[5|6|7|8]          select processor variant (default arc%d)\n\
218   -EB                     assemble code for a big endian cpu\n\
219   -EL                     assemble code for a little endian cpu\n", arc_mach_type + 5);
220 }
221
222 /* This function is called once, at assembler startup time.  It should
223    set up all the tables, etc. that the MD part of the assembler will need.
224    Opcode selection is deferred until later because we might see a .option
225    command.  */
226
227 void
228 md_begin ()
229 {
230   /* The endianness can be chosen "at the factory".  */
231   target_big_endian = byte_order == BIG_ENDIAN;
232
233   if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, arc_mach_type))
234     as_warn ("could not set architecture and machine");
235
236   /* This call is necessary because we need to initialize `arc_operand_map'
237      which may be needed before we see the first insn.  */
238   arc_opcode_init_tables (arc_get_opcode_mach (arc_mach_type,
239                                                target_big_endian));
240 }
241
242 /* Initialize the various opcode and operand tables.
243    MACH is one of bfd_mach_arc_xxx.  */
244 static void
245 init_opcode_tables (mach)
246      int mach;
247 {
248   int i;
249   char *last;
250
251   if ((arc_suffix_hash = hash_new ()) == NULL)
252     as_fatal ("virtual memory exhausted");
253
254   if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
255     as_warn ("could not set architecture and machine");
256
257   /* This initializes a few things in arc-opc.c that we need.
258      This must be called before the various arc_xxx_supported fns.  */
259   arc_opcode_init_tables (arc_get_opcode_mach (mach, target_big_endian));
260
261   /* Only put the first entry of each equivalently named suffix in the
262      table.  */
263   last = "";
264   for (i = 0; i < arc_suffixes_count; i++)
265     {
266       if (strcmp (arc_suffixes[i].name, last) != 0)
267         hash_insert (arc_suffix_hash, arc_suffixes[i].name, (PTR) (arc_suffixes + i));
268       last = arc_suffixes[i].name;
269     }
270
271   /* Since registers don't have a prefix, we put them in the symbol table so
272      they can't be used as symbols.  This also simplifies argument parsing as
273      we can let gas parse registers for us.  The recorded register number is
274      the address of the register's entry in arc_reg_names.
275
276      If the register name is already in the table, then the existing
277      definition is assumed to be from an .ExtCoreRegister pseudo-op.  */
278
279   for (i = 0; i < arc_reg_names_count; i++)
280     {
281       if (symbol_find (arc_reg_names[i].name))
282         continue;
283       /* Use symbol_create here instead of symbol_new so we don't try to
284          output registers into the object file's symbol table.  */
285       symbol_table_insert (symbol_create (arc_reg_names[i].name,
286                                           reg_section,
287                                           (int) &arc_reg_names[i],
288                                           &zero_address_frag));
289     }
290
291   /* Tell `.option' it's too late.  */
292   cpu_tables_init_p = 1;
293 }
294 \f
295 /* Insert an operand value into an instruction.
296    If REG is non-NULL, it is a register number and ignore VAL.  */
297
298 static arc_insn
299 arc_insert_operand (insn, operand, mods, reg, val, file, line)
300      arc_insn insn;
301      const struct arc_operand *operand;
302      int mods;
303      const struct arc_operand_value *reg;
304      offsetT val;
305      char *file;
306      unsigned int line;
307 {
308   if (operand->bits != 32)
309     {
310       long min, max;
311       offsetT test;
312
313       if ((operand->flags & ARC_OPERAND_SIGNED) != 0)
314         {
315           if ((operand->flags & ARC_OPERAND_SIGNOPT) != 0)
316             max = (1 << operand->bits) - 1;
317           else
318             max = (1 << (operand->bits - 1)) - 1;
319           min = - (1 << (operand->bits - 1));
320         }
321       else
322         {
323           max = (1 << operand->bits) - 1;
324           min = 0;
325         }
326
327       if ((operand->flags & ARC_OPERAND_NEGATIVE) != 0)
328         test = - val;
329       else
330         test = val;
331
332       if (test < (offsetT) min || test > (offsetT) max)
333         {
334           const char *err =
335             "operand out of range (%s not between %ld and %ld)";
336           char buf[100];
337
338           sprint_value (buf, test);
339           if (file == (char *) NULL)
340             as_warn (err, buf, min, max);
341           else
342             as_warn_where (file, line, err, buf, min, max);
343         }
344     }
345
346   if (operand->insert)
347     {
348       const char *errmsg;
349
350       errmsg = NULL;
351       insn = (*operand->insert) (insn, operand, mods, reg, (long) val, &errmsg);
352       if (errmsg != (const char *) NULL)
353         as_warn (errmsg);
354     }
355   else
356     insn |= (((long) val & ((1 << operand->bits) - 1))
357              << operand->shift);
358
359   return insn;
360 }
361
362 /* We need to keep a list of fixups.  We can't simply generate them as
363    we go, because that would require us to first create the frag, and
364    that would screw up references to ``.''.  */
365
366 struct arc_fixup {
367   /* index into `arc_operands'  */
368   int opindex;
369   expressionS exp;
370 };
371
372 #define MAX_FIXUPS 5
373
374 #define MAX_SUFFIXES 5
375
376 /* This routine is called for each instruction to be assembled.  */
377
378 void
379 md_assemble (str)
380      char *str;
381 {
382   const struct arc_opcode *opcode;
383   const struct arc_opcode *std_opcode;
384   struct arc_opcode *ext_opcode;
385   char *start;
386   const char *last_errmsg = 0;
387   arc_insn insn;
388   static int init_tables_p = 0;
389
390   /* Opcode table initialization is deferred until here because we have to
391      wait for a possible .option command.  */
392   if (!init_tables_p)
393     {
394       init_opcode_tables (arc_mach_type);
395       init_tables_p = 1;
396     }
397
398   /* Skip leading white space.  */
399   while (ISSPACE (*str))
400     str++;
401
402   /* The instructions are stored in lists hashed by the first letter (though
403      we needn't care how they're hashed).  Get the first in the list.  */
404
405   ext_opcode = arc_ext_opcodes;
406   std_opcode = arc_opcode_lookup_asm (str);
407
408   /* Keep looking until we find a match.  */
409
410   start = str;
411   for (opcode = (ext_opcode ? ext_opcode : std_opcode);
412        opcode != NULL;
413        opcode = (ARC_OPCODE_NEXT_ASM (opcode)
414                  ? ARC_OPCODE_NEXT_ASM (opcode)
415                  : (ext_opcode ? ext_opcode = NULL, std_opcode : NULL)))
416     {
417       int past_opcode_p, fc, num_suffixes;
418       int fix_up_at = 0;
419       char *syn;
420       struct arc_fixup fixups[MAX_FIXUPS];
421       /* Used as a sanity check.  If we need a limm reloc, make sure we ask
422          for an extra 4 bytes from frag_more.  */
423       int limm_reloc_p;
424       int ext_suffix_p;
425       const struct arc_operand_value *insn_suffixes[MAX_SUFFIXES];
426
427       /* Is this opcode supported by the selected cpu?  */
428       if (! arc_opcode_supported (opcode))
429         continue;
430
431       /* Scan the syntax string.  If it doesn't match, try the next one.  */
432
433       arc_opcode_init_insert ();
434       insn = opcode->value;
435       fc = 0;
436       past_opcode_p = 0;
437       num_suffixes = 0;
438       limm_reloc_p = 0;
439       ext_suffix_p = 0;
440
441       /* We don't check for (*str != '\0') here because we want to parse
442          any trailing fake arguments in the syntax string.  */
443       for (str = start, syn = opcode->syntax; *syn != '\0';)
444         {
445           int mods;
446           const struct arc_operand *operand;
447
448           /* Non operand chars must match exactly.  */
449           if (*syn != '%' || *++syn == '%')
450             {
451               /* Handle '+' specially as we want to allow "ld r0,[sp-4]".  */
452               /* ??? The syntax has changed to [sp,-4].  */
453               if (0 && *syn == '+' && *str == '-')
454                 {
455                   /* Skip over syn's +, but leave str's - alone.
456                      That makes the case identical to "ld r0,[sp+-4]".  */
457                   ++syn;
458                 }
459               else if (*str == *syn)
460                 {
461                   if (*syn == ' ')
462                     past_opcode_p = 1;
463                   ++syn;
464                   ++str;
465                 }
466               else
467                 break;
468               continue;
469             }
470
471           /* We have an operand.  Pick out any modifiers.  */
472           mods = 0;
473           while (ARC_MOD_P (arc_operands[arc_operand_map[(int) *syn]].flags))
474             {
475               mods |= arc_operands[arc_operand_map[(int) *syn]].flags & ARC_MOD_BITS;
476               ++syn;
477             }
478           operand = arc_operands + arc_operand_map[(int) *syn];
479           if (operand->fmt == 0)
480             as_fatal ("unknown syntax format character `%c'", *syn);
481
482           if (operand->flags & ARC_OPERAND_FAKE)
483             {
484               const char *errmsg = NULL;
485               if (operand->insert)
486                 {
487                   insn = (*operand->insert) (insn, operand, mods, NULL, 0, &errmsg);
488                   if (errmsg != (const char *) NULL)
489                     {
490                       last_errmsg = errmsg;
491                       if (operand->flags & ARC_OPERAND_ERROR)
492                         {
493                           as_bad (errmsg);
494                           return;
495                         }
496                       else if (operand->flags & ARC_OPERAND_WARN)
497                         as_warn (errmsg);
498                       break;
499                     }
500                   if (limm_reloc_p
501                       && (operand->flags && operand->flags & ARC_OPERAND_LIMM)
502                       && (operand->flags &
503                           (ARC_OPERAND_ABSOLUTE_BRANCH | ARC_OPERAND_ADDRESS)))
504                     {
505                       fixups[fix_up_at].opindex = arc_operand_map[operand->fmt];
506                     }
507                 }
508               ++syn;
509             }
510           /* Are we finished with suffixes?  */
511           else if (!past_opcode_p)
512             {
513               int found;
514               char c;
515               char *s, *t;
516               const struct arc_operand_value *suf, *suffix_end;
517               const struct arc_operand_value *suffix = NULL;
518
519               if (!(operand->flags & ARC_OPERAND_SUFFIX))
520                 abort ();
521
522               /* If we're at a space in the input string, we want to skip the
523                  remaining suffixes.  There may be some fake ones though, so
524                  just go on to try the next one.  */
525               if (*str == ' ')
526                 {
527                   ++syn;
528                   continue;
529                 }
530
531               s = str;
532               if (mods & ARC_MOD_DOT)
533                 {
534                   if (*s != '.')
535                     break;
536                   ++s;
537                 }
538               else
539                 {
540                   /* This can happen in "b.nd foo" and we're currently looking
541                      for "%q" (ie: a condition code suffix).  */
542                   if (*s == '.')
543                     {
544                       ++syn;
545                       continue;
546                     }
547                 }
548
549               /* Pick the suffix out and look it up via the hash table.  */
550               for (t = s; *t && ISALNUM (*t); ++t)
551                 continue;
552               c = *t;
553               *t = '\0';
554               if ((suf = get_ext_suffix (s)))
555                 ext_suffix_p = 1;
556               else
557                 suf = hash_find (arc_suffix_hash, s);
558               if (!suf)
559                 {
560                   /* This can happen in "blle foo" and we're currently using
561                      the template "b%q%.n %j".  The "bl" insn occurs later in
562                      the table so "lle" isn't an illegal suffix.  */
563                   *t = c;
564                   break;
565                 }
566
567               /* Is it the right type?  Note that the same character is used
568                  several times, so we have to examine all of them.  This is
569                  relatively efficient as equivalent entries are kept
570                  together.  If it's not the right type, don't increment `str'
571                  so we try the next one in the series.  */
572               found = 0;
573               if (ext_suffix_p && arc_operands[suf->type].fmt == *syn)
574                 {
575                   /* Insert the suffix's value into the insn.  */
576                   *t = c;
577                   if (operand->insert)
578                     insn = (*operand->insert) (insn, operand,
579                                                mods, NULL, suf->value,
580                                                NULL);
581                   else
582                     insn |= suf->value << operand->shift;
583
584                   str = t;
585                   found = 1;
586                 }
587               else
588                 {
589                   *t = c;
590                   suffix_end = arc_suffixes + arc_suffixes_count;
591                   for (suffix = suf;
592                        suffix < suffix_end && strcmp (suffix->name, suf->name) == 0;
593                        ++suffix)
594                     {
595                       if (arc_operands[suffix->type].fmt == *syn)
596                         {
597                           /* Insert the suffix's value into the insn.  */
598                           if (operand->insert)
599                             insn = (*operand->insert) (insn, operand,
600                                                        mods, NULL, suffix->value,
601                                                        NULL);
602                           else
603                             insn |= suffix->value << operand->shift;
604
605                           str = t;
606                           found = 1;
607                           break;
608                         }
609                     }
610                 }
611               ++syn;
612               if (!found)
613                 /* Wrong type.  Just go on to try next insn entry.  */
614                 ;
615               else
616                 {
617                   if (num_suffixes == MAX_SUFFIXES)
618                     as_bad ("too many suffixes");
619                   else
620                     insn_suffixes[num_suffixes++] = suffix;
621                 }
622             }
623           else
624             /* This is either a register or an expression of some kind.  */
625             {
626               char *hold;
627               const struct arc_operand_value *reg = NULL;
628               long value = 0;
629               expressionS exp;
630
631               if (operand->flags & ARC_OPERAND_SUFFIX)
632                 abort ();
633
634               /* Is there anything left to parse?
635                  We don't check for this at the top because we want to parse
636                  any trailing fake arguments in the syntax string.  */
637               if (is_end_of_line[(unsigned char) *str])
638                 break;
639
640               /* Parse the operand.  */
641               hold = input_line_pointer;
642               input_line_pointer = str;
643               expression (&exp);
644               str = input_line_pointer;
645               input_line_pointer = hold;
646
647               if (exp.X_op == O_illegal)
648                 as_bad ("illegal operand");
649               else if (exp.X_op == O_absent)
650                 as_bad ("missing operand");
651               else if (exp.X_op == O_constant)
652                 {
653                   value = exp.X_add_number;
654                 }
655               else if (exp.X_op == O_register)
656                 {
657                   reg = (struct arc_operand_value *) exp.X_add_number;
658                 }
659 #define IS_REG_DEST_OPERAND(o) ((o) == 'a')
660               else if (IS_REG_DEST_OPERAND (*syn))
661                 as_bad ("symbol as destination register");
662               else
663                 {
664                   if (!strncmp (str, "@h30", 4))
665                     {
666                       arc_code_symbol (&exp);
667                       str += 4;
668                     }
669                   /* We need to generate a fixup for this expression.  */
670                   if (fc >= MAX_FIXUPS)
671                     as_fatal ("too many fixups");
672                   fixups[fc].exp = exp;
673                   /* We don't support shimm relocs. break here to force
674                      the assembler to output a limm.  */
675 #define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
676                   if (IS_REG_SHIMM_OFFSET (*syn))
677                     break;
678                   /* If this is a register constant (IE: one whose
679                      register value gets stored as 61-63) then this
680                      must be a limm.  */
681                   /* ??? This bit could use some cleaning up.
682                      Referencing the format chars like this goes
683                      against style.  */
684                   if (IS_SYMBOL_OPERAND (*syn))
685                     {
686                       const char *junk;
687                       limm_reloc_p = 1;
688                       /* Save this, we don't yet know what reloc to use.  */
689                       fix_up_at = fc;
690                       /* Tell insert_reg we need a limm.  This is
691                          needed because the value at this point is
692                          zero, a shimm.  */
693                       /* ??? We need a cleaner interface than this.  */
694                       (*arc_operands[arc_operand_map['Q']].insert)
695                         (insn, operand, mods, reg, 0L, &junk);
696                     }
697                   else
698                     fixups[fc].opindex = arc_operand_map[(int) *syn];
699                   ++fc;
700                   value = 0;
701                 }
702
703               /* Insert the register or expression into the instruction.  */
704               if (operand->insert)
705                 {
706                   const char *errmsg = NULL;
707                   insn = (*operand->insert) (insn, operand, mods,
708                                              reg, (long) value, &errmsg);
709                   if (errmsg != (const char *) NULL)
710                     {
711                       last_errmsg = errmsg;
712                       if (operand->flags & ARC_OPERAND_ERROR)
713                         {
714                           as_bad (errmsg);
715                           return;
716                         }
717                       else if (operand->flags & ARC_OPERAND_WARN)
718                         as_warn (errmsg);
719                       break;
720                     }
721                 }
722               else
723                 insn |= (value & ((1 << operand->bits) - 1)) << operand->shift;
724
725               ++syn;
726             }
727         }
728
729       /* If we're at the end of the syntax string, we're done.  */
730       /* FIXME: try to move this to a separate function.  */
731       if (*syn == '\0')
732         {
733           int i;
734           char *f;
735           long limm, limm_p;
736
737           /* For the moment we assume a valid `str' can only contain blanks
738              now.  IE: We needn't try again with a longer version of the
739              insn and it is assumed that longer versions of insns appear
740              before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3).  */
741
742           while (ISSPACE (*str))
743             ++str;
744
745           if (!is_end_of_line[(unsigned char) *str])
746             as_bad ("junk at end of line: `%s'", str);
747
748           /* Is there a limm value?  */
749           limm_p = arc_opcode_limm_p (&limm);
750
751           /* Perform various error and warning tests.  */
752
753           {
754             static int in_delay_slot_p = 0;
755             static int prev_insn_needs_cc_nop_p = 0;
756             /* delay slot type seen */
757             int delay_slot_type = ARC_DELAY_NONE;
758             /* conditional execution flag seen */
759             int conditional = 0;
760             /* 1 if condition codes are being set */
761             int cc_set_p = 0;
762             /* 1 if conditional branch, including `b' "branch always" */
763             int cond_branch_p = opcode->flags & ARC_OPCODE_COND_BRANCH;
764
765             for (i = 0; i < num_suffixes; ++i)
766               {
767                 switch (arc_operands[insn_suffixes[i]->type].fmt)
768                   {
769                   case 'n':
770                     delay_slot_type = insn_suffixes[i]->value;
771                     break;
772                   case 'q':
773                     conditional = insn_suffixes[i]->value;
774                     break;
775                   case 'f':
776                     cc_set_p = 1;
777                     break;
778                   }
779               }
780
781             /* Putting an insn with a limm value in a delay slot is supposed to
782                be legal, but let's warn the user anyway.  Ditto for 8 byte
783                jumps with delay slots.  */
784             if (in_delay_slot_p && limm_p)
785               as_warn ("8 byte instruction in delay slot");
786             if (delay_slot_type != ARC_DELAY_NONE
787                 && limm_p && arc_insn_not_jl (insn)) /* except for jl  addr */
788               as_warn ("8 byte jump instruction with delay slot");
789             in_delay_slot_p = (delay_slot_type != ARC_DELAY_NONE) && !limm_p;
790
791             /* Warn when a conditional branch immediately follows a set of
792                the condition codes.  Note that this needn't be done if the
793                insn that sets the condition codes uses a limm.  */
794             if (cond_branch_p && conditional != 0 /* 0 = "always" */
795                 && prev_insn_needs_cc_nop_p && arc_mach_type == bfd_mach_arc_5)
796               as_warn ("conditional branch follows set of flags");
797             prev_insn_needs_cc_nop_p =
798               /* FIXME: ??? not required:
799                  (delay_slot_type != ARC_DELAY_NONE) &&  */
800               cc_set_p && !limm_p;
801           }
802
803           /* Write out the instruction.
804              It is important to fetch enough space in one call to `frag_more'.
805              We use (f - frag_now->fr_literal) to compute where we are and we
806              don't want frag_now to change between calls.  */
807           if (limm_p)
808             {
809               f = frag_more (8);
810               md_number_to_chars (f, insn, 4);
811               md_number_to_chars (f + 4, limm, 4);
812               dwarf2_emit_insn (8);
813             }
814           else if (limm_reloc_p)
815             {
816               /* We need a limm reloc, but the tables think we don't.  */
817               abort ();
818             }
819           else
820             {
821               f = frag_more (4);
822               md_number_to_chars (f, insn, 4);
823               dwarf2_emit_insn (4);
824             }
825
826           /* Create any fixups.  */
827           for (i = 0; i < fc; ++i)
828             {
829               int op_type, reloc_type;
830               expressionS exptmp;
831               const struct arc_operand *operand;
832
833               /* Create a fixup for this operand.
834                  At this point we do not use a bfd_reloc_code_real_type for
835                  operands residing in the insn, but instead just use the
836                  operand index.  This lets us easily handle fixups for any
837                  operand type, although that is admittedly not a very exciting
838                  feature.  We pick a BFD reloc type in md_apply_fix3.
839
840                  Limm values (4 byte immediate "constants") must be treated
841                  normally because they're not part of the actual insn word
842                  and thus the insertion routines don't handle them.  */
843
844               if (arc_operands[fixups[i].opindex].flags & ARC_OPERAND_LIMM)
845                 {
846                   /* Modify the fixup addend as required by the cpu.  */
847                   fixups[i].exp.X_add_number += arc_limm_fixup_adjust (insn);
848                   op_type = fixups[i].opindex;
849                   /* FIXME: can we add this data to the operand table?  */
850                   if (op_type == arc_operand_map['L']
851                       || op_type == arc_operand_map['s']
852                       || op_type == arc_operand_map['o']
853                       || op_type == arc_operand_map['O'])
854                     reloc_type = BFD_RELOC_32;
855                   else if (op_type == arc_operand_map['J'])
856                     reloc_type = BFD_RELOC_ARC_B26;
857                   else
858                     abort ();
859                   reloc_type = get_arc_exp_reloc_type (1, reloc_type,
860                                                        &fixups[i].exp,
861                                                        &exptmp);
862                 }
863               else
864                 {
865                   op_type = get_arc_exp_reloc_type (0, fixups[i].opindex,
866                                                     &fixups[i].exp, &exptmp);
867                   reloc_type = op_type + (int) BFD_RELOC_UNUSED;
868                 }
869               operand = &arc_operands[op_type];
870               fix_new_exp (frag_now,
871                            ((f - frag_now->fr_literal)
872                             + (operand->flags & ARC_OPERAND_LIMM ? 4 : 0)), 4,
873                            &exptmp,
874                            (operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0,
875                            (bfd_reloc_code_real_type) reloc_type);
876             }
877
878           /* All done.  */
879           return;
880         }
881
882       /* Try the next entry.  */
883     }
884
885   if (NULL == last_errmsg)
886     as_bad ("bad instruction `%s'", start);
887   else
888     as_bad (last_errmsg);
889 }
890 \f
891 static void
892 arc_extoper (opertype)
893      int opertype;
894 {
895   char *name;
896   char *mode;
897   char c;
898   char *p;
899   int imode = 0;
900   int number;
901   struct arc_ext_operand_value *ext_oper;
902   symbolS *symbolP;
903
904   segT old_sec;
905   int old_subsec;
906
907   name = input_line_pointer;
908   c = get_symbol_end ();
909   name = xstrdup (name);
910   if (NULL == name)
911     {
912       ignore_rest_of_line ();
913       return;
914     }
915
916   p = name;
917   while (*p)
918     {
919       *p = TOLOWER (*p);
920       p++;
921     }
922
923   /* just after name is now '\0'  */
924   p = input_line_pointer;
925   *p = c;
926   SKIP_WHITESPACE ();
927
928   if (*input_line_pointer != ',')
929     {
930       as_bad ("expected comma after operand name");
931       ignore_rest_of_line ();
932       free (name);
933       return;
934     }
935
936   input_line_pointer++;         /* skip ','  */
937   number = get_absolute_expression ();
938
939   if (number < 0)
940     {
941       as_bad ("negative operand number %d", number);
942       ignore_rest_of_line ();
943       free (name);
944       return;
945     }
946
947   if (opertype)
948     {
949       SKIP_WHITESPACE ();
950
951       if (*input_line_pointer != ',')
952         {
953           as_bad ("expected comma after register-number");
954           ignore_rest_of_line ();
955           free (name);
956           return;
957         }
958
959       input_line_pointer++;             /* skip ','  */
960       mode = input_line_pointer;
961
962       if (!strncmp (mode, "r|w", 3))
963         {
964           imode = 0;
965           input_line_pointer += 3;
966         }
967       else
968         {
969           if (!strncmp (mode, "r", 1))
970             {
971               imode = ARC_REGISTER_READONLY;
972               input_line_pointer += 1;
973             }
974           else
975             {
976               if (strncmp (mode, "w", 1))
977                 {
978                   as_bad ("invalid mode");
979                   ignore_rest_of_line ();
980                   free (name);
981                   return;
982                 }
983               else
984                 {
985                   imode = ARC_REGISTER_WRITEONLY;
986                   input_line_pointer += 1;
987                 }
988             }
989         }
990       SKIP_WHITESPACE ();
991       if (1 == opertype)
992         {
993           if (*input_line_pointer != ',')
994             {
995               as_bad ("expected comma after register-mode");
996               ignore_rest_of_line ();
997               free (name);
998               return;
999             }
1000
1001           input_line_pointer++;         /* skip ','  */
1002
1003           if (!strncmp (input_line_pointer, "cannot_shortcut", 15))
1004             {
1005               imode |= arc_get_noshortcut_flag ();
1006               input_line_pointer += 15;
1007             }
1008           else
1009             {
1010               if (strncmp (input_line_pointer, "can_shortcut", 12))
1011                 {
1012                   as_bad ("shortcut designator invalid");
1013                   ignore_rest_of_line ();
1014                   free (name);
1015                   return;
1016                 }
1017               else
1018                 {
1019                   input_line_pointer += 12;
1020                 }
1021             }
1022         }
1023     }
1024
1025   if ((opertype == 1) && number > 60)
1026     {
1027       as_bad ("core register value (%d) too large", number);
1028       ignore_rest_of_line ();
1029       free (name);
1030       return;
1031     }
1032
1033   if ((opertype == 0) && number > 31)
1034     {
1035       as_bad ("condition code value (%d) too large", number);
1036       ignore_rest_of_line ();
1037       free (name);
1038       return;
1039     }
1040
1041   ext_oper = (struct arc_ext_operand_value *) \
1042     xmalloc (sizeof (struct arc_ext_operand_value));
1043
1044   if (opertype)
1045     {
1046       /* If the symbol already exists, point it at the new definition.  */
1047       if ((symbolP = symbol_find (name)))
1048         {
1049           if (S_GET_SEGMENT (symbolP) == reg_section)
1050             S_SET_VALUE (symbolP, (int) &ext_oper->operand);
1051           else
1052             {
1053               as_bad ("attempt to override symbol: %s", name);
1054               ignore_rest_of_line ();
1055               free (name);
1056               free (ext_oper);
1057               return;
1058             }
1059         }
1060       else
1061         {
1062           /* If its not there, add it.  */
1063           symbol_table_insert (symbol_create (name, reg_section,
1064                                               (int) &ext_oper->operand, &zero_address_frag));
1065         }
1066     }
1067
1068   ext_oper->operand.name  = name;
1069   ext_oper->operand.value = number;
1070   ext_oper->operand.type  = arc_operand_type (opertype);
1071   ext_oper->operand.flags = imode;
1072
1073   ext_oper->next = arc_ext_operands;
1074   arc_ext_operands = ext_oper;
1075
1076   /* OK, now that we know what this operand is, put a description in
1077      the arc extension section of the output file.  */
1078
1079   old_sec    = now_seg;
1080   old_subsec = now_subseg;
1081
1082   arc_set_ext_seg ();
1083
1084   switch (opertype)
1085     {
1086     case 0:
1087       p = frag_more (1);
1088       *p = 3 + strlen (name) + 1;
1089       p = frag_more (1);
1090       *p = EXT_COND_CODE;
1091       p = frag_more (1);
1092       *p = number;
1093       p = frag_more (strlen (name) + 1);
1094       strcpy (p, name);
1095       break;
1096     case 1:
1097       p = frag_more (1);
1098       *p = 3 + strlen (name) + 1;
1099       p = frag_more (1);
1100       *p = EXT_CORE_REGISTER;
1101       p = frag_more (1);
1102       *p = number;
1103       p = frag_more (strlen (name) + 1);
1104       strcpy (p, name);
1105       break;
1106     case 2:
1107       p = frag_more (1);
1108       *p = 6 + strlen (name) + 1;
1109       p = frag_more (1);
1110       *p = EXT_AUX_REGISTER;
1111       p = frag_more (1);
1112       *p = number >> 24 & 0xff;
1113       p = frag_more (1);
1114       *p = number >> 16 & 0xff;
1115       p = frag_more (1);
1116       *p = number >>  8 & 0xff;
1117       p = frag_more (1);
1118       *p = number       & 0xff;
1119       p = frag_more (strlen (name) + 1);
1120       strcpy (p, name);
1121       break;
1122     default:
1123       as_bad ("invalid opertype");
1124       ignore_rest_of_line ();
1125       free (name);
1126       return;
1127       break;
1128     }
1129
1130   subseg_set (old_sec, old_subsec);
1131
1132   /* Enter all registers into the symbol table.  */
1133
1134   demand_empty_rest_of_line ();
1135 }
1136
1137 static void
1138 arc_extinst (ignore)
1139      int ignore ATTRIBUTE_UNUSED;
1140 {
1141   unsigned char syntax[129];
1142   char *name;
1143   char *p;
1144   char c;
1145   int suffixcode = -1;
1146   int opcode, subopcode;
1147   int i;
1148   int class = 0;
1149   int name_len;
1150   struct arc_opcode *ext_op;
1151
1152   segT old_sec;
1153   int old_subsec;
1154
1155   name = input_line_pointer;
1156   c = get_symbol_end ();
1157   name = xstrdup (name);
1158   if (NULL == name)
1159     {
1160       ignore_rest_of_line ();
1161       return;
1162     }
1163   strcpy (syntax, name);
1164   name_len = strlen (name);
1165
1166   /* just after name is now '\0'  */
1167   p = input_line_pointer;
1168   *p = c;
1169
1170   SKIP_WHITESPACE ();
1171
1172   if (*input_line_pointer != ',')
1173     {
1174       as_bad ("expected comma after operand name");
1175       ignore_rest_of_line ();
1176       return;
1177     }
1178
1179   input_line_pointer++;         /* skip ','  */
1180   opcode = get_absolute_expression ();
1181
1182   SKIP_WHITESPACE ();
1183
1184   if (*input_line_pointer != ',')
1185     {
1186       as_bad ("expected comma after opcode");
1187       ignore_rest_of_line ();
1188       return;
1189     }
1190
1191   input_line_pointer++;         /* skip ','  */
1192   subopcode = get_absolute_expression ();
1193
1194   if (subopcode < 0)
1195     {
1196       as_bad ("negative subopcode %d", subopcode);
1197       ignore_rest_of_line ();
1198       return;
1199     }
1200
1201   if (subopcode)
1202     {
1203       if (3 != opcode)
1204         {
1205           as_bad ("subcode value found when opcode not equal 0x03");
1206           ignore_rest_of_line ();
1207           return;
1208         }
1209       else
1210         {
1211           if (subopcode < 0x09 || subopcode == 0x3f)
1212             {
1213               as_bad ("invalid subopcode %d", subopcode);
1214               ignore_rest_of_line ();
1215               return;
1216             }
1217         }
1218     }
1219
1220   SKIP_WHITESPACE ();
1221
1222   if (*input_line_pointer != ',')
1223     {
1224       as_bad ("expected comma after subopcode");
1225       ignore_rest_of_line ();
1226       return;
1227     }
1228
1229   input_line_pointer++;         /* skip ','  */
1230
1231   for (i = 0; i < (int) MAXSUFFIXCLASS; i++)
1232     {
1233       if (!strncmp (suffixclass[i].name,input_line_pointer, suffixclass[i].len))
1234         {
1235           suffixcode = i;
1236           input_line_pointer += suffixclass[i].len;
1237           break;
1238         }
1239     }
1240
1241   if (-1 == suffixcode)
1242     {
1243       as_bad ("invalid suffix class");
1244       ignore_rest_of_line ();
1245       return;
1246     }
1247
1248   SKIP_WHITESPACE ();
1249
1250   if (*input_line_pointer != ',')
1251     {
1252       as_bad ("expected comma after suffix class");
1253       ignore_rest_of_line ();
1254       return;
1255     }
1256
1257   input_line_pointer++;         /* skip ','  */
1258
1259   for (i = 0; i < (int) MAXSYNTAXCLASS; i++)
1260     {
1261       if (!strncmp (syntaxclass[i].name,input_line_pointer, syntaxclass[i].len))
1262         {
1263           class = syntaxclass[i].class;
1264           input_line_pointer += syntaxclass[i].len;
1265           break;
1266         }
1267     }
1268
1269   if (0 == (SYNTAX_VALID & class))
1270     {
1271       as_bad ("invalid syntax class");
1272       ignore_rest_of_line ();
1273       return;
1274     }
1275
1276   if ((0x3 == opcode) & (class & SYNTAX_3OP))
1277     {
1278       as_bad ("opcode 0x3 and SYNTAX_3OP invalid");
1279       ignore_rest_of_line ();
1280       return;
1281     }
1282
1283   switch (suffixcode)
1284     {
1285     case 0:
1286       strcat (syntax, "%.q%.f ");
1287       break;
1288     case 1:
1289       strcat (syntax, "%.f ");
1290       break;
1291     case 2:
1292       strcat (syntax, "%.q ");
1293       break;
1294     case 3:
1295       strcat (syntax, " ");
1296       break;
1297     default:
1298       as_bad ("unknown suffix class");
1299       ignore_rest_of_line ();
1300       return;
1301       break;
1302     };
1303
1304   strcat (syntax, ((opcode == 0x3) ? "%a,%b" : ((class & SYNTAX_3OP) ? "%a,%b,%c" : "%b,%c")));
1305   if (suffixcode < 2)
1306     strcat (syntax, "%F");
1307   strcat (syntax, "%S%L");
1308
1309   ext_op = (struct arc_opcode *) xmalloc (sizeof (struct arc_opcode));
1310   if (NULL == ext_op)
1311     {
1312       ignore_rest_of_line ();
1313       return;
1314     }
1315
1316   ext_op->syntax = xstrdup (syntax);
1317   if (NULL == ext_op->syntax)
1318     {
1319       ignore_rest_of_line ();
1320       return;
1321     }
1322
1323   ext_op->mask  = I (-1) | ((0x3 == opcode) ? C (-1) : 0);
1324   ext_op->value = I (opcode) | ((0x3 == opcode) ? C (subopcode) : 0);
1325   ext_op->flags = class;
1326   ext_op->next_asm = arc_ext_opcodes;
1327   ext_op->next_dis = arc_ext_opcodes;
1328   arc_ext_opcodes = ext_op;
1329
1330   /* OK, now that we know what this inst is, put a description in the
1331      arc extension section of the output file.  */
1332
1333   old_sec    = now_seg;
1334   old_subsec = now_subseg;
1335
1336   arc_set_ext_seg ();
1337
1338   p = frag_more (1);
1339   *p = 5 + name_len + 1;
1340   p = frag_more (1);
1341   *p = EXT_INSTRUCTION;
1342   p = frag_more (1);
1343   *p = opcode;
1344   p = frag_more (1);
1345   *p = subopcode;
1346   p = frag_more (1);
1347   *p = (class & (OP1_MUST_BE_IMM | OP1_IMM_IMPLIED) ? IGNORE_FIRST_OPD : 0);
1348   p = frag_more (name_len);
1349   strncpy (p, syntax, name_len);
1350   p = frag_more (1);
1351   *p = '\0';
1352
1353   subseg_set (old_sec, old_subsec);
1354
1355   demand_empty_rest_of_line ();
1356 }
1357
1358 int
1359 arc_set_ext_seg ()
1360 {
1361   if (!arcext_section)
1362     {
1363       arcext_section = subseg_new (".arcextmap", 0);
1364       bfd_set_section_flags (stdoutput, arcext_section,
1365                              SEC_READONLY | SEC_HAS_CONTENTS);
1366     }
1367   else
1368     subseg_set (arcext_section, 0);
1369   return 1;
1370 }
1371
1372 static void
1373 arc_common (localScope)
1374      int localScope;
1375 {
1376   char *name;
1377   char c;
1378   char *p;
1379   int align, size;
1380   symbolS *symbolP;
1381
1382   name = input_line_pointer;
1383   c = get_symbol_end ();
1384   /* just after name is now '\0'  */
1385   p = input_line_pointer;
1386   *p = c;
1387   SKIP_WHITESPACE ();
1388
1389   if (*input_line_pointer != ',')
1390     {
1391       as_bad ("expected comma after symbol name");
1392       ignore_rest_of_line ();
1393       return;
1394     }
1395
1396   input_line_pointer++;         /* skip ','  */
1397   size = get_absolute_expression ();
1398
1399   if (size < 0)
1400     {
1401       as_bad ("negative symbol length");
1402       ignore_rest_of_line ();
1403       return;
1404     }
1405
1406   *p = 0;
1407   symbolP = symbol_find_or_make (name);
1408   *p = c;
1409
1410   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1411     {
1412       as_bad ("ignoring attempt to re-define symbol");
1413       ignore_rest_of_line ();
1414       return;
1415     }
1416   if (((int) S_GET_VALUE (symbolP) != 0) \
1417       && ((int) S_GET_VALUE (symbolP) != size))
1418     {
1419       as_warn ("length of symbol \"%s\" already %ld, ignoring %d",
1420                S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
1421     }
1422   assert (symbolP->sy_frag == &zero_address_frag);
1423
1424   /* Now parse the alignment field.  This field is optional for
1425      local and global symbols. Default alignment is zero.  */
1426   if (*input_line_pointer == ',')
1427     {
1428       input_line_pointer++;
1429       align = get_absolute_expression ();
1430       if (align < 0)
1431         {
1432           align = 0;
1433           as_warn ("assuming symbol alignment of zero");
1434         }
1435     }
1436   else
1437     align = 0;
1438
1439   if (localScope != 0)
1440     {
1441       segT old_sec;
1442       int old_subsec;
1443       char *pfrag;
1444
1445       old_sec    = now_seg;
1446       old_subsec = now_subseg;
1447       record_alignment (bss_section, align);
1448       subseg_set (bss_section, 0);  /* ??? subseg_set (bss_section, 1); ???  */
1449
1450       if (align)
1451         /* Do alignment.  */
1452         frag_align (align, 0, 0);
1453
1454       /* Detach from old frag.  */
1455       if (S_GET_SEGMENT (symbolP) == bss_section)
1456         symbolP->sy_frag->fr_symbol = NULL;
1457
1458       symbolP->sy_frag = frag_now;
1459       pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
1460                         (offsetT) size, (char *) 0);
1461       *pfrag = 0;
1462
1463       S_SET_SIZE       (symbolP, size);
1464       S_SET_SEGMENT    (symbolP, bss_section);
1465       S_CLEAR_EXTERNAL (symbolP);
1466       symbolP->local = 1;
1467       subseg_set (old_sec, old_subsec);
1468     }
1469   else
1470     {
1471       S_SET_VALUE    (symbolP, (valueT) size);
1472       S_SET_ALIGN    (symbolP, align);
1473       S_SET_EXTERNAL (symbolP);
1474       S_SET_SEGMENT  (symbolP, bfd_com_section_ptr);
1475     }
1476
1477   symbolP->bsym->flags |= BSF_OBJECT;
1478
1479   demand_empty_rest_of_line ();
1480   return;
1481 }
1482 \f
1483 /* Select the cpu we're assembling for.  */
1484
1485 static void
1486 arc_option (ignore)
1487      int ignore ATTRIBUTE_UNUSED;
1488 {
1489   int mach;
1490   char c;
1491   char *cpu;
1492
1493   cpu = input_line_pointer;
1494   c = get_symbol_end ();
1495   mach = arc_get_mach (cpu);
1496   *input_line_pointer = c;
1497
1498   /* If an instruction has already been seen, it's too late.  */
1499   if (cpu_tables_init_p)
1500     {
1501       as_bad ("\".option\" directive must appear before any instructions");
1502       ignore_rest_of_line ();
1503       return;
1504     }
1505
1506   if (mach == -1)
1507     goto bad_cpu;
1508
1509   if (mach_type_specified_p && mach != arc_mach_type)
1510     {
1511       as_bad ("\".option\" directive conflicts with initial definition");
1512       ignore_rest_of_line ();
1513       return;
1514     }
1515   else
1516     {
1517       /* The cpu may have been selected on the command line.  */
1518       if (mach != arc_mach_type)
1519         as_warn ("\".option\" directive overrides command-line (default) value");
1520       arc_mach_type = mach;
1521       if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
1522         as_fatal ("could not set architecture and machine");
1523       mach_type_specified_p = 1;
1524     }
1525   demand_empty_rest_of_line ();
1526   return;
1527
1528  bad_cpu:
1529   as_bad ("invalid identifier for \".option\"");
1530   ignore_rest_of_line ();
1531 }
1532 \f
1533 /* Turn a string in input_line_pointer into a floating point constant
1534    of type TYPE, and store the appropriate bytes in *LITP.  The number
1535    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
1536    returned, or NULL on OK.  */
1537
1538 /* Equal to MAX_PRECISION in atof-ieee.c  */
1539 #define MAX_LITTLENUMS 6
1540
1541 char *
1542 md_atof (type, litP, sizeP)
1543      int type;
1544      char *litP;
1545      int *sizeP;
1546 {
1547   int prec;
1548   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1549   LITTLENUM_TYPE *wordP;
1550   char *t;
1551   char * atof_ieee PARAMS ((char *, int, LITTLENUM_TYPE *));
1552
1553   switch (type)
1554     {
1555     case 'f':
1556     case 'F':
1557       prec = 2;
1558       break;
1559
1560     case 'd':
1561     case 'D':
1562       prec = 4;
1563       break;
1564
1565     default:
1566       *sizeP = 0;
1567       return "bad call to md_atof";
1568     }
1569
1570   t = atof_ieee (input_line_pointer, type, words);
1571   if (t)
1572     input_line_pointer = t;
1573   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1574   for (wordP = words; prec--;)
1575     {
1576       md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
1577       litP += sizeof (LITTLENUM_TYPE);
1578     }
1579
1580   return NULL;
1581 }
1582
1583 /* Write a value out to the object file, using the appropriate
1584    endianness.  */
1585
1586 void
1587 md_number_to_chars (buf, val, n)
1588      char *buf;
1589      valueT val;
1590      int n;
1591 {
1592   if (target_big_endian)
1593     number_to_chars_bigendian (buf, val, n);
1594   else
1595     number_to_chars_littleendian (buf, val, n);
1596 }
1597
1598 /* Round up a section size to the appropriate boundary.  */
1599
1600 valueT
1601 md_section_align (segment, size)
1602      segT segment;
1603      valueT size;
1604 {
1605   int align = bfd_get_section_alignment (stdoutput, segment);
1606
1607   return ((size + (1 << align) - 1) & (-1 << align));
1608 }
1609
1610 /* We don't have any form of relaxing.  */
1611
1612 int
1613 md_estimate_size_before_relax (fragp, seg)
1614      fragS *fragp ATTRIBUTE_UNUSED;
1615      asection *seg ATTRIBUTE_UNUSED;
1616 {
1617   as_fatal (_("md_estimate_size_before_relax\n"));
1618   return 1;
1619 }
1620
1621 /* Convert a machine dependent frag.  We never generate these.  */
1622
1623 void
1624 md_convert_frag (abfd, sec, fragp)
1625      bfd *abfd ATTRIBUTE_UNUSED;
1626      asection *sec ATTRIBUTE_UNUSED;
1627      fragS *fragp ATTRIBUTE_UNUSED;
1628 {
1629   as_fatal (_("md_convert_frag\n"));
1630 }
1631
1632 void
1633 arc_code_symbol (expressionP)
1634      expressionS *expressionP;
1635 {
1636   if (expressionP->X_op == O_symbol && expressionP->X_add_number == 0)
1637     {
1638       expressionS two;
1639       expressionP->X_op = O_right_shift;
1640       expressionP->X_add_symbol->sy_value.X_op = O_constant;
1641       two.X_op = O_constant;
1642       two.X_add_symbol = two.X_op_symbol = NULL;
1643       two.X_add_number = 2;
1644       expressionP->X_op_symbol = make_expr_symbol (&two);
1645     }
1646   /* Allow %st(sym1-sym2)  */
1647   else if (expressionP->X_op == O_subtract
1648            && expressionP->X_add_symbol != NULL
1649            && expressionP->X_op_symbol != NULL
1650            && expressionP->X_add_number == 0)
1651     {
1652       expressionS two;
1653       expressionP->X_add_symbol = make_expr_symbol (expressionP);
1654       expressionP->X_op = O_right_shift;
1655       two.X_op = O_constant;
1656       two.X_add_symbol = two.X_op_symbol = NULL;
1657       two.X_add_number = 2;
1658       expressionP->X_op_symbol = make_expr_symbol (&two);
1659     }
1660   else
1661     {
1662       as_bad ("expression too complex code symbol");
1663       return;
1664     }
1665 }
1666
1667 /* Parse an operand that is machine-specific.
1668
1669    The ARC has a special %-op to adjust addresses so they're usable in
1670    branches.  The "st" is short for the STatus register.
1671    ??? Later expand this to take a flags value too.
1672
1673    ??? We can't create new expression types so we map the %-op's onto the
1674    existing syntax.  This means that the user could use the chosen syntax
1675    to achieve the same effect.  */
1676
1677 void
1678 md_operand (expressionP)
1679      expressionS *expressionP;
1680 {
1681   char *p = input_line_pointer;
1682
1683   if (*p == '%')
1684     if (strncmp (p, "%st(", 4) == 0)
1685       {
1686         input_line_pointer += 4;
1687         expression (expressionP);
1688         if (*input_line_pointer != ')')
1689           {
1690             as_bad ("missing ')' in %%-op");
1691             return;
1692           }
1693         ++input_line_pointer;
1694         arc_code_symbol (expressionP);
1695       }
1696     else
1697       {
1698         /* It could be a register.  */
1699         int i, l;
1700         struct arc_ext_operand_value *ext_oper = arc_ext_operands;
1701         p++;
1702
1703         while (ext_oper)
1704           {
1705             l = strlen (ext_oper->operand.name);
1706             if (!strncmp (p, ext_oper->operand.name, l) && !ISALNUM (*(p + l)))
1707               {
1708                 input_line_pointer += l + 1;
1709                 expressionP->X_op = O_register;
1710                 expressionP->X_add_number = (int) &ext_oper->operand;
1711                 return;
1712               }
1713             ext_oper = ext_oper->next;
1714           }
1715         for (i = 0; i < arc_reg_names_count; i++)
1716           {
1717             l = strlen (arc_reg_names[i].name);
1718             if (!strncmp (p, arc_reg_names[i].name, l) && !ISALNUM (*(p + l)))
1719               {
1720                 input_line_pointer += l + 1;
1721                 expressionP->X_op = O_register;
1722                 expressionP->X_add_number = (int) &arc_reg_names[i];
1723                 break;
1724               }
1725           }
1726       }
1727 }
1728
1729 /* We have no need to default values of symbols.
1730    We could catch register names here, but that is handled by inserting
1731    them all in the symbol table to begin with.  */
1732
1733 symbolS *
1734 md_undefined_symbol (name)
1735      char *name ATTRIBUTE_UNUSED;
1736 {
1737   return 0;
1738 }
1739 \f
1740 /* Functions concerning expressions.  */
1741
1742 /* Parse a .byte, .word, etc. expression.
1743
1744    Values for the status register are specified with %st(label).
1745    `label' will be right shifted by 2.  */
1746
1747 void
1748 arc_parse_cons_expression (exp, nbytes)
1749      expressionS *exp;
1750      unsigned int nbytes ATTRIBUTE_UNUSED;
1751 {
1752   char *p = input_line_pointer;
1753   int code_symbol_fix = 0;
1754
1755   for (; ! is_end_of_line[(unsigned char) *p]; p++)
1756     if (*p == '@' && !strncmp (p, "@h30", 4))
1757       {
1758         code_symbol_fix = 1;
1759         strcpy (p, ";   ");
1760       }
1761   expr (0, exp);
1762   if (code_symbol_fix)
1763     {
1764       arc_code_symbol (exp);
1765       input_line_pointer = p;
1766     }
1767 }
1768
1769 /* Record a fixup for a cons expression.  */
1770
1771 void
1772 arc_cons_fix_new (frag, where, nbytes, exp)
1773      fragS *frag;
1774      int where;
1775      int nbytes;
1776      expressionS *exp;
1777 {
1778   if (nbytes == 4)
1779     {
1780       int reloc_type;
1781       expressionS exptmp;
1782
1783       /* This may be a special ARC reloc (eg: %st()).  */
1784       reloc_type = get_arc_exp_reloc_type (1, BFD_RELOC_32, exp, &exptmp);
1785       fix_new_exp (frag, where, nbytes, &exptmp, 0, reloc_type);
1786     }
1787   else
1788     {
1789       fix_new_exp (frag, where, nbytes, exp, 0,
1790                    nbytes == 2 ? BFD_RELOC_16
1791                    : nbytes == 8 ? BFD_RELOC_64
1792                    : BFD_RELOC_32);
1793     }
1794 }
1795 \f
1796 /* Functions concerning relocs.  */
1797
1798 /* The location from which a PC relative jump should be calculated,
1799    given a PC relative reloc.  */
1800
1801 long
1802 md_pcrel_from (fixP)
1803      fixS *fixP;
1804 {
1805   /* Return the address of the delay slot.  */
1806   return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size;
1807 }
1808
1809 /* Compute the reloc type of an expression.
1810    The possibly modified expression is stored in EXPNEW.
1811
1812    This is used to convert the expressions generated by the %-op's into
1813    the appropriate operand type.  It is called for both data in instructions
1814    (operands) and data outside instructions (variables, debugging info, etc.).
1815
1816    Currently supported %-ops:
1817
1818    %st(symbol): represented as "symbol >> 2"
1819                 "st" is short for STatus as in the status register (pc)
1820
1821    DEFAULT_TYPE is the type to use if no special processing is required.
1822
1823    DATA_P is non-zero for data or limm values, zero for insn operands.
1824    Remember that the opcode "insertion fns" cannot be used on data, they're
1825    only for inserting operands into insns.  They also can't be used for limm
1826    values as the insertion routines don't handle limm values.  When called for
1827    insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED).  When
1828    called for data or limm values we use real reloc types.  */
1829
1830 static int
1831 get_arc_exp_reloc_type (data_p, default_type, exp, expnew)
1832      int data_p;
1833      int default_type;
1834      expressionS *exp;
1835      expressionS *expnew;
1836 {
1837   /* If the expression is "symbol >> 2" we must change it to just "symbol",
1838      as fix_new_exp can't handle it.  Similarily for (symbol - symbol) >> 2.
1839      That's ok though.  What's really going on here is that we're using
1840      ">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26.  */
1841
1842   if (exp->X_op == O_right_shift
1843       && exp->X_op_symbol != NULL
1844       && exp->X_op_symbol->sy_value.X_op == O_constant
1845       && exp->X_op_symbol->sy_value.X_add_number == 2
1846       && exp->X_add_number == 0)
1847     {
1848       if (exp->X_add_symbol != NULL
1849           && (exp->X_add_symbol->sy_value.X_op == O_constant
1850               || exp->X_add_symbol->sy_value.X_op == O_symbol))
1851         {
1852           *expnew = *exp;
1853           expnew->X_op = O_symbol;
1854           expnew->X_op_symbol = NULL;
1855           return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1856         }
1857       else if (exp->X_add_symbol != NULL
1858                && exp->X_add_symbol->sy_value.X_op == O_subtract)
1859         {
1860           *expnew = exp->X_add_symbol->sy_value;
1861           return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1862         }
1863     }
1864
1865   *expnew = *exp;
1866   return default_type;
1867 }
1868
1869 /* Apply a fixup to the object code.  This is called for all the
1870    fixups we generated by the call to fix_new_exp, above.  In the call
1871    above we used a reloc code which was the largest legal reloc code
1872    plus the operand index.  Here we undo that to recover the operand
1873    index.  At this point all symbol values should be fully resolved,
1874    and we attempt to completely resolve the reloc.  If we can not do
1875    that, we determine the correct reloc code and put it back in the fixup.  */
1876
1877 void
1878 md_apply_fix3 (fixP, valP, seg)
1879      fixS *fixP;
1880      valueT * valP;
1881      segT seg;
1882 {
1883 #if 0
1884   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1885 #endif
1886   valueT value = * valP;
1887
1888   if (fixP->fx_addsy == (symbolS *) NULL)
1889     fixP->fx_done = 1;
1890
1891   else if (fixP->fx_pcrel)
1892     {
1893       /* Hack around bfd_install_relocation brain damage.  */
1894       if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
1895         value += md_pcrel_from (fixP);
1896     }
1897
1898   /* We can't actually support subtracting a symbol.  */
1899   if (fixP->fx_subsy != NULL)
1900     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1901
1902   if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1903     {
1904       int opindex;
1905       const struct arc_operand *operand;
1906       char *where;
1907       arc_insn insn;
1908
1909       opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1910
1911       operand = &arc_operands[opindex];
1912
1913       /* Fetch the instruction, insert the fully resolved operand
1914          value, and stuff the instruction back again.  */
1915       where = fixP->fx_frag->fr_literal + fixP->fx_where;
1916       if (target_big_endian)
1917         insn = bfd_getb32 ((unsigned char *) where);
1918       else
1919         insn = bfd_getl32 ((unsigned char *) where);
1920       insn = arc_insert_operand (insn, operand, -1, NULL, (offsetT) value,
1921                                  fixP->fx_file, fixP->fx_line);
1922       if (target_big_endian)
1923         bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1924       else
1925         bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
1926
1927       if (fixP->fx_done)
1928         {
1929           /* Nothing else to do here.  */
1930           return;
1931         }
1932
1933       /* Determine a BFD reloc value based on the operand information.
1934          We are only prepared to turn a few of the operands into relocs.
1935          !!! Note that we can't handle limm values here.  Since we're using
1936          implicit addends the addend must be inserted into the instruction,
1937          however, the opcode insertion routines currently do nothing with
1938          limm values.  */
1939       if (operand->fmt == 'B')
1940         {
1941           assert ((operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0
1942                   && operand->bits == 20
1943                   && operand->shift == 7);
1944           fixP->fx_r_type = BFD_RELOC_ARC_B22_PCREL;
1945         }
1946       else if (operand->fmt == 'J')
1947         {
1948           assert ((operand->flags & ARC_OPERAND_ABSOLUTE_BRANCH) != 0
1949                   && operand->bits == 24
1950                   && operand->shift == 32);
1951           fixP->fx_r_type = BFD_RELOC_ARC_B26;
1952         }
1953       else if (operand->fmt == 'L')
1954         {
1955           assert ((operand->flags & ARC_OPERAND_LIMM) != 0
1956                   && operand->bits == 32
1957                   && operand->shift == 32);
1958           fixP->fx_r_type = BFD_RELOC_32;
1959         }
1960       else
1961         {
1962           as_bad_where (fixP->fx_file, fixP->fx_line,
1963                         "unresolved expression that must be resolved");
1964           fixP->fx_done = 1;
1965           return;
1966         }
1967     }
1968   else
1969     {
1970       switch (fixP->fx_r_type)
1971         {
1972         case BFD_RELOC_8:
1973           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1974                               value, 1);
1975           break;
1976         case BFD_RELOC_16:
1977           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1978                               value, 2);
1979           break;
1980         case BFD_RELOC_32:
1981           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1982                               value, 4);
1983           break;
1984 #if 0
1985         case BFD_RELOC_64:
1986           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1987                               value, 8);
1988           break;
1989 #endif
1990         case BFD_RELOC_ARC_B26:
1991           /* If !fixP->fx_done then `value' is an implicit addend.
1992              We must shift it right by 2 in this case as well because the
1993              linker performs the relocation and then adds this in (as opposed
1994              to adding this in and then shifting right by 2).  */
1995           value >>= 2;
1996           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1997                               value, 4);
1998           break;
1999         default:
2000           abort ();
2001         }
2002     }
2003 }
2004
2005 /* Translate internal representation of relocation info to BFD target
2006    format.  */
2007
2008 arelent *
2009 tc_gen_reloc (section, fixP)
2010      asection *section ATTRIBUTE_UNUSED;
2011      fixS *fixP;
2012 {
2013   arelent *reloc;
2014
2015   reloc = (arelent *) xmalloc (sizeof (arelent));
2016
2017   reloc->sym_ptr_ptr = &fixP->fx_addsy->bsym;
2018   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
2019   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
2020   if (reloc->howto == (reloc_howto_type *) NULL)
2021     {
2022       as_bad_where (fixP->fx_file, fixP->fx_line,
2023                     "internal error: can't export reloc type %d (`%s')",
2024                     fixP->fx_r_type,
2025                     bfd_get_reloc_code_name (fixP->fx_r_type));
2026       return NULL;
2027     }
2028
2029   assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
2030
2031   /* Set addend to account for PC being advanced one insn before the
2032      target address is computed.  */
2033
2034   reloc->addend = (fixP->fx_pcrel ? -4 : 0);
2035
2036   return reloc;
2037 }