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