tc-m32r.c revision 1.8 1 /* tc-m32r.c -- Assembler for the Renesas M32R.
2 Copyright (C) 1996-2022 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
19 Boston, MA 02110-1301, USA. */
20
21 #include "as.h"
22 #include "safe-ctype.h"
23 #include "subsegs.h"
24 #include "symcat.h"
25 #include "opcodes/m32r-desc.h"
26 #include "opcodes/m32r-opc.h"
27 #include "cgen.h"
28 #include "elf/m32r.h"
29
30 /* Linked list of symbols that are debugging symbols to be defined as the
31 beginning of the current instruction. */
32 typedef struct sym_link
33 {
34 struct sym_link *next;
35 symbolS *symbol;
36 } sym_linkS;
37
38 static sym_linkS *debug_sym_link = (sym_linkS *) 0;
39
40 /* Structure to hold all of the different components describing
41 an individual instruction. */
42 typedef struct
43 {
44 const CGEN_INSN *insn;
45 const CGEN_INSN *orig_insn;
46 CGEN_FIELDS fields;
47 #if CGEN_INT_INSN_P
48 CGEN_INSN_INT buffer[1];
49 #define INSN_VALUE(buf) (*(buf))
50 #else
51 unsigned char buffer[CGEN_MAX_INSN_SIZE];
52 #define INSN_VALUE(buf) (buf)
53 #endif
54 char *addr;
55 fragS *frag;
56 int num_fixups;
57 fixS *fixups[GAS_CGEN_MAX_FIXUPS];
58 int indices[MAX_OPERAND_INSTANCES];
59 sym_linkS *debug_sym_link;
60 }
61 m32r_insn;
62
63 /* prev_insn.insn is non-null if last insn was a 16 bit insn on a 32 bit
64 boundary (i.e. was the first of two 16 bit insns). */
65 static m32r_insn prev_insn;
66
67 /* Non-zero if we've seen a relaxable insn since the last 32 bit
68 alignment request. */
69 static int seen_relaxable_p = 0;
70
71 /* Non-zero if we are generating PIC code. */
72 int pic_code;
73
74 /* Non-zero if -relax specified, in which case sufficient relocs are output
75 for the linker to do relaxing.
76 We do simple forms of relaxing internally, but they are always done.
77 This flag does not apply to them. */
78 static int m32r_relax;
79
80 /* Non-zero if warn when a high/shigh reloc has no matching low reloc.
81 Each high/shigh reloc must be paired with it's low cousin in order to
82 properly calculate the addend in a relocatable link (since there is a
83 potential carry from the low to the high/shigh).
84 This option is off by default though for user-written assembler code it
85 might make sense to make the default be on (i.e. have gcc pass a flag
86 to turn it off). This warning must not be on for GCC created code as
87 optimization may delete the low but not the high/shigh (at least we
88 shouldn't assume or require it to). */
89 static int warn_unmatched_high = 0;
90
91 /* 1 if -m32rx has been specified, in which case support for
92 the extended M32RX instruction set should be enabled.
93 2 if -m32r2 has been specified, in which case support for
94 the extended M32R2 instruction set should be enabled. */
95 static int enable_m32rx = 0; /* Default to M32R. */
96
97 /* Non-zero if -m32rx -hidden has been specified, in which case support for
98 the special M32RX instruction set should be enabled. */
99 static int enable_special = 0;
100
101 /* Non-zero if -bitinst has been specified, in which case support
102 for extended M32R bit-field instruction set should be enabled. */
103 static int enable_special_m32r = 1;
104
105 /* Non-zero if -float has been specified, in which case support for
106 extended M32R floating point instruction set should be enabled. */
107 static int enable_special_float = 0;
108
109 /* Non-zero if the programmer should be warned when an explicit parallel
110 instruction might have constraint violations. */
111 static int warn_explicit_parallel_conflicts = 1;
112
113 /* Non-zero if the programmer should not receive any messages about
114 parallel instruction with potential or real constraint violations.
115 The ability to suppress these messages is intended only for hardware
116 vendors testing the chip. It supersedes
117 warn_explicit_parallel_conflicts. */
118 static int ignore_parallel_conflicts = 0;
119
120 /* Non-zero if insns can be made parallel. */
121 static int use_parallel = 0;
122
123 /* Non-zero if optimizations should be performed. */
124 static int optimize;
125
126 /* m32r er_flags. */
127 static int m32r_flags = 0;
128
129 /* Stuff for .scomm symbols. */
130 static segT sbss_section;
131 static asection scom_section;
132 static asymbol scom_symbol;
133
134 const char comment_chars[] = ";";
135 const char line_comment_chars[] = "#";
136 const char line_separator_chars[] = "!";
137 const char EXP_CHARS[] = "eE";
138 const char FLT_CHARS[] = "dD";
139
140 /* Relocations against symbols are done in two
141 parts, with a HI relocation and a LO relocation. Each relocation
142 has only 16 bits of space to store an addend. This means that in
143 order for the linker to handle carries correctly, it must be able
144 to locate both the HI and the LO relocation. This means that the
145 relocations must appear in order in the relocation table.
146
147 In order to implement this, we keep track of each unmatched HI
148 relocation. We then sort them so that they immediately precede the
149 corresponding LO relocation. */
150
151 struct m32r_hi_fixup
152 {
153 /* Next HI fixup. */
154 struct m32r_hi_fixup *next;
155
156 /* This fixup. */
157 fixS *fixp;
158
159 /* The section this fixup is in. */
160 segT seg;
161 };
162
163 /* The list of unmatched HI relocs. */
164
165 static struct m32r_hi_fixup *m32r_hi_fixup_list;
166
167 static const struct
169 {
170 enum bfd_architecture bfd_mach;
171 int mach_flags;
172 } mach_table[] =
173 {
174 { bfd_mach_m32r, (1<<MACH_M32R) },
175 { bfd_mach_m32rx, (1<<MACH_M32RX) },
176 { bfd_mach_m32r2, (1<<MACH_M32R2) }
177 };
178
179 static void
180 allow_m32rx (int on)
181 {
182 enable_m32rx = on;
183
184 if (stdoutput != NULL)
185 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach_table[on].bfd_mach);
186
187 if (gas_cgen_cpu_desc != NULL)
188 gas_cgen_cpu_desc->machs = mach_table[on].mach_flags;
189 }
190
191 #define M32R_SHORTOPTS "O::K:"
193
194 const char *md_shortopts = M32R_SHORTOPTS;
195
196 enum md_option_enums
197 {
198 OPTION_M32R = OPTION_MD_BASE,
199 OPTION_M32RX,
200 OPTION_M32R2,
201 OPTION_BIG,
202 OPTION_LITTLE,
203 OPTION_PARALLEL,
204 OPTION_NO_PARALLEL,
205 OPTION_WARN_PARALLEL,
206 OPTION_NO_WARN_PARALLEL,
207 OPTION_IGNORE_PARALLEL,
208 OPTION_NO_IGNORE_PARALLEL,
209 OPTION_SPECIAL,
210 OPTION_SPECIAL_M32R,
211 OPTION_NO_SPECIAL_M32R,
212 OPTION_SPECIAL_FLOAT,
213 OPTION_WARN_UNMATCHED,
214 OPTION_NO_WARN_UNMATCHED
215 };
216
217 struct option md_longopts[] =
218 {
219 {"m32r", no_argument, NULL, OPTION_M32R},
220 {"m32rx", no_argument, NULL, OPTION_M32RX},
221 {"m32r2", no_argument, NULL, OPTION_M32R2},
222 {"big", no_argument, NULL, OPTION_BIG},
223 {"little", no_argument, NULL, OPTION_LITTLE},
224 {"EB", no_argument, NULL, OPTION_BIG},
225 {"EL", no_argument, NULL, OPTION_LITTLE},
226 {"parallel", no_argument, NULL, OPTION_PARALLEL},
227 {"no-parallel", no_argument, NULL, OPTION_NO_PARALLEL},
228 {"warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_WARN_PARALLEL},
229 {"Wp", no_argument, NULL, OPTION_WARN_PARALLEL},
230 {"no-warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
231 {"Wnp", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
232 {"ignore-parallel-conflicts", no_argument, NULL, OPTION_IGNORE_PARALLEL},
233 {"Ip", no_argument, NULL, OPTION_IGNORE_PARALLEL},
234 {"no-ignore-parallel-conflicts", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL},
235 {"nIp", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL},
236 {"hidden", no_argument, NULL, OPTION_SPECIAL},
237 {"bitinst", no_argument, NULL, OPTION_SPECIAL_M32R},
238 {"no-bitinst", no_argument, NULL, OPTION_NO_SPECIAL_M32R},
239 {"float", no_argument, NULL, OPTION_SPECIAL_FLOAT},
240 /* Sigh. I guess all warnings must now have both variants. */
241 {"warn-unmatched-high", no_argument, NULL, OPTION_WARN_UNMATCHED},
242 {"Wuh", no_argument, NULL, OPTION_WARN_UNMATCHED},
243 {"no-warn-unmatched-high", no_argument, NULL, OPTION_NO_WARN_UNMATCHED},
244 {"Wnuh", no_argument, NULL, OPTION_NO_WARN_UNMATCHED},
245 {NULL, no_argument, NULL, 0}
246 };
247
248 size_t md_longopts_size = sizeof (md_longopts);
249
250 static void
251 little (int on)
252 {
253 target_big_endian = ! on;
254 }
255
256 /* Use parallel execution. */
257
258 static int
259 parallel (void)
260 {
261 if (! enable_m32rx)
262 return 0;
263
264 if (use_parallel == 1)
265 return 1;
266
267 return 0;
268 }
269
270 int
271 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
272 {
273 switch (c)
274 {
275 case 'O':
276 optimize = 1;
277 use_parallel = 1;
278 break;
279
280 case OPTION_M32R:
281 allow_m32rx (0);
282 break;
283
284 case OPTION_M32RX:
285 allow_m32rx (1);
286 break;
287
288 case OPTION_M32R2:
289 allow_m32rx (2);
290 enable_special = 1;
291 enable_special_m32r = 1;
292 break;
293
294 case OPTION_BIG:
295 target_big_endian = 1;
296 break;
297
298 case OPTION_LITTLE:
299 target_big_endian = 0;
300 break;
301
302 case OPTION_PARALLEL:
303 use_parallel = 1;
304 break;
305
306 case OPTION_NO_PARALLEL:
307 use_parallel = 0;
308 break;
309
310 case OPTION_WARN_PARALLEL:
311 warn_explicit_parallel_conflicts = 1;
312 break;
313
314 case OPTION_NO_WARN_PARALLEL:
315 warn_explicit_parallel_conflicts = 0;
316 break;
317
318 case OPTION_IGNORE_PARALLEL:
319 ignore_parallel_conflicts = 1;
320 break;
321
322 case OPTION_NO_IGNORE_PARALLEL:
323 ignore_parallel_conflicts = 0;
324 break;
325
326 case OPTION_SPECIAL:
327 if (enable_m32rx)
328 enable_special = 1;
329 else
330 {
331 /* Pretend that we do not recognise this option. */
332 as_bad (_("Unrecognised option: -hidden"));
333 return 0;
334 }
335 break;
336
337 case OPTION_SPECIAL_M32R:
338 enable_special_m32r = 1;
339 break;
340
341 case OPTION_NO_SPECIAL_M32R:
342 enable_special_m32r = 0;
343 break;
344
345 case OPTION_SPECIAL_FLOAT:
346 enable_special_float = 1;
347 break;
348
349 case OPTION_WARN_UNMATCHED:
350 warn_unmatched_high = 1;
351 break;
352
353 case OPTION_NO_WARN_UNMATCHED:
354 warn_unmatched_high = 0;
355 break;
356
357 case 'K':
358 if (strcmp (arg, "PIC") != 0)
359 as_warn (_("Unrecognized option following -K"));
360 else
361 pic_code = 1;
362 break;
363
364 default:
365 return 0;
366 }
367
368 return 1;
369 }
370
371 void
372 md_show_usage (FILE *stream)
373 {
374 fprintf (stream, _(" M32R specific command line options:\n"));
375
376 fprintf (stream, _("\
377 -m32r disable support for the m32rx instruction set\n"));
378 fprintf (stream, _("\
379 -m32rx support the extended m32rx instruction set\n"));
380 fprintf (stream, _("\
381 -m32r2 support the extended m32r2 instruction set\n"));
382 fprintf (stream, _("\
383 -EL,-little produce little endian code and data\n"));
384 fprintf (stream, _("\
385 -EB,-big produce big endian code and data\n"));
386 fprintf (stream, _("\
387 -parallel try to combine instructions in parallel\n"));
388 fprintf (stream, _("\
389 -no-parallel disable -parallel\n"));
390 fprintf (stream, _("\
391 -no-bitinst disallow the M32R2's extended bit-field instructions\n"));
392 fprintf (stream, _("\
393 -O try to optimize code. Implies -parallel\n"));
394
395 fprintf (stream, _("\
396 -warn-explicit-parallel-conflicts warn when parallel instructions\n"));
397 fprintf (stream, _("\
398 might violate constraints\n"));
399 fprintf (stream, _("\
400 -no-warn-explicit-parallel-conflicts do not warn when parallel\n"));
401 fprintf (stream, _("\
402 instructions might violate constraints\n"));
403 fprintf (stream, _("\
404 -Wp synonym for -warn-explicit-parallel-conflicts\n"));
405 fprintf (stream, _("\
406 -Wnp synonym for -no-warn-explicit-parallel-conflicts\n"));
407 fprintf (stream, _("\
408 -ignore-parallel-conflicts do not check parallel instructions\n"));
409 fprintf (stream, _("\
410 for constraint violations\n"));
411 fprintf (stream, _("\
412 -no-ignore-parallel-conflicts check parallel instructions for\n"));
413 fprintf (stream, _("\
414 constraint violations\n"));
415 fprintf (stream, _("\
416 -Ip synonym for -ignore-parallel-conflicts\n"));
417 fprintf (stream, _("\
418 -nIp synonym for -no-ignore-parallel-conflicts\n"));
419
420 fprintf (stream, _("\
421 -warn-unmatched-high warn when an (s)high reloc has no matching low reloc\n"));
422 fprintf (stream, _("\
423 -no-warn-unmatched-high do not warn about missing low relocs\n"));
424 fprintf (stream, _("\
425 -Wuh synonym for -warn-unmatched-high\n"));
426 fprintf (stream, _("\
427 -Wnuh synonym for -no-warn-unmatched-high\n"));
428
429 fprintf (stream, _("\
430 -KPIC generate PIC\n"));
431 }
432
433 /* Set by md_assemble for use by m32r_fill_insn. */
434 static subsegT prev_subseg;
435 static segT prev_seg;
436
437 #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
438 symbolS * GOT_symbol;
439
440 static inline int
441 m32r_PIC_related_p (symbolS *sym)
442 {
443 expressionS *exp;
444
445 if (! sym)
446 return 0;
447
448 if (sym == GOT_symbol)
449 return 1;
450
451 exp = symbol_get_value_expression (sym);
452
453 return (exp->X_op == O_PIC_reloc
454 || exp->X_md == BFD_RELOC_M32R_26_PLTREL
455 || m32r_PIC_related_p (exp->X_add_symbol)
456 || m32r_PIC_related_p (exp->X_op_symbol));
457 }
458
459 static inline int
460 m32r_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p)
461 {
462 expressionS *exp = main_exp;
463
464 if (exp->X_op == O_add && m32r_PIC_related_p (exp->X_op_symbol))
465 return 1;
466
467 if (exp->X_op == O_symbol && exp->X_add_symbol)
468 {
469 if (exp->X_add_symbol == GOT_symbol)
470 {
471 *r_type_p = BFD_RELOC_M32R_GOTPC24;
472 return 0;
473 }
474 }
475 else if (exp->X_op == O_add)
476 {
477 exp = symbol_get_value_expression (exp->X_add_symbol);
478 if (! exp)
479 return 0;
480 }
481
482 if (exp->X_op == O_PIC_reloc)
483 {
484 *r_type_p = exp->X_md;
485 if (exp == main_exp)
486 exp->X_op = O_symbol;
487 else
488 {
489 main_exp->X_add_symbol = exp->X_add_symbol;
490 main_exp->X_add_number += exp->X_add_number;
491 }
492 }
493 else
494 return (m32r_PIC_related_p (exp->X_add_symbol)
495 || m32r_PIC_related_p (exp->X_op_symbol));
496
497 return 0;
498 }
499
500 /* FIXME: Should be machine generated. */
501 #define NOP_INSN 0x7000
502 #define PAR_NOP_INSN 0xf000 /* Can only be used in 2nd slot. */
503
504 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
505 of an rs_align_code fragment. */
506
507 void
508 m32r_handle_align (fragS *fragp)
509 {
510 static const unsigned char nop_pattern[] = { 0xf0, 0x00 };
511 static const unsigned char multi_nop_pattern[] = { 0x70, 0x00, 0xf0, 0x00 };
512
513 int bytes, fix;
514 char *p;
515
516 if (fragp->fr_type != rs_align_code)
517 return;
518
519 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
520 p = fragp->fr_literal + fragp->fr_fix;
521 fix = 0;
522
523 if (bytes & 1)
524 {
525 fix = 1;
526 *p++ = 0;
527 bytes--;
528 }
529
530 if (bytes & 2)
531 {
532 memcpy (p, nop_pattern, 2);
533 p += 2;
534 bytes -= 2;
535 fix += 2;
536 }
537
538 memcpy (p, multi_nop_pattern, 4);
539
540 fragp->fr_fix += fix;
541 fragp->fr_var = 4;
542 }
543
544 /* If the last instruction was the first of 2 16 bit insns,
545 output a nop to move the PC to a 32 bit boundary.
546
547 This is done via an alignment specification since branch relaxing
548 may make it unnecessary.
549
550 Internally, we need to output one of these each time a 32 bit insn is
551 seen after an insn that is relaxable. */
552
553 static void
554 fill_insn (int ignore ATTRIBUTE_UNUSED)
555 {
556 frag_align_code (2, 0);
557 prev_insn.insn = NULL;
558 seen_relaxable_p = 0;
559 }
560
561 /* Record the symbol so that when we output the insn, we can create
562 a symbol that is at the start of the instruction. This is used
563 to emit the label for the start of a breakpoint without causing
564 the assembler to emit a NOP if the previous instruction was a
565 16 bit instruction. */
566
567 static void
568 debug_sym (int ignore ATTRIBUTE_UNUSED)
569 {
570 char *name;
571 char delim;
572 symbolS *symbolP;
573 sym_linkS *lnk;
574
575 delim = get_symbol_name (&name);
576
577 if ((symbolP = symbol_find (name)) == NULL
578 && (symbolP = md_undefined_symbol (name)) == NULL)
579 symbolP = symbol_new (name, undefined_section, &zero_address_frag, 0);
580
581 symbol_table_insert (symbolP);
582 if (S_IS_DEFINED (symbolP) && (S_GET_SEGMENT (symbolP) != reg_section
583 || S_IS_EXTERNAL (symbolP)
584 || S_IS_WEAK (symbolP)))
585 /* xgettext:c-format */
586 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
587
588 else
589 {
590 lnk = XNEW (sym_linkS);
591 lnk->symbol = symbolP;
592 lnk->next = debug_sym_link;
593 debug_sym_link = lnk;
594 symbol_get_obj (symbolP)->local = 1;
595 }
596
597 (void) restore_line_pointer (delim);
598 demand_empty_rest_of_line ();
599 }
600
601 /* Second pass to expanding the debug symbols, go through linked
602 list of symbols and reassign the address. */
603
604 static void
605 expand_debug_syms (sym_linkS *syms, int align)
606 {
607 char *save_input_line = input_line_pointer;
608 sym_linkS *next_syms;
609
610 if (!syms)
611 return;
612
613 (void) frag_align_code (align, 0);
614 for (; syms != (sym_linkS *) 0; syms = next_syms)
615 {
616 symbolS *symbolP = syms->symbol;
617 next_syms = syms->next;
618 input_line_pointer = (char *) ".\n";
619 pseudo_set (symbolP);
620 free ((char *) syms);
621 }
622
623 input_line_pointer = save_input_line;
624 }
625
626 void
627 m32r_flush_pending_output (void)
628 {
629 if (debug_sym_link)
630 {
631 expand_debug_syms (debug_sym_link, 1);
632 debug_sym_link = (sym_linkS *) 0;
633 }
634 }
635
636 /* Cover function to fill_insn called after a label and at end of assembly.
637 The result is always 1: we're called in a conditional to see if the
638 current line is a label. */
639
640 int
641 m32r_fill_insn (int done)
642 {
643 if (prev_seg != NULL)
644 {
645 segT seg = now_seg;
646 subsegT subseg = now_subseg;
647
648 subseg_set (prev_seg, prev_subseg);
649
650 fill_insn (0);
651
652 subseg_set (seg, subseg);
653 }
654
655 if (done && debug_sym_link)
656 {
657 expand_debug_syms (debug_sym_link, 1);
658 debug_sym_link = (sym_linkS *) 0;
659 }
660
661 return 1;
662 }
663
664 /* The default target format to use. */
666
667 const char *
668 m32r_target_format (void)
669 {
670 #ifdef TE_LINUX
671 if (target_big_endian)
672 return "elf32-m32r-linux";
673 else
674 return "elf32-m32rle-linux";
675 #else
676 if (target_big_endian)
677 return "elf32-m32r";
678 else
679 return "elf32-m32rle";
680 #endif
681 }
682
683 void
684 md_begin (void)
685 {
686 flagword applicable;
687 segT seg;
688 subsegT subseg;
689
690 /* Initialize the `cgen' interface. */
691
692 /* Set the machine number and endian. */
693 gas_cgen_cpu_desc = m32r_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, 0,
694 CGEN_CPU_OPEN_ENDIAN,
695 (target_big_endian ?
696 CGEN_ENDIAN_BIG : CGEN_ENDIAN_LITTLE),
697 CGEN_CPU_OPEN_END);
698 m32r_cgen_init_asm (gas_cgen_cpu_desc);
699
700 /* The operand instance table is used during optimization to determine
701 which insns can be executed in parallel. It is also used to give
702 warnings regarding operand interference in parallel insns. */
703 m32r_cgen_init_opinst_table (gas_cgen_cpu_desc);
704
705 /* This is a callback from cgen to gas to parse operands. */
706 cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand);
707
708 /* Save the current subseg so we can restore it [it's the default one and
709 we don't want the initial section to be .sbss]. */
710 seg = now_seg;
711 subseg = now_subseg;
712
713 /* The sbss section is for local .scomm symbols. */
714 sbss_section = subseg_new (".sbss", 0);
715 seg_info (sbss_section)->bss = 1;
716
717 /* This is copied from perform_an_assembly_pass. */
718 applicable = bfd_applicable_section_flags (stdoutput);
719 bfd_set_section_flags (sbss_section,
720 applicable & (SEC_ALLOC | SEC_SMALL_DATA));
721
722 subseg_set (seg, subseg);
723
724 /* We must construct a fake section similar to bfd_com_section
725 but with the name .scommon. */
726 scom_section = *bfd_com_section_ptr;
727 scom_section.name = ".scommon";
728 scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
729 scom_section.output_section = & scom_section;
730 scom_section.symbol = & scom_symbol;
731 scom_section.symbol_ptr_ptr = & scom_section.symbol;
732 scom_symbol = * bfd_com_section_ptr->symbol;
733 scom_symbol.name = ".scommon";
734 scom_symbol.section = & scom_section;
735
736 allow_m32rx (enable_m32rx);
737
738 gas_cgen_initialize_saved_fixups_array ();
739 }
740
741 #define OPERAND_IS_COND_BIT(operand, indices, index) \
742 ((operand)->hw_type == HW_H_COND \
743 || ((operand)->hw_type == HW_H_PSW) \
744 || ((operand)->hw_type == HW_H_CR \
745 && (indices [index] == 0 || indices [index] == 1)))
746
747 /* Returns true if an output of instruction 'a' is referenced by an operand
748 of instruction 'b'. If 'check_outputs' is true then b's outputs are
749 checked, otherwise its inputs are examined. */
750
751 static int
752 first_writes_to_seconds_operands (m32r_insn *a,
753 m32r_insn *b,
754 const int check_outputs)
755 {
756 const CGEN_OPINST *a_operands = CGEN_INSN_OPERANDS (a->insn);
757 const CGEN_OPINST *b_ops = CGEN_INSN_OPERANDS (b->insn);
758 int a_index;
759
760 if (ignore_parallel_conflicts)
761 return 0;
762
763 /* If at least one of the instructions takes no operands, then there is
764 nothing to check. There really are instructions without operands,
765 eg 'nop'. */
766 if (a_operands == NULL || b_ops == NULL)
767 return 0;
768
769 /* Scan the operand list of 'a' looking for an output operand. */
770 for (a_index = 0;
771 a_operands->type != CGEN_OPINST_END;
772 a_index ++, a_operands ++)
773 {
774 if (a_operands->type == CGEN_OPINST_OUTPUT)
775 {
776 int b_index;
777 const CGEN_OPINST *b_operands = b_ops;
778
779 /* Special Case:
780 The Condition bit 'C' is a shadow of the CBR register (control
781 register 1) and also a shadow of bit 31 of the program status
782 word (control register 0). For now this is handled here, rather
783 than by cgen.... */
784
785 if (OPERAND_IS_COND_BIT (a_operands, a->indices, a_index))
786 {
787 /* Scan operand list of 'b' looking for another reference to the
788 condition bit, which goes in the right direction. */
789 for (b_index = 0;
790 b_operands->type != CGEN_OPINST_END;
791 b_index++, b_operands++)
792 {
793 if ((b_operands->type
794 == (check_outputs
795 ? CGEN_OPINST_OUTPUT
796 : CGEN_OPINST_INPUT))
797 && OPERAND_IS_COND_BIT (b_operands, b->indices, b_index))
798 return 1;
799 }
800 }
801 else
802 {
803 /* Scan operand list of 'b' looking for an operand that
804 references the same hardware element, and which goes in the
805 right direction. */
806 for (b_index = 0;
807 b_operands->type != CGEN_OPINST_END;
808 b_index++, b_operands++)
809 {
810 if ((b_operands->type
811 == (check_outputs
812 ? CGEN_OPINST_OUTPUT
813 : CGEN_OPINST_INPUT))
814 && (b_operands->hw_type == a_operands->hw_type)
815 && (a->indices[a_index] == b->indices[b_index]))
816 return 1;
817 }
818 }
819 }
820 }
821
822 return 0;
823 }
824
825 /* Returns true if the insn can (potentially) alter the program counter. */
826
827 static int
828 writes_to_pc (m32r_insn *a)
829 {
830 if (CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_UNCOND_CTI)
831 || CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_COND_CTI))
832 return 1;
833 return 0;
834 }
835
836 /* Return NULL if the two 16 bit insns can be executed in parallel.
837 Otherwise return a pointer to an error message explaining why not. */
838
839 static const char *
840 can_make_parallel (m32r_insn *a, m32r_insn *b)
841 {
842 PIPE_ATTR a_pipe;
843 PIPE_ATTR b_pipe;
844
845 /* Make sure the instructions are the right length. */
846 if (CGEN_FIELDS_BITSIZE (&a->fields) != 16
847 || CGEN_FIELDS_BITSIZE (&b->fields) != 16)
848 abort ();
849
850 if (first_writes_to_seconds_operands (a, b, true))
851 return _("instructions write to the same destination register.");
852
853 a_pipe = CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_PIPE);
854 b_pipe = CGEN_INSN_ATTR_VALUE (b->insn, CGEN_INSN_PIPE);
855
856 /* Make sure that the instructions use the correct execution pipelines. */
857 if (a_pipe == PIPE_NONE
858 || b_pipe == PIPE_NONE)
859 return _("Instructions do not use parallel execution pipelines.");
860
861 /* Leave this test for last, since it is the only test that can
862 go away if the instructions are swapped, and we want to make
863 sure that any other errors are detected before this happens. */
864 if (a_pipe == PIPE_S
865 || b_pipe == PIPE_O
866 || (b_pipe == PIPE_O_OS && (enable_m32rx != 2)))
867 return _("Instructions share the same execution pipeline");
868
869 return NULL;
870 }
871
872 /* Force the top bit of the second 16-bit insn to be set. */
873
874 static void
875 make_parallel (CGEN_INSN_BYTES_PTR buffer)
876 {
877 #if CGEN_INT_INSN_P
878 *buffer |= 0x8000;
879 #else
880 buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
881 |= 0x80;
882 #endif
883 }
884
885 /* Same as make_parallel except buffer contains the bytes in target order. */
886
887 static void
888 target_make_parallel (char *buffer)
889 {
890 buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
891 |= 0x80;
892 }
893
894 /* Assemble two instructions with an explicit parallel operation (||) or
895 sequential operation (->). */
896
897 static void
898 assemble_two_insns (char *str1, char *str2, int parallel_p)
899 {
900 char *str3;
901 m32r_insn first;
902 m32r_insn second;
903 char *errmsg;
904 char save_str2 = *str2;
905
906 /* Separate the two instructions. */
907 *str2 = 0;
908
909 /* Make sure the two insns begin on a 32 bit boundary.
910 This is also done for the serial case (foo -> bar), relaxing doesn't
911 affect insns written like this.
912 Note that we must always do this as we can't assume anything about
913 whether we're currently on a 32 bit boundary or not. Relaxing may
914 change this. */
915 fill_insn (0);
916
917 first.debug_sym_link = debug_sym_link;
918 debug_sym_link = (sym_linkS *) 0;
919
920 /* Parse the first instruction. */
921 if (! (first.insn = m32r_cgen_assemble_insn
922 (gas_cgen_cpu_desc, str1, & first.fields, first.buffer, & errmsg)))
923 {
924 as_bad ("%s", errmsg);
925 return;
926 }
927
928 /* Check it. */
929 if (CGEN_FIELDS_BITSIZE (&first.fields) != 16)
930 {
931 /* xgettext:c-format */
932 as_bad (_("not a 16 bit instruction '%s'"), str1);
933 return;
934 }
935 #ifdef E_M32R2_ARCH
936 else if ((enable_m32rx == 1)
937 /* FIXME: Need standard macro to perform this test. */
938 && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
939 & (1 << MACH_M32R2))
940 && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
941 & (1 << MACH_M32RX)))))
942 {
943 /* xgettext:c-format */
944 as_bad (_("instruction '%s' is for the M32R2 only"), str1);
945 return;
946 }
947 else if ((! enable_special
948 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
949 || (! enable_special_m32r
950 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)))
951 #else
952 else if (! enable_special
953 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
954 #endif
955 {
956 /* xgettext:c-format */
957 as_bad (_("unknown instruction '%s'"), str1);
958 return;
959 }
960 else if (! enable_m32rx
961 /* FIXME: Need standard macro to perform this test. */
962 && (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
963 == (1 << MACH_M32RX)))
964 {
965 /* xgettext:c-format */
966 as_bad (_("instruction '%s' is for the M32RX only"), str1);
967 return;
968 }
969
970 /* Check to see if this is an allowable parallel insn. */
971 if (parallel_p
972 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_PIPE) == PIPE_NONE)
973 {
974 /* xgettext:c-format */
975 as_bad (_("instruction '%s' cannot be executed in parallel."), str1);
976 return;
977 }
978
979 /* Restore the original assembly text, just in case it is needed. */
980 *str2 = save_str2;
981
982 /* Save the original string pointer. */
983 str3 = str1;
984
985 /* Advanced past the parsed string. */
986 str1 = str2 + 2;
987
988 /* Remember the entire string in case it is needed for error
989 messages. */
990 str2 = str3;
991
992 /* Convert the opcode to lower case. */
993 {
994 char *s2 = str1;
995
996 while (ISSPACE (*s2++))
997 continue;
998
999 --s2;
1000
1001 while (ISALNUM (*s2))
1002 {
1003 *s2 = TOLOWER (*s2);
1004 s2++;
1005 }
1006 }
1007
1008 /* Preserve any fixups that have been generated and reset the list
1009 to empty. */
1010 gas_cgen_save_fixups (0);
1011
1012 /* Get the indices of the operands of the instruction. */
1013 /* FIXME: CGEN_FIELDS is already recorded, but relying on that fact
1014 doesn't seem right. Perhaps allow passing fields like we do insn. */
1015 /* FIXME: ALIAS insns do not have operands, so we use this function
1016 to find the equivalent insn and overwrite the value stored in our
1017 structure. We still need the original insn, however, since this
1018 may have certain attributes that are not present in the unaliased
1019 version (eg relaxability). When aliases behave differently this
1020 may have to change. */
1021 first.orig_insn = first.insn;
1022 {
1023 CGEN_FIELDS tmp_fields;
1024 first.insn = cgen_lookup_get_insn_operands
1025 (gas_cgen_cpu_desc, NULL, INSN_VALUE (first.buffer), NULL, 16,
1026 first.indices, &tmp_fields);
1027 }
1028
1029 if (first.insn == NULL)
1030 as_fatal (_("internal error: lookup/get operands failed"));
1031
1032 second.debug_sym_link = NULL;
1033
1034 /* Parse the second instruction. */
1035 if (! (second.insn = m32r_cgen_assemble_insn
1036 (gas_cgen_cpu_desc, str1, & second.fields, second.buffer, & errmsg)))
1037 {
1038 as_bad ("%s", errmsg);
1039 return;
1040 }
1041
1042 /* Check it. */
1043 if (CGEN_FIELDS_BITSIZE (&second.fields) != 16)
1044 {
1045 /* xgettext:c-format */
1046 as_bad (_("not a 16 bit instruction '%s'"), str1);
1047 return;
1048 }
1049 #ifdef E_M32R2_ARCH
1050 else if ((enable_m32rx == 1)
1051 /* FIXME: Need standard macro to perform this test. */
1052 && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1053 & (1 << MACH_M32R2))
1054 && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1055 & (1 << MACH_M32RX)))))
1056 {
1057 /* xgettext:c-format */
1058 as_bad (_("instruction '%s' is for the M32R2 only"), str1);
1059 return;
1060 }
1061 else if ((! enable_special
1062 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1063 || (! enable_special_m32r
1064 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R)))
1065 #else
1066 else if (! enable_special
1067 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1068 #endif
1069 {
1070 /* xgettext:c-format */
1071 as_bad (_("unknown instruction '%s'"), str1);
1072 return;
1073 }
1074 else if (! enable_m32rx
1075 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1076 {
1077 /* xgettext:c-format */
1078 as_bad (_("instruction '%s' is for the M32RX only"), str1);
1079 return;
1080 }
1081
1082 /* Check to see if this is an allowable parallel insn. */
1083 if (parallel_p
1084 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_PIPE) == PIPE_NONE)
1085 {
1086 /* xgettext:c-format */
1087 as_bad (_("instruction '%s' cannot be executed in parallel."), str1);
1088 return;
1089 }
1090
1091 if (parallel_p && ! enable_m32rx)
1092 {
1093 if (CGEN_INSN_NUM (first.insn) != M32R_INSN_NOP
1094 && CGEN_INSN_NUM (second.insn) != M32R_INSN_NOP)
1095 {
1096 /* xgettext:c-format */
1097 as_bad (_("'%s': only the NOP instruction can be issued in parallel on the m32r"), str2);
1098 return;
1099 }
1100 }
1101
1102 /* Get the indices of the operands of the instruction. */
1103 second.orig_insn = second.insn;
1104 {
1105 CGEN_FIELDS tmp_fields;
1106 second.insn = cgen_lookup_get_insn_operands
1107 (gas_cgen_cpu_desc, NULL, INSN_VALUE (second.buffer), NULL, 16,
1108 second.indices, &tmp_fields);
1109 }
1110
1111 if (second.insn == NULL)
1112 as_fatal (_("internal error: lookup/get operands failed"));
1113
1114 /* We assume that if the first instruction writes to a register that is
1115 read by the second instruction it is because the programmer intended
1116 this to happen, (after all they have explicitly requested that these
1117 two instructions be executed in parallel). Although if the global
1118 variable warn_explicit_parallel_conflicts is true then we do generate
1119 a warning message. Similarly we assume that parallel branch and jump
1120 instructions are deliberate and should not produce errors. */
1121
1122 if (parallel_p && warn_explicit_parallel_conflicts)
1123 {
1124 if (first_writes_to_seconds_operands (&first, &second, false))
1125 /* xgettext:c-format */
1126 as_warn (_("%s: output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?"), str2);
1127
1128 if (first_writes_to_seconds_operands (&second, &first, false))
1129 /* xgettext:c-format */
1130 as_warn (_("%s: output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?"), str2);
1131 }
1132
1133 if (!parallel_p
1134 || (errmsg = (char *) can_make_parallel (&first, &second)) == NULL)
1135 {
1136 /* Get the fixups for the first instruction. */
1137 gas_cgen_swap_fixups (0);
1138
1139 /* Write it out. */
1140 expand_debug_syms (first.debug_sym_link, 1);
1141 gas_cgen_finish_insn (first.orig_insn, first.buffer,
1142 CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1143
1144 /* Force the top bit of the second insn to be set. */
1145 if (parallel_p)
1146 make_parallel (second.buffer);
1147
1148 /* Get its fixups. */
1149 gas_cgen_restore_fixups (0);
1150
1151 /* Write it out. */
1152 expand_debug_syms (second.debug_sym_link, 1);
1153 gas_cgen_finish_insn (second.orig_insn, second.buffer,
1154 CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1155 }
1156 /* Try swapping the instructions to see if they work that way. */
1157 else if (can_make_parallel (&second, &first) == NULL)
1158 {
1159 /* Write out the second instruction first. */
1160 expand_debug_syms (second.debug_sym_link, 1);
1161 gas_cgen_finish_insn (second.orig_insn, second.buffer,
1162 CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1163
1164 /* Force the top bit of the first instruction to be set. */
1165 make_parallel (first.buffer);
1166
1167 /* Get the fixups for the first instruction. */
1168 gas_cgen_restore_fixups (0);
1169
1170 /* Write out the first instruction. */
1171 expand_debug_syms (first.debug_sym_link, 1);
1172 gas_cgen_finish_insn (first.orig_insn, first.buffer,
1173 CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1174 }
1175 else
1176 {
1177 as_bad ("'%s': %s", str2, errmsg);
1178 return;
1179 }
1180
1181 if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL)
1182 || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1183 m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1184 if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)
1185 || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R))
1186 m32r_flags |= E_M32R_HAS_BIT_INST;
1187 if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_FLOAT)
1188 || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_FLOAT))
1189 m32r_flags |= E_M32R_HAS_FLOAT_INST;
1190
1191 /* Set these so m32r_fill_insn can use them. */
1192 prev_seg = now_seg;
1193 prev_subseg = now_subseg;
1194 }
1195
1196 void
1197 md_assemble (char *str)
1198 {
1199 m32r_insn insn;
1200 char *errmsg;
1201 char *str2 = NULL;
1202
1203 /* Initialize GAS's cgen interface for a new instruction. */
1204 gas_cgen_init_parse ();
1205
1206 /* Look for a parallel instruction separator. */
1207 if ((str2 = strstr (str, "||")) != NULL)
1208 {
1209 assemble_two_insns (str, str2, 1);
1210 m32r_flags |= E_M32R_HAS_PARALLEL;
1211 return;
1212 }
1213
1214 /* Also look for a sequential instruction separator. */
1215 if ((str2 = strstr (str, "->")) != NULL)
1216 {
1217 assemble_two_insns (str, str2, 0);
1218 return;
1219 }
1220
1221 insn.debug_sym_link = debug_sym_link;
1222 debug_sym_link = (sym_linkS *) 0;
1223
1224 insn.insn = m32r_cgen_assemble_insn
1225 (gas_cgen_cpu_desc, str, &insn.fields, insn.buffer, & errmsg);
1226
1227 if (!insn.insn)
1228 {
1229 as_bad ("%s", errmsg);
1230 return;
1231 }
1232
1233 #ifdef E_M32R2_ARCH
1234 if ((enable_m32rx == 1)
1235 /* FIXME: Need standard macro to perform this test. */
1236 && ((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1237 & (1 << MACH_M32R2))
1238 && !((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1239 & (1 << MACH_M32RX)))))
1240 {
1241 /* xgettext:c-format */
1242 as_bad (_("instruction '%s' is for the M32R2 only"), str);
1243 return;
1244 }
1245 else if ((! enable_special
1246 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1247 || (! enable_special_m32r
1248 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R)))
1249 #else
1250 if (! enable_special
1251 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1252 #endif
1253 {
1254 /* xgettext:c-format */
1255 as_bad (_("unknown instruction '%s'"), str);
1256 return;
1257 }
1258 else if (! enable_m32rx
1259 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1260 {
1261 /* xgettext:c-format */
1262 as_bad (_("instruction '%s' is for the M32RX only"), str);
1263 return;
1264 }
1265
1266 if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1267 m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1268 if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R))
1269 m32r_flags |= E_M32R_HAS_BIT_INST;
1270 if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_FLOAT))
1271 m32r_flags |= E_M32R_HAS_FLOAT_INST;
1272
1273 if (CGEN_INSN_BITSIZE (insn.insn) == 32)
1274 {
1275 /* 32 bit insns must live on 32 bit boundaries. */
1276 if (prev_insn.insn || seen_relaxable_p)
1277 {
1278 /* ??? If calling fill_insn too many times turns us into a memory
1279 pig, can we call a fn to assemble a nop instead of
1280 !seen_relaxable_p? */
1281 fill_insn (0);
1282 }
1283
1284 expand_debug_syms (insn.debug_sym_link, 2);
1285
1286 /* Doesn't really matter what we pass for RELAX_P here. */
1287 gas_cgen_finish_insn (insn.insn, insn.buffer,
1288 CGEN_FIELDS_BITSIZE (&insn.fields), 1, NULL);
1289 }
1290 else
1291 {
1292 int on_32bit_boundary_p;
1293 int swap = false;
1294
1295 if (CGEN_INSN_BITSIZE (insn.insn) != 16)
1296 abort ();
1297
1298 insn.orig_insn = insn.insn;
1299
1300 /* If the previous insn was relaxable, then it may be expanded
1301 to fill the current 16 bit slot. Emit a NOP here to occupy
1302 this slot, so that we can start at optimizing at a 32 bit
1303 boundary. */
1304 if (prev_insn.insn && seen_relaxable_p && optimize)
1305 fill_insn (0);
1306
1307 if (enable_m32rx)
1308 {
1309 /* Get the indices of the operands of the instruction.
1310 FIXME: See assemble_parallel for notes on orig_insn. */
1311 {
1312 CGEN_FIELDS tmp_fields;
1313 insn.insn = cgen_lookup_get_insn_operands
1314 (gas_cgen_cpu_desc, NULL, INSN_VALUE (insn.buffer), NULL,
1315 16, insn.indices, &tmp_fields);
1316 }
1317
1318 if (insn.insn == NULL)
1319 as_fatal (_("internal error: lookup/get operands failed"));
1320 }
1321
1322 /* Compute whether we're on a 32 bit boundary or not.
1323 prev_insn.insn is NULL when we're on a 32 bit boundary. */
1324 on_32bit_boundary_p = prev_insn.insn == NULL;
1325
1326 /* Change a frag to, if each insn to swap is in a different frag.
1327 It must keep only one instruction in a frag. */
1328 if (parallel() && on_32bit_boundary_p)
1329 {
1330 frag_wane (frag_now);
1331 frag_new (0);
1332 }
1333
1334 /* Look to see if this instruction can be combined with the
1335 previous instruction to make one, parallel, 32 bit instruction.
1336 If the previous instruction (potentially) changed the flow of
1337 program control, then it cannot be combined with the current
1338 instruction. If the current instruction is relaxable, then it
1339 might be replaced with a longer version, so we cannot combine it.
1340 Also if the output of the previous instruction is used as an
1341 input to the current instruction then it cannot be combined.
1342 Otherwise call can_make_parallel() with both orderings of the
1343 instructions to see if they can be combined. */
1344 if (! on_32bit_boundary_p
1345 && parallel ()
1346 && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) == 0
1347 && ! writes_to_pc (&prev_insn)
1348 && ! first_writes_to_seconds_operands (&prev_insn, &insn, false))
1349 {
1350 if (can_make_parallel (&prev_insn, &insn) == NULL)
1351 make_parallel (insn.buffer);
1352 else if (can_make_parallel (&insn, &prev_insn) == NULL)
1353 swap = true;
1354 }
1355
1356 expand_debug_syms (insn.debug_sym_link, 1);
1357
1358 {
1359 int i;
1360 finished_insnS fi;
1361
1362 /* Ensure each pair of 16 bit insns is in the same frag. */
1363 frag_grow (4);
1364
1365 gas_cgen_finish_insn (insn.orig_insn, insn.buffer,
1366 CGEN_FIELDS_BITSIZE (&insn.fields),
1367 1 /* relax_p */, &fi);
1368 insn.addr = fi.addr;
1369 insn.frag = fi.frag;
1370 insn.num_fixups = fi.num_fixups;
1371 for (i = 0; i < fi.num_fixups; ++i)
1372 insn.fixups[i] = fi.fixups[i];
1373 }
1374
1375 if (swap)
1376 {
1377 int i, tmp;
1378
1379 #define SWAP_BYTES(a,b) tmp = a; a = b; b = tmp
1380
1381 /* Swap the two insns */
1382 SWAP_BYTES (prev_insn.addr[0], insn.addr[0]);
1383 SWAP_BYTES (prev_insn.addr[1], insn.addr[1]);
1384
1385 target_make_parallel (insn.addr);
1386
1387 /* Swap any relaxable frags recorded for the two insns. */
1388 /* FIXME: Clarify. relaxation precludes parallel insns */
1389 if (prev_insn.frag->fr_opcode == prev_insn.addr)
1390 prev_insn.frag->fr_opcode = insn.addr;
1391 else if (insn.frag->fr_opcode == insn.addr)
1392 insn.frag->fr_opcode = prev_insn.addr;
1393
1394 /* Change a frag to, if each insn is in a different frag.
1395 It must keep only one instruction in a frag. */
1396 if (prev_insn.frag != insn.frag)
1397 {
1398 for (i = 0; i < prev_insn.num_fixups; ++i)
1399 prev_insn.fixups[i]->fx_frag = insn.frag;
1400 for (i = 0; i < insn.num_fixups; ++i)
1401 insn.fixups[i]->fx_frag = prev_insn.frag;
1402 }
1403 else
1404 {
1405 /* Update the addresses in any fixups.
1406 Note that we don't have to handle the case where each insn is in
1407 a different frag as we ensure they're in the same frag above. */
1408 for (i = 0; i < prev_insn.num_fixups; ++i)
1409 prev_insn.fixups[i]->fx_where += 2;
1410 for (i = 0; i < insn.num_fixups; ++i)
1411 insn.fixups[i]->fx_where -= 2;
1412 }
1413 }
1414
1415 /* Keep track of whether we've seen a pair of 16 bit insns.
1416 prev_insn.insn is NULL when we're on a 32 bit boundary. */
1417 if (on_32bit_boundary_p)
1418 prev_insn = insn;
1419 else
1420 prev_insn.insn = NULL;
1421
1422 /* If the insn needs the following one to be on a 32 bit boundary
1423 (e.g. subroutine calls), fill this insn's slot. */
1424 if (on_32bit_boundary_p
1425 && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_FILL_SLOT) != 0)
1426 fill_insn (0);
1427
1428 /* If this is a relaxable insn (can be replaced with a larger version)
1429 mark the fact so that we can emit an alignment directive for a
1430 following 32 bit insn if we see one. */
1431 if (CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) != 0)
1432 seen_relaxable_p = 1;
1433 }
1434
1435 /* Set these so m32r_fill_insn can use them. */
1436 prev_seg = now_seg;
1437 prev_subseg = now_subseg;
1438 }
1439
1440 /* The syntax in the manual says constants begin with '#'.
1441 We just ignore it. */
1442
1443 void
1444 md_operand (expressionS *expressionP)
1445 {
1446 if (*input_line_pointer == '#')
1447 {
1448 input_line_pointer++;
1449 expression (expressionP);
1450 }
1451 }
1452
1453 valueT
1454 md_section_align (segT segment, valueT size)
1455 {
1456 int align = bfd_section_alignment (segment);
1457
1458 return ((size + (1 << align) - 1) & -(1 << align));
1459 }
1460
1461 symbolS *
1462 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1463 {
1464 return 0;
1465 }
1466
1467 /* .scomm pseudo-op handler.
1469
1470 This is a new pseudo-op to handle putting objects in .scommon.
1471 By doing this the linker won't need to do any work,
1472 and more importantly it removes the implicit -G arg necessary to
1473 correctly link the object file. */
1474
1475 static void
1476 m32r_scomm (int ignore ATTRIBUTE_UNUSED)
1477 {
1478 char *name;
1479 char c;
1480 char *p;
1481 offsetT size;
1482 symbolS *symbolP;
1483 offsetT align;
1484 int align2;
1485
1486 c = get_symbol_name (&name);
1487
1488 /* Just after name is now '\0'. */
1489 p = input_line_pointer;
1490 *p = c;
1491 SKIP_WHITESPACE_AFTER_NAME ();
1492 if (*input_line_pointer != ',')
1493 {
1494 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1495 ignore_rest_of_line ();
1496 return;
1497 }
1498
1499 /* Skip ','. */
1500 input_line_pointer++;
1501 if ((size = get_absolute_expression ()) < 0)
1502 {
1503 /* xgettext:c-format */
1504 as_warn (_(".SCOMMon length (%ld.) <0! Ignored."), (long) size);
1505 ignore_rest_of_line ();
1506 return;
1507 }
1508
1509 /* The third argument to .scomm is the alignment. */
1510 if (*input_line_pointer != ',')
1511 align = 8;
1512 else
1513 {
1514 ++input_line_pointer;
1515 align = get_absolute_expression ();
1516 if (align <= 0)
1517 {
1518 as_warn (_("ignoring bad alignment"));
1519 align = 8;
1520 }
1521 }
1522
1523 /* Convert to a power of 2 alignment. */
1524 if (align)
1525 {
1526 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
1527 continue;
1528 if (align != 1)
1529 {
1530 as_bad (_("Common alignment not a power of 2"));
1531 ignore_rest_of_line ();
1532 return;
1533 }
1534 }
1535 else
1536 align2 = 0;
1537
1538 *p = 0;
1539 symbolP = symbol_find_or_make (name);
1540 *p = c;
1541
1542 if (S_IS_DEFINED (symbolP))
1543 {
1544 /* xgettext:c-format */
1545 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1546 S_GET_NAME (symbolP));
1547 ignore_rest_of_line ();
1548 return;
1549 }
1550
1551 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1552 {
1553 /* xgettext:c-format */
1554 as_bad (_("Length of .scomm \"%s\" is already %ld. Not changed to %ld."),
1555 S_GET_NAME (symbolP),
1556 (long) S_GET_VALUE (symbolP),
1557 (long) size);
1558
1559 ignore_rest_of_line ();
1560 return;
1561 }
1562
1563 if (symbol_get_obj (symbolP)->local)
1564 {
1565 segT old_sec = now_seg;
1566 int old_subsec = now_subseg;
1567 char *pfrag;
1568
1569 record_alignment (sbss_section, align2);
1570 subseg_set (sbss_section, 0);
1571
1572 if (align2)
1573 frag_align (align2, 0, 0);
1574
1575 if (S_GET_SEGMENT (symbolP) == sbss_section)
1576 symbol_get_frag (symbolP)->fr_symbol = 0;
1577
1578 symbol_set_frag (symbolP, frag_now);
1579
1580 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1581 (char *) 0);
1582 *pfrag = 0;
1583 S_SET_SIZE (symbolP, size);
1584 S_SET_SEGMENT (symbolP, sbss_section);
1585 S_CLEAR_EXTERNAL (symbolP);
1586 subseg_set (old_sec, old_subsec);
1587 }
1588 else
1589 {
1590 S_SET_VALUE (symbolP, (valueT) size);
1591 S_SET_ALIGN (symbolP, align2);
1592 S_SET_EXTERNAL (symbolP);
1593 S_SET_SEGMENT (symbolP, &scom_section);
1594 }
1595
1596 demand_empty_rest_of_line ();
1597 }
1598
1599 /* The target specific pseudo-ops which we support. */
1600 const pseudo_typeS md_pseudo_table[] =
1601 {
1602 { "word", cons, 4 },
1603 { "fillinsn", fill_insn, 0 },
1604 { "scomm", m32r_scomm, 0 },
1605 { "debugsym", debug_sym, 0 },
1606 { "m32r", allow_m32rx, 0 },
1607 { "m32rx", allow_m32rx, 1 },
1608 { "m32r2", allow_m32rx, 2 },
1609 { "little", little, 1 },
1610 { "big", little, 0 },
1611 { NULL, NULL, 0 }
1612 };
1613
1614 /* Interface to relax_segment. */
1616
1617 /* FIXME: Build table by hand, get it working, then machine generate. */
1618
1619 const relax_typeS md_relax_table[] =
1620 {
1621 /* The fields are:
1622 1) most positive reach of this state,
1623 2) most negative reach of this state,
1624 3) how many bytes this mode will add to the size of the current frag
1625 4) which index into the table to try if we can't fit into this one. */
1626
1627 /* The first entry must be unused because an `rlx_more' value of zero ends
1628 each list. */
1629 {1, 1, 0, 0},
1630
1631 /* The displacement used by GAS is from the end of the 2 byte insn,
1632 so we subtract 2 from the following. */
1633 /* 16 bit insn, 8 bit disp -> 10 bit range.
1634 This doesn't handle a branch in the right slot at the border:
1635 the "& -4" isn't taken into account. It's not important enough to
1636 complicate things over it, so we subtract an extra 2 (or + 2 in -ve
1637 case). */
1638 {511 - 2 - 2, -512 - 2 + 2, 0, 2 },
1639 /* 32 bit insn, 24 bit disp -> 26 bit range. */
1640 {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 },
1641 /* Same thing, but with leading nop for alignment. */
1642 {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 }
1643 };
1644
1645 long
1646 m32r_relax_frag (segT segment, fragS *fragP, long stretch)
1647 {
1648 /* Address of branch insn. */
1649 long address = fragP->fr_address + fragP->fr_fix - 2;
1650 long growth = 0;
1651
1652 /* Keep 32 bit insns aligned on 32 bit boundaries. */
1653 if (fragP->fr_subtype == 2)
1654 {
1655 if ((address & 3) != 0)
1656 {
1657 fragP->fr_subtype = 3;
1658 growth = 2;
1659 }
1660 }
1661 else if (fragP->fr_subtype == 3)
1662 {
1663 if ((address & 3) == 0)
1664 {
1665 fragP->fr_subtype = 2;
1666 growth = -2;
1667 }
1668 }
1669 else
1670 {
1671 growth = relax_frag (segment, fragP, stretch);
1672
1673 /* Long jump on odd halfword boundary? */
1674 if (fragP->fr_subtype == 2 && (address & 3) != 0)
1675 {
1676 fragP->fr_subtype = 3;
1677 growth += 2;
1678 }
1679 }
1680
1681 return growth;
1682 }
1683
1684 /* Return an initial guess of the length by which a fragment must grow to
1685 hold a branch to reach its destination.
1686 Also updates fr_type/fr_subtype as necessary.
1687
1688 Called just before doing relaxation.
1689 Any symbol that is now undefined will not become defined.
1690 The guess for fr_var is ACTUALLY the growth beyond fr_fix.
1691 Whatever we do to grow fr_fix or fr_var contributes to our returned value.
1692 Although it may not be explicit in the frag, pretend fr_var starts
1693 with a 0 value. */
1694
1695 int
1696 md_estimate_size_before_relax (fragS *fragP, segT segment)
1697 {
1698 /* The only thing we have to handle here are symbols outside of the
1699 current segment. They may be undefined or in a different segment in
1700 which case linker scripts may place them anywhere.
1701 However, we can't finish the fragment here and emit the reloc as insn
1702 alignment requirements may move the insn about. */
1703 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
1704 || S_IS_EXTERNAL (fragP->fr_symbol)
1705 || S_IS_WEAK (fragP->fr_symbol))
1706 {
1707 /* The symbol is undefined in this segment.
1708 Change the relaxation subtype to the max allowable and leave
1709 all further handling to md_convert_frag. */
1710 fragP->fr_subtype = 2;
1711
1712 {
1713 const CGEN_INSN *insn;
1714 int i;
1715
1716 /* Update the recorded insn.
1717 Fortunately we don't have to look very far.
1718 FIXME: Change this to record in the instruction the next higher
1719 relaxable insn to use. */
1720 for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++)
1721 {
1722 if ((strcmp (CGEN_INSN_MNEMONIC (insn),
1723 CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn))
1724 == 0)
1725 && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED))
1726 break;
1727 }
1728 if (i == 4)
1729 abort ();
1730
1731 fragP->fr_cgen.insn = insn;
1732 return 2;
1733 }
1734 }
1735
1736 return md_relax_table[fragP->fr_subtype].rlx_length;
1737 }
1738
1739 /* *FRAGP has been relaxed to its final size, and now needs to have
1740 the bytes inside it modified to conform to the new size.
1741
1742 Called after relaxation is finished.
1743 fragP->fr_type == rs_machine_dependent.
1744 fragP->fr_subtype is the subtype of what the address relaxed to. */
1745
1746 void
1747 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1748 segT sec,
1749 fragS *fragP)
1750 {
1751 char *opcode;
1752 char *displacement;
1753 int target_address;
1754 int opcode_address;
1755 int extension;
1756 int addend;
1757
1758 opcode = fragP->fr_opcode;
1759
1760 /* Address opcode resides at in file space. */
1761 opcode_address = fragP->fr_address + fragP->fr_fix - 2;
1762
1763 switch (fragP->fr_subtype)
1764 {
1765 case 1:
1766 extension = 0;
1767 displacement = &opcode[1];
1768 break;
1769 case 2:
1770 opcode[0] |= 0x80;
1771 extension = 2;
1772 displacement = &opcode[1];
1773 break;
1774 case 3:
1775 opcode[2] = opcode[0] | 0x80;
1776 md_number_to_chars (opcode, PAR_NOP_INSN, 2);
1777 opcode_address += 2;
1778 extension = 4;
1779 displacement = &opcode[3];
1780 break;
1781 default:
1782 abort ();
1783 }
1784
1785 if (S_GET_SEGMENT (fragP->fr_symbol) != sec
1786 || S_IS_EXTERNAL (fragP->fr_symbol)
1787 || S_IS_WEAK (fragP->fr_symbol))
1788 {
1789 /* Symbol must be resolved by linker. */
1790 if (fragP->fr_offset & 3)
1791 as_warn (_("Addend to unresolved symbol not on word boundary."));
1792 #ifdef USE_M32R_OLD_RELOC
1793 addend = fragP->fr_offset >> 2; /* Old M32R used USE_REL. */
1794 #else
1795 addend = 0;
1796 #endif
1797 }
1798 else
1799 {
1800 /* Address we want to reach in file space. */
1801 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
1802 addend = (target_address - (opcode_address & -4)) >> 2;
1803 }
1804
1805 /* Create a relocation for symbols that must be resolved by the linker.
1806 Otherwise output the completed insn. */
1807
1808 if (S_GET_SEGMENT (fragP->fr_symbol) != sec
1809 || S_IS_EXTERNAL (fragP->fr_symbol)
1810 || S_IS_WEAK (fragP->fr_symbol))
1811 {
1812 fixS *fixP;
1813
1814 gas_assert (fragP->fr_subtype != 1);
1815 gas_assert (fragP->fr_cgen.insn != 0);
1816
1817 fixP = gas_cgen_record_fixup (fragP,
1818 /* Offset of branch insn in frag. */
1819 fragP->fr_fix + extension - 4,
1820 fragP->fr_cgen.insn,
1821 4 /* Length. */,
1822 /* FIXME: quick hack. */
1823 cgen_operand_lookup_by_num (gas_cgen_cpu_desc,
1824 M32R_OPERAND_DISP24),
1825 fragP->fr_cgen.opinfo,
1826 fragP->fr_symbol, fragP->fr_offset);
1827 if (fragP->fr_cgen.opinfo)
1828 fixP->fx_r_type = fragP->fr_cgen.opinfo;
1829 }
1830
1831 #define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
1832
1833 md_number_to_chars (displacement, (valueT) addend,
1834 SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
1835
1836 fragP->fr_fix += extension;
1837 }
1838
1839 /* Functions concerning relocs. */
1841
1842 /* The location from which a PC relative jump should be calculated,
1843 given a PC relative reloc. */
1844
1845 long
1846 md_pcrel_from_section (fixS *fixP, segT sec)
1847 {
1848 if (fixP->fx_addsy != (symbolS *) NULL
1849 && (! S_IS_DEFINED (fixP->fx_addsy)
1850 || S_GET_SEGMENT (fixP->fx_addsy) != sec
1851 || S_IS_EXTERNAL (fixP->fx_addsy)
1852 || S_IS_WEAK (fixP->fx_addsy)))
1853 {
1854 if (S_GET_SEGMENT (fixP->fx_addsy) != sec
1855 && S_IS_DEFINED (fixP->fx_addsy)
1856 && ! S_IS_EXTERNAL (fixP->fx_addsy)
1857 && ! S_IS_WEAK (fixP->fx_addsy))
1858 return fixP->fx_offset;
1859
1860 /* The symbol is undefined (or is defined but not in this section).
1861 Let the linker figure it out. */
1862 return 0;
1863 }
1864
1865 return (fixP->fx_frag->fr_address + fixP->fx_where) & -4L;
1866 }
1867
1868 /* Return the bfd reloc type for OPERAND of INSN at fixup FIXP.
1869 Returns BFD_RELOC_NONE if no reloc type can be found.
1870 *FIXP may be modified if desired. */
1871
1872 bfd_reloc_code_real_type
1873 md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
1874 const CGEN_OPERAND *operand,
1875 fixS *fixP)
1876 {
1877 switch (operand->type)
1878 {
1879 case M32R_OPERAND_DISP8: return BFD_RELOC_M32R_10_PCREL;
1880 case M32R_OPERAND_DISP16: return BFD_RELOC_M32R_18_PCREL;
1881 case M32R_OPERAND_DISP24: return BFD_RELOC_M32R_26_PCREL;
1882 case M32R_OPERAND_UIMM24: return BFD_RELOC_M32R_24;
1883 case M32R_OPERAND_HI16:
1884 case M32R_OPERAND_SLO16:
1885 case M32R_OPERAND_ULO16:
1886 /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1887 if (fixP->fx_cgen.opinfo != 0)
1888 return fixP->fx_cgen.opinfo;
1889 break;
1890 default:
1891 /* Avoid -Wall warning. */
1892 break;
1893 }
1894 return BFD_RELOC_NONE;
1895 }
1896
1897 /* Record a HI16 reloc for later matching with its LO16 cousin. */
1898
1899 static void
1900 m32r_record_hi16 (int reloc_type,
1901 fixS *fixP,
1902 segT seg ATTRIBUTE_UNUSED)
1903 {
1904 struct m32r_hi_fixup *hi_fixup;
1905
1906 gas_assert (reloc_type == BFD_RELOC_M32R_HI16_SLO
1907 || reloc_type == BFD_RELOC_M32R_HI16_ULO);
1908
1909 hi_fixup = XNEW (struct m32r_hi_fixup);
1910 hi_fixup->fixp = fixP;
1911 hi_fixup->seg = now_seg;
1912 hi_fixup->next = m32r_hi_fixup_list;
1913
1914 m32r_hi_fixup_list = hi_fixup;
1915 }
1916
1917 /* Called while parsing an instruction to create a fixup.
1918 We need to check for HI16 relocs and queue them up for later sorting. */
1919
1920 fixS *
1921 m32r_cgen_record_fixup_exp (fragS *frag,
1922 int where,
1923 const CGEN_INSN *insn,
1924 int length,
1925 const CGEN_OPERAND *operand,
1926 int opinfo,
1927 expressionS *exp)
1928 {
1929 fixS *fixP;
1930 bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED;
1931
1932 if (m32r_check_fixup (exp, &r_type))
1933 as_bad (_("Invalid PIC expression."));
1934
1935 fixP = gas_cgen_record_fixup_exp (frag, where, insn, length,
1936 operand, opinfo, exp);
1937
1938 switch (operand->type)
1939 {
1940 case M32R_OPERAND_HI16:
1941 /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1942 if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO
1943 || fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1944 m32r_record_hi16 (fixP->fx_cgen.opinfo, fixP, now_seg);
1945 break;
1946
1947 default:
1948 /* Avoid -Wall warning. */
1949 break;
1950 }
1951
1952 switch (r_type)
1953 {
1954 case BFD_RELOC_UNUSED:
1955 default:
1956 return fixP;
1957
1958 case BFD_RELOC_M32R_GOTPC24:
1959 if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1960 r_type = BFD_RELOC_M32R_GOTPC_HI_SLO;
1961 else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1962 r_type = BFD_RELOC_M32R_GOTPC_HI_ULO;
1963 else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1964 r_type = BFD_RELOC_M32R_GOTPC_LO;
1965 break;
1966
1967 case BFD_RELOC_M32R_GOT24:
1968 if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1969 r_type = BFD_RELOC_M32R_GOT16_HI_SLO;
1970 else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1971 r_type = BFD_RELOC_M32R_GOT16_HI_ULO;
1972 else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1973 r_type = BFD_RELOC_M32R_GOT16_LO;
1974 break;
1975
1976 case BFD_RELOC_M32R_GOTOFF:
1977 if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1978 r_type = BFD_RELOC_M32R_GOTOFF_HI_SLO;
1979 else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1980 r_type = BFD_RELOC_M32R_GOTOFF_HI_ULO;
1981 else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1982 r_type = BFD_RELOC_M32R_GOTOFF_LO;
1983 break;
1984
1985 case BFD_RELOC_M32R_26_PLTREL:
1986 as_bad (_("Invalid PIC expression."));
1987 break;
1988 }
1989
1990 fixP->fx_r_type = r_type;
1991
1992 return fixP;
1993 }
1994
1995 /* Return BFD reloc type from opinfo field in a fixS.
1996 It's tricky using fx_r_type in m32r_frob_file because the values
1997 are BFD_RELOC_UNUSED + operand number. */
1998 #define FX_OPINFO_R_TYPE(f) ((f)->fx_cgen.opinfo)
1999
2000 /* Sort any unmatched HI16 relocs so that they immediately precede
2001 the corresponding LO16 reloc. This is called before md_apply_fix and
2002 tc_gen_reloc. */
2003
2004 void
2005 m32r_frob_file (void)
2006 {
2007 struct m32r_hi_fixup *l;
2008
2009 for (l = m32r_hi_fixup_list; l != NULL; l = l->next)
2010 {
2011 segment_info_type *seginfo;
2012 int pass;
2013
2014 gas_assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO
2015 || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO);
2016
2017 /* Check quickly whether the next fixup happens to be a matching low. */
2018 if (l->fixp->fx_next != NULL
2019 && FX_OPINFO_R_TYPE (l->fixp->fx_next) == BFD_RELOC_M32R_LO16
2020 && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
2021 && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
2022 continue;
2023
2024 /* Look through the fixups for this segment for a matching `low'.
2025 When we find one, move the high/shigh just in front of it. We do
2026 this in two passes. In the first pass, we try to find a
2027 unique `low'. In the second pass, we permit multiple high's
2028 relocs for a single `low'. */
2029 seginfo = seg_info (l->seg);
2030 for (pass = 0; pass < 2; pass++)
2031 {
2032 fixS *f;
2033 fixS *prev;
2034
2035 prev = NULL;
2036 for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
2037 {
2038 /* Check whether this is a `low' fixup which matches l->fixp. */
2039 if (FX_OPINFO_R_TYPE (f) == BFD_RELOC_M32R_LO16
2040 && f->fx_addsy == l->fixp->fx_addsy
2041 && f->fx_offset == l->fixp->fx_offset
2042 && (pass == 1
2043 || prev == NULL
2044 || (FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_SLO
2045 && FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_ULO)
2046 || prev->fx_addsy != f->fx_addsy
2047 || prev->fx_offset != f->fx_offset))
2048 {
2049 fixS **pf;
2050
2051 /* Move l->fixp before f. */
2052 for (pf = &seginfo->fix_root;
2053 *pf != l->fixp;
2054 pf = & (*pf)->fx_next)
2055 gas_assert (*pf != NULL);
2056
2057 *pf = l->fixp->fx_next;
2058
2059 l->fixp->fx_next = f;
2060 if (prev == NULL)
2061 seginfo->fix_root = l->fixp;
2062 else
2063 prev->fx_next = l->fixp;
2064
2065 break;
2066 }
2067
2068 prev = f;
2069 }
2070
2071 if (f != NULL)
2072 break;
2073
2074 if (pass == 1
2075 && warn_unmatched_high)
2076 as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
2077 _("Unmatched high/shigh reloc"));
2078 }
2079 }
2080 }
2081
2082 /* See whether we need to force a relocation into the output file.
2083 This is used to force out switch and PC relative relocations when
2084 relaxing. */
2085
2086 int
2087 m32r_force_relocation (fixS *fix)
2088 {
2089 if (generic_force_reloc (fix))
2090 return 1;
2091
2092 if (! m32r_relax)
2093 return 0;
2094
2095 return fix->fx_pcrel;
2096 }
2097
2098 /* Write a value out to the object file, using the appropriate endianness. */
2100
2101 void
2102 md_number_to_chars (char *buf, valueT val, int n)
2103 {
2104 if (target_big_endian)
2105 number_to_chars_bigendian (buf, val, n);
2106 else
2107 number_to_chars_littleendian (buf, val, n);
2108 }
2109
2110 /* Turn a string in input_line_pointer into a floating point constant
2111 of type TYPE, and store the appropriate bytes in *LITP. The number
2112 of LITTLENUMS emitted is stored in *SIZEP. An error message is
2113 returned, or NULL on OK. */
2114
2115 const char *
2116 md_atof (int type, char *litP, int *sizeP)
2117 {
2118 return ieee_md_atof (type, litP, sizeP, target_big_endian);
2119 }
2120
2121 void
2122 m32r_elf_section_change_hook (void)
2123 {
2124 /* If we have reached the end of a section and we have just emitted a
2125 16 bit insn, then emit a nop to make sure that the section ends on
2126 a 32 bit boundary. */
2127
2128 if (prev_insn.insn || seen_relaxable_p)
2129 (void) m32r_fill_insn (0);
2130 }
2131
2132 /* Return true if can adjust the reloc to be relative to its section
2133 (such as .data) instead of relative to some symbol. */
2134
2135 bool
2136 m32r_fix_adjustable (fixS *fixP)
2137 {
2138 bfd_reloc_code_real_type reloc_type;
2139
2140 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
2141 {
2142 const CGEN_INSN *insn = NULL;
2143 int opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
2144 const CGEN_OPERAND *operand =
2145 cgen_operand_lookup_by_num(gas_cgen_cpu_desc, opindex);
2146
2147 reloc_type = md_cgen_lookup_reloc (insn, operand, fixP);
2148 }
2149 else
2150 reloc_type = fixP->fx_r_type;
2151
2152 if (fixP->fx_addsy == NULL)
2153 return 1;
2154
2155 /* Prevent all adjustments to global symbols. */
2156 if (S_IS_EXTERNAL (fixP->fx_addsy))
2157 return 0;
2158 if (S_IS_WEAK (fixP->fx_addsy))
2159 return 0;
2160
2161 if (pic_code
2162 && (reloc_type == BFD_RELOC_M32R_24
2163 || reloc_type == BFD_RELOC_M32R_26_PCREL
2164 || reloc_type == BFD_RELOC_M32R_HI16_SLO
2165 || reloc_type == BFD_RELOC_M32R_HI16_ULO
2166 || reloc_type == BFD_RELOC_M32R_LO16))
2167 return 0;
2168
2169 if (reloc_type == BFD_RELOC_M32R_GOT24
2170 || reloc_type == BFD_RELOC_M32R_26_PLTREL
2171 || reloc_type == BFD_RELOC_M32R_GOTPC_HI_SLO
2172 || reloc_type == BFD_RELOC_M32R_GOTPC_HI_ULO
2173 || reloc_type == BFD_RELOC_M32R_GOTPC_LO
2174 || reloc_type == BFD_RELOC_M32R_GOT16_HI_SLO
2175 || reloc_type == BFD_RELOC_M32R_GOT16_HI_ULO
2176 || reloc_type == BFD_RELOC_M32R_GOT16_LO)
2177 return 0;
2178
2179 /* We need the symbol name for the VTABLE entries. */
2180 if (reloc_type == BFD_RELOC_VTABLE_INHERIT
2181 || reloc_type == BFD_RELOC_VTABLE_ENTRY)
2182 return 0;
2183
2184 return 1;
2185 }
2186
2187 void
2188 m32r_elf_final_processing (void)
2189 {
2190 if (use_parallel)
2191 m32r_flags |= E_M32R_HAS_PARALLEL;
2192 elf_elfheader (stdoutput)->e_flags |= m32r_flags;
2193 }
2194
2195 /* Translate internal representation of relocation info to BFD target
2196 format. */
2197
2198 arelent *
2199 tc_gen_reloc (asection * section, fixS * fixP)
2200 {
2201 arelent * reloc;
2202 bfd_reloc_code_real_type code;
2203
2204 reloc = XNEW (arelent);
2205
2206 reloc->sym_ptr_ptr = XNEW (asymbol *);
2207 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
2208 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
2209
2210 if (fixP->fx_pcrel)
2211 {
2212 if (fixP->fx_r_type == BFD_RELOC_32)
2213 fixP->fx_r_type = BFD_RELOC_32_PCREL;
2214 else if (fixP->fx_r_type == BFD_RELOC_16)
2215 {
2216 fixP->fx_r_type = BFD_RELOC_16_PCREL;
2217 bfd_set_error (bfd_error_bad_value);
2218 }
2219 }
2220
2221 code = fixP->fx_r_type;
2222 if (pic_code)
2223 {
2224 #ifdef DEBUG_PIC
2225 printf("%s",bfd_get_reloc_code_name(code));
2226 #endif
2227 switch (code)
2228 {
2229 case BFD_RELOC_M32R_26_PCREL:
2230 code = BFD_RELOC_M32R_26_PLTREL;
2231 break;
2232
2233 case BFD_RELOC_M32R_24:
2234 if (fixP->fx_addsy != NULL
2235 && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2236 code = BFD_RELOC_M32R_GOTPC24;
2237 else
2238 code = BFD_RELOC_M32R_GOT24;
2239 break;
2240
2241 case BFD_RELOC_M32R_HI16_ULO:
2242 if (fixP->fx_addsy != NULL
2243 && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2244 code = BFD_RELOC_M32R_GOTPC_HI_ULO;
2245 else
2246 code = BFD_RELOC_M32R_GOT16_HI_ULO;
2247 break;
2248
2249 case BFD_RELOC_M32R_HI16_SLO:
2250 if (fixP->fx_addsy != NULL
2251 && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2252 code = BFD_RELOC_M32R_GOTPC_HI_SLO;
2253 else
2254 code = BFD_RELOC_M32R_GOT16_HI_SLO;
2255 break;
2256
2257 case BFD_RELOC_M32R_LO16:
2258 if (fixP->fx_addsy != NULL
2259 && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2260 code = BFD_RELOC_M32R_GOTPC_LO;
2261 else
2262 code = BFD_RELOC_M32R_GOT16_LO;
2263 break;
2264
2265 default:
2266 break;
2267 }
2268 #ifdef DEBUG_PIC
2269 printf(" => %s",bfd_get_reloc_code_name(code));
2270 #endif
2271 }
2272
2273 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2274
2275 #ifdef DEBUG_PIC
2276 printf(" => %s\n",reloc->howto->name);
2277 #endif
2278
2279 if (reloc->howto == (reloc_howto_type *) NULL)
2280 {
2281 as_bad_where (fixP->fx_file, fixP->fx_line,
2282 _("internal error: can't export reloc type %d (`%s')"),
2283 fixP->fx_r_type, bfd_get_reloc_code_name (code));
2284 return NULL;
2285 }
2286
2287 /* Use fx_offset for these cases. */
2288 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
2289 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2290 || fixP->fx_r_type == BFD_RELOC_32_PCREL)
2291 reloc->addend = fixP->fx_offset;
2292 else if ((!pic_code
2293 && code != BFD_RELOC_M32R_26_PLTREL)
2294 && fixP->fx_pcrel
2295 && fixP->fx_addsy != NULL
2296 && (S_GET_SEGMENT(fixP->fx_addsy) != section)
2297 && S_IS_DEFINED (fixP->fx_addsy)
2298 && ! S_IS_EXTERNAL(fixP->fx_addsy)
2299 && ! S_IS_WEAK(fixP->fx_addsy))
2300 /* Already used fx_offset in the opcode field itself. */
2301 reloc->addend = fixP->fx_offset;
2302 else
2303 reloc->addend = fixP->fx_addnumber;
2304
2305 return reloc;
2306 }
2307
2308 inline static char *
2309 m32r_end_of_match (char *cont, const char *what)
2310 {
2311 int len = strlen (what);
2312
2313 if (strncasecmp (cont, what, strlen (what)) == 0
2314 && ! is_part_of_name (cont[len]))
2315 return cont + len;
2316
2317 return NULL;
2318 }
2319
2320 int
2321 m32r_parse_name (char const *name,
2322 expressionS *exprP,
2323 enum expr_mode mode,
2324 char *nextcharP)
2325 {
2326 char *next = input_line_pointer;
2327 char *next_end;
2328 int reloc_type;
2329 operatorT op_type;
2330 segT segment;
2331
2332 exprP->X_op_symbol = NULL;
2333 exprP->X_md = BFD_RELOC_UNUSED;
2334
2335 if (strcmp (name, GOT_NAME) == 0)
2336 {
2337 if (! GOT_symbol)
2338 GOT_symbol = symbol_find_or_make (name);
2339
2340 exprP->X_add_symbol = GOT_symbol;
2341 no_suffix:
2342 /* If we have an absolute symbol or a
2343 reg, then we know its value now. */
2344 segment = S_GET_SEGMENT (exprP->X_add_symbol);
2345 if (mode != expr_defer && segment == absolute_section)
2346 {
2347 exprP->X_op = O_constant;
2348 exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2349 exprP->X_add_symbol = NULL;
2350 }
2351 else if (mode != expr_defer && segment == reg_section)
2352 {
2353 exprP->X_op = O_register;
2354 exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2355 exprP->X_add_symbol = NULL;
2356 }
2357 else
2358 {
2359 exprP->X_op = O_symbol;
2360 exprP->X_add_number = 0;
2361 }
2362
2363 return 1;
2364 }
2365
2366 exprP->X_add_symbol = symbol_find_or_make (name);
2367
2368 if (*nextcharP != '@')
2369 goto no_suffix;
2370 else if ((next_end = m32r_end_of_match (next + 1, "GOTOFF")))
2371 {
2372 reloc_type = BFD_RELOC_M32R_GOTOFF;
2373 op_type = O_PIC_reloc;
2374 }
2375 else if ((next_end = m32r_end_of_match (next + 1, "GOT")))
2376 {
2377 reloc_type = BFD_RELOC_M32R_GOT24;
2378 op_type = O_PIC_reloc;
2379 }
2380 else if ((next_end = m32r_end_of_match (next + 1, "PLT")))
2381 {
2382 reloc_type = BFD_RELOC_M32R_26_PLTREL;
2383 op_type = O_PIC_reloc;
2384 }
2385 else
2386 goto no_suffix;
2387
2388 *input_line_pointer = *nextcharP;
2389 input_line_pointer = next_end;
2390 *nextcharP = *input_line_pointer;
2391 *input_line_pointer = '\0';
2392
2393 exprP->X_op = op_type;
2394 exprP->X_add_number = 0;
2395 exprP->X_md = reloc_type;
2396
2397 return 1;
2398 }
2399
2400 int
2401 m32r_cgen_parse_fix_exp(int opinfo, expressionS *exp)
2402 {
2403 if (exp->X_op == O_PIC_reloc
2404 && exp->X_md == BFD_RELOC_M32R_26_PLTREL)
2405 {
2406 exp->X_op = O_symbol;
2407 opinfo = exp->X_md;
2408 }
2409
2410 return opinfo;
2411 }
2412