Fix compile time warnings building the binutils with gcc 7.1.1.
[deliverable/binutils-gdb.git] / gas / config / tc-pru.c
1 /* TI PRU assembler.
2 Copyright (C) 2014-2017 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 & 0xffff);
818 SET_INSN_FIELD (IMM16, insn2, fixup >> 16);
819
820 md_number_to_chars (buf, insn1, 4);
821 md_number_to_chars (buf + 4, insn2, 4);
822 }
823 else
824 {
825 if (fixP->fx_r_type == BFD_RELOC_PRU_S10_PCREL)
826 SET_BROFF_URAW (insn, fixup);
827 else
828 insn = (insn & ~howto->dst_mask) | (fixup << howto->bitpos);
829 md_number_to_chars (buf, insn, fixP->fx_size);
830 }
831 }
832
833 fixP->fx_done = 1;
834 }
835
836 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
837 {
838 fixP->fx_done = 0;
839 if (fixP->fx_addsy
840 && !S_IS_DEFINED (fixP->fx_addsy) && !S_IS_WEAK (fixP->fx_addsy))
841 S_SET_WEAK (fixP->fx_addsy);
842 }
843 else if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
844 fixP->fx_done = 0;
845 }
846
847
848 \f
849 /** Instruction parsing support. */
850
851 /* Creates a new pru_insn_relocS and returns a pointer to it. */
852 static pru_insn_relocS *
853 pru_insn_reloc_new (bfd_reloc_code_real_type reloc_type, unsigned int pcrel)
854 {
855 pru_insn_relocS *retval;
856 retval = XNEW (pru_insn_relocS);
857 if (retval == NULL)
858 {
859 as_bad (_("can't create relocation"));
860 abort ();
861 }
862
863 /* Fill out the fields with default values. */
864 retval->reloc_next = NULL;
865 retval->reloc_type = reloc_type;
866 retval->reloc_pcrel = pcrel;
867 return retval;
868 }
869
870 /* Frees up memory previously allocated by pru_insn_reloc_new (). */
871 static void
872 pru_insn_reloc_destroy (pru_insn_relocS *reloc)
873 {
874 pru_insn_relocS *next;
875
876 while (reloc)
877 {
878 next = reloc->reloc_next;
879 free (reloc);
880 reloc = next;
881 }
882 }
883
884 /* The various pru_assemble_* functions call this
885 function to generate an expression from a string representing an expression.
886 It then tries to evaluate the expression, and if it can, returns its value.
887 If not, it creates a new pru_insn_relocS and stores the expression and
888 reloc_type for future use. */
889 static unsigned long
890 pru_assemble_expression (const char *exprstr,
891 pru_insn_infoS *insn,
892 pru_insn_relocS *prev_reloc,
893 bfd_reloc_code_real_type reloc_type,
894 unsigned int pcrel)
895 {
896 expressionS *ep;
897 pru_insn_relocS *reloc;
898 char *saved_line_ptr;
899 unsigned short value;
900
901 gas_assert (exprstr != NULL);
902 gas_assert (insn != NULL);
903
904 /* We use this blank keyword to distinguish register from
905 label operands. */
906 if (strstr (exprstr, "%label") != NULL)
907 {
908 exprstr += strlen ("%label") + 1;
909 }
910
911 /* Check for pmem relocation operator.
912 Change the relocation type and advance the ptr to the start of
913 the expression proper. */
914 if (strstr (exprstr, "%pmem") != NULL)
915 {
916 reloc_type = BFD_RELOC_PRU_U16_PMEMIMM;
917 exprstr += strlen ("%pmem") + 1;
918 }
919
920 /* We potentially have a relocation. */
921 reloc = pru_insn_reloc_new (reloc_type, pcrel);
922 if (prev_reloc != NULL)
923 prev_reloc->reloc_next = reloc;
924 else
925 insn->insn_reloc = reloc;
926
927 /* Parse the expression string. */
928 ep = &reloc->reloc_expression;
929 saved_line_ptr = input_line_pointer;
930 input_line_pointer = (char *) exprstr;
931 SKIP_WHITESPACE ();
932 expression (ep);
933 SKIP_WHITESPACE ();
934 if (*input_line_pointer)
935 as_bad (_("trailing garbage after expression: %s"), input_line_pointer);
936 input_line_pointer = saved_line_ptr;
937
938
939 if (ep->X_op == O_illegal || ep->X_op == O_absent)
940 as_bad (_("expected expression, got %s"), exprstr);
941
942 /* This is redundant as the fixup will put this into
943 the instruction, but it is included here so that
944 self-test mode (-r) works. */
945 value = 0;
946 if (pru_mode == PRU_MODE_TEST && ep->X_op == O_constant)
947 value = ep->X_add_number;
948
949 return (unsigned long) value;
950 }
951
952 /* Try to parse a non-relocatable expression. */
953 static unsigned long
954 pru_assemble_noreloc_expression (const char *exprstr)
955 {
956 expressionS exp;
957 char *saved_line_ptr;
958 unsigned long val;
959
960 gas_assert (exprstr != NULL);
961
962 saved_line_ptr = input_line_pointer;
963 input_line_pointer = (char *) exprstr;
964 SKIP_WHITESPACE ();
965 expression (&exp);
966 SKIP_WHITESPACE ();
967 if (*input_line_pointer)
968 as_bad (_("trailing garbage after expression: %s"), input_line_pointer);
969 input_line_pointer = saved_line_ptr;
970
971 val = 0;
972 if (exp.X_op != O_constant)
973 as_bad (_("expected constant expression, got %s"), exprstr);
974 else
975 val = exp.X_add_number;
976
977 return val;
978 }
979
980 /* Argument assemble functions.
981 All take an instruction argument string, and a pointer
982 to an instruction opcode. Upon return the insn_opcode
983 has the relevant fields filled in to represent the arg
984 string. The return value is NULL if successful, or
985 an error message if an error was detected. */
986
987 static void
988 pru_assemble_arg_d (pru_insn_infoS *insn_info, const char *argstr)
989 {
990 struct pru_reg *dst = pru_reg_lookup (argstr);
991
992 if (dst == NULL)
993 as_bad (_("unknown register %s"), argstr);
994 else
995 {
996 SET_INSN_FIELD (RD, insn_info->insn_code, dst->index);
997 SET_INSN_FIELD (RDSEL, insn_info->insn_code, dst->regsel);
998 }
999 }
1000
1001 static void
1002 pru_assemble_arg_D (pru_insn_infoS *insn_info, const char *argstr)
1003 {
1004 struct pru_reg *dst;
1005
1006 /* The leading & before an address register is optional. */
1007 if (*argstr == '&')
1008 argstr++;
1009
1010 dst = pru_reg_lookup (argstr);
1011
1012 if (dst == NULL)
1013 as_bad (_("unknown register %s"), argstr);
1014 else
1015 {
1016 unsigned long rxb = 0;
1017
1018 switch (dst->regsel)
1019 {
1020 case RSEL_31_0: rxb = 0; break; /* whole register defaults to .b0 */
1021 case RSEL_7_0: rxb = 0; break;
1022 case RSEL_15_8: rxb = 1; break;
1023 case RSEL_23_16: rxb = 2; break;
1024 case RSEL_31_24: rxb = 3; break;
1025 default:
1026 as_bad (_("data transfer register cannot be halfword"));
1027 }
1028
1029 SET_INSN_FIELD (RD, insn_info->insn_code, dst->index);
1030 SET_INSN_FIELD (RDB, insn_info->insn_code, rxb);
1031 }
1032 }
1033
1034 static void
1035 pru_assemble_arg_R (pru_insn_infoS *insn_info, const char *argstr)
1036 {
1037 struct pru_reg *dst = pru_reg_lookup (argstr);
1038
1039 if (dst == NULL)
1040 as_bad (_("unknown register %s"), argstr);
1041 else
1042 {
1043 if (dst->regsel != RSEL_31_0)
1044 {
1045 as_bad (_("destination register must be full-word"));
1046 }
1047
1048 SET_INSN_FIELD (RD, insn_info->insn_code, dst->index);
1049 SET_INSN_FIELD (RDSEL, insn_info->insn_code, dst->regsel);
1050 }
1051 }
1052
1053 static void
1054 pru_assemble_arg_s (pru_insn_infoS *insn_info, const char *argstr)
1055 {
1056 struct pru_reg *src1 = pru_reg_lookup (argstr);
1057
1058 if (src1 == NULL)
1059 as_bad (_("unknown register %s"), argstr);
1060 else
1061 {
1062 SET_INSN_FIELD (RS1, insn_info->insn_code, src1->index);
1063 SET_INSN_FIELD (RS1SEL, insn_info->insn_code, src1->regsel);
1064 }
1065 }
1066
1067 static void
1068 pru_assemble_arg_S (pru_insn_infoS *insn_info, const char *argstr)
1069 {
1070 struct pru_reg *src1 = pru_reg_lookup (argstr);
1071
1072 if (src1 == NULL)
1073 as_bad (_("unknown register %s"), argstr);
1074 else
1075 {
1076 if (src1->regsel != RSEL_31_0)
1077 as_bad (_("cannot use partial register %s for addressing"), argstr);
1078 SET_INSN_FIELD (RS1, insn_info->insn_code, src1->index);
1079 }
1080 }
1081
1082 static void
1083 pru_assemble_arg_b (pru_insn_infoS *insn_info, const char *argstr)
1084 {
1085 struct pru_reg *src2 = pru_reg_lookup (argstr);
1086 if (src2 == NULL)
1087 {
1088 unsigned long imm8 = pru_assemble_noreloc_expression (argstr);
1089 SET_INSN_FIELD (IMM8, insn_info->insn_code, imm8);
1090 SET_INSN_FIELD (IO, insn_info->insn_code, 1);
1091 }
1092 else
1093 {
1094 SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1095 SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index);
1096 SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel);
1097 }
1098
1099 }
1100
1101 static void
1102 pru_assemble_arg_B (pru_insn_infoS *insn_info, const char *argstr)
1103 {
1104 struct pru_reg *src2 = pru_reg_lookup (argstr);
1105 if (src2 == NULL)
1106 {
1107 unsigned long imm8;
1108 imm8 = pru_assemble_noreloc_expression (argstr);
1109 if (!imm8 || imm8 > 0xff)
1110 as_bad (_("loop count constant %ld is out of range [1..%d]"),
1111 imm8, 0xff);
1112 /* Note: HW expects the immediate loop count field
1113 to be one less than the actual loop count. */
1114 SET_INSN_FIELD (IMM8, insn_info->insn_code, imm8 - 1);
1115 SET_INSN_FIELD (IO, insn_info->insn_code, 1);
1116 }
1117 else
1118 {
1119 SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1120 SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index);
1121 SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel);
1122 }
1123 }
1124
1125 static void
1126 pru_assemble_arg_i (pru_insn_infoS *insn_info, const char *argstr)
1127 {
1128 unsigned long imm32;
1129
1130 /* We must not generate PRU_LDI32 relocation if relaxation is disabled in
1131 GAS. Consider the following scenario: GAS relaxation is disabled, so
1132 DIFF* expressions are fixed and not emitted as relocations. Then if LD
1133 has relaxation enabled, it may shorten LDI32 but will not update
1134 accordingly the DIFF expressions. */
1135 if (pru_opt.link_relax)
1136 imm32 = pru_assemble_expression (argstr, insn_info,
1137 insn_info->insn_reloc,
1138 BFD_RELOC_PRU_LDI32, 0);
1139 else
1140 imm32 = pru_assemble_noreloc_expression (argstr);
1141
1142 /* QUIRK: LDI must clear IO bit high, even though it has immediate arg. */
1143 SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1144 SET_INSN_FIELD (IMM16, insn_info->insn_code, imm32 & 0xffff);
1145 insn_info->ldi32_imm32 = imm32;
1146 }
1147
1148 static void
1149 pru_assemble_arg_j (pru_insn_infoS *insn_info, const char *argstr)
1150 {
1151 struct pru_reg *src2 = pru_reg_lookup (argstr);
1152
1153 if (src2 == NULL)
1154 {
1155 unsigned long imm16 = pru_assemble_expression (argstr, insn_info,
1156 insn_info->insn_reloc,
1157 BFD_RELOC_PRU_U16_PMEMIMM,
1158 0);
1159 SET_INSN_FIELD (IMM16, insn_info->insn_code, imm16);
1160 SET_INSN_FIELD (IO, insn_info->insn_code, 1);
1161 }
1162 else
1163 {
1164 SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1165 SET_INSN_FIELD (RS2, insn_info->insn_code, src2->index);
1166 SET_INSN_FIELD (RS2SEL, insn_info->insn_code, src2->regsel);
1167 }
1168 }
1169
1170 static void
1171 pru_assemble_arg_W (pru_insn_infoS *insn_info, const char *argstr)
1172 {
1173 unsigned long imm16 = pru_assemble_expression (argstr, insn_info,
1174 insn_info->insn_reloc,
1175 BFD_RELOC_PRU_U16, 0);
1176 /* QUIRK: LDI must clear IO bit high, even though it has immediate arg. */
1177 SET_INSN_FIELD (IO, insn_info->insn_code, 0);
1178 SET_INSN_FIELD (IMM16, insn_info->insn_code, imm16);
1179 }
1180
1181 static void
1182 pru_assemble_arg_o (pru_insn_infoS *insn_info, const char *argstr)
1183 {
1184 unsigned long imm10 = pru_assemble_expression (argstr, insn_info,
1185 insn_info->insn_reloc,
1186 BFD_RELOC_PRU_S10_PCREL, 1);
1187 SET_BROFF_URAW (insn_info->insn_code, imm10);
1188 }
1189
1190 static void
1191 pru_assemble_arg_O (pru_insn_infoS *insn_info, const char *argstr)
1192 {
1193 unsigned long imm8 = pru_assemble_expression (argstr, insn_info,
1194 insn_info->insn_reloc,
1195 BFD_RELOC_PRU_U8_PCREL, 1);
1196 SET_INSN_FIELD (LOOP_JMPOFFS, insn_info->insn_code, imm8);
1197 }
1198
1199 static void
1200 pru_assemble_arg_l (pru_insn_infoS *insn_info, const char *argstr)
1201 {
1202 unsigned long burstlen = 0;
1203 struct pru_reg *blreg = pru_reg_lookup (argstr);
1204
1205 if (blreg == NULL)
1206 {
1207 burstlen = pru_assemble_noreloc_expression (argstr);
1208 if (!burstlen || burstlen > LSSBBO_BYTECOUNT_R0_BITS7_0)
1209 as_bad (_("byte count constant %ld is out of range [1..%d]"),
1210 burstlen, LSSBBO_BYTECOUNT_R0_BITS7_0);
1211 burstlen--;
1212 }
1213 else
1214 {
1215 if (blreg->index != 0)
1216 as_bad (_("only r0 can be used as byte count register"));
1217 else if (blreg->regsel > RSEL_31_24)
1218 as_bad (_("only r0.bX byte fields of r0 can be used as byte count"));
1219 else
1220 burstlen = LSSBBO_BYTECOUNT_R0_BITS7_0 + blreg->regsel;
1221 }
1222 SET_BURSTLEN (insn_info->insn_code, burstlen);
1223 }
1224
1225 static void
1226 pru_assemble_arg_n (pru_insn_infoS *insn_info, const char *argstr)
1227 {
1228 unsigned long burstlen = 0;
1229 struct pru_reg *blreg = pru_reg_lookup (argstr);
1230
1231 if (blreg == NULL)
1232 {
1233 burstlen = pru_assemble_noreloc_expression (argstr);
1234 if (!burstlen || burstlen > LSSBBO_BYTECOUNT_R0_BITS7_0)
1235 as_bad (_("byte count constant %ld is out of range [1..%d]"),
1236 burstlen, LSSBBO_BYTECOUNT_R0_BITS7_0);
1237 burstlen--;
1238 }
1239 else
1240 {
1241 if (blreg->index != 0)
1242 as_bad (_("only r0 can be used as byte count register"));
1243 else if (blreg->regsel > RSEL_31_24)
1244 as_bad (_("only r0.bX byte fields of r0 can be used as byte count"));
1245 else
1246 burstlen = LSSBBO_BYTECOUNT_R0_BITS7_0 + blreg->regsel;
1247 }
1248 SET_INSN_FIELD (XFR_LENGTH, insn_info->insn_code, burstlen);
1249 }
1250
1251 static void
1252 pru_assemble_arg_c (pru_insn_infoS *insn_info, const char *argstr)
1253 {
1254 unsigned long cb = pru_assemble_noreloc_expression (argstr);
1255
1256 if (cb > 31)
1257 as_bad (_("invalid constant table offset %ld"), cb);
1258 else
1259 SET_INSN_FIELD (CB, insn_info->insn_code, cb);
1260 }
1261
1262 static void
1263 pru_assemble_arg_w (pru_insn_infoS *insn_info, const char *argstr)
1264 {
1265 unsigned long wk = pru_assemble_noreloc_expression (argstr);
1266
1267 if (wk != 0 && wk != 1)
1268 as_bad (_("invalid WakeOnStatus %ld"), wk);
1269 else
1270 SET_INSN_FIELD (WAKEONSTATUS, insn_info->insn_code, wk);
1271 }
1272
1273 static void
1274 pru_assemble_arg_x (pru_insn_infoS *insn_info, const char *argstr)
1275 {
1276 unsigned long wba = pru_assemble_noreloc_expression (argstr);
1277
1278 if (wba > 255)
1279 as_bad (_("invalid XFR WideBus Address %ld"), wba);
1280 else
1281 SET_INSN_FIELD (XFR_WBA, insn_info->insn_code, wba);
1282 }
1283
1284 /* The function consume_arg takes a pointer into a string
1285 of instruction tokens (args) and a pointer into a string
1286 representing the expected sequence of tokens and separators.
1287 It checks whether the first argument in argstr is of the
1288 expected type, throwing an error if it is not, and returns
1289 the pointer argstr. */
1290 static char *
1291 pru_consume_arg (char *argstr, const char *parsestr)
1292 {
1293 char *temp;
1294
1295 switch (*parsestr)
1296 {
1297 case 'W':
1298 if (*argstr == '%')
1299 {
1300 if (strprefix (argstr, "%pmem") || strprefix (argstr, "%label"))
1301 {
1302 /* We zap the parentheses because we don't want them confused
1303 with separators. */
1304 temp = strchr (argstr, '(');
1305 if (temp != NULL)
1306 *temp = ' ';
1307 temp = strchr (argstr, ')');
1308 if (temp != NULL)
1309 *temp = ' ';
1310 }
1311 else
1312 as_bad (_("badly formed expression near %s"), argstr);
1313 }
1314 break;
1315
1316 case 'j':
1317 case 'o':
1318 case 'O':
1319 if (*argstr == '%')
1320 {
1321 /* Only 'j' really requires %label for distinguishing registers
1322 from labels, but we include 'o' and 'O' here to avoid
1323 confusing assembler programmers. Thus for completeness all
1324 jump operands can be prefixed with %label. */
1325 if (strprefix (argstr, "%label"))
1326 {
1327 /* We zap the parentheses because we don't want them confused
1328 with separators. */
1329 temp = strchr (argstr, '(');
1330 if (temp != NULL)
1331 *temp = ' ';
1332 temp = strchr (argstr, ')');
1333 if (temp != NULL)
1334 *temp = ' ';
1335 }
1336 else
1337 as_bad (_("badly formed expression near %s"), argstr);
1338 }
1339 break;
1340
1341 case 'b':
1342 case 'B':
1343 case 'c':
1344 case 'd':
1345 case 'D':
1346 case 'E':
1347 case 'i':
1348 case 's':
1349 case 'S':
1350 case 'l':
1351 case 'n':
1352 case 'R':
1353 case 'w':
1354 case 'x':
1355 /* We can't have %pmem here. */
1356 if (*argstr == '%')
1357 as_bad (_("badly formed expression near %s"), argstr);
1358 break;
1359 default:
1360 BAD_CASE (*parsestr);
1361 break;
1362 }
1363
1364 return argstr;
1365 }
1366
1367 /* The function consume_separator takes a pointer into a string
1368 of instruction tokens (args) and a pointer into a string representing
1369 the expected sequence of tokens and separators. It finds the first
1370 instance of the character pointed to by separator in argstr, and
1371 returns a pointer to the next element of argstr, which is the
1372 following token in the sequence. */
1373 static char *
1374 pru_consume_separator (char *argstr, const char *separator)
1375 {
1376 char *p;
1377
1378 p = strchr (argstr, *separator);
1379
1380 if (p != NULL)
1381 *p++ = 0;
1382 else
1383 as_bad (_("expecting %c near %s"), *separator, argstr);
1384 return p;
1385 }
1386
1387
1388 /* The principal argument parsing function which takes a string argstr
1389 representing the instruction arguments for insn, and extracts the argument
1390 tokens matching parsestr into parsed_args. */
1391 static void
1392 pru_parse_args (pru_insn_infoS *insn ATTRIBUTE_UNUSED, char *argstr,
1393 const char *parsestr, char **parsed_args)
1394 {
1395 char *p;
1396 char *end = NULL;
1397 int i;
1398 p = argstr;
1399 i = 0;
1400 bfd_boolean terminate = FALSE;
1401
1402 /* This rest of this function is it too fragile and it mostly works,
1403 therefore special case this one. */
1404 if (*parsestr == 0 && argstr != 0)
1405 {
1406 as_bad (_("too many arguments"));
1407 parsed_args[0] = NULL;
1408 return;
1409 }
1410
1411 while (p != NULL && !terminate && i < PRU_MAX_INSN_TOKENS)
1412 {
1413 parsed_args[i] = pru_consume_arg (p, parsestr);
1414 ++parsestr;
1415 if (*parsestr != '\0')
1416 {
1417 p = pru_consume_separator (p, parsestr);
1418 ++parsestr;
1419 }
1420 else
1421 {
1422 /* Check that the argument string has no trailing arguments. */
1423 /* If we've got a %pmem relocation, we've zapped the parens with
1424 spaces. */
1425 if (strprefix (p, "%pmem") || strprefix (p, "%label"))
1426 end = strpbrk (p, ",");
1427 else
1428 end = strpbrk (p, " ,");
1429
1430 if (end != NULL)
1431 as_bad (_("too many arguments"));
1432 }
1433
1434 if (*parsestr == '\0' || (p != NULL && *p == '\0'))
1435 terminate = TRUE;
1436 ++i;
1437 }
1438
1439 parsed_args[i] = NULL;
1440
1441 /* There are no instructions with optional arguments; complain. */
1442 if (*parsestr != '\0')
1443 as_bad (_("missing argument"));
1444 }
1445
1446 \f
1447 /** Assembler output support. */
1448
1449 /* Output a normal instruction. */
1450 static void
1451 output_insn (pru_insn_infoS *insn)
1452 {
1453 char *f;
1454 pru_insn_relocS *reloc;
1455
1456 f = frag_more (4);
1457 /* This allocates enough space for the instruction
1458 and puts it in the current frag. */
1459 md_number_to_chars (f, insn->insn_code, 4);
1460 /* Emit debug info. */
1461 dwarf2_emit_insn (4);
1462 /* Create any fixups to be acted on later. */
1463 for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next)
1464 fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
1465 &reloc->reloc_expression, reloc->reloc_pcrel,
1466 reloc->reloc_type);
1467 }
1468
1469 /* Output two LDI instructions from LDI32 macro */
1470 static void
1471 output_insn_ldi32 (pru_insn_infoS *insn)
1472 {
1473 char *f;
1474 pru_insn_relocS *reloc;
1475 unsigned long insn2;
1476
1477 f = frag_more (8);
1478 md_number_to_chars (f, insn->insn_code, 4);
1479
1480 insn2 = insn->insn_code;
1481 SET_INSN_FIELD (IMM16, insn2, insn->ldi32_imm32 >> 16);
1482 SET_INSN_FIELD (RDSEL, insn2, RSEL_31_16);
1483 md_number_to_chars (f + 4, insn2, 4);
1484
1485 /* Emit debug info. */
1486 dwarf2_emit_insn (8);
1487
1488 /* Create any fixups to be acted on later. */
1489 for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next)
1490 fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
1491 &reloc->reloc_expression, reloc->reloc_pcrel,
1492 reloc->reloc_type);
1493 }
1494
1495 \f
1496 /** External interfaces. */
1497
1498 /* The following functions are called by machine-independent parts of
1499 the assembler. */
1500 int
1501 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
1502 {
1503 switch (c)
1504 {
1505 case 'r':
1506 /* Hidden option for self-test mode. */
1507 pru_mode = PRU_MODE_TEST;
1508 break;
1509 case OPTION_LINK_RELAX:
1510 pru_opt.link_relax = TRUE;
1511 break;
1512 case OPTION_NO_LINK_RELAX:
1513 pru_opt.link_relax = FALSE;
1514 break;
1515 case OPTION_NO_WARN_REGNAME_LABEL:
1516 pru_opt.warn_regname_label = FALSE;
1517 break;
1518 default:
1519 return 0;
1520 break;
1521 }
1522
1523 return 1;
1524 }
1525
1526 const char *
1527 pru_target_format (void)
1528 {
1529 return "elf32-pru";
1530 }
1531
1532 /* Machine-dependent usage message. */
1533 void
1534 md_show_usage (FILE *stream)
1535 {
1536 fprintf (stream,
1537 _("PRU options:\n"
1538 " -mlink-relax generate relocations for linker relaxation (default).\n"
1539 " -mno-link-relax don't generate relocations for linker relaxation.\n"
1540 ));
1541
1542 }
1543
1544 /* This function is called once, at assembler startup time.
1545 It should set up all the tables, etc. that the MD part of the
1546 assembler will need. */
1547 void
1548 md_begin (void)
1549 {
1550 int i;
1551 const char *inserted;
1552
1553 /* Create and fill a hashtable for the PRU opcodes, registers and
1554 arguments. */
1555 pru_opcode_hash = hash_new ();
1556 pru_reg_hash = hash_new ();
1557
1558 for (i = 0; i < NUMOPCODES; ++i)
1559 {
1560 inserted
1561 = hash_insert (pru_opcode_hash, pru_opcodes[i].name,
1562 (PTR) & pru_opcodes[i]);
1563 if (inserted != NULL)
1564 {
1565 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1566 pru_opcodes[i].name, inserted);
1567 /* Probably a memory allocation problem? Give up now. */
1568 as_fatal (_("Broken assembler. No assembly attempted."));
1569 }
1570 }
1571
1572 for (i = 0; i < pru_num_regs; ++i)
1573 {
1574 inserted
1575 = hash_insert (pru_reg_hash, pru_regs[i].name,
1576 (PTR) & pru_regs[i]);
1577 if (inserted != NULL)
1578 {
1579 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1580 pru_regs[i].name, inserted);
1581 /* Probably a memory allocation problem? Give up now. */
1582 as_fatal (_("Broken assembler. No assembly attempted."));
1583 }
1584
1585 }
1586
1587 linkrelax = pru_opt.link_relax;
1588 /* Initialize the alignment data. */
1589 pru_current_align_seg = now_seg;
1590 pru_last_label = NULL;
1591 pru_current_align = 0;
1592 }
1593
1594
1595 /* Assembles a single line of PRU assembly language. */
1596 void
1597 md_assemble (char *op_str)
1598 {
1599 char *argstr;
1600 char *op_strdup = NULL;
1601 pru_insn_infoS thisinsn;
1602 pru_insn_infoS *insn = &thisinsn;
1603
1604 /* Make sure we are aligned on a 4-byte boundary. */
1605 if (pru_current_align < 2)
1606 pru_align (2, NULL, pru_last_label);
1607 else if (pru_current_align > 2)
1608 pru_current_align = 2;
1609 pru_last_label = NULL;
1610
1611 /* We don't want to clobber to op_str
1612 because we want to be able to use it in messages. */
1613 op_strdup = strdup (op_str);
1614 insn->insn_tokens[0] = strtok (op_strdup, " ");
1615 argstr = strtok (NULL, "");
1616
1617 /* Assemble the opcode. */
1618 insn->insn_pru_opcode = pru_opcode_lookup (insn->insn_tokens[0]);
1619 insn->insn_reloc = NULL;
1620
1621 if (insn->insn_pru_opcode != NULL)
1622 {
1623 const char *argsfmt = insn->insn_pru_opcode->args;
1624 const char **argtk = &insn->insn_tokens[1];
1625 const char *argp;
1626
1627 /* Set the opcode for the instruction. */
1628 insn->insn_code = insn->insn_pru_opcode->match;
1629
1630 if (pru_mode == PRU_MODE_TEST)
1631 {
1632 /* Add the "expected" instruction parameter used for validation. */
1633 argsfmt = malloc (strlen (argsfmt) + 3);
1634 sprintf ((char *)argsfmt, "%s,E", insn->insn_pru_opcode->args);
1635 }
1636 pru_parse_args (insn, argstr, argsfmt,
1637 (char **) &insn->insn_tokens[1]);
1638
1639 for (argp = argsfmt; !had_errors () && *argp && *argtk; ++argp)
1640 {
1641 gas_assert (argtk <= &insn->insn_tokens[PRU_MAX_INSN_TOKENS]);
1642
1643 switch (*argp)
1644 {
1645 case ',':
1646 continue;
1647
1648 case 'd':
1649 pru_assemble_arg_d (insn, *argtk++);
1650 continue;
1651 case 'D':
1652 pru_assemble_arg_D (insn, *argtk++);
1653 continue;
1654 case 'R':
1655 pru_assemble_arg_R (insn, *argtk++);
1656 continue;
1657 case 's':
1658 pru_assemble_arg_s (insn, *argtk++);
1659 continue;
1660 case 'S':
1661 pru_assemble_arg_S (insn, *argtk++);
1662 continue;
1663 case 'b':
1664 pru_assemble_arg_b (insn, *argtk++);
1665 continue;
1666 case 'B':
1667 pru_assemble_arg_B (insn, *argtk++);
1668 continue;
1669 case 'i':
1670 pru_assemble_arg_i (insn, *argtk++);
1671 continue;
1672 case 'j':
1673 pru_assemble_arg_j (insn, *argtk++);
1674 continue;
1675 case 'W':
1676 pru_assemble_arg_W (insn, *argtk++);
1677 continue;
1678 case 'o':
1679 pru_assemble_arg_o (insn, *argtk++);
1680 continue;
1681 case 'O':
1682 pru_assemble_arg_O (insn, *argtk++);
1683 continue;
1684 case 'l':
1685 pru_assemble_arg_l (insn, *argtk++);
1686 continue;
1687 case 'n':
1688 pru_assemble_arg_n (insn, *argtk++);
1689 continue;
1690 case 'c':
1691 pru_assemble_arg_c (insn, *argtk++);
1692 continue;
1693 case 'w':
1694 pru_assemble_arg_w (insn, *argtk++);
1695 continue;
1696 case 'x':
1697 pru_assemble_arg_x (insn, *argtk++);
1698 continue;
1699
1700 case 'E':
1701 pru_check_assembly (insn->insn_code, *argtk++);
1702 continue;
1703
1704 default:
1705 BAD_CASE (*argp);
1706 }
1707 }
1708
1709 if (*argp && !had_errors ())
1710 as_bad (_("missing argument"));
1711
1712 if (!had_errors ())
1713 {
1714 if (insn->insn_pru_opcode->pinfo & PRU_INSN_LDI32)
1715 {
1716 output_insn_ldi32 (insn);
1717 }
1718 else
1719 {
1720 output_insn (insn);
1721 }
1722 }
1723
1724 if (pru_mode == PRU_MODE_TEST)
1725 free ((char *)argsfmt);
1726 }
1727 else
1728 /* Unrecognised instruction - error. */
1729 as_bad (_("unrecognised instruction %s"), insn->insn_tokens[0]);
1730
1731 /* Don't leak memory. */
1732 pru_insn_reloc_destroy (insn->insn_reloc);
1733 free (op_strdup);
1734 }
1735
1736 /* Round up section size. */
1737 valueT
1738 md_section_align (asection *seg, valueT addr)
1739 {
1740 int align = bfd_get_section_alignment (stdoutput, seg);
1741 return ((addr + (1 << align) - 1) & (-((valueT) 1 << align)));
1742 }
1743
1744 /* Implement tc_fix_adjustable. */
1745 int
1746 pru_fix_adjustable (fixS *fixp)
1747 {
1748 if (fixp->fx_addsy == NULL)
1749 return 1;
1750
1751 /* Prevent all adjustments to global symbols. */
1752 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
1753 && (S_IS_EXTERNAL (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)))
1754 return 0;
1755
1756 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1757 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1758 return 0;
1759
1760 /* Preserve relocations against symbols with function type. */
1761 if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION)
1762 return 0;
1763
1764 return 1;
1765 }
1766
1767 /* The function tc_gen_reloc creates a relocation structure for the
1768 fixup fixp, and returns a pointer to it. This structure is passed
1769 to bfd_install_relocation so that it can be written to the object
1770 file for linking. */
1771 arelent *
1772 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
1773 {
1774 arelent *reloc = XNEW (arelent);
1775 reloc->sym_ptr_ptr = XNEW (asymbol *);
1776 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1777
1778 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1779 reloc->addend = fixp->fx_offset; /* fixp->fx_addnumber; */
1780
1781 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1782 if (reloc->howto == NULL)
1783 {
1784 as_bad_where (fixp->fx_file, fixp->fx_line,
1785 _("can't represent relocation type %s"),
1786 bfd_get_reloc_code_name (fixp->fx_r_type));
1787
1788 /* Set howto to a garbage value so that we can keep going. */
1789 reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
1790 gas_assert (reloc->howto != NULL);
1791 }
1792 return reloc;
1793 }
1794
1795 long
1796 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
1797 {
1798 return fixP->fx_where + fixP->fx_frag->fr_address;
1799 }
1800
1801 /* Called just before the assembler exits. */
1802 void
1803 md_end (void)
1804 {
1805 hash_die (pru_opcode_hash);
1806 hash_die (pru_reg_hash);
1807 }
1808
1809 symbolS *
1810 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1811 {
1812 return NULL;
1813 }
1814
1815 /* Implement tc_frob_label. */
1816 void
1817 pru_frob_label (symbolS *lab)
1818 {
1819 /* Emit dwarf information. */
1820 dwarf2_emit_label (lab);
1821
1822 /* Update the label's address with the current output pointer. */
1823 symbol_set_frag (lab, frag_now);
1824 S_SET_VALUE (lab, (valueT) frag_now_fix ());
1825
1826 /* Record this label for future adjustment after we find out what
1827 kind of data it references, and the required alignment therewith. */
1828 pru_last_label = lab;
1829
1830 if (pru_opt.warn_regname_label && pru_reg_lookup (S_GET_NAME (lab)))
1831 as_warn (_("Label \"%s\" matches a CPU register name"), S_GET_NAME (lab));
1832 }
1833
1834 static inline char *
1835 skip_space (char *s)
1836 {
1837 while (*s == ' ' || *s == '\t')
1838 ++s;
1839 return s;
1840 }
1841
1842 /* Parse special CONS expression: pmem (expression). Idea from AVR.
1843
1844 Used to catch and mark code (program memory) in constant expression
1845 relocations. Return non-zero for program memory. */
1846
1847 int
1848 pru_parse_cons_expression (expressionS *exp, int nbytes)
1849 {
1850 int is_pmem = FALSE;
1851 char *tmp;
1852
1853 tmp = input_line_pointer = skip_space (input_line_pointer);
1854
1855 if (nbytes == 4 || nbytes == 2)
1856 {
1857 const char *pmem_str = "%pmem";
1858 int len = strlen (pmem_str);
1859
1860 if (strncasecmp (input_line_pointer, pmem_str, len) == 0)
1861 {
1862 input_line_pointer = skip_space (input_line_pointer + len);
1863
1864 if (*input_line_pointer == '(')
1865 {
1866 input_line_pointer = skip_space (input_line_pointer + 1);
1867 is_pmem = TRUE;
1868 expression (exp);
1869
1870 if (*input_line_pointer == ')')
1871 ++input_line_pointer;
1872 else
1873 {
1874 as_bad (_("`)' required"));
1875 is_pmem = FALSE;
1876 }
1877
1878 return is_pmem;
1879 }
1880
1881 input_line_pointer = tmp;
1882 }
1883 }
1884
1885 expression (exp);
1886
1887 return is_pmem;
1888 }
1889
1890 /* Implement TC_CONS_FIX_NEW. */
1891 void
1892 pru_cons_fix_new (fragS *frag, int where, unsigned int nbytes,
1893 expressionS *exp, const int is_pmem)
1894 {
1895 bfd_reloc_code_real_type r;
1896
1897 switch (nbytes | (!!is_pmem << 8))
1898 {
1899 case 1 | (0 << 8): r = BFD_RELOC_8; break;
1900 case 2 | (0 << 8): r = BFD_RELOC_16; break;
1901 case 4 | (0 << 8): r = BFD_RELOC_32; break;
1902 case 8 | (0 << 8): r = BFD_RELOC_64; break;
1903 case 2 | (1 << 8): r = BFD_RELOC_PRU_16_PMEM; break;
1904 case 4 | (1 << 8): r = BFD_RELOC_PRU_32_PMEM; break;
1905 default:
1906 as_bad (_("illegal %s relocation size: %d"),
1907 is_pmem ? "text" : "data", nbytes);
1908 return;
1909 }
1910
1911 fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
1912 }
1913
1914 /* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2
1915 register number. */
1916 int
1917 pru_regname_to_dw2regnum (char *regname)
1918 {
1919 struct pru_reg *r = pru_reg_lookup (regname);
1920 if (r == NULL)
1921 return -1;
1922 return r->index;
1923 }
1924
1925 /* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2
1926 unwind information for this procedure. */
1927 void
1928 pru_frame_initial_instructions (void)
1929 {
1930 const unsigned fp_regno = 4;
1931 cfi_add_CFA_def_cfa (fp_regno, 0);
1932 }
1933
1934 bfd_boolean
1935 pru_allow_local_subtract (expressionS * left,
1936 expressionS * right,
1937 segT section)
1938 {
1939 /* If we are not in relaxation mode, subtraction is OK. */
1940 if (!linkrelax)
1941 return TRUE;
1942
1943 /* If the symbols are not in a code section then they are OK. */
1944 if ((section->flags & SEC_CODE) == 0)
1945 return TRUE;
1946
1947 if (left->X_add_symbol == right->X_add_symbol)
1948 return TRUE;
1949
1950 /* We have to assume that there may be instructions between the
1951 two symbols and that relaxation may increase the distance between
1952 them. */
1953 return FALSE;
1954 }
This page took 0.105016 seconds and 4 git commands to generate.