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