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