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