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