* config/tc-sh.c (parse_reg): Fix end-of-word check for is, ix, iy
[deliverable/binutils-gdb.git] / gas / config / tc-sh.c
1 /* tc-sh.c -- Assemble code for the Hitachi Super-H
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 /* Written By Steve Chamberlain <sac@cygnus.com> */
23
24 #include <stdio.h>
25 #include "as.h"
26 #include "bfd.h"
27 #include "subsegs.h"
28 #define DEFINE_TABLE
29 #include "opcodes/sh-opc.h"
30 #include "safe-ctype.h"
31 #include "struc-symbol.h"
32
33 #ifdef OBJ_ELF
34 #include "elf/sh.h"
35 #endif
36
37 #include "dwarf2dbg.h"
38
39 typedef struct
40 {
41 sh_arg_type type;
42 int reg;
43 expressionS immediate;
44 }
45 sh_operand_info;
46
47 const char comment_chars[] = "!";
48 const char line_separator_chars[] = ";";
49 const char line_comment_chars[] = "!#";
50
51 static void s_uses PARAMS ((int));
52
53 static void sh_count_relocs PARAMS ((bfd *, segT, PTR));
54 static void sh_frob_section PARAMS ((bfd *, segT, PTR));
55
56 static void s_uacons PARAMS ((int));
57 static sh_opcode_info *find_cooked_opcode PARAMS ((char **));
58 static unsigned int assemble_ppi PARAMS ((char *, sh_opcode_info *));
59 static void little PARAMS ((int));
60 static void big PARAMS ((int));
61 static int parse_reg PARAMS ((char *, int *, int *));
62 static symbolS *dot PARAMS ((void));
63 static char *parse_exp PARAMS ((char *, sh_operand_info *));
64 static char *parse_at PARAMS ((char *, sh_operand_info *));
65 static void get_operand PARAMS ((char **, sh_operand_info *));
66 static char *get_operands
67 PARAMS ((sh_opcode_info *, char *, sh_operand_info *));
68 static sh_opcode_info *get_specific
69 PARAMS ((sh_opcode_info *, sh_operand_info *));
70 static void insert PARAMS ((char *, int, int, sh_operand_info *));
71 static void build_relax PARAMS ((sh_opcode_info *, sh_operand_info *));
72 static char *insert_loop_bounds PARAMS ((char *, sh_operand_info *));
73 static unsigned int build_Mytes
74 PARAMS ((sh_opcode_info *, sh_operand_info *));
75
76 #ifdef OBJ_ELF
77 static void sh_elf_cons PARAMS ((int));
78
79 inline static int sh_PIC_related_p PARAMS ((symbolS *));
80 static int sh_check_fixup PARAMS ((expressionS *, bfd_reloc_code_real_type *));
81 inline static char *sh_end_of_match PARAMS ((char *, char *));
82
83 symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
84 #endif
85
86 static void
87 big (ignore)
88 int ignore ATTRIBUTE_UNUSED;
89 {
90 if (! target_big_endian)
91 as_bad (_("directive .big encountered when option -big required"));
92
93 /* Stop further messages. */
94 target_big_endian = 1;
95 }
96
97 static void
98 little (ignore)
99 int ignore ATTRIBUTE_UNUSED;
100 {
101 if (target_big_endian)
102 as_bad (_("directive .little encountered when option -little required"));
103
104 /* Stop further messages. */
105 target_big_endian = 0;
106 }
107
108 /* This table describes all the machine specific pseudo-ops the assembler
109 has to support. The fields are:
110 pseudo-op name without dot
111 function to call to execute this pseudo-op
112 Integer arg to pass to the function. */
113
114 const pseudo_typeS md_pseudo_table[] =
115 {
116 #ifdef OBJ_ELF
117 {"long", sh_elf_cons, 4},
118 {"int", sh_elf_cons, 4},
119 {"word", sh_elf_cons, 2},
120 {"short", sh_elf_cons, 2},
121 #else
122 {"int", cons, 4},
123 {"word", cons, 2},
124 #endif /* OBJ_ELF */
125 {"big", big, 0},
126 {"form", listing_psize, 0},
127 {"little", little, 0},
128 {"heading", listing_title, 0},
129 {"import", s_ignore, 0},
130 {"page", listing_eject, 0},
131 {"program", s_ignore, 0},
132 {"uses", s_uses, 0},
133 {"uaword", s_uacons, 2},
134 {"ualong", s_uacons, 4},
135 {"uaquad", s_uacons, 8},
136 {"2byte", s_uacons, 2},
137 {"4byte", s_uacons, 4},
138 {"8byte", s_uacons, 8},
139 #ifdef BFD_ASSEMBLER
140 {"file", dwarf2_directive_file, 0 },
141 {"loc", dwarf2_directive_loc, 0 },
142 #endif
143 {0, 0, 0}
144 };
145
146 /*int md_reloc_size; */
147
148 int sh_relax; /* set if -relax seen */
149
150 /* Whether -small was seen. */
151
152 int sh_small;
153
154 /* Whether -dsp was seen. */
155
156 static int sh_dsp;
157
158 /* The bit mask of architectures that could
159 accomodate the insns seen so far. */
160 static int valid_arch;
161
162 const char EXP_CHARS[] = "eE";
163
164 /* Chars that mean this number is a floating point constant. */
165 /* As in 0f12.456 */
166 /* or 0d1.2345e12 */
167 const char FLT_CHARS[] = "rRsSfFdDxXpP";
168
169 #define C(a,b) ENCODE_RELAX(a,b)
170
171 #define ENCODE_RELAX(what,length) (((what) << 4) + (length))
172 #define GET_WHAT(x) ((x>>4))
173
174 /* These are the three types of relaxable instrction. */
175 #define COND_JUMP 1
176 #define COND_JUMP_DELAY 2
177 #define UNCOND_JUMP 3
178 #define END 4
179
180 #define UNDEF_DISP 0
181 #define COND8 1
182 #define COND12 2
183 #define COND32 3
184 #define UNDEF_WORD_DISP 4
185
186 #define UNCOND12 1
187 #define UNCOND32 2
188
189 /* Branch displacements are from the address of the branch plus
190 four, thus all minimum and maximum values have 4 added to them. */
191 #define COND8_F 258
192 #define COND8_M -252
193 #define COND8_LENGTH 2
194
195 /* There is one extra instruction before the branch, so we must add
196 two more bytes to account for it. */
197 #define COND12_F 4100
198 #define COND12_M -4090
199 #define COND12_LENGTH 6
200
201 #define COND12_DELAY_LENGTH 4
202
203 /* ??? The minimum and maximum values are wrong, but this does not matter
204 since this relocation type is not supported yet. */
205 #define COND32_F (1<<30)
206 #define COND32_M -(1<<30)
207 #define COND32_LENGTH 14
208
209 #define UNCOND12_F 4098
210 #define UNCOND12_M -4092
211 #define UNCOND12_LENGTH 2
212
213 /* ??? The minimum and maximum values are wrong, but this does not matter
214 since this relocation type is not supported yet. */
215 #define UNCOND32_F (1<<30)
216 #define UNCOND32_M -(1<<30)
217 #define UNCOND32_LENGTH 14
218
219 #define EMPTY { 0, 0, 0, 0 }
220
221 const relax_typeS md_relax_table[C (END, 0)] = {
222 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
223 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
224
225 EMPTY,
226 /* C (COND_JUMP, COND8) */
227 { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP, COND12) },
228 /* C (COND_JUMP, COND12) */
229 { COND12_F, COND12_M, COND12_LENGTH, C (COND_JUMP, COND32), },
230 /* C (COND_JUMP, COND32) */
231 { COND32_F, COND32_M, COND32_LENGTH, 0, },
232 /* C (COND_JUMP, UNDEF_WORD_DISP) */
233 { 0, 0, COND32_LENGTH, 0, },
234 EMPTY, EMPTY, EMPTY,
235 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
236
237 EMPTY,
238 /* C (COND_JUMP_DELAY, COND8) */
239 { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP_DELAY, COND12) },
240 /* C (COND_JUMP_DELAY, COND12) */
241 { COND12_F, COND12_M, COND12_DELAY_LENGTH, C (COND_JUMP_DELAY, COND32), },
242 /* C (COND_JUMP_DELAY, COND32) */
243 { COND32_F, COND32_M, COND32_LENGTH, 0, },
244 /* C (COND_JUMP_DELAY, UNDEF_WORD_DISP) */
245 { 0, 0, COND32_LENGTH, 0, },
246 EMPTY, EMPTY, EMPTY,
247 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
248
249 EMPTY,
250 /* C (UNCOND_JUMP, UNCOND12) */
251 { UNCOND12_F, UNCOND12_M, UNCOND12_LENGTH, C (UNCOND_JUMP, UNCOND32), },
252 /* C (UNCOND_JUMP, UNCOND32) */
253 { UNCOND32_F, UNCOND32_M, UNCOND32_LENGTH, 0, },
254 EMPTY,
255 /* C (UNCOND_JUMP, UNDEF_WORD_DISP) */
256 { 0, 0, UNCOND32_LENGTH, 0, },
257 EMPTY, EMPTY, EMPTY,
258 EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
259 };
260
261 #undef EMPTY
262
263 static struct hash_control *opcode_hash_control; /* Opcode mnemonics */
264
265 \f
266 #ifdef OBJ_ELF
267 /* Determinet whether the symbol needs any kind of PIC relocation. */
268
269 inline static int
270 sh_PIC_related_p (sym)
271 symbolS *sym;
272 {
273 expressionS *exp;
274
275 if (! sym)
276 return 0;
277
278 if (sym == GOT_symbol)
279 return 1;
280
281 exp = symbol_get_value_expression (sym);
282
283 return (exp->X_op == O_PIC_reloc
284 || sh_PIC_related_p (exp->X_add_symbol)
285 || sh_PIC_related_p (exp->X_op_symbol));
286 }
287
288 /* Determine the relocation type to be used to represent the
289 expression, that may be rearranged. */
290
291 static int
292 sh_check_fixup (main_exp, r_type_p)
293 expressionS *main_exp;
294 bfd_reloc_code_real_type *r_type_p;
295 {
296 expressionS *exp = main_exp;
297
298 /* This is here for backward-compatibility only. GCC used to generated:
299
300 f@PLT + . - (.LPCS# + 2)
301
302 but we'd rather be able to handle this as a PIC-related reference
303 plus/minus a symbol. However, gas' parser gives us:
304
305 O_subtract (O_add (f@PLT, .), .LPCS#+2)
306
307 so we attempt to transform this into:
308
309 O_subtract (f@PLT, O_subtract (.LPCS#+2, .))
310
311 which we can handle simply below. */
312 if (exp->X_op == O_subtract)
313 {
314 if (sh_PIC_related_p (exp->X_op_symbol))
315 return 1;
316
317 exp = symbol_get_value_expression (exp->X_add_symbol);
318
319 if (exp && sh_PIC_related_p (exp->X_op_symbol))
320 return 1;
321
322 if (exp && exp->X_op == O_add
323 && sh_PIC_related_p (exp->X_add_symbol))
324 {
325 symbolS *sym = exp->X_add_symbol;
326
327 exp->X_op = O_subtract;
328 exp->X_add_symbol = main_exp->X_op_symbol;
329
330 main_exp->X_op_symbol = main_exp->X_add_symbol;
331 main_exp->X_add_symbol = sym;
332
333 main_exp->X_add_number += exp->X_add_number;
334 exp->X_add_number = 0;
335 }
336
337 exp = main_exp;
338 }
339 else if (exp->X_op == O_add && sh_PIC_related_p (exp->X_op_symbol))
340 return 1;
341
342 if (exp->X_op == O_symbol || exp->X_op == O_add || exp->X_op == O_subtract)
343 {
344 if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
345 {
346 *r_type_p = BFD_RELOC_SH_GOTPC;
347 return 0;
348 }
349 exp = symbol_get_value_expression (exp->X_add_symbol);
350 if (! exp)
351 return 0;
352 }
353
354 if (exp->X_op == O_PIC_reloc)
355 {
356 *r_type_p = exp->X_md;
357 if (exp == main_exp)
358 exp->X_op = O_symbol;
359 else
360 {
361 main_exp->X_add_symbol = exp->X_add_symbol;
362 main_exp->X_add_number += exp->X_add_number;
363 }
364 }
365 else
366 return (sh_PIC_related_p (exp->X_add_symbol)
367 || sh_PIC_related_p (exp->X_op_symbol));
368
369 return 0;
370 }
371
372 /* Add expression EXP of SIZE bytes to offset OFF of fragment FRAG. */
373
374 void
375 sh_cons_fix_new (frag, off, size, exp)
376 fragS *frag;
377 int off, size;
378 expressionS *exp;
379 {
380 bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED;
381
382 if (sh_check_fixup (exp, &r_type))
383 as_bad (_("Invalid PIC expression."));
384
385 if (r_type == BFD_RELOC_UNUSED)
386 switch (size)
387 {
388 case 1:
389 r_type = BFD_RELOC_8;
390 break;
391
392 case 2:
393 r_type = BFD_RELOC_16;
394 break;
395
396 case 4:
397 r_type = BFD_RELOC_32;
398 break;
399
400 default:
401 goto error;
402 }
403 else if (size != 4)
404 {
405 error:
406 as_bad (_("unsupported BFD relocation size %u"), size);
407 r_type = BFD_RELOC_UNUSED;
408 }
409
410 fix_new_exp (frag, off, size, exp, 0, r_type);
411 }
412
413 /* The regular cons() function, that reads constants, doesn't support
414 suffixes such as @GOT, @GOTOFF and @PLT, that generate
415 machine-specific relocation types. So we must define it here. */
416 /* Clobbers input_line_pointer, checks end-of-line. */
417 static void
418 sh_elf_cons (nbytes)
419 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
420 {
421 expressionS exp;
422
423 if (is_it_end_of_statement ())
424 {
425 demand_empty_rest_of_line ();
426 return;
427 }
428
429 do
430 {
431 expression (&exp);
432 emit_expr (&exp, (unsigned int) nbytes);
433 }
434 while (*input_line_pointer++ == ',');
435
436 input_line_pointer--; /* Put terminator back into stream. */
437 if (*input_line_pointer == '#' || *input_line_pointer == '!')
438 {
439 while (! is_end_of_line[(unsigned char) *input_line_pointer++]);
440 }
441 else
442 demand_empty_rest_of_line ();
443 }
444 #endif /* OBJ_ELF */
445
446 \f
447 /* This function is called once, at assembler startup time. This should
448 set up all the tables, etc that the MD part of the assembler needs. */
449
450 void
451 md_begin ()
452 {
453 sh_opcode_info *opcode;
454 char *prev_name = "";
455 int target_arch;
456
457 target_arch = arch_sh1_up & ~(sh_dsp ? arch_sh3e_up : arch_sh_dsp_up);
458 valid_arch = target_arch;
459
460 opcode_hash_control = hash_new ();
461
462 /* Insert unique names into hash table. */
463 for (opcode = sh_table; opcode->name; opcode++)
464 {
465 if (strcmp (prev_name, opcode->name))
466 {
467 if (! (opcode->arch & target_arch))
468 continue;
469 prev_name = opcode->name;
470 hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
471 }
472 else
473 {
474 /* Make all the opcodes with the same name point to the same
475 string. */
476 opcode->name = prev_name;
477 }
478 }
479 }
480
481 static int reg_m;
482 static int reg_n;
483 static int reg_x, reg_y;
484 static int reg_efg;
485 static int reg_b;
486
487 #define IDENT_CHAR(c) (ISALNUM (c) || (c) == '_')
488
489 /* Try to parse a reg name. Return the number of chars consumed. */
490
491 static int
492 parse_reg (src, mode, reg)
493 char *src;
494 int *mode;
495 int *reg;
496 {
497 char l0 = TOLOWER (src[0]);
498 char l1 = l0 ? TOLOWER (src[1]) : 0;
499
500 /* We use ! IDENT_CHAR for the next character after the register name, to
501 make sure that we won't accidentally recognize a symbol name such as
502 'sram' or sr_ram as being a reference to the register 'sr'. */
503
504 if (l0 == 'r')
505 {
506 if (l1 == '1')
507 {
508 if (src[2] >= '0' && src[2] <= '5'
509 && ! IDENT_CHAR ((unsigned char) src[3]))
510 {
511 *mode = A_REG_N;
512 *reg = 10 + src[2] - '0';
513 return 3;
514 }
515 }
516 if (l1 >= '0' && l1 <= '9'
517 && ! IDENT_CHAR ((unsigned char) src[2]))
518 {
519 *mode = A_REG_N;
520 *reg = (l1 - '0');
521 return 2;
522 }
523 if (l1 >= '0' && l1 <= '7' && strncasecmp (&src[2], "_bank", 5) == 0
524 && ! IDENT_CHAR ((unsigned char) src[7]))
525 {
526 *mode = A_REG_B;
527 *reg = (l1 - '0');
528 return 7;
529 }
530
531 if (l1 == 'e' && ! IDENT_CHAR ((unsigned char) src[2]))
532 {
533 *mode = A_RE;
534 return 2;
535 }
536 if (l1 == 's' && ! IDENT_CHAR ((unsigned char) src[2]))
537 {
538 *mode = A_RS;
539 return 2;
540 }
541 }
542
543 if (l0 == 'a')
544 {
545 if (l1 == '0')
546 {
547 if (! IDENT_CHAR ((unsigned char) src[2]))
548 {
549 *mode = DSP_REG_N;
550 *reg = A_A0_NUM;
551 return 2;
552 }
553 if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR ((unsigned char) src[3]))
554 {
555 *mode = DSP_REG_N;
556 *reg = A_A0G_NUM;
557 return 3;
558 }
559 }
560 if (l1 == '1')
561 {
562 if (! IDENT_CHAR ((unsigned char) src[2]))
563 {
564 *mode = DSP_REG_N;
565 *reg = A_A1_NUM;
566 return 2;
567 }
568 if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR ((unsigned char) src[3]))
569 {
570 *mode = DSP_REG_N;
571 *reg = A_A1G_NUM;
572 return 3;
573 }
574 }
575
576 if (l1 == 'x' && src[2] >= '0' && src[2] <= '1'
577 && ! IDENT_CHAR ((unsigned char) src[3]))
578 {
579 *mode = A_REG_N;
580 *reg = 4 + (l1 - '0');
581 return 3;
582 }
583 if (l1 == 'y' && src[2] >= '0' && src[2] <= '1'
584 && ! IDENT_CHAR ((unsigned char) src[3]))
585 {
586 *mode = A_REG_N;
587 *reg = 6 + (l1 - '0');
588 return 3;
589 }
590 if (l1 == 's' && src[2] >= '0' && src[2] <= '3'
591 && ! IDENT_CHAR ((unsigned char) src[3]))
592 {
593 int n = l1 - '0';
594
595 *mode = A_REG_N;
596 *reg = n | ((~n & 2) << 1);
597 return 3;
598 }
599 }
600
601 if (l0 == 'i' && l1 && ! IDENT_CHAR ((unsigned char) src[2]))
602 {
603 if (l1 == 's')
604 {
605 *mode = A_REG_N;
606 *reg = 8;
607 return 2;
608 }
609 if (l1 == 'x')
610 {
611 *mode = A_REG_N;
612 *reg = 8;
613 return 2;
614 }
615 if (l1 == 'y')
616 {
617 *mode = A_REG_N;
618 *reg = 9;
619 return 2;
620 }
621 }
622
623 if (l0 == 'x' && l1 >= '0' && l1 <= '1'
624 && ! IDENT_CHAR ((unsigned char) src[2]))
625 {
626 *mode = DSP_REG_N;
627 *reg = A_X0_NUM + l1 - '0';
628 return 2;
629 }
630
631 if (l0 == 'y' && l1 >= '0' && l1 <= '1'
632 && ! IDENT_CHAR ((unsigned char) src[2]))
633 {
634 *mode = DSP_REG_N;
635 *reg = A_Y0_NUM + l1 - '0';
636 return 2;
637 }
638
639 if (l0 == 'm' && l1 >= '0' && l1 <= '1'
640 && ! IDENT_CHAR ((unsigned char) src[2]))
641 {
642 *mode = DSP_REG_N;
643 *reg = l1 == '0' ? A_M0_NUM : A_M1_NUM;
644 return 2;
645 }
646
647 if (l0 == 's'
648 && l1 == 's'
649 && TOLOWER (src[2]) == 'r' && ! IDENT_CHAR ((unsigned char) src[3]))
650 {
651 *mode = A_SSR;
652 return 3;
653 }
654
655 if (l0 == 's' && l1 == 'p' && TOLOWER (src[2]) == 'c'
656 && ! IDENT_CHAR ((unsigned char) src[3]))
657 {
658 *mode = A_SPC;
659 return 3;
660 }
661
662 if (l0 == 's' && l1 == 'g' && TOLOWER (src[2]) == 'r'
663 && ! IDENT_CHAR ((unsigned char) src[3]))
664 {
665 *mode = A_SGR;
666 return 3;
667 }
668
669 if (l0 == 'd' && l1 == 's' && TOLOWER (src[2]) == 'r'
670 && ! IDENT_CHAR ((unsigned char) src[3]))
671 {
672 *mode = A_DSR;
673 return 3;
674 }
675
676 if (l0 == 'd' && l1 == 'b' && TOLOWER (src[2]) == 'r'
677 && ! IDENT_CHAR ((unsigned char) src[3]))
678 {
679 *mode = A_DBR;
680 return 3;
681 }
682
683 if (l0 == 's' && l1 == 'r' && ! IDENT_CHAR ((unsigned char) src[2]))
684 {
685 *mode = A_SR;
686 return 2;
687 }
688
689 if (l0 == 's' && l1 == 'p' && ! IDENT_CHAR ((unsigned char) src[2]))
690 {
691 *mode = A_REG_N;
692 *reg = 15;
693 return 2;
694 }
695
696 if (l0 == 'p' && l1 == 'r' && ! IDENT_CHAR ((unsigned char) src[2]))
697 {
698 *mode = A_PR;
699 return 2;
700 }
701 if (l0 == 'p' && l1 == 'c' && ! IDENT_CHAR ((unsigned char) src[2]))
702 {
703 /* Don't use A_DISP_PC here - that would accept stuff like 'mova pc,r0'
704 and use an uninitialized immediate. */
705 *mode = A_PC;
706 return 2;
707 }
708 if (l0 == 'g' && l1 == 'b' && TOLOWER (src[2]) == 'r'
709 && ! IDENT_CHAR ((unsigned char) src[3]))
710 {
711 *mode = A_GBR;
712 return 3;
713 }
714 if (l0 == 'v' && l1 == 'b' && TOLOWER (src[2]) == 'r'
715 && ! IDENT_CHAR ((unsigned char) src[3]))
716 {
717 *mode = A_VBR;
718 return 3;
719 }
720
721 if (l0 == 'm' && l1 == 'a' && TOLOWER (src[2]) == 'c'
722 && ! IDENT_CHAR ((unsigned char) src[4]))
723 {
724 if (TOLOWER (src[3]) == 'l')
725 {
726 *mode = A_MACL;
727 return 4;
728 }
729 if (TOLOWER (src[3]) == 'h')
730 {
731 *mode = A_MACH;
732 return 4;
733 }
734 }
735 if (l0 == 'm' && l1 == 'o' && TOLOWER (src[2]) == 'd'
736 && ! IDENT_CHAR ((unsigned char) src[3]))
737 {
738 *mode = A_MOD;
739 return 3;
740 }
741 if (l0 == 'f' && l1 == 'r')
742 {
743 if (src[2] == '1')
744 {
745 if (src[3] >= '0' && src[3] <= '5'
746 && ! IDENT_CHAR ((unsigned char) src[4]))
747 {
748 *mode = F_REG_N;
749 *reg = 10 + src[3] - '0';
750 return 4;
751 }
752 }
753 if (src[2] >= '0' && src[2] <= '9'
754 && ! IDENT_CHAR ((unsigned char) src[3]))
755 {
756 *mode = F_REG_N;
757 *reg = (src[2] - '0');
758 return 3;
759 }
760 }
761 if (l0 == 'd' && l1 == 'r')
762 {
763 if (src[2] == '1')
764 {
765 if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
766 && ! IDENT_CHAR ((unsigned char) src[4]))
767 {
768 *mode = D_REG_N;
769 *reg = 10 + src[3] - '0';
770 return 4;
771 }
772 }
773 if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
774 && ! IDENT_CHAR ((unsigned char) src[3]))
775 {
776 *mode = D_REG_N;
777 *reg = (src[2] - '0');
778 return 3;
779 }
780 }
781 if (l0 == 'x' && l1 == 'd')
782 {
783 if (src[2] == '1')
784 {
785 if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
786 && ! IDENT_CHAR ((unsigned char) src[4]))
787 {
788 *mode = X_REG_N;
789 *reg = 11 + src[3] - '0';
790 return 4;
791 }
792 }
793 if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
794 && ! IDENT_CHAR ((unsigned char) src[3]))
795 {
796 *mode = X_REG_N;
797 *reg = (src[2] - '0') + 1;
798 return 3;
799 }
800 }
801 if (l0 == 'f' && l1 == 'v')
802 {
803 if (src[2] == '1'&& src[3] == '2' && ! IDENT_CHAR ((unsigned char) src[4]))
804 {
805 *mode = V_REG_N;
806 *reg = 12;
807 return 4;
808 }
809 if ((src[2] == '0' || src[2] == '4' || src[2] == '8')
810 && ! IDENT_CHAR ((unsigned char) src[3]))
811 {
812 *mode = V_REG_N;
813 *reg = (src[2] - '0');
814 return 3;
815 }
816 }
817 if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 'u'
818 && TOLOWER (src[3]) == 'l'
819 && ! IDENT_CHAR ((unsigned char) src[4]))
820 {
821 *mode = FPUL_N;
822 return 4;
823 }
824
825 if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 's'
826 && TOLOWER (src[3]) == 'c'
827 && TOLOWER (src[4]) == 'r' && ! IDENT_CHAR ((unsigned char) src[5]))
828 {
829 *mode = FPSCR_N;
830 return 5;
831 }
832
833 if (l0 == 'x' && l1 == 'm' && TOLOWER (src[2]) == 't'
834 && TOLOWER (src[3]) == 'r'
835 && TOLOWER (src[4]) == 'x' && ! IDENT_CHAR ((unsigned char) src[5]))
836 {
837 *mode = XMTRX_M4;
838 return 5;
839 }
840
841 return 0;
842 }
843
844 static symbolS *
845 dot ()
846 {
847 const char *fake;
848
849 /* JF: '.' is pseudo symbol with value of current location
850 in current segment. */
851 fake = FAKE_LABEL_NAME;
852 return symbol_new (fake,
853 now_seg,
854 (valueT) frag_now_fix (),
855 frag_now);
856 }
857
858 static char *
859 parse_exp (s, op)
860 char *s;
861 sh_operand_info *op;
862 {
863 char *save;
864 char *new;
865
866 save = input_line_pointer;
867 input_line_pointer = s;
868 expression (&op->immediate);
869 if (op->immediate.X_op == O_absent)
870 as_bad (_("missing operand"));
871 #ifdef OBJ_ELF
872 else if (op->immediate.X_op == O_PIC_reloc
873 || sh_PIC_related_p (op->immediate.X_add_symbol)
874 || sh_PIC_related_p (op->immediate.X_op_symbol))
875 as_bad (_("misplaced PIC operand"));
876 #endif
877 new = input_line_pointer;
878 input_line_pointer = save;
879 return new;
880 }
881
882 /* The many forms of operand:
883
884 Rn Register direct
885 @Rn Register indirect
886 @Rn+ Autoincrement
887 @-Rn Autodecrement
888 @(disp:4,Rn)
889 @(disp:8,GBR)
890 @(disp:8,PC)
891
892 @(R0,Rn)
893 @(R0,GBR)
894
895 disp:8
896 disp:12
897 #imm8
898 pr, gbr, vbr, macl, mach
899 */
900
901 static char *
902 parse_at (src, op)
903 char *src;
904 sh_operand_info *op;
905 {
906 int len;
907 int mode;
908 src++;
909 if (src[0] == '-')
910 {
911 /* Must be predecrement. */
912 src++;
913
914 len = parse_reg (src, &mode, &(op->reg));
915 if (mode != A_REG_N)
916 as_bad (_("illegal register after @-"));
917
918 op->type = A_DEC_N;
919 src += len;
920 }
921 else if (src[0] == '(')
922 {
923 /* Could be @(disp, rn), @(disp, gbr), @(disp, pc), @(r0, gbr) or
924 @(r0, rn). */
925 src++;
926 len = parse_reg (src, &mode, &(op->reg));
927 if (len && mode == A_REG_N)
928 {
929 src += len;
930 if (op->reg != 0)
931 {
932 as_bad (_("must be @(r0,...)"));
933 }
934 if (src[0] == ',')
935 {
936 src++;
937 /* Now can be rn or gbr. */
938 len = parse_reg (src, &mode, &(op->reg));
939 }
940 else
941 {
942 len = 0;
943 }
944 if (len)
945 {
946 if (mode == A_GBR)
947 {
948 op->type = A_R0_GBR;
949 }
950 else if (mode == A_REG_N)
951 {
952 op->type = A_IND_R0_REG_N;
953 }
954 else
955 {
956 as_bad (_("syntax error in @(r0,...)"));
957 }
958 }
959 else
960 {
961 as_bad (_("syntax error in @(r0...)"));
962 }
963 }
964 else
965 {
966 /* Must be an @(disp,.. thing). */
967 src = parse_exp (src, op);
968 if (src[0] == ',')
969 src++;
970 /* Now can be rn, gbr or pc. */
971 len = parse_reg (src, &mode, &op->reg);
972 if (len)
973 {
974 if (mode == A_REG_N)
975 {
976 op->type = A_DISP_REG_N;
977 }
978 else if (mode == A_GBR)
979 {
980 op->type = A_DISP_GBR;
981 }
982 else if (mode == A_PC)
983 {
984 /* Turn a plain @(4,pc) into @(.+4,pc). */
985 if (op->immediate.X_op == O_constant)
986 {
987 op->immediate.X_add_symbol = dot();
988 op->immediate.X_op = O_symbol;
989 }
990 op->type = A_DISP_PC;
991 }
992 else
993 {
994 as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
995 }
996 }
997 else
998 {
999 as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
1000 }
1001 }
1002 src += len;
1003 if (src[0] != ')')
1004 as_bad (_("expecting )"));
1005 else
1006 src++;
1007 }
1008 else
1009 {
1010 src += parse_reg (src, &mode, &(op->reg));
1011 if (mode != A_REG_N)
1012 as_bad (_("illegal register after @"));
1013
1014 if (src[0] == '+')
1015 {
1016 char l0, l1;
1017
1018 src++;
1019 l0 = TOLOWER (src[0]);
1020 l1 = TOLOWER (src[1]);
1021
1022 if ((l0 == 'r' && l1 == '8')
1023 || (l0 == 'i' && (l1 == 'x' || l1 == 's')))
1024 {
1025 src += 2;
1026 op->type = A_PMOD_N;
1027 }
1028 else if ( (l0 == 'r' && l1 == '9')
1029 || (l0 == 'i' && l1 == 'y'))
1030 {
1031 src += 2;
1032 op->type = A_PMODY_N;
1033 }
1034 else
1035 op->type = A_INC_N;
1036 }
1037 else
1038 op->type = A_IND_N;
1039 }
1040 return src;
1041 }
1042
1043 static void
1044 get_operand (ptr, op)
1045 char **ptr;
1046 sh_operand_info *op;
1047 {
1048 char *src = *ptr;
1049 int mode = -1;
1050 unsigned int len;
1051
1052 if (src[0] == '#')
1053 {
1054 src++;
1055 *ptr = parse_exp (src, op);
1056 op->type = A_IMM;
1057 return;
1058 }
1059
1060 else if (src[0] == '@')
1061 {
1062 *ptr = parse_at (src, op);
1063 return;
1064 }
1065 len = parse_reg (src, &mode, &(op->reg));
1066 if (len)
1067 {
1068 *ptr = src + len;
1069 op->type = mode;
1070 return;
1071 }
1072 else
1073 {
1074 /* Not a reg, the only thing left is a displacement. */
1075 *ptr = parse_exp (src, op);
1076 op->type = A_DISP_PC;
1077 return;
1078 }
1079 }
1080
1081 static char *
1082 get_operands (info, args, operand)
1083 sh_opcode_info *info;
1084 char *args;
1085 sh_operand_info *operand;
1086 {
1087 char *ptr = args;
1088 if (info->arg[0])
1089 {
1090 /* The pre-processor will eliminate whitespace in front of '@'
1091 after the first argument; we may be called multiple times
1092 from assemble_ppi, so don't insist on finding whitespace here. */
1093 if (*ptr == ' ')
1094 ptr++;
1095
1096 get_operand (&ptr, operand + 0);
1097 if (info->arg[1])
1098 {
1099 if (*ptr == ',')
1100 {
1101 ptr++;
1102 }
1103 get_operand (&ptr, operand + 1);
1104 /* ??? Hack: psha/pshl have a varying operand number depending on
1105 the type of the first operand. We handle this by having the
1106 three-operand version first and reducing the number of operands
1107 parsed to two if we see that the first operand is an immediate.
1108 This works because no insn with three operands has an immediate
1109 as first operand. */
1110 if (info->arg[2] && operand[0].type != A_IMM)
1111 {
1112 if (*ptr == ',')
1113 {
1114 ptr++;
1115 }
1116 get_operand (&ptr, operand + 2);
1117 }
1118 else
1119 {
1120 operand[2].type = 0;
1121 }
1122 }
1123 else
1124 {
1125 operand[1].type = 0;
1126 operand[2].type = 0;
1127 }
1128 }
1129 else
1130 {
1131 operand[0].type = 0;
1132 operand[1].type = 0;
1133 operand[2].type = 0;
1134 }
1135 return ptr;
1136 }
1137
1138 /* Passed a pointer to a list of opcodes which use different
1139 addressing modes, return the opcode which matches the opcodes
1140 provided. */
1141
1142 static sh_opcode_info *
1143 get_specific (opcode, operands)
1144 sh_opcode_info *opcode;
1145 sh_operand_info *operands;
1146 {
1147 sh_opcode_info *this_try = opcode;
1148 char *name = opcode->name;
1149 int n = 0;
1150
1151 while (opcode->name)
1152 {
1153 this_try = opcode++;
1154 if (this_try->name != name)
1155 {
1156 /* We've looked so far down the table that we've run out of
1157 opcodes with the same name. */
1158 return 0;
1159 }
1160
1161 /* Look at both operands needed by the opcodes and provided by
1162 the user - since an arg test will often fail on the same arg
1163 again and again, we'll try and test the last failing arg the
1164 first on each opcode try. */
1165 for (n = 0; this_try->arg[n]; n++)
1166 {
1167 sh_operand_info *user = operands + n;
1168 sh_arg_type arg = this_try->arg[n];
1169
1170 switch (arg)
1171 {
1172 case A_IMM:
1173 case A_BDISP12:
1174 case A_BDISP8:
1175 case A_DISP_GBR:
1176 case A_DISP_PC:
1177 case A_MACH:
1178 case A_PR:
1179 case A_MACL:
1180 if (user->type != arg)
1181 goto fail;
1182 break;
1183 case A_R0:
1184 /* opcode needs r0 */
1185 if (user->type != A_REG_N || user->reg != 0)
1186 goto fail;
1187 break;
1188 case A_R0_GBR:
1189 if (user->type != A_R0_GBR || user->reg != 0)
1190 goto fail;
1191 break;
1192 case F_FR0:
1193 if (user->type != F_REG_N || user->reg != 0)
1194 goto fail;
1195 break;
1196
1197 case A_REG_N:
1198 case A_INC_N:
1199 case A_DEC_N:
1200 case A_IND_N:
1201 case A_IND_R0_REG_N:
1202 case A_DISP_REG_N:
1203 case F_REG_N:
1204 case D_REG_N:
1205 case X_REG_N:
1206 case V_REG_N:
1207 case FPUL_N:
1208 case FPSCR_N:
1209 case A_PMOD_N:
1210 case A_PMODY_N:
1211 case DSP_REG_N:
1212 /* Opcode needs rn */
1213 if (user->type != arg)
1214 goto fail;
1215 reg_n = user->reg;
1216 break;
1217 case DX_REG_N:
1218 if (user->type != D_REG_N && user->type != X_REG_N)
1219 goto fail;
1220 reg_n = user->reg;
1221 break;
1222 case A_GBR:
1223 case A_SR:
1224 case A_VBR:
1225 case A_DSR:
1226 case A_MOD:
1227 case A_RE:
1228 case A_RS:
1229 case A_SSR:
1230 case A_SPC:
1231 case A_SGR:
1232 case A_DBR:
1233 if (user->type != arg)
1234 goto fail;
1235 break;
1236
1237 case A_REG_B:
1238 if (user->type != arg)
1239 goto fail;
1240 reg_b = user->reg;
1241 break;
1242
1243 case A_REG_M:
1244 case A_INC_M:
1245 case A_DEC_M:
1246 case A_IND_M:
1247 case A_IND_R0_REG_M:
1248 case A_DISP_REG_M:
1249 case DSP_REG_M:
1250 /* Opcode needs rn */
1251 if (user->type != arg - A_REG_M + A_REG_N)
1252 goto fail;
1253 reg_m = user->reg;
1254 break;
1255
1256 case DSP_REG_X:
1257 if (user->type != DSP_REG_N)
1258 goto fail;
1259 switch (user->reg)
1260 {
1261 case A_X0_NUM:
1262 reg_x = 0;
1263 break;
1264 case A_X1_NUM:
1265 reg_x = 1;
1266 break;
1267 case A_A0_NUM:
1268 reg_x = 2;
1269 break;
1270 case A_A1_NUM:
1271 reg_x = 3;
1272 break;
1273 default:
1274 goto fail;
1275 }
1276 break;
1277
1278 case DSP_REG_Y:
1279 if (user->type != DSP_REG_N)
1280 goto fail;
1281 switch (user->reg)
1282 {
1283 case A_Y0_NUM:
1284 reg_y = 0;
1285 break;
1286 case A_Y1_NUM:
1287 reg_y = 1;
1288 break;
1289 case A_M0_NUM:
1290 reg_y = 2;
1291 break;
1292 case A_M1_NUM:
1293 reg_y = 3;
1294 break;
1295 default:
1296 goto fail;
1297 }
1298 break;
1299
1300 case DSP_REG_E:
1301 if (user->type != DSP_REG_N)
1302 goto fail;
1303 switch (user->reg)
1304 {
1305 case A_X0_NUM:
1306 reg_efg = 0 << 10;
1307 break;
1308 case A_X1_NUM:
1309 reg_efg = 1 << 10;
1310 break;
1311 case A_Y0_NUM:
1312 reg_efg = 2 << 10;
1313 break;
1314 case A_A1_NUM:
1315 reg_efg = 3 << 10;
1316 break;
1317 default:
1318 goto fail;
1319 }
1320 break;
1321
1322 case DSP_REG_F:
1323 if (user->type != DSP_REG_N)
1324 goto fail;
1325 switch (user->reg)
1326 {
1327 case A_Y0_NUM:
1328 reg_efg |= 0 << 8;
1329 break;
1330 case A_Y1_NUM:
1331 reg_efg |= 1 << 8;
1332 break;
1333 case A_X0_NUM:
1334 reg_efg |= 2 << 8;
1335 break;
1336 case A_A1_NUM:
1337 reg_efg |= 3 << 8;
1338 break;
1339 default:
1340 goto fail;
1341 }
1342 break;
1343
1344 case DSP_REG_G:
1345 if (user->type != DSP_REG_N)
1346 goto fail;
1347 switch (user->reg)
1348 {
1349 case A_M0_NUM:
1350 reg_efg |= 0 << 2;
1351 break;
1352 case A_M1_NUM:
1353 reg_efg |= 1 << 2;
1354 break;
1355 case A_A0_NUM:
1356 reg_efg |= 2 << 2;
1357 break;
1358 case A_A1_NUM:
1359 reg_efg |= 3 << 2;
1360 break;
1361 default:
1362 goto fail;
1363 }
1364 break;
1365
1366 case A_A0:
1367 if (user->type != DSP_REG_N || user->reg != A_A0_NUM)
1368 goto fail;
1369 break;
1370 case A_X0:
1371 if (user->type != DSP_REG_N || user->reg != A_X0_NUM)
1372 goto fail;
1373 break;
1374 case A_X1:
1375 if (user->type != DSP_REG_N || user->reg != A_X1_NUM)
1376 goto fail;
1377 break;
1378 case A_Y0:
1379 if (user->type != DSP_REG_N || user->reg != A_Y0_NUM)
1380 goto fail;
1381 break;
1382 case A_Y1:
1383 if (user->type != DSP_REG_N || user->reg != A_Y1_NUM)
1384 goto fail;
1385 break;
1386
1387 case F_REG_M:
1388 case D_REG_M:
1389 case X_REG_M:
1390 case V_REG_M:
1391 case FPUL_M:
1392 case FPSCR_M:
1393 /* Opcode needs rn */
1394 if (user->type != arg - F_REG_M + F_REG_N)
1395 goto fail;
1396 reg_m = user->reg;
1397 break;
1398 case DX_REG_M:
1399 if (user->type != D_REG_N && user->type != X_REG_N)
1400 goto fail;
1401 reg_m = user->reg;
1402 break;
1403 case XMTRX_M4:
1404 if (user->type != XMTRX_M4)
1405 goto fail;
1406 reg_m = 4;
1407 break;
1408
1409 default:
1410 printf (_("unhandled %d\n"), arg);
1411 goto fail;
1412 }
1413 }
1414 if ( !(valid_arch & this_try->arch))
1415 goto fail;
1416 valid_arch &= this_try->arch;
1417 return this_try;
1418 fail:
1419 ;
1420 }
1421
1422 return 0;
1423 }
1424
1425 static void
1426 insert (where, how, pcrel, op)
1427 char *where;
1428 int how;
1429 int pcrel;
1430 sh_operand_info *op;
1431 {
1432 fix_new_exp (frag_now,
1433 where - frag_now->fr_literal,
1434 2,
1435 &op->immediate,
1436 pcrel,
1437 how);
1438 }
1439
1440 static void
1441 build_relax (opcode, op)
1442 sh_opcode_info *opcode;
1443 sh_operand_info *op;
1444 {
1445 int high_byte = target_big_endian ? 0 : 1;
1446 char *p;
1447
1448 if (opcode->arg[0] == A_BDISP8)
1449 {
1450 int what = (opcode->nibbles[1] & 4) ? COND_JUMP_DELAY : COND_JUMP;
1451 p = frag_var (rs_machine_dependent,
1452 md_relax_table[C (what, COND32)].rlx_length,
1453 md_relax_table[C (what, COND8)].rlx_length,
1454 C (what, 0),
1455 op->immediate.X_add_symbol,
1456 op->immediate.X_add_number,
1457 0);
1458 p[high_byte] = (opcode->nibbles[0] << 4) | (opcode->nibbles[1]);
1459 }
1460 else if (opcode->arg[0] == A_BDISP12)
1461 {
1462 p = frag_var (rs_machine_dependent,
1463 md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length,
1464 md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length,
1465 C (UNCOND_JUMP, 0),
1466 op->immediate.X_add_symbol,
1467 op->immediate.X_add_number,
1468 0);
1469 p[high_byte] = (opcode->nibbles[0] << 4);
1470 }
1471
1472 }
1473
1474 /* Insert ldrs & ldre with fancy relocations that relaxation can recognize. */
1475
1476 static char *
1477 insert_loop_bounds (output, operand)
1478 char *output;
1479 sh_operand_info *operand;
1480 {
1481 char *name;
1482 symbolS *end_sym;
1483
1484 /* Since the low byte of the opcode will be overwritten by the reloc, we
1485 can just stash the high byte into both bytes and ignore endianness. */
1486 output[0] = 0x8c;
1487 output[1] = 0x8c;
1488 insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
1489 insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
1490
1491 if (sh_relax)
1492 {
1493 static int count = 0;
1494
1495 /* If the last loop insn is a two-byte-insn, it is in danger of being
1496 swapped with the insn after it. To prevent this, create a new
1497 symbol - complete with SH_LABEL reloc - after the last loop insn.
1498 If the last loop insn is four bytes long, the symbol will be
1499 right in the middle, but four byte insns are not swapped anyways. */
1500 /* A REPEAT takes 6 bytes. The SH has a 32 bit address space.
1501 Hence a 9 digit number should be enough to count all REPEATs. */
1502 name = alloca (11);
1503 sprintf (name, "_R%x", count++ & 0x3fffffff);
1504 end_sym = symbol_new (name, undefined_section, 0, &zero_address_frag);
1505 /* Make this a local symbol. */
1506 #ifdef OBJ_COFF
1507 SF_SET_LOCAL (end_sym);
1508 #endif /* OBJ_COFF */
1509 symbol_table_insert (end_sym);
1510 end_sym->sy_value = operand[1].immediate;
1511 end_sym->sy_value.X_add_number += 2;
1512 fix_new (frag_now, frag_now_fix (), 2, end_sym, 0, 1, BFD_RELOC_SH_LABEL);
1513 }
1514
1515 output = frag_more (2);
1516 output[0] = 0x8e;
1517 output[1] = 0x8e;
1518 insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
1519 insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
1520
1521 return frag_more (2);
1522 }
1523
1524 /* Now we know what sort of opcodes it is, let's build the bytes. */
1525
1526 static unsigned int
1527 build_Mytes (opcode, operand)
1528 sh_opcode_info *opcode;
1529 sh_operand_info *operand;
1530 {
1531 int index;
1532 char nbuf[4];
1533 char *output = frag_more (2);
1534 unsigned int size = 2;
1535 int low_byte = target_big_endian ? 1 : 0;
1536 nbuf[0] = 0;
1537 nbuf[1] = 0;
1538 nbuf[2] = 0;
1539 nbuf[3] = 0;
1540
1541 for (index = 0; index < 4; index++)
1542 {
1543 sh_nibble_type i = opcode->nibbles[index];
1544 if (i < 16)
1545 {
1546 nbuf[index] = i;
1547 }
1548 else
1549 {
1550 switch (i)
1551 {
1552 case REG_N:
1553 nbuf[index] = reg_n;
1554 break;
1555 case REG_M:
1556 nbuf[index] = reg_m;
1557 break;
1558 case SDT_REG_N:
1559 if (reg_n < 2 || reg_n > 5)
1560 as_bad (_("Invalid register: 'r%d'"), reg_n);
1561 nbuf[index] = (reg_n & 3) | 4;
1562 break;
1563 case REG_NM:
1564 nbuf[index] = reg_n | (reg_m >> 2);
1565 break;
1566 case REG_B:
1567 nbuf[index] = reg_b | 0x08;
1568 break;
1569 case IMM0_4BY4:
1570 insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand);
1571 break;
1572 case IMM0_4BY2:
1573 insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand);
1574 break;
1575 case IMM0_4:
1576 insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand);
1577 break;
1578 case IMM1_4BY4:
1579 insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand + 1);
1580 break;
1581 case IMM1_4BY2:
1582 insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand + 1);
1583 break;
1584 case IMM1_4:
1585 insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand + 1);
1586 break;
1587 case IMM0_8BY4:
1588 insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand);
1589 break;
1590 case IMM0_8BY2:
1591 insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand);
1592 break;
1593 case IMM0_8:
1594 insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand);
1595 break;
1596 case IMM1_8BY4:
1597 insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand + 1);
1598 break;
1599 case IMM1_8BY2:
1600 insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand + 1);
1601 break;
1602 case IMM1_8:
1603 insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1);
1604 break;
1605 case PCRELIMM_8BY4:
1606 insert (output, BFD_RELOC_SH_PCRELIMM8BY4, 1, operand);
1607 break;
1608 case PCRELIMM_8BY2:
1609 insert (output, BFD_RELOC_SH_PCRELIMM8BY2, 1, operand);
1610 break;
1611 case REPEAT:
1612 output = insert_loop_bounds (output, operand);
1613 nbuf[index] = opcode->nibbles[3];
1614 operand += 2;
1615 break;
1616 default:
1617 printf (_("failed for %d\n"), i);
1618 }
1619 }
1620 }
1621 if (!target_big_endian)
1622 {
1623 output[1] = (nbuf[0] << 4) | (nbuf[1]);
1624 output[0] = (nbuf[2] << 4) | (nbuf[3]);
1625 }
1626 else
1627 {
1628 output[0] = (nbuf[0] << 4) | (nbuf[1]);
1629 output[1] = (nbuf[2] << 4) | (nbuf[3]);
1630 }
1631 return size;
1632 }
1633
1634 /* Find an opcode at the start of *STR_P in the hash table, and set
1635 *STR_P to the first character after the last one read. */
1636
1637 static sh_opcode_info *
1638 find_cooked_opcode (str_p)
1639 char **str_p;
1640 {
1641 char *str = *str_p;
1642 unsigned char *op_start;
1643 unsigned char *op_end;
1644 char name[20];
1645 int nlen = 0;
1646
1647 /* Drop leading whitespace. */
1648 while (*str == ' ')
1649 str++;
1650
1651 /* Find the op code end.
1652 The pre-processor will eliminate whitespace in front of
1653 any '@' after the first argument; we may be called from
1654 assemble_ppi, so the opcode might be terminated by an '@'. */
1655 for (op_start = op_end = (unsigned char *) (str);
1656 *op_end
1657 && nlen < 20
1658 && !is_end_of_line[*op_end] && *op_end != ' ' && *op_end != '@';
1659 op_end++)
1660 {
1661 unsigned char c = op_start[nlen];
1662
1663 /* The machine independent code will convert CMP/EQ into cmp/EQ
1664 because it thinks the '/' is the end of the symbol. Moreover,
1665 all but the first sub-insn is a parallel processing insn won't
1666 be capitalized. Instead of hacking up the machine independent
1667 code, we just deal with it here. */
1668 c = TOLOWER (c);
1669 name[nlen] = c;
1670 nlen++;
1671 }
1672
1673 name[nlen] = 0;
1674 *str_p = op_end;
1675
1676 if (nlen == 0)
1677 as_bad (_("can't find opcode "));
1678
1679 return (sh_opcode_info *) hash_find (opcode_hash_control, name);
1680 }
1681
1682 /* Assemble a parallel processing insn. */
1683 #define DDT_BASE 0xf000 /* Base value for double data transfer insns */
1684
1685 static unsigned int
1686 assemble_ppi (op_end, opcode)
1687 char *op_end;
1688 sh_opcode_info *opcode;
1689 {
1690 int movx = 0;
1691 int movy = 0;
1692 int cond = 0;
1693 int field_b = 0;
1694 char *output;
1695 int move_code;
1696 unsigned int size;
1697
1698 /* Some insn ignore one or more register fields, e.g. psts machl,a0.
1699 Make sure we encode a defined insn pattern. */
1700 reg_x = 0;
1701 reg_y = 0;
1702
1703 for (;;)
1704 {
1705 sh_operand_info operand[3];
1706
1707 if (opcode->arg[0] != A_END)
1708 op_end = get_operands (opcode, op_end, operand);
1709 opcode = get_specific (opcode, operand);
1710 if (opcode == 0)
1711 {
1712 /* Couldn't find an opcode which matched the operands. */
1713 char *where = frag_more (2);
1714 size = 2;
1715
1716 where[0] = 0x0;
1717 where[1] = 0x0;
1718 as_bad (_("invalid operands for opcode"));
1719 return size;
1720 }
1721
1722 if (opcode->nibbles[0] != PPI)
1723 as_bad (_("insn can't be combined with parallel processing insn"));
1724
1725 switch (opcode->nibbles[1])
1726 {
1727
1728 case NOPX:
1729 if (movx)
1730 as_bad (_("multiple movx specifications"));
1731 movx = DDT_BASE;
1732 break;
1733 case NOPY:
1734 if (movy)
1735 as_bad (_("multiple movy specifications"));
1736 movy = DDT_BASE;
1737 break;
1738
1739 case MOVX:
1740 if (movx)
1741 as_bad (_("multiple movx specifications"));
1742 if (reg_n < 4 || reg_n > 5)
1743 as_bad (_("invalid movx address register"));
1744 if (opcode->nibbles[2] & 8)
1745 {
1746 if (reg_m == A_A1_NUM)
1747 movx = 1 << 7;
1748 else if (reg_m != A_A0_NUM)
1749 as_bad (_("invalid movx dsp register"));
1750 }
1751 else
1752 {
1753 if (reg_x > 1)
1754 as_bad (_("invalid movx dsp register"));
1755 movx = reg_x << 7;
1756 }
1757 movx += ((reg_n - 4) << 9) + (opcode->nibbles[2] << 2) + DDT_BASE;
1758 break;
1759
1760 case MOVY:
1761 if (movy)
1762 as_bad (_("multiple movy specifications"));
1763 if (opcode->nibbles[2] & 8)
1764 {
1765 /* Bit 3 in nibbles[2] is intended for bit 4 of the opcode,
1766 so add 8 more. */
1767 movy = 8;
1768 if (reg_m == A_A1_NUM)
1769 movy += 1 << 6;
1770 else if (reg_m != A_A0_NUM)
1771 as_bad (_("invalid movy dsp register"));
1772 }
1773 else
1774 {
1775 if (reg_y > 1)
1776 as_bad (_("invalid movy dsp register"));
1777 movy = reg_y << 6;
1778 }
1779 if (reg_n < 6 || reg_n > 7)
1780 as_bad (_("invalid movy address register"));
1781 movy += ((reg_n - 6) << 8) + opcode->nibbles[2] + DDT_BASE;
1782 break;
1783
1784 case PSH:
1785 if (operand[0].immediate.X_op != O_constant)
1786 as_bad (_("dsp immediate shift value not constant"));
1787 field_b = ((opcode->nibbles[2] << 12)
1788 | (operand[0].immediate.X_add_number & 127) << 4
1789 | reg_n);
1790 break;
1791 case PPI3:
1792 if (field_b)
1793 as_bad (_("multiple parallel processing specifications"));
1794 field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
1795 + (reg_x << 6) + (reg_y << 4) + reg_n);
1796 break;
1797 case PDC:
1798 if (cond)
1799 as_bad (_("multiple condition specifications"));
1800 cond = opcode->nibbles[2] << 8;
1801 if (*op_end)
1802 goto skip_cond_check;
1803 break;
1804 case PPIC:
1805 if (field_b)
1806 as_bad (_("multiple parallel processing specifications"));
1807 field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
1808 + cond + (reg_x << 6) + (reg_y << 4) + reg_n);
1809 cond = 0;
1810 break;
1811 case PMUL:
1812 if (field_b)
1813 {
1814 if ((field_b & 0xef00) != 0xa100)
1815 as_bad (_("insn cannot be combined with pmuls"));
1816 field_b -= 0x8100;
1817 switch (field_b & 0xf)
1818 {
1819 case A_X0_NUM:
1820 field_b += 0 - A_X0_NUM;
1821 break;
1822 case A_Y0_NUM:
1823 field_b += 1 - A_Y0_NUM;
1824 break;
1825 case A_A0_NUM:
1826 field_b += 2 - A_A0_NUM;
1827 break;
1828 case A_A1_NUM:
1829 field_b += 3 - A_A1_NUM;
1830 break;
1831 default:
1832 as_bad (_("bad padd / psub pmuls output operand"));
1833 }
1834 }
1835 field_b += 0x4000 + reg_efg;
1836 break;
1837 default:
1838 abort ();
1839 }
1840 if (cond)
1841 {
1842 as_bad (_("condition not followed by conditionalizable insn"));
1843 cond = 0;
1844 }
1845 if (! *op_end)
1846 break;
1847 skip_cond_check:
1848 opcode = find_cooked_opcode (&op_end);
1849 if (opcode == NULL)
1850 {
1851 (as_bad
1852 (_("unrecognized characters at end of parallel processing insn")));
1853 break;
1854 }
1855 }
1856
1857 move_code = movx | movy;
1858 if (field_b)
1859 {
1860 /* Parallel processing insn. */
1861 unsigned long ppi_code = (movx | movy | 0xf800) << 16 | field_b;
1862
1863 output = frag_more (4);
1864 size = 4;
1865 if (! target_big_endian)
1866 {
1867 output[3] = ppi_code >> 8;
1868 output[2] = ppi_code;
1869 }
1870 else
1871 {
1872 output[2] = ppi_code >> 8;
1873 output[3] = ppi_code;
1874 }
1875 move_code |= 0xf800;
1876 }
1877 else
1878 {
1879 /* Just a double data transfer. */
1880 output = frag_more (2);
1881 size = 2;
1882 }
1883 if (! target_big_endian)
1884 {
1885 output[1] = move_code >> 8;
1886 output[0] = move_code;
1887 }
1888 else
1889 {
1890 output[0] = move_code >> 8;
1891 output[1] = move_code;
1892 }
1893 return size;
1894 }
1895
1896 /* This is the guts of the machine-dependent assembler. STR points to a
1897 machine dependent instruction. This function is supposed to emit
1898 the frags/bytes it assembles to. */
1899
1900 void
1901 md_assemble (str)
1902 char *str;
1903 {
1904 unsigned char *op_end;
1905 sh_operand_info operand[3];
1906 sh_opcode_info *opcode;
1907 unsigned int size = 0;
1908
1909 opcode = find_cooked_opcode (&str);
1910 op_end = str;
1911
1912 if (opcode == NULL)
1913 {
1914 as_bad (_("unknown opcode"));
1915 return;
1916 }
1917
1918 if (sh_relax
1919 && ! seg_info (now_seg)->tc_segment_info_data.in_code)
1920 {
1921 /* Output a CODE reloc to tell the linker that the following
1922 bytes are instructions, not data. */
1923 fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
1924 BFD_RELOC_SH_CODE);
1925 seg_info (now_seg)->tc_segment_info_data.in_code = 1;
1926 }
1927
1928 if (opcode->nibbles[0] == PPI)
1929 {
1930 size = assemble_ppi (op_end, opcode);
1931 }
1932 else
1933 {
1934 if (opcode->arg[0] == A_BDISP12
1935 || opcode->arg[0] == A_BDISP8)
1936 {
1937 parse_exp (op_end + 1, &operand[0]);
1938 build_relax (opcode, &operand[0]);
1939 }
1940 else
1941 {
1942 if (opcode->arg[0] == A_END)
1943 {
1944 /* Ignore trailing whitespace. If there is any, it has already
1945 been compressed to a single space. */
1946 if (*op_end == ' ')
1947 op_end++;
1948 }
1949 else
1950 {
1951 op_end = get_operands (opcode, op_end, operand);
1952 }
1953 opcode = get_specific (opcode, operand);
1954
1955 if (opcode == 0)
1956 {
1957 /* Couldn't find an opcode which matched the operands. */
1958 char *where = frag_more (2);
1959 size = 2;
1960
1961 where[0] = 0x0;
1962 where[1] = 0x0;
1963 as_bad (_("invalid operands for opcode"));
1964 }
1965 else
1966 {
1967 if (*op_end)
1968 as_bad (_("excess operands: '%s'"), op_end);
1969
1970 size = build_Mytes (opcode, operand);
1971 }
1972 }
1973 }
1974
1975 #ifdef BFD_ASSEMBLER
1976 dwarf2_emit_insn (size);
1977 #endif
1978 }
1979
1980 /* This routine is called each time a label definition is seen. It
1981 emits a BFD_RELOC_SH_LABEL reloc if necessary. */
1982
1983 void
1984 sh_frob_label ()
1985 {
1986 static fragS *last_label_frag;
1987 static int last_label_offset;
1988
1989 if (sh_relax
1990 && seg_info (now_seg)->tc_segment_info_data.in_code)
1991 {
1992 int offset;
1993
1994 offset = frag_now_fix ();
1995 if (frag_now != last_label_frag
1996 || offset != last_label_offset)
1997 {
1998 fix_new (frag_now, offset, 2, &abs_symbol, 0, 0, BFD_RELOC_SH_LABEL);
1999 last_label_frag = frag_now;
2000 last_label_offset = offset;
2001 }
2002 }
2003 }
2004
2005 /* This routine is called when the assembler is about to output some
2006 data. It emits a BFD_RELOC_SH_DATA reloc if necessary. */
2007
2008 void
2009 sh_flush_pending_output ()
2010 {
2011 if (sh_relax
2012 && seg_info (now_seg)->tc_segment_info_data.in_code)
2013 {
2014 fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
2015 BFD_RELOC_SH_DATA);
2016 seg_info (now_seg)->tc_segment_info_data.in_code = 0;
2017 }
2018 }
2019
2020 symbolS *
2021 md_undefined_symbol (name)
2022 char *name ATTRIBUTE_UNUSED;
2023 {
2024 return 0;
2025 }
2026
2027 #ifdef OBJ_COFF
2028 #ifndef BFD_ASSEMBLER
2029
2030 void
2031 tc_crawl_symbol_chain (headers)
2032 object_headers *headers;
2033 {
2034 printf (_("call to tc_crawl_symbol_chain \n"));
2035 }
2036
2037 void
2038 tc_headers_hook (headers)
2039 object_headers *headers;
2040 {
2041 printf (_("call to tc_headers_hook \n"));
2042 }
2043
2044 #endif
2045 #endif
2046
2047 /* Various routines to kill one day. */
2048 /* Equal to MAX_PRECISION in atof-ieee.c. */
2049 #define MAX_LITTLENUMS 6
2050
2051 /* Turn a string in input_line_pointer into a floating point constant
2052 of type TYPE, and store the appropriate bytes in *LITP. The number
2053 of LITTLENUMS emitted is stored in *SIZEP . An error message is
2054 returned, or NULL on OK. */
2055
2056 char *
2057 md_atof (type, litP, sizeP)
2058 int type;
2059 char *litP;
2060 int *sizeP;
2061 {
2062 int prec;
2063 LITTLENUM_TYPE words[4];
2064 char *t;
2065 int i;
2066
2067 switch (type)
2068 {
2069 case 'f':
2070 prec = 2;
2071 break;
2072
2073 case 'd':
2074 prec = 4;
2075 break;
2076
2077 default:
2078 *sizeP = 0;
2079 return _("bad call to md_atof");
2080 }
2081
2082 t = atof_ieee (input_line_pointer, type, words);
2083 if (t)
2084 input_line_pointer = t;
2085
2086 *sizeP = prec * 2;
2087
2088 if (! target_big_endian)
2089 {
2090 for (i = prec - 1; i >= 0; i--)
2091 {
2092 md_number_to_chars (litP, (valueT) words[i], 2);
2093 litP += 2;
2094 }
2095 }
2096 else
2097 {
2098 for (i = 0; i < prec; i++)
2099 {
2100 md_number_to_chars (litP, (valueT) words[i], 2);
2101 litP += 2;
2102 }
2103 }
2104
2105 return NULL;
2106 }
2107
2108 /* Handle the .uses pseudo-op. This pseudo-op is used just before a
2109 call instruction. It refers to a label of the instruction which
2110 loads the register which the call uses. We use it to generate a
2111 special reloc for the linker. */
2112
2113 static void
2114 s_uses (ignore)
2115 int ignore ATTRIBUTE_UNUSED;
2116 {
2117 expressionS ex;
2118
2119 if (! sh_relax)
2120 as_warn (_(".uses pseudo-op seen when not relaxing"));
2121
2122 expression (&ex);
2123
2124 if (ex.X_op != O_symbol || ex.X_add_number != 0)
2125 {
2126 as_bad (_("bad .uses format"));
2127 ignore_rest_of_line ();
2128 return;
2129 }
2130
2131 fix_new_exp (frag_now, frag_now_fix (), 2, &ex, 1, BFD_RELOC_SH_USES);
2132
2133 demand_empty_rest_of_line ();
2134 }
2135 \f
2136 CONST char *md_shortopts = "";
2137 struct option md_longopts[] =
2138 {
2139 #define OPTION_RELAX (OPTION_MD_BASE)
2140 #define OPTION_BIG (OPTION_MD_BASE + 1)
2141 #define OPTION_LITTLE (OPTION_BIG + 1)
2142 #define OPTION_SMALL (OPTION_LITTLE + 1)
2143 #define OPTION_DSP (OPTION_SMALL + 1)
2144
2145 {"relax", no_argument, NULL, OPTION_RELAX},
2146 {"big", no_argument, NULL, OPTION_BIG},
2147 {"little", no_argument, NULL, OPTION_LITTLE},
2148 {"small", no_argument, NULL, OPTION_SMALL},
2149 {"dsp", no_argument, NULL, OPTION_DSP},
2150 {NULL, no_argument, NULL, 0}
2151 };
2152 size_t md_longopts_size = sizeof (md_longopts);
2153
2154 int
2155 md_parse_option (c, arg)
2156 int c;
2157 char *arg ATTRIBUTE_UNUSED;
2158 {
2159 switch (c)
2160 {
2161 case OPTION_RELAX:
2162 sh_relax = 1;
2163 break;
2164
2165 case OPTION_BIG:
2166 target_big_endian = 1;
2167 break;
2168
2169 case OPTION_LITTLE:
2170 target_big_endian = 0;
2171 break;
2172
2173 case OPTION_SMALL:
2174 sh_small = 1;
2175 break;
2176
2177 case OPTION_DSP:
2178 sh_dsp = 1;
2179 break;
2180
2181 default:
2182 return 0;
2183 }
2184
2185 return 1;
2186 }
2187
2188 void
2189 md_show_usage (stream)
2190 FILE *stream;
2191 {
2192 fprintf (stream, _("\
2193 SH options:\n\
2194 -little generate little endian code\n\
2195 -big generate big endian code\n\
2196 -relax alter jump instructions for long displacements\n\
2197 -small align sections to 4 byte boundaries, not 16\n\
2198 -dsp enable sh-dsp insns, and disable sh3e / sh4 insns.\n"));
2199 }
2200 \f
2201 /* This struct is used to pass arguments to sh_count_relocs through
2202 bfd_map_over_sections. */
2203
2204 struct sh_count_relocs
2205 {
2206 /* Symbol we are looking for. */
2207 symbolS *sym;
2208 /* Count of relocs found. */
2209 int count;
2210 };
2211
2212 /* Count the number of fixups in a section which refer to a particular
2213 symbol. When using BFD_ASSEMBLER, this is called via
2214 bfd_map_over_sections. */
2215
2216 static void
2217 sh_count_relocs (abfd, sec, data)
2218 bfd *abfd ATTRIBUTE_UNUSED;
2219 segT sec;
2220 PTR data;
2221 {
2222 struct sh_count_relocs *info = (struct sh_count_relocs *) data;
2223 segment_info_type *seginfo;
2224 symbolS *sym;
2225 fixS *fix;
2226
2227 seginfo = seg_info (sec);
2228 if (seginfo == NULL)
2229 return;
2230
2231 sym = info->sym;
2232 for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
2233 {
2234 if (fix->fx_addsy == sym)
2235 {
2236 ++info->count;
2237 fix->fx_tcbit = 1;
2238 }
2239 }
2240 }
2241
2242 /* Handle the count relocs for a particular section. When using
2243 BFD_ASSEMBLER, this is called via bfd_map_over_sections. */
2244
2245 static void
2246 sh_frob_section (abfd, sec, ignore)
2247 bfd *abfd ATTRIBUTE_UNUSED;
2248 segT sec;
2249 PTR ignore ATTRIBUTE_UNUSED;
2250 {
2251 segment_info_type *seginfo;
2252 fixS *fix;
2253
2254 seginfo = seg_info (sec);
2255 if (seginfo == NULL)
2256 return;
2257
2258 for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
2259 {
2260 symbolS *sym;
2261 bfd_vma val;
2262 fixS *fscan;
2263 struct sh_count_relocs info;
2264
2265 if (fix->fx_r_type != BFD_RELOC_SH_USES)
2266 continue;
2267
2268 /* The BFD_RELOC_SH_USES reloc should refer to a defined local
2269 symbol in the same section. */
2270 sym = fix->fx_addsy;
2271 if (sym == NULL
2272 || fix->fx_subsy != NULL
2273 || fix->fx_addnumber != 0
2274 || S_GET_SEGMENT (sym) != sec
2275 #if ! defined (BFD_ASSEMBLER) && defined (OBJ_COFF)
2276 || S_GET_STORAGE_CLASS (sym) == C_EXT
2277 #endif
2278 || S_IS_EXTERNAL (sym))
2279 {
2280 as_warn_where (fix->fx_file, fix->fx_line,
2281 _(".uses does not refer to a local symbol in the same section"));
2282 continue;
2283 }
2284
2285 /* Look through the fixups again, this time looking for one
2286 at the same location as sym. */
2287 val = S_GET_VALUE (sym);
2288 for (fscan = seginfo->fix_root;
2289 fscan != NULL;
2290 fscan = fscan->fx_next)
2291 if (val == fscan->fx_frag->fr_address + fscan->fx_where
2292 && fscan->fx_r_type != BFD_RELOC_SH_ALIGN
2293 && fscan->fx_r_type != BFD_RELOC_SH_CODE
2294 && fscan->fx_r_type != BFD_RELOC_SH_DATA
2295 && fscan->fx_r_type != BFD_RELOC_SH_LABEL)
2296 break;
2297 if (fscan == NULL)
2298 {
2299 as_warn_where (fix->fx_file, fix->fx_line,
2300 _("can't find fixup pointed to by .uses"));
2301 continue;
2302 }
2303
2304 if (fscan->fx_tcbit)
2305 {
2306 /* We've already done this one. */
2307 continue;
2308 }
2309
2310 /* The variable fscan should also be a fixup to a local symbol
2311 in the same section. */
2312 sym = fscan->fx_addsy;
2313 if (sym == NULL
2314 || fscan->fx_subsy != NULL
2315 || fscan->fx_addnumber != 0
2316 || S_GET_SEGMENT (sym) != sec
2317 #if ! defined (BFD_ASSEMBLER) && defined (OBJ_COFF)
2318 || S_GET_STORAGE_CLASS (sym) == C_EXT
2319 #endif
2320 || S_IS_EXTERNAL (sym))
2321 {
2322 as_warn_where (fix->fx_file, fix->fx_line,
2323 _(".uses target does not refer to a local symbol in the same section"));
2324 continue;
2325 }
2326
2327 /* Now we look through all the fixups of all the sections,
2328 counting the number of times we find a reference to sym. */
2329 info.sym = sym;
2330 info.count = 0;
2331 #ifdef BFD_ASSEMBLER
2332 bfd_map_over_sections (stdoutput, sh_count_relocs, (PTR) &info);
2333 #else
2334 {
2335 int iscan;
2336
2337 for (iscan = SEG_E0; iscan < SEG_UNKNOWN; iscan++)
2338 sh_count_relocs ((bfd *) NULL, iscan, (PTR) &info);
2339 }
2340 #endif
2341
2342 if (info.count < 1)
2343 abort ();
2344
2345 /* Generate a BFD_RELOC_SH_COUNT fixup at the location of sym.
2346 We have already adjusted the value of sym to include the
2347 fragment address, so we undo that adjustment here. */
2348 subseg_change (sec, 0);
2349 fix_new (fscan->fx_frag,
2350 S_GET_VALUE (sym) - fscan->fx_frag->fr_address,
2351 4, &abs_symbol, info.count, 0, BFD_RELOC_SH_COUNT);
2352 }
2353 }
2354
2355 /* This function is called after the symbol table has been completed,
2356 but before the relocs or section contents have been written out.
2357 If we have seen any .uses pseudo-ops, they point to an instruction
2358 which loads a register with the address of a function. We look
2359 through the fixups to find where the function address is being
2360 loaded from. We then generate a COUNT reloc giving the number of
2361 times that function address is referred to. The linker uses this
2362 information when doing relaxing, to decide when it can eliminate
2363 the stored function address entirely. */
2364
2365 void
2366 sh_frob_file ()
2367 {
2368 if (! sh_relax)
2369 return;
2370
2371 #ifdef BFD_ASSEMBLER
2372 bfd_map_over_sections (stdoutput, sh_frob_section, (PTR) NULL);
2373 #else
2374 {
2375 int iseg;
2376
2377 for (iseg = SEG_E0; iseg < SEG_UNKNOWN; iseg++)
2378 sh_frob_section ((bfd *) NULL, iseg, (PTR) NULL);
2379 }
2380 #endif
2381 }
2382
2383 /* Called after relaxing. Set the correct sizes of the fragments, and
2384 create relocs so that md_apply_fix3 will fill in the correct values. */
2385
2386 void
2387 md_convert_frag (headers, seg, fragP)
2388 #ifdef BFD_ASSEMBLER
2389 bfd *headers ATTRIBUTE_UNUSED;
2390 #else
2391 object_headers *headers;
2392 #endif
2393 segT seg;
2394 fragS *fragP;
2395 {
2396 int donerelax = 0;
2397
2398 switch (fragP->fr_subtype)
2399 {
2400 case C (COND_JUMP, COND8):
2401 case C (COND_JUMP_DELAY, COND8):
2402 subseg_change (seg, 0);
2403 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
2404 1, BFD_RELOC_SH_PCDISP8BY2);
2405 fragP->fr_fix += 2;
2406 fragP->fr_var = 0;
2407 break;
2408
2409 case C (UNCOND_JUMP, UNCOND12):
2410 subseg_change (seg, 0);
2411 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
2412 1, BFD_RELOC_SH_PCDISP12BY2);
2413 fragP->fr_fix += 2;
2414 fragP->fr_var = 0;
2415 break;
2416
2417 case C (UNCOND_JUMP, UNCOND32):
2418 case C (UNCOND_JUMP, UNDEF_WORD_DISP):
2419 if (fragP->fr_symbol == NULL)
2420 as_bad_where (fragP->fr_file, fragP->fr_line,
2421 _("displacement overflows 12-bit field"));
2422 else if (S_IS_DEFINED (fragP->fr_symbol))
2423 as_bad_where (fragP->fr_file, fragP->fr_line,
2424 _("displacement to defined symbol %s overflows 12-bit field"),
2425 S_GET_NAME (fragP->fr_symbol));
2426 else
2427 as_bad_where (fragP->fr_file, fragP->fr_line,
2428 _("displacement to undefined symbol %s overflows 12-bit field"),
2429 S_GET_NAME (fragP->fr_symbol));
2430 /* Stabilize this frag, so we don't trip an assert. */
2431 fragP->fr_fix += fragP->fr_var;
2432 fragP->fr_var = 0;
2433 break;
2434
2435 case C (COND_JUMP, COND12):
2436 case C (COND_JUMP_DELAY, COND12):
2437 /* A bcond won't fit, so turn it into a b!cond; bra disp; nop. */
2438 /* I found that a relax failure for gcc.c-torture/execute/930628-1.c
2439 was due to gas incorrectly relaxing an out-of-range conditional
2440 branch with delay slot. It turned:
2441 bf.s L6 (slot mov.l r12,@(44,r0))
2442 into:
2443
2444 2c: 8f 01 a0 8b bf.s 32 <_main+32> (slot bra L6)
2445 30: 00 09 nop
2446 32: 10 cb mov.l r12,@(44,r0)
2447 Therefore, branches with delay slots have to be handled
2448 differently from ones without delay slots. */
2449 {
2450 unsigned char *buffer =
2451 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
2452 int highbyte = target_big_endian ? 0 : 1;
2453 int lowbyte = target_big_endian ? 1 : 0;
2454 int delay = fragP->fr_subtype == C (COND_JUMP_DELAY, COND12);
2455
2456 /* Toggle the true/false bit of the bcond. */
2457 buffer[highbyte] ^= 0x2;
2458
2459 /* If this is a delayed branch, we may not put the bra in the
2460 slot. So we change it to a non-delayed branch, like that:
2461 b! cond slot_label; bra disp; slot_label: slot_insn
2462 ??? We should try if swapping the conditional branch and
2463 its delay-slot insn already makes the branch reach. */
2464
2465 /* Build a relocation to six / four bytes farther on. */
2466 subseg_change (seg, 0);
2467 fix_new (fragP, fragP->fr_fix, 2,
2468 #ifdef BFD_ASSEMBLER
2469 section_symbol (seg),
2470 #else
2471 seg_info (seg)->dot,
2472 #endif
2473 fragP->fr_address + fragP->fr_fix + (delay ? 4 : 6),
2474 1, BFD_RELOC_SH_PCDISP8BY2);
2475
2476 /* Set up a jump instruction. */
2477 buffer[highbyte + 2] = 0xa0;
2478 buffer[lowbyte + 2] = 0;
2479 fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
2480 fragP->fr_offset, 1, BFD_RELOC_SH_PCDISP12BY2);
2481
2482 if (delay)
2483 {
2484 buffer[highbyte] &= ~0x4; /* Removes delay slot from branch. */
2485 fragP->fr_fix += 4;
2486 }
2487 else
2488 {
2489 /* Fill in a NOP instruction. */
2490 buffer[highbyte + 4] = 0x0;
2491 buffer[lowbyte + 4] = 0x9;
2492
2493 fragP->fr_fix += 6;
2494 }
2495 fragP->fr_var = 0;
2496 donerelax = 1;
2497 }
2498 break;
2499
2500 case C (COND_JUMP, COND32):
2501 case C (COND_JUMP_DELAY, COND32):
2502 case C (COND_JUMP, UNDEF_WORD_DISP):
2503 case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
2504 if (fragP->fr_symbol == NULL)
2505 as_bad_where (fragP->fr_file, fragP->fr_line,
2506 _("displacement overflows 8-bit field"));
2507 else if (S_IS_DEFINED (fragP->fr_symbol))
2508 as_bad_where (fragP->fr_file, fragP->fr_line,
2509 _("displacement to defined symbol %s overflows 8-bit field"),
2510 S_GET_NAME (fragP->fr_symbol));
2511 else
2512 as_bad_where (fragP->fr_file, fragP->fr_line,
2513 _("displacement to undefined symbol %s overflows 8-bit field "),
2514 S_GET_NAME (fragP->fr_symbol));
2515 /* Stabilize this frag, so we don't trip an assert. */
2516 fragP->fr_fix += fragP->fr_var;
2517 fragP->fr_var = 0;
2518 break;
2519
2520 default:
2521 abort ();
2522 }
2523
2524 if (donerelax && !sh_relax)
2525 as_warn_where (fragP->fr_file, fragP->fr_line,
2526 _("overflow in branch to %s; converted into longer instruction sequence"),
2527 (fragP->fr_symbol != NULL
2528 ? S_GET_NAME (fragP->fr_symbol)
2529 : ""));
2530 }
2531
2532 valueT
2533 md_section_align (seg, size)
2534 segT seg ATTRIBUTE_UNUSED;
2535 valueT size;
2536 {
2537 #ifdef BFD_ASSEMBLER
2538 #ifdef OBJ_ELF
2539 return size;
2540 #else /* ! OBJ_ELF */
2541 return ((size + (1 << bfd_get_section_alignment (stdoutput, seg)) - 1)
2542 & (-1 << bfd_get_section_alignment (stdoutput, seg)));
2543 #endif /* ! OBJ_ELF */
2544 #else /* ! BFD_ASSEMBLER */
2545 return ((size + (1 << section_alignment[(int) seg]) - 1)
2546 & (-1 << section_alignment[(int) seg]));
2547 #endif /* ! BFD_ASSEMBLER */
2548 }
2549
2550 /* This static variable is set by s_uacons to tell sh_cons_align that
2551 the expession does not need to be aligned. */
2552
2553 static int sh_no_align_cons = 0;
2554
2555 /* This handles the unaligned space allocation pseudo-ops, such as
2556 .uaword. .uaword is just like .word, but the value does not need
2557 to be aligned. */
2558
2559 static void
2560 s_uacons (bytes)
2561 int bytes;
2562 {
2563 /* Tell sh_cons_align not to align this value. */
2564 sh_no_align_cons = 1;
2565 cons (bytes);
2566 }
2567
2568 /* If a .word, et. al., pseud-op is seen, warn if the value is not
2569 aligned correctly. Note that this can cause warnings to be issued
2570 when assembling initialized structured which were declared with the
2571 packed attribute. FIXME: Perhaps we should require an option to
2572 enable this warning? */
2573
2574 void
2575 sh_cons_align (nbytes)
2576 int nbytes;
2577 {
2578 int nalign;
2579 char *p;
2580
2581 if (sh_no_align_cons)
2582 {
2583 /* This is an unaligned pseudo-op. */
2584 sh_no_align_cons = 0;
2585 return;
2586 }
2587
2588 nalign = 0;
2589 while ((nbytes & 1) == 0)
2590 {
2591 ++nalign;
2592 nbytes >>= 1;
2593 }
2594
2595 if (nalign == 0)
2596 return;
2597
2598 if (now_seg == absolute_section)
2599 {
2600 if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
2601 as_warn (_("misaligned data"));
2602 return;
2603 }
2604
2605 p = frag_var (rs_align_test, 1, 1, (relax_substateT) 0,
2606 (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
2607
2608 record_alignment (now_seg, nalign);
2609 }
2610
2611 /* When relaxing, we need to output a reloc for any .align directive
2612 that requests alignment to a four byte boundary or larger. This is
2613 also where we check for misaligned data. */
2614
2615 void
2616 sh_handle_align (frag)
2617 fragS *frag;
2618 {
2619 int bytes = frag->fr_next->fr_address - frag->fr_address - frag->fr_fix;
2620
2621 if (frag->fr_type == rs_align_code)
2622 {
2623 static const unsigned char big_nop_pattern[] = { 0x00, 0x09 };
2624 static const unsigned char little_nop_pattern[] = { 0x09, 0x00 };
2625
2626 char *p = frag->fr_literal + frag->fr_fix;
2627
2628 if (bytes & 1)
2629 {
2630 *p++ = 0;
2631 bytes--;
2632 frag->fr_fix += 1;
2633 }
2634
2635 if (target_big_endian)
2636 {
2637 memcpy (p, big_nop_pattern, sizeof big_nop_pattern);
2638 frag->fr_var = sizeof big_nop_pattern;
2639 }
2640 else
2641 {
2642 memcpy (p, little_nop_pattern, sizeof little_nop_pattern);
2643 frag->fr_var = sizeof little_nop_pattern;
2644 }
2645 }
2646 else if (frag->fr_type == rs_align_test)
2647 {
2648 if (bytes != 0)
2649 as_warn_where (frag->fr_file, frag->fr_line, _("misaligned data"));
2650 }
2651
2652 if (sh_relax
2653 && (frag->fr_type == rs_align
2654 || frag->fr_type == rs_align_code)
2655 && frag->fr_address + frag->fr_fix > 0
2656 && frag->fr_offset > 1
2657 && now_seg != bss_section)
2658 fix_new (frag, frag->fr_fix, 2, &abs_symbol, frag->fr_offset, 0,
2659 BFD_RELOC_SH_ALIGN);
2660 }
2661
2662 /* This macro decides whether a particular reloc is an entry in a
2663 switch table. It is used when relaxing, because the linker needs
2664 to know about all such entries so that it can adjust them if
2665 necessary. */
2666
2667 #ifdef BFD_ASSEMBLER
2668 #define SWITCH_TABLE_CONS(fix) (0)
2669 #else
2670 #define SWITCH_TABLE_CONS(fix) \
2671 ((fix)->fx_r_type == 0 \
2672 && ((fix)->fx_size == 2 \
2673 || (fix)->fx_size == 1 \
2674 || (fix)->fx_size == 4))
2675 #endif
2676
2677 #define SWITCH_TABLE(fix) \
2678 ((fix)->fx_addsy != NULL \
2679 && (fix)->fx_subsy != NULL \
2680 && S_GET_SEGMENT ((fix)->fx_addsy) == text_section \
2681 && S_GET_SEGMENT ((fix)->fx_subsy) == text_section \
2682 && ((fix)->fx_r_type == BFD_RELOC_32 \
2683 || (fix)->fx_r_type == BFD_RELOC_16 \
2684 || (fix)->fx_r_type == BFD_RELOC_8 \
2685 || SWITCH_TABLE_CONS (fix)))
2686
2687 /* See whether we need to force a relocation into the output file.
2688 This is used to force out switch and PC relative relocations when
2689 relaxing. */
2690
2691 int
2692 sh_force_relocation (fix)
2693 fixS *fix;
2694 {
2695
2696 if (fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2697 || fix->fx_r_type == BFD_RELOC_VTABLE_ENTRY
2698 || fix->fx_r_type == BFD_RELOC_SH_LOOP_START
2699 || fix->fx_r_type == BFD_RELOC_SH_LOOP_END)
2700 return 1;
2701
2702 if (! sh_relax)
2703 return 0;
2704
2705 return (fix->fx_pcrel
2706 || SWITCH_TABLE (fix)
2707 || fix->fx_r_type == BFD_RELOC_SH_COUNT
2708 || fix->fx_r_type == BFD_RELOC_SH_ALIGN
2709 || fix->fx_r_type == BFD_RELOC_SH_CODE
2710 || fix->fx_r_type == BFD_RELOC_SH_DATA
2711 || fix->fx_r_type == BFD_RELOC_SH_LABEL);
2712 }
2713
2714 #ifdef OBJ_ELF
2715 boolean
2716 sh_fix_adjustable (fixP)
2717 fixS *fixP;
2718 {
2719
2720 if (fixP->fx_addsy == NULL)
2721 return 1;
2722
2723 if (fixP->fx_r_type == BFD_RELOC_SH_PCDISP8BY2
2724 || fixP->fx_r_type == BFD_RELOC_SH_PCDISP12BY2
2725 || fixP->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY2
2726 || fixP->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY4
2727 || fixP->fx_r_type == BFD_RELOC_8_PCREL
2728 || fixP->fx_r_type == BFD_RELOC_SH_SWITCH16
2729 || fixP->fx_r_type == BFD_RELOC_SH_SWITCH32)
2730 return 1;
2731
2732 if (! TC_RELOC_RTSYM_LOC_FIXUP (fixP)
2733 || fixP->fx_r_type == BFD_RELOC_RVA)
2734 return 0;
2735
2736 /* We need the symbol name for the VTABLE entries */
2737 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2738 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2739 return 0;
2740
2741 return 1;
2742 }
2743
2744 void
2745 sh_elf_final_processing ()
2746 {
2747 int val;
2748
2749 /* Set file-specific flags to indicate if this code needs
2750 a processor with the sh-dsp / sh3e ISA to execute. */
2751 if (valid_arch & arch_sh1)
2752 val = EF_SH1;
2753 else if (valid_arch & arch_sh2)
2754 val = EF_SH2;
2755 else if (valid_arch & arch_sh_dsp)
2756 val = EF_SH_DSP;
2757 else if (valid_arch & arch_sh3)
2758 val = EF_SH3;
2759 else if (valid_arch & arch_sh3_dsp)
2760 val = EF_SH_DSP;
2761 else if (valid_arch & arch_sh3e)
2762 val = EF_SH3E;
2763 else if (valid_arch & arch_sh4)
2764 val = EF_SH4;
2765 else
2766 abort ();
2767
2768 elf_elfheader (stdoutput)->e_flags &= ~EF_SH_MACH_MASK;
2769 elf_elfheader (stdoutput)->e_flags |= val;
2770 }
2771 #endif
2772
2773 /* Apply a fixup to the object file. */
2774
2775 void
2776 md_apply_fix3 (fixP, valP, seg)
2777 fixS * fixP;
2778 valueT * valP;
2779 segT seg ATTRIBUTE_UNUSED;
2780 {
2781 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2782 int lowbyte = target_big_endian ? 1 : 0;
2783 int highbyte = target_big_endian ? 0 : 1;
2784 long val = * (long *) valP;
2785 long max, min;
2786 int shift;
2787
2788 #ifdef BFD_ASSEMBLER
2789 /* A difference between two symbols, the second of which is in the
2790 current section, is transformed in a PC-relative relocation to
2791 the other symbol. We have to adjust the relocation type here. */
2792 if (fixP->fx_pcrel)
2793 {
2794 switch (fixP->fx_r_type)
2795 {
2796 default:
2797 break;
2798
2799 case BFD_RELOC_32:
2800 fixP->fx_r_type = BFD_RELOC_32_PCREL;
2801 break;
2802
2803 /* Currently, we only support 32-bit PCREL relocations.
2804 We'd need a new reloc type to handle 16_PCREL, and
2805 8_PCREL is already taken for R_SH_SWITCH8, which
2806 apparently does something completely different than what
2807 we need. FIXME. */
2808 case BFD_RELOC_16:
2809 bfd_set_error (bfd_error_bad_value);
2810 return;
2811
2812 case BFD_RELOC_8:
2813 bfd_set_error (bfd_error_bad_value);
2814 return;
2815 }
2816 }
2817
2818 /* The function adjust_reloc_syms won't convert a reloc against a weak
2819 symbol into a reloc against a section, but bfd_install_relocation
2820 will screw up if the symbol is defined, so we have to adjust val here
2821 to avoid the screw up later.
2822
2823 For ordinary relocs, this does not happen for ELF, since for ELF,
2824 bfd_install_relocation uses the "special function" field of the
2825 howto, and does not execute the code that needs to be undone, as long
2826 as the special function does not return bfd_reloc_continue.
2827 It can happen for GOT- and PLT-type relocs the way they are
2828 described in elf32-sh.c as they use bfd_elf_generic_reloc, but it
2829 doesn't matter here since those relocs don't use VAL; see below. */
2830 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2831 && fixP->fx_addsy != NULL
2832 && S_IS_WEAK (fixP->fx_addsy))
2833 val -= S_GET_VALUE (fixP->fx_addsy);
2834 #endif
2835
2836 #ifndef BFD_ASSEMBLER
2837 if (fixP->fx_r_type == 0)
2838 {
2839 if (fixP->fx_size == 2)
2840 fixP->fx_r_type = BFD_RELOC_16;
2841 else if (fixP->fx_size == 4)
2842 fixP->fx_r_type = BFD_RELOC_32;
2843 else if (fixP->fx_size == 1)
2844 fixP->fx_r_type = BFD_RELOC_8;
2845 else
2846 abort ();
2847 }
2848 #endif
2849
2850 max = min = 0;
2851 shift = 0;
2852 switch (fixP->fx_r_type)
2853 {
2854 case BFD_RELOC_SH_IMM4:
2855 max = 0xf;
2856 *buf = (*buf & 0xf0) | (val & 0xf);
2857 break;
2858
2859 case BFD_RELOC_SH_IMM4BY2:
2860 max = 0xf;
2861 shift = 1;
2862 *buf = (*buf & 0xf0) | ((val >> 1) & 0xf);
2863 break;
2864
2865 case BFD_RELOC_SH_IMM4BY4:
2866 max = 0xf;
2867 shift = 2;
2868 *buf = (*buf & 0xf0) | ((val >> 2) & 0xf);
2869 break;
2870
2871 case BFD_RELOC_SH_IMM8BY2:
2872 max = 0xff;
2873 shift = 1;
2874 *buf = val >> 1;
2875 break;
2876
2877 case BFD_RELOC_SH_IMM8BY4:
2878 max = 0xff;
2879 shift = 2;
2880 *buf = val >> 2;
2881 break;
2882
2883 case BFD_RELOC_8:
2884 case BFD_RELOC_SH_IMM8:
2885 /* Sometimes the 8 bit value is sign extended (e.g., add) and
2886 sometimes it is not (e.g., and). We permit any 8 bit value.
2887 Note that adding further restrictions may invalidate
2888 reasonable looking assembly code, such as ``and -0x1,r0''. */
2889 max = 0xff;
2890 min = -0xff;
2891 *buf++ = val;
2892 break;
2893
2894 case BFD_RELOC_SH_PCRELIMM8BY4:
2895 /* The lower two bits of the PC are cleared before the
2896 displacement is added in. We can assume that the destination
2897 is on a 4 byte bounday. If this instruction is also on a 4
2898 byte boundary, then we want
2899 (target - here) / 4
2900 and target - here is a multiple of 4.
2901 Otherwise, we are on a 2 byte boundary, and we want
2902 (target - (here - 2)) / 4
2903 and target - here is not a multiple of 4. Computing
2904 (target - (here - 2)) / 4 == (target - here + 2) / 4
2905 works for both cases, since in the first case the addition of
2906 2 will be removed by the division. target - here is in the
2907 variable val. */
2908 val = (val + 2) / 4;
2909 if (val & ~0xff)
2910 as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2911 buf[lowbyte] = val;
2912 break;
2913
2914 case BFD_RELOC_SH_PCRELIMM8BY2:
2915 val /= 2;
2916 if (val & ~0xff)
2917 as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2918 buf[lowbyte] = val;
2919 break;
2920
2921 case BFD_RELOC_SH_PCDISP8BY2:
2922 val /= 2;
2923 if (val < -0x80 || val > 0x7f)
2924 as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2925 buf[lowbyte] = val;
2926 break;
2927
2928 case BFD_RELOC_SH_PCDISP12BY2:
2929 val /= 2;
2930 if (val < -0x800 || val > 0x7ff)
2931 as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2932 buf[lowbyte] = val & 0xff;
2933 buf[highbyte] |= (val >> 8) & 0xf;
2934 break;
2935
2936 case BFD_RELOC_32:
2937 case BFD_RELOC_32_PCREL:
2938 md_number_to_chars (buf, val, 4);
2939 break;
2940
2941 case BFD_RELOC_16:
2942 md_number_to_chars (buf, val, 2);
2943 break;
2944
2945 case BFD_RELOC_SH_USES:
2946 /* Pass the value into sh_coff_reloc_mangle. */
2947 fixP->fx_addnumber = val;
2948 break;
2949
2950 case BFD_RELOC_SH_COUNT:
2951 case BFD_RELOC_SH_ALIGN:
2952 case BFD_RELOC_SH_CODE:
2953 case BFD_RELOC_SH_DATA:
2954 case BFD_RELOC_SH_LABEL:
2955 /* Nothing to do here. */
2956 break;
2957
2958 case BFD_RELOC_SH_LOOP_START:
2959 case BFD_RELOC_SH_LOOP_END:
2960
2961 case BFD_RELOC_VTABLE_INHERIT:
2962 case BFD_RELOC_VTABLE_ENTRY:
2963 fixP->fx_done = 0;
2964 return;
2965
2966 #ifdef OBJ_ELF
2967 case BFD_RELOC_32_PLT_PCREL:
2968 /* Make the jump instruction point to the address of the operand. At
2969 runtime we merely add the offset to the actual PLT entry. */
2970 * valP = 0xfffffffc;
2971 val = fixP->fx_addnumber - S_GET_VALUE (fixP->fx_subsy);
2972 md_number_to_chars (buf, val, 4);
2973 break;
2974
2975 case BFD_RELOC_SH_GOTPC:
2976 /* This is tough to explain. We end up with this one if we have
2977 operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]".
2978 The goal here is to obtain the absolute address of the GOT,
2979 and it is strongly preferable from a performance point of
2980 view to avoid using a runtime relocation for this. There are
2981 cases where you have something like:
2982
2983 .long _GLOBAL_OFFSET_TABLE_+[.-.L66]
2984
2985 and here no correction would be required. Internally in the
2986 assembler we treat operands of this form as not being pcrel
2987 since the '.' is explicitly mentioned, and I wonder whether
2988 it would simplify matters to do it this way. Who knows. In
2989 earlier versions of the PIC patches, the pcrel_adjust field
2990 was used to store the correction, but since the expression is
2991 not pcrel, I felt it would be confusing to do it this way. */
2992 * valP -= 1;
2993 md_number_to_chars (buf, val, 4);
2994 break;
2995
2996 case BFD_RELOC_32_GOT_PCREL:
2997 * valP = 0; /* Fully resolved at runtime. No addend. */
2998 md_number_to_chars (buf, 0, 4);
2999 break;
3000
3001 case BFD_RELOC_32_GOTOFF:
3002 md_number_to_chars (buf, val, 4);
3003 break;
3004 #endif
3005
3006 default:
3007 abort ();
3008 }
3009
3010 if (shift != 0)
3011 {
3012 if ((val & ((1 << shift) - 1)) != 0)
3013 as_bad_where (fixP->fx_file, fixP->fx_line, _("misaligned offset"));
3014 if (val >= 0)
3015 val >>= shift;
3016 else
3017 val = ((val >> shift)
3018 | ((long) -1 & ~ ((long) -1 >> shift)));
3019 }
3020 if (max != 0 && (val < min || val > max))
3021 as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
3022
3023 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
3024 fixP->fx_done = 1;
3025 }
3026
3027 /* Called just before address relaxation. Return the length
3028 by which a fragment must grow to reach it's destination. */
3029
3030 int
3031 md_estimate_size_before_relax (fragP, segment_type)
3032 register fragS *fragP;
3033 register segT segment_type;
3034 {
3035 int what;
3036
3037 switch (fragP->fr_subtype)
3038 {
3039 default:
3040 abort ();
3041
3042 case C (UNCOND_JUMP, UNDEF_DISP):
3043 /* Used to be a branch to somewhere which was unknown. */
3044 if (!fragP->fr_symbol)
3045 {
3046 fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
3047 }
3048 else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
3049 {
3050 fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
3051 }
3052 else
3053 {
3054 fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
3055 }
3056 break;
3057
3058 case C (COND_JUMP, UNDEF_DISP):
3059 case C (COND_JUMP_DELAY, UNDEF_DISP):
3060 what = GET_WHAT (fragP->fr_subtype);
3061 /* Used to be a branch to somewhere which was unknown. */
3062 if (fragP->fr_symbol
3063 && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
3064 {
3065 /* Got a symbol and it's defined in this segment, become byte
3066 sized - maybe it will fix up. */
3067 fragP->fr_subtype = C (what, COND8);
3068 }
3069 else if (fragP->fr_symbol)
3070 {
3071 /* Its got a segment, but its not ours, so it will always be long. */
3072 fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
3073 }
3074 else
3075 {
3076 /* We know the abs value. */
3077 fragP->fr_subtype = C (what, COND8);
3078 }
3079 break;
3080
3081 case C (UNCOND_JUMP, UNCOND12):
3082 case C (UNCOND_JUMP, UNCOND32):
3083 case C (UNCOND_JUMP, UNDEF_WORD_DISP):
3084 case C (COND_JUMP, COND8):
3085 case C (COND_JUMP, COND12):
3086 case C (COND_JUMP, COND32):
3087 case C (COND_JUMP, UNDEF_WORD_DISP):
3088 case C (COND_JUMP_DELAY, COND8):
3089 case C (COND_JUMP_DELAY, COND12):
3090 case C (COND_JUMP_DELAY, COND32):
3091 case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
3092 /* When relaxing a section for the second time, we don't need to
3093 do anything besides return the current size. */
3094 break;
3095 }
3096
3097 fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
3098 return fragP->fr_var;
3099 }
3100
3101 /* Put number into target byte order. */
3102
3103 void
3104 md_number_to_chars (ptr, use, nbytes)
3105 char *ptr;
3106 valueT use;
3107 int nbytes;
3108 {
3109 if (! target_big_endian)
3110 number_to_chars_littleendian (ptr, use, nbytes);
3111 else
3112 number_to_chars_bigendian (ptr, use, nbytes);
3113 }
3114
3115 long
3116 md_pcrel_from_section (fixP, sec)
3117 fixS *fixP;
3118 segT sec;
3119 {
3120 if (fixP->fx_addsy != (symbolS *) NULL
3121 && (! S_IS_DEFINED (fixP->fx_addsy)
3122 || S_IS_EXTERN (fixP->fx_addsy)
3123 || S_IS_WEAK (fixP->fx_addsy)
3124 || S_GET_SEGMENT (fixP->fx_addsy) != sec))
3125 {
3126 /* The symbol is undefined (or is defined but not in this section,
3127 or we're not sure about it being the final definition). Let the
3128 linker figure it out. We need to adjust the subtraction of a
3129 symbol to the position of the relocated data, though. */
3130 return fixP->fx_subsy ? fixP->fx_where + fixP->fx_frag->fr_address : 0;
3131 }
3132
3133 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address + 2;
3134 }
3135
3136 #ifdef OBJ_COFF
3137
3138 int
3139 tc_coff_sizemachdep (frag)
3140 fragS *frag;
3141 {
3142 return md_relax_table[frag->fr_subtype].rlx_length;
3143 }
3144
3145 #endif /* OBJ_COFF */
3146
3147 #ifndef BFD_ASSEMBLER
3148 #ifdef OBJ_COFF
3149
3150 /* Map BFD relocs to SH COFF relocs. */
3151
3152 struct reloc_map
3153 {
3154 bfd_reloc_code_real_type bfd_reloc;
3155 int sh_reloc;
3156 };
3157
3158 static const struct reloc_map coff_reloc_map[] =
3159 {
3160 { BFD_RELOC_32, R_SH_IMM32 },
3161 { BFD_RELOC_16, R_SH_IMM16 },
3162 { BFD_RELOC_8, R_SH_IMM8 },
3163 { BFD_RELOC_SH_PCDISP8BY2, R_SH_PCDISP8BY2 },
3164 { BFD_RELOC_SH_PCDISP12BY2, R_SH_PCDISP },
3165 { BFD_RELOC_SH_IMM4, R_SH_IMM4 },
3166 { BFD_RELOC_SH_IMM4BY2, R_SH_IMM4BY2 },
3167 { BFD_RELOC_SH_IMM4BY4, R_SH_IMM4BY4 },
3168 { BFD_RELOC_SH_IMM8, R_SH_IMM8 },
3169 { BFD_RELOC_SH_IMM8BY2, R_SH_IMM8BY2 },
3170 { BFD_RELOC_SH_IMM8BY4, R_SH_IMM8BY4 },
3171 { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_PCRELIMM8BY2 },
3172 { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_PCRELIMM8BY4 },
3173 { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
3174 { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
3175 { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
3176 { BFD_RELOC_SH_USES, R_SH_USES },
3177 { BFD_RELOC_SH_COUNT, R_SH_COUNT },
3178 { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
3179 { BFD_RELOC_SH_CODE, R_SH_CODE },
3180 { BFD_RELOC_SH_DATA, R_SH_DATA },
3181 { BFD_RELOC_SH_LABEL, R_SH_LABEL },
3182 { BFD_RELOC_UNUSED, 0 }
3183 };
3184
3185 /* Adjust a reloc for the SH. This is similar to the generic code,
3186 but does some minor tweaking. */
3187
3188 void
3189 sh_coff_reloc_mangle (seg, fix, intr, paddr)
3190 segment_info_type *seg;
3191 fixS *fix;
3192 struct internal_reloc *intr;
3193 unsigned int paddr;
3194 {
3195 symbolS *symbol_ptr = fix->fx_addsy;
3196 symbolS *dot;
3197
3198 intr->r_vaddr = paddr + fix->fx_frag->fr_address + fix->fx_where;
3199
3200 if (! SWITCH_TABLE (fix))
3201 {
3202 const struct reloc_map *rm;
3203
3204 for (rm = coff_reloc_map; rm->bfd_reloc != BFD_RELOC_UNUSED; rm++)
3205 if (rm->bfd_reloc == (bfd_reloc_code_real_type) fix->fx_r_type)
3206 break;
3207 if (rm->bfd_reloc == BFD_RELOC_UNUSED)
3208 as_bad_where (fix->fx_file, fix->fx_line,
3209 _("Can not represent %s relocation in this object file format"),
3210 bfd_get_reloc_code_name (fix->fx_r_type));
3211 intr->r_type = rm->sh_reloc;
3212 intr->r_offset = 0;
3213 }
3214 else
3215 {
3216 know (sh_relax);
3217
3218 if (fix->fx_r_type == BFD_RELOC_16)
3219 intr->r_type = R_SH_SWITCH16;
3220 else if (fix->fx_r_type == BFD_RELOC_8)
3221 intr->r_type = R_SH_SWITCH8;
3222 else if (fix->fx_r_type == BFD_RELOC_32)
3223 intr->r_type = R_SH_SWITCH32;
3224 else
3225 abort ();
3226
3227 /* For a switch reloc, we set r_offset to the difference between
3228 the reloc address and the subtrahend. When the linker is
3229 doing relaxing, it can use the determine the starting and
3230 ending points of the switch difference expression. */
3231 intr->r_offset = intr->r_vaddr - S_GET_VALUE (fix->fx_subsy);
3232 }
3233
3234 /* PC relative relocs are always against the current section. */
3235 if (symbol_ptr == NULL)
3236 {
3237 switch (fix->fx_r_type)
3238 {
3239 case BFD_RELOC_SH_PCRELIMM8BY2:
3240 case BFD_RELOC_SH_PCRELIMM8BY4:
3241 case BFD_RELOC_SH_PCDISP8BY2:
3242 case BFD_RELOC_SH_PCDISP12BY2:
3243 case BFD_RELOC_SH_USES:
3244 symbol_ptr = seg->dot;
3245 break;
3246 default:
3247 break;
3248 }
3249 }
3250
3251 if (fix->fx_r_type == BFD_RELOC_SH_USES)
3252 {
3253 /* We can't store the offset in the object file, since this
3254 reloc does not take up any space, so we store it in r_offset.
3255 The fx_addnumber field was set in md_apply_fix3. */
3256 intr->r_offset = fix->fx_addnumber;
3257 }
3258 else if (fix->fx_r_type == BFD_RELOC_SH_COUNT)
3259 {
3260 /* We can't store the count in the object file, since this reloc
3261 does not take up any space, so we store it in r_offset. The
3262 fx_offset field was set when the fixup was created in
3263 sh_coff_frob_file. */
3264 intr->r_offset = fix->fx_offset;
3265 /* This reloc is always absolute. */
3266 symbol_ptr = NULL;
3267 }
3268 else if (fix->fx_r_type == BFD_RELOC_SH_ALIGN)
3269 {
3270 /* Store the alignment in the r_offset field. */
3271 intr->r_offset = fix->fx_offset;
3272 /* This reloc is always absolute. */
3273 symbol_ptr = NULL;
3274 }
3275 else if (fix->fx_r_type == BFD_RELOC_SH_CODE
3276 || fix->fx_r_type == BFD_RELOC_SH_DATA
3277 || fix->fx_r_type == BFD_RELOC_SH_LABEL)
3278 {
3279 /* These relocs are always absolute. */
3280 symbol_ptr = NULL;
3281 }
3282
3283 /* Turn the segment of the symbol into an offset. */
3284 if (symbol_ptr != NULL)
3285 {
3286 dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
3287 if (dot != NULL)
3288 intr->r_symndx = dot->sy_number;
3289 else
3290 intr->r_symndx = symbol_ptr->sy_number;
3291 }
3292 else
3293 intr->r_symndx = -1;
3294 }
3295
3296 #endif /* OBJ_COFF */
3297 #endif /* ! BFD_ASSEMBLER */
3298
3299 #ifdef BFD_ASSEMBLER
3300
3301 /* Create a reloc. */
3302
3303 arelent *
3304 tc_gen_reloc (section, fixp)
3305 asection *section ATTRIBUTE_UNUSED;
3306 fixS *fixp;
3307 {
3308 arelent *rel;
3309 bfd_reloc_code_real_type r_type;
3310
3311 rel = (arelent *) xmalloc (sizeof (arelent));
3312 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
3313 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3314 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
3315
3316 if (fixp->fx_subsy
3317 && S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
3318 {
3319 fixp->fx_addnumber -= S_GET_VALUE (fixp->fx_subsy);
3320 fixp->fx_subsy = 0;
3321 }
3322
3323 r_type = fixp->fx_r_type;
3324
3325 if (SWITCH_TABLE (fixp))
3326 {
3327 rel->addend = rel->address - S_GET_VALUE (fixp->fx_subsy);
3328 if (r_type == BFD_RELOC_16)
3329 r_type = BFD_RELOC_SH_SWITCH16;
3330 else if (r_type == BFD_RELOC_8)
3331 r_type = BFD_RELOC_8_PCREL;
3332 else if (r_type == BFD_RELOC_32)
3333 r_type = BFD_RELOC_SH_SWITCH32;
3334 else
3335 abort ();
3336 }
3337 else if (r_type == BFD_RELOC_SH_USES)
3338 rel->addend = fixp->fx_addnumber;
3339 else if (r_type == BFD_RELOC_SH_COUNT)
3340 rel->addend = fixp->fx_offset;
3341 else if (r_type == BFD_RELOC_SH_ALIGN)
3342 rel->addend = fixp->fx_offset;
3343 else if (r_type == BFD_RELOC_VTABLE_INHERIT
3344 || r_type == BFD_RELOC_VTABLE_ENTRY)
3345 rel->addend = fixp->fx_offset;
3346 else if (r_type == BFD_RELOC_SH_LOOP_START
3347 || r_type == BFD_RELOC_SH_LOOP_END)
3348 rel->addend = fixp->fx_offset;
3349 else if (r_type == BFD_RELOC_SH_LABEL && fixp->fx_pcrel)
3350 {
3351 rel->addend = 0;
3352 rel->address = rel->addend = fixp->fx_offset;
3353 }
3354 else if (fixp->fx_pcrel)
3355 rel->addend = fixp->fx_addnumber;
3356 else if (r_type == BFD_RELOC_32 || r_type == BFD_RELOC_32_GOTOFF)
3357 rel->addend = fixp->fx_addnumber;
3358 else
3359 rel->addend = 0;
3360
3361 rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
3362 if (rel->howto == NULL || fixp->fx_subsy)
3363 {
3364 as_bad_where (fixp->fx_file, fixp->fx_line,
3365 _("Cannot represent relocation type %s"),
3366 bfd_get_reloc_code_name (r_type));
3367 /* Set howto to a garbage value so that we can keep going. */
3368 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
3369 assert (rel->howto != NULL);
3370 }
3371
3372 return rel;
3373 }
3374
3375 #ifdef OBJ_ELF
3376 inline static char *
3377 sh_end_of_match (cont, what)
3378 char *cont, *what;
3379 {
3380 int len = strlen (what);
3381
3382 if (strncasecmp (cont, what, strlen (what)) == 0
3383 && ! is_part_of_name (cont[len]))
3384 return cont + len;
3385
3386 return NULL;
3387 }
3388
3389 int
3390 sh_parse_name (name, exprP, nextcharP)
3391 char const *name;
3392 expressionS *exprP;
3393 char *nextcharP;
3394 {
3395 char *next = input_line_pointer;
3396 char *next_end;
3397 int reloc_type;
3398 segT segment;
3399
3400 exprP->X_op_symbol = NULL;
3401
3402 if (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
3403 {
3404 if (! GOT_symbol)
3405 GOT_symbol = symbol_find_or_make (name);
3406
3407 exprP->X_add_symbol = GOT_symbol;
3408 no_suffix:
3409 /* If we have an absolute symbol or a reg, then we know its
3410 value now. */
3411 segment = S_GET_SEGMENT (exprP->X_add_symbol);
3412 if (segment == absolute_section)
3413 {
3414 exprP->X_op = O_constant;
3415 exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
3416 exprP->X_add_symbol = NULL;
3417 }
3418 else if (segment == reg_section)
3419 {
3420 exprP->X_op = O_register;
3421 exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
3422 exprP->X_add_symbol = NULL;
3423 }
3424 else
3425 {
3426 exprP->X_op = O_symbol;
3427 exprP->X_add_number = 0;
3428 }
3429
3430 return 1;
3431 }
3432
3433 exprP->X_add_symbol = symbol_find_or_make (name);
3434
3435 if (*nextcharP != '@')
3436 goto no_suffix;
3437 else if ((next_end = sh_end_of_match (next + 1, "GOTOFF")))
3438 reloc_type = BFD_RELOC_32_GOTOFF;
3439 else if ((next_end = sh_end_of_match (next + 1, "GOT")))
3440 reloc_type = BFD_RELOC_32_GOT_PCREL;
3441 else if ((next_end = sh_end_of_match (next + 1, "PLT")))
3442 reloc_type = BFD_RELOC_32_PLT_PCREL;
3443 else
3444 goto no_suffix;
3445
3446 *input_line_pointer = *nextcharP;
3447 input_line_pointer = next_end;
3448 *nextcharP = *input_line_pointer;
3449 *input_line_pointer = '\0';
3450
3451 exprP->X_op = O_PIC_reloc;
3452 exprP->X_add_number = 0;
3453 exprP->X_md = reloc_type;
3454
3455 return 1;
3456 }
3457 #endif
3458 #endif /* BFD_ASSEMBLER */
This page took 0.106241 seconds and 5 git commands to generate.