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