x86: correct "-Q" option handling
[external/binutils.git] / gas / config / tc-pru.c
1 /* TI PRU assembler.
2    Copyright (C) 2014-2019 Free Software Foundation, Inc.
3    Contributed by Dimitar Dimitrov <dimitar@dinux.eu>
4    Based on tc-nios2.c
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 3, 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, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 #include "as.h"
24 #include "bfd_stdint.h"
25 #include "opcode/pru.h"
26 #include "elf/pru.h"
27 #include "tc-pru.h"
28 #include "bfd.h"
29 #include "dwarf2dbg.h"
30 #include "subsegs.h"
31 #include "safe-ctype.h"
32 #include "dw2gencfi.h"
33
34 #ifndef OBJ_ELF
35 /* We are not supporting any other target so we throw a compile time error.  */
36   #error "OBJ_ELF not defined"
37 #endif
38
39 /* This array holds the chars that always start a comment.  If the
40    pre-processor is disabled, these aren't very useful.  */
41 const char comment_chars[] = "#;";
42
43 /* This array holds the chars that only start a comment at the beginning of
44    a line.  If the line seems to have the form '# 123 filename'
45    .line and .file directives will appear in the pre-processed output.  */
46 /* Note that input_file.c hand checks for '#' at the beginning of the
47    first line of the input file.  This is because the compiler outputs
48    #NO_APP at the beginning of its output.  */
49 /* Also note that C style comments are always supported.  */
50 const char line_comment_chars[] = "#;*";
51
52 /* This array holds machine specific line separator characters.  */
53 const char line_separator_chars[] = "";
54
55 /* Chars that can be used to separate mant from exp in floating point nums.  */
56 const char EXP_CHARS[] = "eE";
57
58 /* Chars that mean this number is a floating point constant.
59    As in 0f12.456
60    or    0d1.2345e12  */
61 const char FLT_CHARS[] = "rRsSfFdDxXpP";
62
63 /* Machine-dependent command-line options.  */
64
65 struct pru_opt_s
66 {
67   /* -mno-link-relax / -mlink-relax: generate (or not)
68      relocations for linker relaxation.  */
69   bfd_boolean link_relax;
70
71   /* -mno-warn-regname-label: do not output a warning that a label name
72      matches a register name.  */
73   bfd_boolean warn_regname_label;
74 };
75
76 static struct pru_opt_s pru_opt = { TRUE, TRUE };
77
78 const char *md_shortopts = "r";
79
80 enum options
81 {
82   OPTION_LINK_RELAX = OPTION_MD_BASE + 1,
83   OPTION_NO_LINK_RELAX,
84   OPTION_NO_WARN_REGNAME_LABEL,
85 };
86
87 struct option md_longopts[] = {
88   { "mlink-relax",  no_argument, NULL, OPTION_LINK_RELAX  },
89   { "mno-link-relax",  no_argument, NULL, OPTION_NO_LINK_RELAX  },
90   { "mno-warn-regname-label",  no_argument, NULL,
91     OPTION_NO_WARN_REGNAME_LABEL  },
92   { NULL, no_argument, NULL, 0 }
93 };
94
95 size_t md_longopts_size = sizeof (md_longopts);
96
97 typedef struct pru_insn_reloc
98 {
99   /* Any expression in the instruction is parsed into this field,
100      which is passed to fix_new_exp () to generate a fixup.  */
101   expressionS reloc_expression;
102
103   /* The type of the relocation to be applied.  */
104   bfd_reloc_code_real_type reloc_type;
105
106   /* PC-relative.  */
107   unsigned int reloc_pcrel;
108
109   /* The next relocation to be applied to the instruction.  */
110   struct pru_insn_reloc *reloc_next;
111 } pru_insn_relocS;
112
113 /* This struct is used to hold state when assembling instructions.  */
114 typedef struct pru_insn_info
115 {
116   /* Assembled instruction.  */
117   unsigned long insn_code;
118   /* Used for assembling LDI32.  */
119   unsigned long ldi32_imm32;
120
121   /* Pointer to the relevant bit of the opcode table.  */
122   const struct pru_opcode *insn_pru_opcode;
123   /* After parsing ptrs to the tokens in the instruction fill this array
124      it is terminated with a null pointer (hence the first +1).
125      The second +1 is because in some parts of the code the opcode
126      is not counted as a token, but still placed in this array.  */
127   const char *insn_tokens[PRU_MAX_INSN_TOKENS + 1 + 1];
128
129   /* This holds information used to generate fixups
130      and eventually relocations if it is not null.  */
131   pru_insn_relocS *insn_reloc;
132 } pru_insn_infoS;
133
134 /* Opcode hash table.  */
135 static struct hash_control *pru_opcode_hash = NULL;
136 #define pru_opcode_lookup(NAME) \
137   ((struct pru_opcode *) hash_find (pru_opcode_hash, (NAME)))
138
139 /* Register hash table.  */
140 static struct hash_control *pru_reg_hash = NULL;
141 #define pru_reg_lookup(NAME) \
142   ((struct pru_reg *) hash_find (pru_reg_hash, (NAME)))
143
144 /* The known current alignment of the current section.  */
145 static int pru_current_align;
146 static segT pru_current_align_seg;
147
148 static int pru_auto_align_on = 1;
149
150 /* The last seen label in the current section.  This is used to auto-align
151    labels preceding instructions.  */
152 static symbolS *pru_last_label;
153
154 \f
155 /** Utility routines.  */
156 /* Function md_chars_to_number takes the sequence of
157    bytes in buf and returns the corresponding value
158    in an int.  n must be 1, 2, 4 or 8.  */
159 static uint64_t
160 md_chars_to_number (char *buf, int n)
161 {
162   int i;
163   uint64_t val;
164
165   gas_assert (n == 1 || n == 2 || n == 4 || n == 8);
166
167   val = 0;
168   for (i = 0; i < n; ++i)
169     val = val | ((buf[i] & 0xff) << 8 * i);
170   return val;
171 }
172
173
174 /* This function turns a C long int, short int or char
175    into the series of bytes that represent the number
176    on the target machine.  */
177 void
178 md_number_to_chars (char *buf, valueT val, int n)
179 {
180   gas_assert (n == 1 || n == 2 || n == 4 || n == 8);
181   number_to_chars_littleendian (buf, val, n);
182 }
183
184 /* Turn a string in input_line_pointer into a floating point constant
185    of type TYPE, and store the appropriate bytes in *LITP.  The number
186    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
187    returned, or NULL on OK.  */
188 const char *
189 md_atof (int type, char *litP, int *sizeP)
190 {
191   return ieee_md_atof (type, litP, sizeP, FALSE);
192 }
193
194 /* Return true if STR starts with PREFIX, which should be a string literal.  */
195 #define strprefix(STR, PREFIX) \
196   (strncmp ((STR), PREFIX, strlen (PREFIX)) == 0)
197
198 /* nop fill pattern for text section.  */
199 static char const nop[4] = { 0xe0, 0xe0, 0xe0, 0x12 };
200
201 /* Handles all machine-dependent alignment needs.  */
202 static void
203 pru_align (int log_size, const char *pfill, symbolS *label)
204 {
205   int align;
206   long max_alignment = 15;
207
208   /* The front end is prone to changing segments out from under us
209      temporarily when -g is in effect.  */
210   int switched_seg_p = (pru_current_align_seg != now_seg);
211
212   align = log_size;
213   if (align > max_alignment)
214     {
215       align = max_alignment;
216       as_bad (_("Alignment too large: %d assumed"), align);
217     }
218   else if (align < 0)
219     {
220       as_warn (_("Alignment negative: 0 assumed"));
221       align = 0;
222     }
223
224   if (align != 0)
225     {
226       if (subseg_text_p (now_seg) && align >= 2)
227         {
228           /* First, make sure we're on a four-byte boundary, in case
229              someone has been putting .byte values the text section.  */
230           if (pru_current_align < 2 || switched_seg_p)
231             frag_align (2, 0, 0);
232
233           /* Now fill in the alignment pattern.  */
234           if (pfill != NULL)
235             frag_align_pattern (align, pfill, sizeof nop, 0);
236           else
237             frag_align (align, 0, 0);
238         }
239       else
240         frag_align (align, 0, 0);
241
242       if (!switched_seg_p)
243         pru_current_align = align;
244
245       /* If the last label was in a different section we can't align it.  */
246       if (label != NULL && !switched_seg_p)
247         {
248           symbolS *sym;
249           int label_seen = FALSE;
250           struct frag *old_frag;
251           valueT old_value;
252           valueT new_value;
253
254           gas_assert (S_GET_SEGMENT (label) == now_seg);
255
256           old_frag = symbol_get_frag (label);
257           old_value = S_GET_VALUE (label);
258           new_value = (valueT) frag_now_fix ();
259
260           /* It is possible to have more than one label at a particular
261              address, especially if debugging is enabled, so we must
262              take care to adjust all the labels at this address in this
263              fragment.  To save time we search from the end of the symbol
264              list, backwards, since the symbols we are interested in are
265              almost certainly the ones that were most recently added.
266              Also to save time we stop searching once we have seen at least
267              one matching label, and we encounter a label that is no longer
268              in the target fragment.  Note, this search is guaranteed to
269              find at least one match when sym == label, so no special case
270              code is necessary.  */
271           for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
272             if (symbol_get_frag (sym) == old_frag
273                 && S_GET_VALUE (sym) == old_value)
274               {
275                 label_seen = TRUE;
276                 symbol_set_frag (sym, frag_now);
277                 S_SET_VALUE (sym, new_value);
278               }
279             else if (label_seen && symbol_get_frag (sym) != old_frag)
280               break;
281         }
282       record_alignment (now_seg, align);
283     }
284 }
285
286 \f
287 /** Support for self-check mode.  */
288
289 /* Mode of the assembler.  */
290 typedef enum
291 {
292   PRU_MODE_ASSEMBLE,            /* Ordinary operation.  */
293   PRU_MODE_TEST         /* Hidden mode used for self testing.  */
294 } PRU_MODE;
295
296 static PRU_MODE pru_mode = PRU_MODE_ASSEMBLE;
297
298 /* This function is used to in self-checking mode
299    to check the assembled instruction.
300    OPCODE should be the assembled opcode, and exp_opcode
301    the parsed string representing the expected opcode.  */
302
303 static void
304 pru_check_assembly (unsigned int opcode, const char *exp_opcode)
305 {
306   if (pru_mode == PRU_MODE_TEST)
307     {
308       if (exp_opcode == NULL)
309         as_bad (_("expecting opcode string in self test mode"));
310       else if (opcode != strtoul (exp_opcode, NULL, 16))
311         as_bad (_("assembly 0x%08x, expected %s"), opcode, exp_opcode);
312     }
313 }
314
315 \f
316 /** Support for machine-dependent assembler directives.  */
317 /* Handle the .align pseudo-op.  This aligns to a power of two.  It
318    also adjusts any current instruction label.  We treat this the same
319    way the MIPS port does: .align 0 turns off auto alignment.  */
320 static void
321 s_pru_align (int ignore ATTRIBUTE_UNUSED)
322 {
323   int align;
324   char fill;
325   const char *pfill = NULL;
326   long max_alignment = 15;
327
328   align = get_absolute_expression ();
329   if (align > max_alignment)
330     {
331       align = max_alignment;
332       as_bad (_("Alignment too large: %d assumed"), align);
333     }
334   else if (align < 0)
335     {
336       as_warn (_("Alignment negative: 0 assumed"));
337       align = 0;
338     }
339
340   if (*input_line_pointer == ',')
341     {
342       input_line_pointer++;
343       fill = get_absolute_expression ();
344       pfill = (const char *) &fill;
345     }
346   else if (subseg_text_p (now_seg))
347     pfill = (const char *) &nop;
348   else
349     {
350       pfill = NULL;
351       pru_last_label = NULL;
352     }
353
354   if (align != 0)
355     {
356       pru_auto_align_on = 1;
357       pru_align (align, pfill, pru_last_label);
358       pru_last_label = NULL;
359     }
360   else
361     pru_auto_align_on = 0;
362
363   demand_empty_rest_of_line ();
364 }
365
366 /* Handle the .text pseudo-op.  This is like the usual one, but it
367    clears the saved last label and resets known alignment.  */
368 static void
369 s_pru_text (int i)
370 {
371   s_text (i);
372   pru_last_label = NULL;
373   pru_current_align = 0;
374   pru_current_align_seg = now_seg;
375 }
376
377 /* Handle the .data pseudo-op.  This is like the usual one, but it
378    clears the saved last label and resets known alignment.  */
379 static void
380 s_pru_data (int i)
381 {
382   s_data (i);
383   pru_last_label = NULL;
384   pru_current_align = 0;
385   pru_current_align_seg = now_seg;
386 }
387
388 /* Handle the .section pseudo-op.  This is like the usual one, but it
389    clears the saved last label and resets known alignment.  */
390 static void
391 s_pru_section (int ignore)
392 {
393   obj_elf_section (ignore);
394   pru_last_label = NULL;
395   pru_current_align = 0;
396   pru_current_align_seg = now_seg;
397 }
398
399 /* Explicitly unaligned cons.  */
400 static void
401 s_pru_ucons (int nbytes)
402 {
403   int hold;
404   hold = pru_auto_align_on;
405   pru_auto_align_on = 0;
406   cons (nbytes);
407   pru_auto_align_on = hold;
408 }
409
410 /* .set sets assembler options.  */
411 static void
412 s_pru_set (int equiv)
413 {
414   char *save = input_line_pointer;
415   char *directive;
416   char delim = get_symbol_name (&directive);
417   char *endline = input_line_pointer;
418
419   (void) restore_line_pointer (delim);
420
421   /* We only want to handle ".set XXX" if the
422      user has tried ".set XXX, YYY" they are not
423      trying a directive.  This prevents
424      us from polluting the name space.  */
425   SKIP_WHITESPACE ();
426   if (is_end_of_line[(unsigned char) *input_line_pointer])
427     {
428       bfd_boolean done = TRUE;
429       *endline = 0;
430
431       if (!strcmp (directive, "no_warn_regname_label"))
432           pru_opt.warn_regname_label = FALSE;
433       else
434         done = FALSE;
435
436       if (done)
437         {
438           *endline = delim;
439           demand_empty_rest_of_line ();
440           return;
441         }
442     }
443
444   /* If we fall through to here, either we have ".set XXX, YYY"
445      or we have ".set XXX" where XXX is unknown or we have
446      a syntax error.  */
447   input_line_pointer = save;
448   s_set (equiv);
449 }
450
451 /* Machine-dependent assembler directives.
452    Format of each entry is:
453    { "directive", handler_func, param }  */
454 const pseudo_typeS md_pseudo_table[] = {
455   {"align", s_pru_align, 0},
456   {"text", s_pru_text, 0},
457   {"data", s_pru_data, 0},
458   {"section", s_pru_section, 0},
459   {"section.s", s_pru_section, 0},
460   {"sect", s_pru_section, 0},
461   {"sect.s", s_pru_section, 0},
462   /* .dword and .half are included for compatibility with MIPS.  */
463   {"dword", cons, 8},
464   {"half", cons, 2},
465   /* PRU native word size is 4 bytes, so we override
466      the GAS default of 2.  */
467   {"word", cons, 4},
468   /* Explicitly unaligned directives.  */
469   {"2byte", s_pru_ucons, 2},
470   {"4byte", s_pru_ucons, 4},
471   {"8byte", s_pru_ucons, 8},
472   {"16byte", s_pru_ucons, 16},
473   {"set", s_pru_set, 0},
474   {NULL, NULL, 0}
475 };
476
477 \f
478 int
479 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
480                                asection *seg ATTRIBUTE_UNUSED)
481 {
482   abort ();
483   return 0;
484 }
485
486 void
487 md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT segment ATTRIBUTE_UNUSED,
488                  fragS *fragp ATTRIBUTE_UNUSED)
489 {
490   abort ();
491 }
492
493 \f
494 static bfd_boolean
495 relaxable_section (asection *sec)
496 {
497   return ((sec->flags & SEC_DEBUGGING) == 0
498           && (sec->flags & SEC_CODE) != 0
499           && (sec->flags & SEC_ALLOC) != 0);
500 }
501
502 /* Does whatever the xtensa port does.  */
503 int
504 pru_validate_fix_sub (fixS *fix)
505 {
506   segT add_symbol_segment, sub_symbol_segment;
507
508   /* The difference of two symbols should be resolved by the assembler when
509      linkrelax is not set.  If the linker may relax the section containing
510      the symbols, then an Xtensa DIFF relocation must be generated so that
511      the linker knows to adjust the difference value.  */
512   if (!linkrelax || fix->fx_addsy == NULL)
513     return 0;
514
515   /* Make sure both symbols are in the same segment, and that segment is
516      "normal" and relaxable.  If the segment is not "normal", then the
517      fix is not valid.  If the segment is not "relaxable", then the fix
518      should have been handled earlier.  */
519   add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
520   if (! SEG_NORMAL (add_symbol_segment)
521       || ! relaxable_section (add_symbol_segment))
522     return 0;
523
524   sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
525   return (sub_symbol_segment == add_symbol_segment);
526 }
527
528 /* TC_FORCE_RELOCATION hook.  */
529
530 /* If linkrelax is turned on, and the symbol to relocate
531    against is in a relaxable segment, don't compute the value -
532    generate a relocation instead.  */
533 int
534 pru_force_relocation (fixS *fix)
535 {
536   if (linkrelax && fix->fx_addsy
537       && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
538     return 1;
539
540   return generic_force_reloc (fix);
541 }
542
543
544 \f
545 /** Fixups and overflow checking.  */
546
547 /* Check a fixup for overflow.  */
548 static bfd_reloc_status_type
549 pru_check_overflow (valueT fixup, reloc_howto_type *howto)
550 {
551   bfd_reloc_status_type ret;
552
553   ret = bfd_check_overflow (howto->complain_on_overflow,
554                             howto->bitsize,
555                             howto->rightshift,
556                             bfd_get_reloc_size (howto) * 8,
557                             fixup);
558
559   return ret;
560 }
561
562 /* Emit diagnostic for fixup overflow.  */
563 static void
564 pru_diagnose_overflow (valueT fixup, reloc_howto_type *howto,
565                          fixS *fixP, valueT value)
566 {
567   if (fixP->fx_r_type == BFD_RELOC_8
568       || fixP->fx_r_type == BFD_RELOC_16
569       || fixP->fx_r_type == BFD_RELOC_32)
570     /* These relocs are against data, not instructions.  */
571     as_bad_where (fixP->fx_file, fixP->fx_line,
572                   _("immediate value 0x%x truncated to 0x%x"),
573                   (unsigned int) fixup,
574                   (unsigned int) (~(~(valueT) 0 << howto->bitsize) & fixup));
575   else
576     {
577       /* What opcode is the instruction?  This will determine
578          whether we check for overflow in immediate values
579          and what error message we get.  */
580       const struct pru_opcode *opcode;
581       enum overflow_type overflow_msg_type;
582       unsigned int range_min;
583       unsigned int range_max;
584       unsigned int address;
585       gas_assert (fixP->fx_size == 4);
586       opcode = pru_find_opcode (value);
587       gas_assert (opcode);
588       overflow_msg_type = opcode->overflow_msg;
589       switch (overflow_msg_type)
590         {
591         case call_target_overflow:
592           range_min
593             = ((fixP->fx_frag->fr_address + fixP->fx_where) & 0xf0000000);
594           range_max = range_min + 0x0fffffff;
595           address = fixup | range_min;
596
597           as_bad_where (fixP->fx_file, fixP->fx_line,
598                         _("call target address 0x%08x out of range 0x%08x to 0x%08x"),
599                         address, range_min, range_max);
600           break;
601         case qbranch_target_overflow:
602           as_bad_where (fixP->fx_file, fixP->fx_line,
603                         _("quick branch offset %d out of range %d to %d"),
604                         (int)fixup, -((1<<9) * 4), (1 << 9) * 4);
605           break;
606         case address_offset_overflow:
607           as_bad_where (fixP->fx_file, fixP->fx_line,
608                         _("%s offset %d out of range %d to %d"),
609                         opcode->name, (int)fixup, -32768, 32767);
610           break;
611         case signed_immed16_overflow:
612           as_bad_where (fixP->fx_file, fixP->fx_line,
613                         _("immediate value %d out of range %d to %d"),
614                         (int)fixup, -32768, 32767);
615           break;
616         case unsigned_immed32_overflow:
617           as_bad_where (fixP->fx_file, fixP->fx_line,
618                         _("immediate value %llu out of range %u to %lu"),
619                         (unsigned long long)fixup, 0, 0xfffffffflu);
620           break;
621         case unsigned_immed16_overflow:
622           as_bad_where (fixP->fx_file, fixP->fx_line,
623                         _("immediate value %u out of range %u to %u"),
624                         (unsigned int)fixup, 0, 65535);
625           break;
626         case unsigned_immed5_overflow:
627           as_bad_where (fixP->fx_file, fixP->fx_line,
628                         _("immediate value %u out of range %u to %u"),
629                         (unsigned int)fixup, 0, 31);
630           break;
631         default:
632           as_bad_where (fixP->fx_file, fixP->fx_line,
633                         _("overflow in immediate argument"));
634           break;
635         }
636     }
637 }
638
639 /* Apply a fixup to the object file.  */
640 void
641 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
642 {
643   unsigned char *where;
644   valueT value = *valP;
645   long n;
646
647   /* Assert that the fixup is one we can handle.  */
648   gas_assert (fixP != NULL && valP != NULL
649               && (fixP->fx_r_type == BFD_RELOC_8
650                   || fixP->fx_r_type == BFD_RELOC_16
651                   || fixP->fx_r_type == BFD_RELOC_32
652                   || fixP->fx_r_type == BFD_RELOC_64
653                   || fixP->fx_r_type == BFD_RELOC_PRU_LDI32
654                   || fixP->fx_r_type == BFD_RELOC_PRU_U16
655                   || fixP->fx_r_type == BFD_RELOC_PRU_U16_PMEMIMM
656                   || fixP->fx_r_type == BFD_RELOC_PRU_S10_PCREL
657                   || fixP->fx_r_type == BFD_RELOC_PRU_U8_PCREL
658                   || fixP->fx_r_type == BFD_RELOC_PRU_32_PMEM
659                   || fixP->fx_r_type == BFD_RELOC_PRU_16_PMEM
660                   /* Add other relocs here as we generate them.  */
661               ));
662
663   if (fixP->fx_r_type == BFD_RELOC_64)
664     {
665       /* We may reach here due to .8byte directives, but we never output
666          BFD_RELOC_64; it must be resolved.  */
667       if (fixP->fx_addsy != NULL)
668         as_bad_where (fixP->fx_file, fixP->fx_line,
669                       _("cannot create 64-bit relocation"));
670       else
671         {
672           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
673                               *valP, 8);
674           fixP->fx_done = 1;
675         }
676       return;
677     }
678
679   /* gas_assert (had_errors () || !fixP->fx_subsy); */
680
681   /* In general, fix instructions with immediate
682      constants.  But leave LDI32 for the linker,
683      which is prepared to shorten insns.  */
684   if (fixP->fx_addsy == (symbolS *) NULL
685       && fixP->fx_r_type != BFD_RELOC_PRU_LDI32)
686     fixP->fx_done = 1;
687
688   else if (fixP->fx_pcrel)
689     {
690       segT s = S_GET_SEGMENT (fixP->fx_addsy);
691
692       if (s == seg || s == absolute_section)
693         {
694           /* Blindly copied from AVR, but I don't understand why
695              this is needed in the first place.  Fail hard to catch
696              when this curious code snippet is utilized.  */
697           as_bad_where (fixP->fx_file, fixP->fx_line,
698                         _("unexpected PC relative expression"));
699           value += S_GET_VALUE (fixP->fx_addsy);
700           fixP->fx_done = 1;
701         }
702     }
703   else if (linkrelax && fixP->fx_subsy)
704     {
705       /* For a subtraction relocation expression, generate one
706          of the DIFF relocs, with the value being the difference.
707          Note that a sym1 - sym2 expression is adjusted into a
708          section_start_sym + sym4_offset_from_section_start - sym1
709          expression.  fixP->fx_addsy holds the section start symbol,
710          fixP->fx_offset holds sym2's offset, and fixP->fx_subsy
711          holds sym1.  Calculate the current difference and write value,
712          but leave fx_offset as is - during relaxation,
713          fx_offset - value gives sym1's value.  */
714
715       offsetT diffval;  /* valueT is unsigned, so use offsetT.  */
716
717       diffval = S_GET_VALUE (fixP->fx_addsy)
718                 + fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy);
719
720       switch (fixP->fx_r_type)
721         {
722         case BFD_RELOC_8:
723           fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF8;
724           break;
725         case BFD_RELOC_16:
726           fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF16;
727           break;
728         case BFD_RELOC_32:
729           fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF32;
730           break;
731         case BFD_RELOC_PRU_16_PMEM:
732           fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF16_PMEM;
733           if (diffval % 4)
734             as_bad_where (fixP->fx_file, fixP->fx_line,
735                           _("residual low bits in pmem diff relocation"));
736           diffval /= 4;
737           break;
738         case BFD_RELOC_PRU_32_PMEM:
739           fixP->fx_r_type = BFD_RELOC_PRU_GNU_DIFF32_PMEM;
740           if (diffval % 4)
741             as_bad_where (fixP->fx_file, fixP->fx_line,
742                           _("residual low bits in pmem diff relocation"));
743           diffval /= 4;
744           break;
745         default:
746           as_bad_where (fixP->fx_file, fixP->fx_line,
747                         _("expression too complex"));
748           break;
749         }
750
751       value = *valP = diffval;
752
753       fixP->fx_subsy = NULL;
754   }
755   /* We don't actually support subtracting a symbol.  */
756   if (fixP->fx_subsy != (symbolS *) NULL)
757     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
758
759   /* For the DIFF relocs, write the value into the object file while still
760      keeping fx_done FALSE, as both the difference (recorded in the object file)
761      and the sym offset (part of fixP) are needed at link relax time.  */
762   where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
763   switch (fixP->fx_r_type)
764     {
765     case BFD_RELOC_PRU_GNU_DIFF8:
766       *where = value;
767       break;
768     case BFD_RELOC_PRU_GNU_DIFF16:
769     case BFD_RELOC_PRU_GNU_DIFF16_PMEM:
770       bfd_putl16 ((bfd_vma) value, where);
771       break;
772     case BFD_RELOC_PRU_GNU_DIFF32:
773     case BFD_RELOC_PRU_GNU_DIFF32_PMEM:
774       bfd_putl32 ((bfd_vma) value, where);
775       break;
776     default:
777       break;
778     }
779
780   if (fixP->fx_done)
781     /* Fully resolved fixup.  */
782     {
783       reloc_howto_type *howto
784         = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
785
786       if (howto == NULL)
787         as_bad_where (fixP->fx_file, fixP->fx_line,
788                       _("relocation is not supported"));
789       else
790         {
791           valueT fixup = value;
792           uint64_t insn;
793           char *buf;
794
795           /* Get the instruction or data to be fixed up.  */
796           buf = fixP->fx_frag->fr_literal + fixP->fx_where;
797           insn = md_chars_to_number (buf, fixP->fx_size);
798
799           /* Check for overflow, emitting a diagnostic if necessary.  */
800           if (pru_check_overflow (fixup, howto) != bfd_reloc_ok)
801             pru_diagnose_overflow (fixup, howto, fixP, insn);
802
803           /* Apply the right shift.  */
804           fixup = ((offsetT)fixup) >> howto->rightshift;
805
806           /* Truncate the fixup to right size.  */
807           n = sizeof (fixup) * 8 - howto->bitsize;
808           fixup = (fixup << n) >> n;
809
810           /* Fix up the instruction.  Non-contiguous bitfields need
811              special handling.  */
812           if (fixP->fx_r_type == BFD_RELOC_PRU_LDI32)
813             {
814               /* As the only 64-bit "insn", LDI32 needs special handling. */
815               uint32_t insn1 = insn & 0xffffffff;
816               uint32_t insn2 = insn >> 32;
817               SET_INSN_FIELD (IMM16, insn1, fixup >> 16);
818               SET_INSN_FIELD (IMM16, insn2, fixup & 0xffff);
819
820               SET_INSN_FIELD (RDSEL, insn1, RSEL_31_16);
821               SET_INSN_FIELD (RDSEL, insn2, RSEL_15_0);
822
823               md_number_to_chars (buf, insn1, 4);
824               md_number_to_chars (buf + 4, insn2, 4);
825             }
826           else
827             {
828               if (fixP->fx_r_type == BFD_RELOC_PRU_S10_PCREL)
829                 SET_BROFF_URAW (insn, fixup);
830               else
831                 insn = (insn & ~howto->dst_mask) | (fixup << howto->bitpos);
832               md_number_to_chars (buf, insn, fixP->fx_size);
833             }
834         }
835
836       fixP->fx_done = 1;
837     }
838
839   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
840     {
841       fixP->fx_done = 0;
842       if (fixP->fx_addsy
843           && !S_IS_DEFINED (fixP->fx_addsy) && !S_IS_WEAK (fixP->fx_addsy))
844         S_SET_WEAK (fixP->fx_addsy);
845     }
846   else if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
847     fixP->fx_done = 0;
848 }
849
850
851 \f
852 /** Instruction parsing support.  */
853
854 /* Creates a new pru_insn_relocS and returns a pointer to it.  */
855 static pru_insn_relocS *
856 pru_insn_reloc_new (bfd_reloc_code_real_type reloc_type, unsigned int pcrel)
857 {
858   pru_insn_relocS *retval;
859   retval = XNEW (pru_insn_relocS);
860   if (retval == NULL)
861     {
862       as_bad (_("can't create relocation"));
863       abort ();
864     }
865
866   /* Fill out the fields with default values.  */
867   retval->reloc_next = NULL;
868   retval->reloc_type = reloc_type;
869   retval->reloc_pcrel = pcrel;
870   return retval;
871 }
872
873 /* Frees up memory previously allocated by pru_insn_reloc_new ().  */
874 static void
875 pru_insn_reloc_destroy (pru_insn_relocS *reloc)
876 {
877   pru_insn_relocS *next;
878
879   while (reloc)
880     {
881       next = reloc->reloc_next;
882       free (reloc);
883       reloc = next;
884     }
885 }
886
887 /* The various pru_assemble_* functions call this
888    function to generate an expression from a string representing an expression.
889    It then tries to evaluate the expression, and if it can, returns its value.
890    If not, it creates a new pru_insn_relocS and stores the expression and
891    reloc_type for future use.  */
892 static unsigned long
893 pru_assemble_expression (const char *exprstr,
894                            pru_insn_infoS *insn,
895                            pru_insn_relocS *prev_reloc,
896                            bfd_reloc_code_real_type reloc_type,
897                            unsigned int pcrel)
898 {
899   expressionS *ep;
900   pru_insn_relocS *reloc;
901   char *saved_line_ptr;
902   unsigned short value;
903
904   gas_assert (exprstr != NULL);
905   gas_assert (insn != NULL);
906
907   /* We use this blank keyword to distinguish register from
908      label operands.  */
909   if (strstr (exprstr, "%label") != NULL)
910     {
911       exprstr += strlen ("%label") + 1;
912     }
913
914   /* Check for pmem relocation operator.
915      Change the relocation type and advance the ptr to the start of
916      the expression proper.  */
917   if (strstr (exprstr, "%pmem") != NULL)
918     {
919       reloc_type = BFD_RELOC_PRU_U16_PMEMIMM;
920       exprstr += strlen ("%pmem") + 1;
921     }
922
923   /* We potentially have a relocation.  */
924   reloc = pru_insn_reloc_new (reloc_type, pcrel);
925   if (prev_reloc != NULL)
926     prev_reloc->reloc_next = reloc;
927   else
928     insn->insn_reloc = reloc;
929
930   /* Parse the expression string.  */
931   ep = &reloc->reloc_expression;
932   saved_line_ptr = input_line_pointer;
933   input_line_pointer = (char *) exprstr;
934   SKIP_WHITESPACE ();
935   expression (ep);
936   SKIP_WHITESPACE ();
937   if (*input_line_pointer)
938     as_bad (_("trailing garbage after expression: %s"), input_line_pointer);
939   input_line_pointer = saved_line_ptr;
940
941
942   if (ep->X_op == O_illegal || ep->X_op == O_absent)
943     as_bad (_("expected expression, got %s"), exprstr);
944
945   /* This is redundant as the fixup will put this into
946      the instruction, but it is included here so that
947      self-test mode (-r) works.  */
948   value = 0;
949   if (pru_mode == PRU_MODE_TEST && ep->X_op == O_constant)
950     value = ep->X_add_number;
951
952   return (unsigned long) value;
953 }
954
955 /* Try to parse a non-relocatable expression.  */
956 static unsigned long
957 pru_assemble_noreloc_expression (const char *exprstr)
958 {
959   expressionS exp;
960   char *saved_line_ptr;
961   unsigned long val;
962
963   gas_assert (exprstr != NULL);
964
965   saved_line_ptr = input_line_pointer;
966   input_line_pointer = (char *) exprstr;
967   SKIP_WHITESPACE ();
968   expression (&exp);
969   SKIP_WHITESPACE ();
970   if (*input_line_pointer)
971     as_bad (_("trailing garbage after expression: %s"), input_line_pointer);
972   input_line_pointer = saved_line_ptr;
973
974   val = 0;
975   if (exp.X_op != O_constant)
976     as_bad (_("expected constant expression, got %s"), exprstr);
977   else
978     val = exp.X_add_number;
979
980   return val;
981 }
982
983 /* Argument assemble functions.
984    All take an instruction argument string, and a pointer
985    to an instruction opcode.  Upon return the insn_opcode
986    has the relevant fields filled in to represent the arg
987    string.  The return value is NULL if successful, or
988    an error message if an error was detected.  */
989
990 static void
991 pru_assemble_arg_d (pru_insn_infoS *insn_info, const char *argstr)
992 {
993   struct pru_reg *dst = pru_reg_lookup (argstr);
994
995   if (dst == NULL)
996     as_bad (_("unknown register %s"), argstr);
997   else
998     {
999       SET_INSN_FIELD (RD, insn_info->insn_code, dst->index);
1000       SET_INSN_FIELD (RDSEL, insn_info->insn_code, dst->regsel);
1001     }
1002 }
1003
1004 static void
1005 pru_assemble_arg_D (pru_insn_infoS *insn_info, const char *argstr)
1006 {
1007   struct pru_reg *dst;
1008
1009   /* The leading & before an address register is optional.  */
1010   if (*argstr == '&')
1011     argstr++;
1012
1013   dst = pru_reg_lookup (argstr);
1014
1015   if (dst == NULL)
1016     as_bad (_("unknown register %s"), argstr);
1017   else
1018     {
1019       unsigned long rxb = 0;
1020
1021       switch (dst->regsel)
1022         {
1023         case RSEL_31_0: rxb = 0; break; /* whole register defaults to .b0  */
1024         case RSEL_7_0: rxb = 0; break;
1025         case RSEL_15_8: rxb = 1; break;
1026         case RSEL_23_16: rxb = 2; break;
1027         case RSEL_31_24: rxb = 3; break;
1028         default:
1029           as_bad (_("data transfer register cannot be halfword"));
1030         }
1031
1032       SET_INSN_FIELD (RD, insn_info->insn_code, dst->index);
1033       SET_INSN_FIELD (RDB, insn_info->insn_code, rxb);
1034     }
1035 }
1036
1037 static void
1038 pru_assemble_arg_R (pru_insn_infoS *insn_info, const char *argstr)
1039 {
1040   struct pru_reg *dst = pru_reg_lookup (argstr);
1041
1042   if (dst == NULL)
1043     as_bad (_("unknown register %s"), argstr);
1044   else
1045     {
1046       if (dst->regsel != RSEL_31_0)
1047         {
1048           as_bad (_("destination register must be full-word"));
1049         }
1050
1051       SET_INSN_FIELD (RD, insn_info->insn_code, dst->index);
1052       SET_INSN_FIELD (RDSEL, insn_info->insn_code, dst->regsel);
1053     }
1054 }
1055
1056 static void
1057 pru_assemble_arg_s (pru_insn_infoS *insn_info, const char *argstr)
1058 {
1059   struct pru_reg *src1 = pru_reg_lookup (argstr);
1060
1061   if (src1 == NULL)
1062     as_bad (_("unknown register %s"), argstr);
1063   else
1064     {
1065       SET_INSN_FIELD (RS1, insn_info->insn_code, src1->index);
1066       SET_INSN_FIELD (RS1SEL, insn_info->insn_code, src1->regsel);
1067     }
1068 }
1069
1070 static void
1071 pru_assemble_arg_S (pru_insn_infoS *insn_info, const char *argstr)
1072 {
1073   struct pru_reg *src1 = pru_reg_lookup (argstr);
1074
1075   if (src1 == NULL)
1076     as_bad (_("unknown register %s"), argstr);
1077   else
1078     {
1079       if (src1->regsel != RSEL_31_0)
1080         as_bad (_("cannot use partial register %s for addressing"), argstr);
1081       SET_INSN_FIELD (RS1, insn_info->insn_code, src1->index);
1082     }
1083 }
1084
1085 static void
1086 pru_assemble_arg_b (pru_insn_infoS *insn_info, const char *argstr)
1087 {
1088   struct pru_reg *src2 = pru_reg_lookup (argstr);
1089   if (src2 == NULL)
1090     {
1091       unsigned long imm8 = pru_assemble_noreloc_expression (argstr);
1092       if (imm8 >= 0x100)
1093         as_bad (_("value %lu is too large for a byte operand"), imm8);
1094       SET_INSN_FIELD (IMM8, insn_info->insn_code, imm8);
1095       SET_INSN_FIELD (IO, insn_info->insn_code, 1);
1096     }
1097   else
1098     {
1099       SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1100       SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index);
1101       SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel);
1102     }
1103
1104 }
1105
1106 static void
1107 pru_assemble_arg_B (pru_insn_infoS *insn_info, const char *argstr)
1108 {
1109   struct pru_reg *src2 = pru_reg_lookup (argstr);
1110   if (src2 == NULL)
1111     {
1112       unsigned long imm8;
1113       imm8 = pru_assemble_noreloc_expression (argstr);
1114       if (!imm8 || imm8 > 0xff)
1115         as_bad (_("loop count constant %ld is out of range [1..%d]"),
1116                 imm8, 0xff);
1117       /* Note: HW expects the immediate loop count field
1118          to be one less than the actual loop count.  */
1119       SET_INSN_FIELD (IMM8, insn_info->insn_code, imm8 - 1);
1120       SET_INSN_FIELD (IO, insn_info->insn_code, 1);
1121     }
1122   else
1123     {
1124       SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1125       SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index);
1126       SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel);
1127     }
1128 }
1129
1130 static void
1131 pru_assemble_arg_i (pru_insn_infoS *insn_info, const char *argstr)
1132 {
1133   unsigned long imm32;
1134
1135   /* We must not generate PRU_LDI32 relocation if relaxation is disabled in
1136      GAS. Consider the following scenario: GAS relaxation is disabled, so
1137      DIFF* expressions are fixed and not emitted as relocations. Then if LD
1138      has relaxation enabled, it may shorten LDI32 but will not update
1139      accordingly the DIFF expressions.  */
1140   if (pru_opt.link_relax)
1141     imm32 = pru_assemble_expression (argstr, insn_info,
1142                                      insn_info->insn_reloc,
1143                                      BFD_RELOC_PRU_LDI32, 0);
1144   else
1145     imm32 = pru_assemble_noreloc_expression (argstr);
1146
1147   /* QUIRK: LDI must clear IO bit high, even though it has immediate arg. */
1148   SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1149   SET_INSN_FIELD (RDSEL, insn_info->insn_code, RSEL_31_16);
1150   SET_INSN_FIELD (IMM16, insn_info->insn_code, imm32 >> 16);
1151   insn_info->ldi32_imm32 = imm32;
1152 }
1153
1154 static void
1155 pru_assemble_arg_j (pru_insn_infoS *insn_info, const char *argstr)
1156 {
1157   struct pru_reg *src2 = pru_reg_lookup (argstr);
1158
1159   if (src2 == NULL)
1160     {
1161       unsigned long imm16 = pru_assemble_expression (argstr, insn_info,
1162                                                      insn_info->insn_reloc,
1163                                                      BFD_RELOC_PRU_U16_PMEMIMM,
1164                                                      0);
1165       SET_INSN_FIELD (IMM16, insn_info->insn_code, imm16);
1166       SET_INSN_FIELD (IO, insn_info->insn_code, 1);
1167     }
1168   else
1169     {
1170       SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1171       SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index);
1172       SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel);
1173     }
1174 }
1175
1176 static void
1177 pru_assemble_arg_W (pru_insn_infoS *insn_info, const char *argstr)
1178 {
1179   unsigned long imm16 = pru_assemble_expression (argstr, insn_info,
1180                                                  insn_info->insn_reloc,
1181                                                  BFD_RELOC_PRU_U16, 0);
1182   /* QUIRK: LDI must clear IO bit high, even though it has immediate arg.  */
1183   SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1184   SET_INSN_FIELD (IMM16, insn_info->insn_code, imm16);
1185 }
1186
1187 static void
1188 pru_assemble_arg_o (pru_insn_infoS *insn_info, const char *argstr)
1189 {
1190   unsigned long imm10 = pru_assemble_expression (argstr, insn_info,
1191                                                  insn_info->insn_reloc,
1192                                                  BFD_RELOC_PRU_S10_PCREL, 1);
1193   SET_BROFF_URAW (insn_info->insn_code, imm10);
1194 }
1195
1196 static void
1197 pru_assemble_arg_O (pru_insn_infoS *insn_info, const char *argstr)
1198 {
1199   unsigned long imm8 = pru_assemble_expression (argstr, insn_info,
1200                                                 insn_info->insn_reloc,
1201                                                 BFD_RELOC_PRU_U8_PCREL, 1);
1202   SET_INSN_FIELD (LOOP_JMPOFFS, insn_info->insn_code, imm8);
1203 }
1204
1205 static void
1206 pru_assemble_arg_l (pru_insn_infoS *insn_info, const char *argstr)
1207 {
1208   unsigned long burstlen = 0;
1209   struct pru_reg *blreg = pru_reg_lookup (argstr);
1210
1211   if (blreg == NULL)
1212     {
1213       burstlen = pru_assemble_noreloc_expression (argstr);
1214       if (!burstlen || burstlen > LSSBBO_BYTECOUNT_R0_BITS7_0)
1215         as_bad (_("byte count constant %ld is out of range [1..%d]"),
1216                 burstlen, LSSBBO_BYTECOUNT_R0_BITS7_0);
1217       burstlen--;
1218     }
1219   else
1220     {
1221       if (blreg->index != 0)
1222         as_bad (_("only r0 can be used as byte count register"));
1223       else if (blreg->regsel > RSEL_31_24)
1224         as_bad (_("only r0.bX byte fields of r0 can be used as byte count"));
1225       else
1226         burstlen = LSSBBO_BYTECOUNT_R0_BITS7_0 + blreg->regsel;
1227     }
1228     SET_BURSTLEN (insn_info->insn_code, burstlen);
1229 }
1230
1231 static void
1232 pru_assemble_arg_n (pru_insn_infoS *insn_info, const char *argstr)
1233 {
1234   unsigned long burstlen = 0;
1235   struct pru_reg *blreg = pru_reg_lookup (argstr);
1236
1237   if (blreg == NULL)
1238     {
1239       burstlen = pru_assemble_noreloc_expression (argstr);
1240       if (!burstlen || burstlen > LSSBBO_BYTECOUNT_R0_BITS7_0)
1241         as_bad (_("byte count constant %ld is out of range [1..%d]"),
1242                 burstlen, LSSBBO_BYTECOUNT_R0_BITS7_0);
1243       burstlen--;
1244     }
1245   else
1246     {
1247       if (blreg->index != 0)
1248         as_bad (_("only r0 can be used as byte count register"));
1249       else if (blreg->regsel > RSEL_31_24)
1250         as_bad (_("only r0.bX byte fields of r0 can be used as byte count"));
1251       else
1252         burstlen = LSSBBO_BYTECOUNT_R0_BITS7_0 + blreg->regsel;
1253     }
1254     SET_INSN_FIELD (XFR_LENGTH, insn_info->insn_code, burstlen);
1255 }
1256
1257 static void
1258 pru_assemble_arg_c (pru_insn_infoS *insn_info, const char *argstr)
1259 {
1260   unsigned long cb = pru_assemble_noreloc_expression (argstr);
1261
1262   if (cb > 31)
1263     as_bad (_("invalid constant table offset %ld"), cb);
1264   else
1265     SET_INSN_FIELD (CB, insn_info->insn_code, cb);
1266 }
1267
1268 static void
1269 pru_assemble_arg_w (pru_insn_infoS *insn_info, const char *argstr)
1270 {
1271   unsigned long wk = pru_assemble_noreloc_expression (argstr);
1272
1273   if (wk != 0 && wk != 1)
1274     as_bad (_("invalid WakeOnStatus %ld"), wk);
1275   else
1276     SET_INSN_FIELD (WAKEONSTATUS, insn_info->insn_code, wk);
1277 }
1278
1279 static void
1280 pru_assemble_arg_x (pru_insn_infoS *insn_info, const char *argstr)
1281 {
1282   unsigned long wba = pru_assemble_noreloc_expression (argstr);
1283
1284   if (wba > 255)
1285     as_bad (_("invalid XFR WideBus Address %ld"), wba);
1286   else
1287     SET_INSN_FIELD (XFR_WBA, insn_info->insn_code, wba);
1288 }
1289
1290 /* The function consume_arg takes a pointer into a string
1291    of instruction tokens (args) and a pointer into a string
1292    representing the expected sequence of tokens and separators.
1293    It checks whether the first argument in argstr is of the
1294    expected type, throwing an error if it is not, and returns
1295    the pointer argstr.  */
1296 static char *
1297 pru_consume_arg (char *argstr, const char *parsestr)
1298 {
1299   char *temp;
1300
1301   switch (*parsestr)
1302     {
1303     case 'W':
1304       if (*argstr == '%')
1305         {
1306           if (strprefix (argstr, "%pmem") || strprefix (argstr, "%label"))
1307             {
1308               /* We zap the parentheses because we don't want them confused
1309                  with separators.  */
1310               temp = strchr (argstr, '(');
1311               if (temp != NULL)
1312                 *temp = ' ';
1313               temp = strchr (argstr, ')');
1314               if (temp != NULL)
1315                 *temp = ' ';
1316             }
1317           else
1318             as_bad (_("badly formed expression near %s"), argstr);
1319         }
1320       break;
1321
1322     case 'j':
1323     case 'o':
1324     case 'O':
1325       if (*argstr == '%')
1326         {
1327           /* Only 'j' really requires %label for distinguishing registers
1328              from labels, but we include 'o' and 'O' here to avoid
1329              confusing assembler programmers. Thus for completeness all
1330              jump operands can be prefixed with %label.  */
1331           if (strprefix (argstr, "%label"))
1332             {
1333               /* We zap the parentheses because we don't want them confused
1334                  with separators.  */
1335               temp = strchr (argstr, '(');
1336               if (temp != NULL)
1337                 *temp = ' ';
1338               temp = strchr (argstr, ')');
1339               if (temp != NULL)
1340                 *temp = ' ';
1341             }
1342           else
1343             as_bad (_("badly formed expression near %s"), argstr);
1344         }
1345       break;
1346
1347     case 'b':
1348     case 'B':
1349     case 'c':
1350     case 'd':
1351     case 'D':
1352     case 'E':
1353     case 'i':
1354     case 's':
1355     case 'S':
1356     case 'l':
1357     case 'n':
1358     case 'R':
1359     case 'w':
1360     case 'x':
1361       /* We can't have %pmem here.  */
1362       if (*argstr == '%')
1363         as_bad (_("badly formed expression near %s"), argstr);
1364       break;
1365     default:
1366       BAD_CASE (*parsestr);
1367       break;
1368     }
1369
1370   return argstr;
1371 }
1372
1373 /* The function consume_separator takes a pointer into a string
1374    of instruction tokens (args) and a pointer into a string representing
1375    the expected sequence of tokens and separators.  It finds the first
1376    instance of the character pointed to by separator in argstr, and
1377    returns a pointer to the next element of argstr, which is the
1378    following token in the sequence.  */
1379 static char *
1380 pru_consume_separator (char *argstr, const char *separator)
1381 {
1382   char *p;
1383
1384   p = strchr (argstr, *separator);
1385
1386   if (p != NULL)
1387     *p++ = 0;
1388   else
1389     as_bad (_("expecting %c near %s"), *separator, argstr);
1390   return p;
1391 }
1392
1393
1394 /* The principal argument parsing function which takes a string argstr
1395    representing the instruction arguments for insn, and extracts the argument
1396    tokens matching parsestr into parsed_args.  */
1397 static void
1398 pru_parse_args (pru_insn_infoS *insn ATTRIBUTE_UNUSED, char *argstr,
1399                   const char *parsestr, char **parsed_args)
1400 {
1401   char *p;
1402   char *end = NULL;
1403   int i;
1404   p = argstr;
1405   i = 0;
1406   bfd_boolean terminate = FALSE;
1407
1408   /* This rest of this function is it too fragile and it mostly works,
1409      therefore special case this one.  */
1410   if (*parsestr == 0 && argstr != 0)
1411     {
1412       as_bad (_("too many arguments"));
1413       parsed_args[0] = NULL;
1414       return;
1415     }
1416
1417   while (p != NULL && !terminate && i < PRU_MAX_INSN_TOKENS)
1418     {
1419       parsed_args[i] = pru_consume_arg (p, parsestr);
1420       ++parsestr;
1421       if (*parsestr != '\0')
1422         {
1423           p = pru_consume_separator (p, parsestr);
1424           ++parsestr;
1425         }
1426       else
1427         {
1428           /* Check that the argument string has no trailing arguments.  */
1429           /* If we've got a %pmem relocation, we've zapped the parens with
1430              spaces.  */
1431           if (strprefix (p, "%pmem") || strprefix (p, "%label"))
1432             end = strpbrk (p, ",");
1433           else
1434             end = strpbrk (p, " ,");
1435
1436           if (end != NULL)
1437             as_bad (_("too many arguments"));
1438         }
1439
1440       if (*parsestr == '\0' || (p != NULL && *p == '\0'))
1441         terminate = TRUE;
1442       ++i;
1443     }
1444
1445   parsed_args[i] = NULL;
1446
1447   /* There are no instructions with optional arguments; complain.  */
1448   if (*parsestr != '\0')
1449     as_bad (_("missing argument"));
1450 }
1451
1452 \f
1453 /** Assembler output support.  */
1454
1455 /* Output a normal instruction.  */
1456 static void
1457 output_insn (pru_insn_infoS *insn)
1458 {
1459   char *f;
1460   pru_insn_relocS *reloc;
1461
1462   f = frag_more (4);
1463   /* This allocates enough space for the instruction
1464      and puts it in the current frag.  */
1465   md_number_to_chars (f, insn->insn_code, 4);
1466   /* Emit debug info.  */
1467   dwarf2_emit_insn (4);
1468   /* Create any fixups to be acted on later.  */
1469   for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next)
1470     fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
1471                  &reloc->reloc_expression, reloc->reloc_pcrel,
1472                  reloc->reloc_type);
1473 }
1474
1475 /* Output two LDI instructions from LDI32 macro */
1476 static void
1477 output_insn_ldi32 (pru_insn_infoS *insn)
1478 {
1479   char *f;
1480   pru_insn_relocS *reloc;
1481   unsigned long insn2;
1482
1483   f = frag_more (8);
1484   SET_INSN_FIELD (IMM16, insn->insn_code, insn->ldi32_imm32 >> 16);
1485   SET_INSN_FIELD (RDSEL, insn->insn_code, RSEL_31_16);
1486   md_number_to_chars (f, insn->insn_code, 4);
1487
1488   insn2 = insn->insn_code;
1489   SET_INSN_FIELD (IMM16, insn2, insn->ldi32_imm32 & 0xffff);
1490   SET_INSN_FIELD (RDSEL, insn2, RSEL_15_0);
1491   md_number_to_chars (f + 4, insn2, 4);
1492
1493   /* Emit debug info.  */
1494   dwarf2_emit_insn (8);
1495
1496   /* Create any fixups to be acted on later.  */
1497   for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next)
1498     fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
1499                  &reloc->reloc_expression, reloc->reloc_pcrel,
1500                  reloc->reloc_type);
1501 }
1502
1503 \f
1504 /** External interfaces.  */
1505
1506 /* The following functions are called by machine-independent parts of
1507    the assembler.  */
1508 int
1509 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
1510 {
1511   switch (c)
1512     {
1513     case 'r':
1514       /* Hidden option for self-test mode.  */
1515       pru_mode = PRU_MODE_TEST;
1516       break;
1517     case OPTION_LINK_RELAX:
1518       pru_opt.link_relax = TRUE;
1519       break;
1520     case OPTION_NO_LINK_RELAX:
1521       pru_opt.link_relax = FALSE;
1522       break;
1523     case OPTION_NO_WARN_REGNAME_LABEL:
1524       pru_opt.warn_regname_label = FALSE;
1525       break;
1526     default:
1527       return 0;
1528       break;
1529     }
1530
1531   return 1;
1532 }
1533
1534 const char *
1535 pru_target_format (void)
1536 {
1537   return "elf32-pru";
1538 }
1539
1540 /* Machine-dependent usage message.  */
1541 void
1542 md_show_usage (FILE *stream)
1543 {
1544   fprintf (stream,
1545     _("PRU options:\n"
1546       "  -mlink-relax     generate relocations for linker relaxation (default).\n"
1547       "  -mno-link-relax  don't generate relocations for linker relaxation.\n"
1548     ));
1549
1550 }
1551
1552 /* This function is called once, at assembler startup time.
1553    It should set up all the tables, etc.  that the MD part of the
1554    assembler will need.  */
1555 void
1556 md_begin (void)
1557 {
1558   int i;
1559   const char *inserted;
1560
1561   /* Create and fill a hashtable for the PRU opcodes, registers and
1562      arguments.  */
1563   pru_opcode_hash = hash_new ();
1564   pru_reg_hash = hash_new ();
1565
1566   for (i = 0; i < NUMOPCODES; ++i)
1567     {
1568       inserted
1569         = hash_insert (pru_opcode_hash, pru_opcodes[i].name,
1570                        (PTR) & pru_opcodes[i]);
1571       if (inserted != NULL)
1572         {
1573           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1574                    pru_opcodes[i].name, inserted);
1575           /* Probably a memory allocation problem?  Give up now.  */
1576           as_fatal (_("Broken assembler.  No assembly attempted."));
1577         }
1578     }
1579
1580   for (i = 0; i < pru_num_regs; ++i)
1581     {
1582       inserted
1583         = hash_insert (pru_reg_hash, pru_regs[i].name,
1584                        (PTR) & pru_regs[i]);
1585       if (inserted != NULL)
1586         {
1587           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1588                    pru_regs[i].name, inserted);
1589           /* Probably a memory allocation problem?  Give up now.  */
1590           as_fatal (_("Broken assembler.  No assembly attempted."));
1591         }
1592
1593     }
1594
1595   linkrelax = pru_opt.link_relax;
1596   /* Initialize the alignment data.  */
1597   pru_current_align_seg = now_seg;
1598   pru_last_label = NULL;
1599   pru_current_align = 0;
1600 }
1601
1602
1603 /* Assembles a single line of PRU assembly language.  */
1604 void
1605 md_assemble (char *op_str)
1606 {
1607   char *argstr;
1608   char *op_strdup = NULL;
1609   pru_insn_infoS thisinsn;
1610   pru_insn_infoS *insn = &thisinsn;
1611
1612   /* Make sure we are aligned on a 4-byte boundary.  */
1613   if (pru_current_align < 2)
1614     pru_align (2, NULL, pru_last_label);
1615   else if (pru_current_align > 2)
1616     pru_current_align = 2;
1617   pru_last_label = NULL;
1618
1619   /* We don't want to clobber to op_str
1620      because we want to be able to use it in messages.  */
1621   op_strdup = strdup (op_str);
1622   insn->insn_tokens[0] = strtok (op_strdup, " ");
1623   argstr = strtok (NULL, "");
1624
1625   /* Assemble the opcode.  */
1626   insn->insn_pru_opcode = pru_opcode_lookup (insn->insn_tokens[0]);
1627   insn->insn_reloc = NULL;
1628
1629   if (insn->insn_pru_opcode != NULL)
1630     {
1631       const char *argsfmt = insn->insn_pru_opcode->args;
1632       const char **argtk = &insn->insn_tokens[1];
1633       const char *argp;
1634
1635       /* Set the opcode for the instruction.  */
1636       insn->insn_code = insn->insn_pru_opcode->match;
1637
1638       if (pru_mode == PRU_MODE_TEST)
1639         {
1640           /* Add the "expected" instruction parameter used for validation.  */
1641           argsfmt = malloc (strlen (argsfmt) + 3);
1642           sprintf ((char *)argsfmt, "%s,E", insn->insn_pru_opcode->args);
1643         }
1644       pru_parse_args (insn, argstr, argsfmt,
1645                       (char **) &insn->insn_tokens[1]);
1646
1647       for (argp = argsfmt; !had_errors () && *argp && *argtk; ++argp)
1648         {
1649           gas_assert (argtk <= &insn->insn_tokens[PRU_MAX_INSN_TOKENS]);
1650
1651           switch (*argp)
1652             {
1653             case ',':
1654               continue;
1655
1656             case 'd':
1657               pru_assemble_arg_d (insn, *argtk++);
1658               continue;
1659             case 'D':
1660               pru_assemble_arg_D (insn, *argtk++);
1661               continue;
1662             case 'R':
1663               pru_assemble_arg_R (insn, *argtk++);
1664               continue;
1665             case 's':
1666               pru_assemble_arg_s (insn, *argtk++);
1667               continue;
1668             case 'S':
1669               pru_assemble_arg_S (insn, *argtk++);
1670               continue;
1671             case 'b':
1672               pru_assemble_arg_b (insn, *argtk++);
1673               continue;
1674             case 'B':
1675               pru_assemble_arg_B (insn, *argtk++);
1676               continue;
1677             case 'i':
1678               pru_assemble_arg_i (insn, *argtk++);
1679               continue;
1680             case 'j':
1681               pru_assemble_arg_j (insn, *argtk++);
1682               continue;
1683             case 'W':
1684               pru_assemble_arg_W (insn, *argtk++);
1685               continue;
1686             case 'o':
1687               pru_assemble_arg_o (insn, *argtk++);
1688               continue;
1689             case 'O':
1690               pru_assemble_arg_O (insn, *argtk++);
1691               continue;
1692             case 'l':
1693               pru_assemble_arg_l (insn, *argtk++);
1694               continue;
1695             case 'n':
1696               pru_assemble_arg_n (insn, *argtk++);
1697               continue;
1698             case 'c':
1699               pru_assemble_arg_c (insn, *argtk++);
1700               continue;
1701             case 'w':
1702               pru_assemble_arg_w (insn, *argtk++);
1703               continue;
1704             case 'x':
1705               pru_assemble_arg_x (insn, *argtk++);
1706               continue;
1707
1708             case 'E':
1709               pru_check_assembly (insn->insn_code, *argtk++);
1710               continue;
1711
1712             default:
1713               BAD_CASE (*argp);
1714             }
1715         }
1716
1717       if (*argp && !had_errors ())
1718         as_bad (_("missing argument"));
1719
1720       if (!had_errors ())
1721         {
1722           if (insn->insn_pru_opcode->pinfo & PRU_INSN_LDI32)
1723             {
1724               output_insn_ldi32 (insn);
1725             }
1726           else
1727             {
1728               output_insn (insn);
1729             }
1730         }
1731
1732       if (pru_mode == PRU_MODE_TEST)
1733         free ((char *)argsfmt);
1734     }
1735   else
1736     /* Unrecognised instruction - error.  */
1737     as_bad (_("unrecognised instruction %s"), insn->insn_tokens[0]);
1738
1739   /* Don't leak memory.  */
1740   pru_insn_reloc_destroy (insn->insn_reloc);
1741   free (op_strdup);
1742 }
1743
1744 /* Round up section size.  */
1745 valueT
1746 md_section_align (asection *seg, valueT addr)
1747 {
1748   int align = bfd_get_section_alignment (stdoutput, seg);
1749   return ((addr + (1 << align) - 1) & (-((valueT) 1 << align)));
1750 }
1751
1752 /* Implement tc_fix_adjustable.  */
1753 int
1754 pru_fix_adjustable (fixS *fixp)
1755 {
1756   if (fixp->fx_addsy == NULL)
1757     return 1;
1758
1759   /* Prevent all adjustments to global symbols.  */
1760   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
1761       && (S_IS_EXTERNAL (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)))
1762     return 0;
1763
1764   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1765       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1766     return 0;
1767
1768   /* Preserve relocations against symbols with function type.  */
1769   if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION)
1770     return 0;
1771
1772   return 1;
1773 }
1774
1775 /* The function tc_gen_reloc creates a relocation structure for the
1776    fixup fixp, and returns a pointer to it.  This structure is passed
1777    to bfd_install_relocation so that it can be written to the object
1778    file for linking.  */
1779 arelent *
1780 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
1781 {
1782   arelent *reloc = XNEW (arelent);
1783   reloc->sym_ptr_ptr = XNEW (asymbol *);
1784   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1785
1786   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1787   reloc->addend = fixp->fx_offset;  /* fixp->fx_addnumber; */
1788
1789   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1790   if (reloc->howto == NULL)
1791     {
1792       as_bad_where (fixp->fx_file, fixp->fx_line,
1793                     _("can't represent relocation type %s"),
1794                     bfd_get_reloc_code_name (fixp->fx_r_type));
1795
1796       /* Set howto to a garbage value so that we can keep going.  */
1797       reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
1798       gas_assert (reloc->howto != NULL);
1799     }
1800   return reloc;
1801 }
1802
1803 long
1804 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
1805 {
1806   return fixP->fx_where + fixP->fx_frag->fr_address;
1807 }
1808
1809 /* Called just before the assembler exits.  */
1810 void
1811 md_end (void)
1812 {
1813   hash_die (pru_opcode_hash);
1814   hash_die (pru_reg_hash);
1815 }
1816
1817 symbolS *
1818 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1819 {
1820   return NULL;
1821 }
1822
1823 /* Implement tc_frob_label.  */
1824 void
1825 pru_frob_label (symbolS *lab)
1826 {
1827   /* Emit dwarf information.  */
1828   dwarf2_emit_label (lab);
1829
1830   /* Update the label's address with the current output pointer.  */
1831   symbol_set_frag (lab, frag_now);
1832   S_SET_VALUE (lab, (valueT) frag_now_fix ());
1833
1834   /* Record this label for future adjustment after we find out what
1835      kind of data it references, and the required alignment therewith.  */
1836   pru_last_label = lab;
1837
1838   if (pru_opt.warn_regname_label && pru_reg_lookup (S_GET_NAME (lab)))
1839     as_warn (_("Label \"%s\" matches a CPU register name"), S_GET_NAME (lab));
1840 }
1841
1842 static inline char *
1843 skip_space (char *s)
1844 {
1845   while (*s == ' ' || *s == '\t')
1846     ++s;
1847   return s;
1848 }
1849
1850 /* Parse special CONS expression: pmem (expression).  Idea from AVR.
1851
1852    Used to catch and mark code (program memory) in constant expression
1853    relocations.  Return non-zero for program memory.  */
1854
1855 int
1856 pru_parse_cons_expression (expressionS *exp, int nbytes)
1857 {
1858   int is_pmem = FALSE;
1859   char *tmp;
1860
1861   tmp = input_line_pointer = skip_space (input_line_pointer);
1862
1863   if (nbytes == 4 || nbytes == 2)
1864     {
1865       const char *pmem_str = "%pmem";
1866       int len = strlen (pmem_str);
1867
1868       if (strncasecmp (input_line_pointer, pmem_str, len) == 0)
1869         {
1870           input_line_pointer = skip_space (input_line_pointer + len);
1871
1872           if (*input_line_pointer == '(')
1873             {
1874               input_line_pointer = skip_space (input_line_pointer + 1);
1875               is_pmem = TRUE;
1876               expression (exp);
1877
1878               if (*input_line_pointer == ')')
1879                 ++input_line_pointer;
1880               else
1881                 {
1882                   as_bad (_("`)' required"));
1883                   is_pmem = FALSE;
1884                 }
1885
1886               return is_pmem;
1887             }
1888
1889           input_line_pointer = tmp;
1890         }
1891     }
1892
1893   expression (exp);
1894
1895   return is_pmem;
1896 }
1897
1898 /* Implement TC_CONS_FIX_NEW.  */
1899 void
1900 pru_cons_fix_new (fragS *frag, int where, unsigned int nbytes,
1901                     expressionS *exp, const int is_pmem)
1902 {
1903   bfd_reloc_code_real_type r;
1904
1905   switch (nbytes | (!!is_pmem << 8))
1906     {
1907     case 1 | (0 << 8): r = BFD_RELOC_8; break;
1908     case 2 | (0 << 8): r = BFD_RELOC_16; break;
1909     case 4 | (0 << 8): r = BFD_RELOC_32; break;
1910     case 8 | (0 << 8): r = BFD_RELOC_64; break;
1911     case 2 | (1 << 8): r = BFD_RELOC_PRU_16_PMEM; break;
1912     case 4 | (1 << 8): r = BFD_RELOC_PRU_32_PMEM; break;
1913     default:
1914       as_bad (_("illegal %s relocation size: %d"),
1915               is_pmem ? "text" : "data", nbytes);
1916       return;
1917     }
1918
1919   fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
1920 }
1921
1922 /* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2
1923    register number.  Return the starting HW byte-register number.  */
1924
1925 int
1926 pru_regname_to_dw2regnum (char *regname)
1927 {
1928   static const unsigned int regstart[RSEL_NUM_ITEMS] =
1929     {
1930      [RSEL_7_0]   = 0,
1931      [RSEL_15_8]  = 1,
1932      [RSEL_23_16] = 2,
1933      [RSEL_31_24] = 3,
1934      [RSEL_15_0]  = 0,
1935      [RSEL_23_8]  = 1,
1936      [RSEL_31_16] = 2,
1937      [RSEL_31_0]  = 0,
1938     };
1939
1940   struct pru_reg *r = pru_reg_lookup (regname);
1941
1942   if (r == NULL || r->regsel >= RSEL_NUM_ITEMS)
1943     return -1;
1944   return r->index * 4 + regstart[r->regsel];
1945 }
1946
1947 /* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2
1948    unwind information for this procedure.  */
1949 void
1950 pru_frame_initial_instructions (void)
1951 {
1952   const unsigned fp_regno = 4 * 4;
1953   cfi_add_CFA_def_cfa (fp_regno, 0);
1954 }
1955
1956 bfd_boolean
1957 pru_allow_local_subtract (expressionS * left,
1958                              expressionS * right,
1959                              segT section)
1960 {
1961   /* If we are not in relaxation mode, subtraction is OK.  */
1962   if (!linkrelax)
1963     return TRUE;
1964
1965   /* If the symbols are not in a code section then they are OK.  */
1966   if ((section->flags & SEC_CODE) == 0)
1967     return TRUE;
1968
1969   if (left->X_add_symbol == right->X_add_symbol)
1970     return TRUE;
1971
1972   /* We have to assume that there may be instructions between the
1973      two symbols and that relaxation may increase the distance between
1974      them.  */
1975   return FALSE;
1976 }