tc-m32r.c revision 1.1.1.7 1 1.1 skrll /* tc-m32r.c -- Assembler for the Renesas M32R.
2 1.1.1.7 christos Copyright (C) 1996-2020 Free Software Foundation, Inc.
3 1.1 skrll
4 1.1 skrll This file is part of GAS, the GNU Assembler.
5 1.1 skrll
6 1.1 skrll GAS is free software; you can redistribute it and/or modify
7 1.1 skrll it under the terms of the GNU General Public License as published by
8 1.1 skrll the Free Software Foundation; either version 3, or (at your option)
9 1.1 skrll any later version.
10 1.1 skrll
11 1.1 skrll GAS is distributed in the hope that it will be useful,
12 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 skrll GNU General Public License for more details.
15 1.1 skrll
16 1.1 skrll You should have received a copy of the GNU General Public License
17 1.1 skrll along with GAS; see the file COPYING. If not, write to
18 1.1 skrll the Free Software Foundation, 51 Franklin Street - Fifth Floor,
19 1.1 skrll Boston, MA 02110-1301, USA. */
20 1.1 skrll
21 1.1 skrll #include "as.h"
22 1.1 skrll #include "safe-ctype.h"
23 1.1 skrll #include "subsegs.h"
24 1.1 skrll #include "symcat.h"
25 1.1 skrll #include "opcodes/m32r-desc.h"
26 1.1 skrll #include "opcodes/m32r-opc.h"
27 1.1 skrll #include "cgen.h"
28 1.1 skrll #include "elf/m32r.h"
29 1.1 skrll
30 1.1 skrll /* Linked list of symbols that are debugging symbols to be defined as the
31 1.1 skrll beginning of the current instruction. */
32 1.1 skrll typedef struct sym_link
33 1.1 skrll {
34 1.1 skrll struct sym_link *next;
35 1.1 skrll symbolS *symbol;
36 1.1 skrll } sym_linkS;
37 1.1 skrll
38 1.1 skrll static sym_linkS *debug_sym_link = (sym_linkS *) 0;
39 1.1 skrll
40 1.1 skrll /* Structure to hold all of the different components describing
41 1.1 skrll an individual instruction. */
42 1.1 skrll typedef struct
43 1.1 skrll {
44 1.1 skrll const CGEN_INSN *insn;
45 1.1 skrll const CGEN_INSN *orig_insn;
46 1.1 skrll CGEN_FIELDS fields;
47 1.1 skrll #if CGEN_INT_INSN_P
48 1.1 skrll CGEN_INSN_INT buffer[1];
49 1.1 skrll #define INSN_VALUE(buf) (*(buf))
50 1.1 skrll #else
51 1.1 skrll unsigned char buffer[CGEN_MAX_INSN_SIZE];
52 1.1 skrll #define INSN_VALUE(buf) (buf)
53 1.1 skrll #endif
54 1.1 skrll char *addr;
55 1.1 skrll fragS *frag;
56 1.1 skrll int num_fixups;
57 1.1 skrll fixS *fixups[GAS_CGEN_MAX_FIXUPS];
58 1.1 skrll int indices[MAX_OPERAND_INSTANCES];
59 1.1 skrll sym_linkS *debug_sym_link;
60 1.1 skrll }
61 1.1 skrll m32r_insn;
62 1.1 skrll
63 1.1 skrll /* prev_insn.insn is non-null if last insn was a 16 bit insn on a 32 bit
64 1.1 skrll boundary (i.e. was the first of two 16 bit insns). */
65 1.1 skrll static m32r_insn prev_insn;
66 1.1 skrll
67 1.1 skrll /* Non-zero if we've seen a relaxable insn since the last 32 bit
68 1.1 skrll alignment request. */
69 1.1 skrll static int seen_relaxable_p = 0;
70 1.1 skrll
71 1.1 skrll /* Non-zero if we are generating PIC code. */
72 1.1 skrll int pic_code;
73 1.1 skrll
74 1.1 skrll /* Non-zero if -relax specified, in which case sufficient relocs are output
75 1.1 skrll for the linker to do relaxing.
76 1.1 skrll We do simple forms of relaxing internally, but they are always done.
77 1.1 skrll This flag does not apply to them. */
78 1.1 skrll static int m32r_relax;
79 1.1 skrll
80 1.1 skrll /* Non-zero if warn when a high/shigh reloc has no matching low reloc.
81 1.1 skrll Each high/shigh reloc must be paired with it's low cousin in order to
82 1.1 skrll properly calculate the addend in a relocatable link (since there is a
83 1.1 skrll potential carry from the low to the high/shigh).
84 1.1 skrll This option is off by default though for user-written assembler code it
85 1.1 skrll might make sense to make the default be on (i.e. have gcc pass a flag
86 1.1 skrll to turn it off). This warning must not be on for GCC created code as
87 1.1 skrll optimization may delete the low but not the high/shigh (at least we
88 1.1 skrll shouldn't assume or require it to). */
89 1.1 skrll static int warn_unmatched_high = 0;
90 1.1 skrll
91 1.1 skrll /* 1 if -m32rx has been specified, in which case support for
92 1.1 skrll the extended M32RX instruction set should be enabled.
93 1.1 skrll 2 if -m32r2 has been specified, in which case support for
94 1.1 skrll the extended M32R2 instruction set should be enabled. */
95 1.1 skrll static int enable_m32rx = 0; /* Default to M32R. */
96 1.1 skrll
97 1.1 skrll /* Non-zero if -m32rx -hidden has been specified, in which case support for
98 1.1 skrll the special M32RX instruction set should be enabled. */
99 1.1 skrll static int enable_special = 0;
100 1.1 skrll
101 1.1 skrll /* Non-zero if -bitinst has been specified, in which case support
102 1.1 skrll for extended M32R bit-field instruction set should be enabled. */
103 1.1 skrll static int enable_special_m32r = 1;
104 1.1 skrll
105 1.1 skrll /* Non-zero if -float has been specified, in which case support for
106 1.1 skrll extended M32R floating point instruction set should be enabled. */
107 1.1 skrll static int enable_special_float = 0;
108 1.1 skrll
109 1.1 skrll /* Non-zero if the programmer should be warned when an explicit parallel
110 1.1 skrll instruction might have constraint violations. */
111 1.1 skrll static int warn_explicit_parallel_conflicts = 1;
112 1.1 skrll
113 1.1 skrll /* Non-zero if the programmer should not receive any messages about
114 1.1 skrll parallel instruction with potential or real constraint violations.
115 1.1 skrll The ability to suppress these messages is intended only for hardware
116 1.1.1.6 christos vendors testing the chip. It supersedes
117 1.1 skrll warn_explicit_parallel_conflicts. */
118 1.1 skrll static int ignore_parallel_conflicts = 0;
119 1.1 skrll
120 1.1 skrll /* Non-zero if insns can be made parallel. */
121 1.1 skrll static int use_parallel = 0;
122 1.1 skrll
123 1.1 skrll /* Non-zero if optimizations should be performed. */
124 1.1 skrll static int optimize;
125 1.1 skrll
126 1.1 skrll /* m32r er_flags. */
127 1.1 skrll static int m32r_flags = 0;
128 1.1 skrll
129 1.1 skrll /* Stuff for .scomm symbols. */
130 1.1 skrll static segT sbss_section;
131 1.1 skrll static asection scom_section;
132 1.1 skrll static asymbol scom_symbol;
133 1.1 skrll
134 1.1 skrll const char comment_chars[] = ";";
135 1.1 skrll const char line_comment_chars[] = "#";
136 1.1 skrll const char line_separator_chars[] = "!";
137 1.1 skrll const char EXP_CHARS[] = "eE";
138 1.1 skrll const char FLT_CHARS[] = "dD";
139 1.1 skrll
140 1.1 skrll /* Relocations against symbols are done in two
141 1.1 skrll parts, with a HI relocation and a LO relocation. Each relocation
142 1.1 skrll has only 16 bits of space to store an addend. This means that in
143 1.1 skrll order for the linker to handle carries correctly, it must be able
144 1.1 skrll to locate both the HI and the LO relocation. This means that the
145 1.1 skrll relocations must appear in order in the relocation table.
146 1.1 skrll
147 1.1 skrll In order to implement this, we keep track of each unmatched HI
148 1.1 skrll relocation. We then sort them so that they immediately precede the
149 1.1 skrll corresponding LO relocation. */
150 1.1 skrll
151 1.1 skrll struct m32r_hi_fixup
152 1.1 skrll {
153 1.1 skrll /* Next HI fixup. */
154 1.1 skrll struct m32r_hi_fixup *next;
155 1.1 skrll
156 1.1 skrll /* This fixup. */
157 1.1 skrll fixS *fixp;
158 1.1 skrll
159 1.1 skrll /* The section this fixup is in. */
160 1.1 skrll segT seg;
161 1.1 skrll };
162 1.1 skrll
163 1.1 skrll /* The list of unmatched HI relocs. */
164 1.1 skrll
165 1.1 skrll static struct m32r_hi_fixup *m32r_hi_fixup_list;
166 1.1 skrll
167 1.1.1.5 christos static const struct
169 1.1 skrll {
170 1.1 skrll enum bfd_architecture bfd_mach;
171 1.1 skrll int mach_flags;
172 1.1 skrll } mach_table[] =
173 1.1 skrll {
174 1.1 skrll { bfd_mach_m32r, (1<<MACH_M32R) },
175 1.1 skrll { bfd_mach_m32rx, (1<<MACH_M32RX) },
176 1.1 skrll { bfd_mach_m32r2, (1<<MACH_M32R2) }
177 1.1 skrll };
178 1.1 skrll
179 1.1 skrll static void
180 1.1 skrll allow_m32rx (int on)
181 1.1 skrll {
182 1.1 skrll enable_m32rx = on;
183 1.1 skrll
184 1.1 skrll if (stdoutput != NULL)
185 1.1 skrll bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach_table[on].bfd_mach);
186 1.1 skrll
187 1.1 skrll if (gas_cgen_cpu_desc != NULL)
188 1.1 skrll gas_cgen_cpu_desc->machs = mach_table[on].mach_flags;
189 1.1 skrll }
190 1.1 skrll
191 1.1 skrll #define M32R_SHORTOPTS "O::K:"
193 1.1 skrll
194 1.1 skrll const char *md_shortopts = M32R_SHORTOPTS;
195 1.1 skrll
196 1.1 skrll enum md_option_enums
197 1.1 skrll {
198 1.1 skrll OPTION_M32R = OPTION_MD_BASE,
199 1.1 skrll OPTION_M32RX,
200 1.1 skrll OPTION_M32R2,
201 1.1 skrll OPTION_BIG,
202 1.1 skrll OPTION_LITTLE,
203 1.1 skrll OPTION_PARALLEL,
204 1.1 skrll OPTION_NO_PARALLEL,
205 1.1 skrll OPTION_WARN_PARALLEL,
206 1.1 skrll OPTION_NO_WARN_PARALLEL,
207 1.1 skrll OPTION_IGNORE_PARALLEL,
208 1.1 skrll OPTION_NO_IGNORE_PARALLEL,
209 1.1 skrll OPTION_SPECIAL,
210 1.1 skrll OPTION_SPECIAL_M32R,
211 1.1 skrll OPTION_NO_SPECIAL_M32R,
212 1.1 skrll OPTION_SPECIAL_FLOAT,
213 1.1 skrll OPTION_WARN_UNMATCHED,
214 1.1 skrll OPTION_NO_WARN_UNMATCHED
215 1.1 skrll };
216 1.1 skrll
217 1.1 skrll struct option md_longopts[] =
218 1.1 skrll {
219 1.1 skrll {"m32r", no_argument, NULL, OPTION_M32R},
220 1.1 skrll {"m32rx", no_argument, NULL, OPTION_M32RX},
221 1.1 skrll {"m32r2", no_argument, NULL, OPTION_M32R2},
222 1.1 skrll {"big", no_argument, NULL, OPTION_BIG},
223 1.1 skrll {"little", no_argument, NULL, OPTION_LITTLE},
224 1.1 skrll {"EB", no_argument, NULL, OPTION_BIG},
225 1.1 skrll {"EL", no_argument, NULL, OPTION_LITTLE},
226 1.1 skrll {"parallel", no_argument, NULL, OPTION_PARALLEL},
227 1.1 skrll {"no-parallel", no_argument, NULL, OPTION_NO_PARALLEL},
228 1.1 skrll {"warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_WARN_PARALLEL},
229 1.1 skrll {"Wp", no_argument, NULL, OPTION_WARN_PARALLEL},
230 1.1 skrll {"no-warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
231 1.1 skrll {"Wnp", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
232 1.1 skrll {"ignore-parallel-conflicts", no_argument, NULL, OPTION_IGNORE_PARALLEL},
233 1.1 skrll {"Ip", no_argument, NULL, OPTION_IGNORE_PARALLEL},
234 1.1 skrll {"no-ignore-parallel-conflicts", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL},
235 1.1 skrll {"nIp", no_argument, NULL, OPTION_NO_IGNORE_PARALLEL},
236 1.1 skrll {"hidden", no_argument, NULL, OPTION_SPECIAL},
237 1.1 skrll {"bitinst", no_argument, NULL, OPTION_SPECIAL_M32R},
238 1.1 skrll {"no-bitinst", no_argument, NULL, OPTION_NO_SPECIAL_M32R},
239 1.1 skrll {"float", no_argument, NULL, OPTION_SPECIAL_FLOAT},
240 1.1 skrll /* Sigh. I guess all warnings must now have both variants. */
241 1.1 skrll {"warn-unmatched-high", no_argument, NULL, OPTION_WARN_UNMATCHED},
242 1.1 skrll {"Wuh", no_argument, NULL, OPTION_WARN_UNMATCHED},
243 1.1 skrll {"no-warn-unmatched-high", no_argument, NULL, OPTION_NO_WARN_UNMATCHED},
244 1.1 skrll {"Wnuh", no_argument, NULL, OPTION_NO_WARN_UNMATCHED},
245 1.1 skrll {NULL, no_argument, NULL, 0}
246 1.1 skrll };
247 1.1 skrll
248 1.1 skrll size_t md_longopts_size = sizeof (md_longopts);
249 1.1 skrll
250 1.1 skrll static void
251 1.1 skrll little (int on)
252 1.1 skrll {
253 1.1 skrll target_big_endian = ! on;
254 1.1 skrll }
255 1.1 skrll
256 1.1 skrll /* Use parallel execution. */
257 1.1 skrll
258 1.1 skrll static int
259 1.1 skrll parallel (void)
260 1.1 skrll {
261 1.1 skrll if (! enable_m32rx)
262 1.1 skrll return 0;
263 1.1 skrll
264 1.1 skrll if (use_parallel == 1)
265 1.1 skrll return 1;
266 1.1 skrll
267 1.1 skrll return 0;
268 1.1 skrll }
269 1.1.1.5 christos
270 1.1 skrll int
271 1.1 skrll md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
272 1.1 skrll {
273 1.1 skrll switch (c)
274 1.1 skrll {
275 1.1 skrll case 'O':
276 1.1 skrll optimize = 1;
277 1.1 skrll use_parallel = 1;
278 1.1 skrll break;
279 1.1 skrll
280 1.1 skrll case OPTION_M32R:
281 1.1 skrll allow_m32rx (0);
282 1.1 skrll break;
283 1.1 skrll
284 1.1 skrll case OPTION_M32RX:
285 1.1 skrll allow_m32rx (1);
286 1.1 skrll break;
287 1.1 skrll
288 1.1 skrll case OPTION_M32R2:
289 1.1 skrll allow_m32rx (2);
290 1.1 skrll enable_special = 1;
291 1.1 skrll enable_special_m32r = 1;
292 1.1 skrll break;
293 1.1 skrll
294 1.1 skrll case OPTION_BIG:
295 1.1 skrll target_big_endian = 1;
296 1.1 skrll break;
297 1.1 skrll
298 1.1 skrll case OPTION_LITTLE:
299 1.1 skrll target_big_endian = 0;
300 1.1 skrll break;
301 1.1 skrll
302 1.1 skrll case OPTION_PARALLEL:
303 1.1 skrll use_parallel = 1;
304 1.1 skrll break;
305 1.1 skrll
306 1.1 skrll case OPTION_NO_PARALLEL:
307 1.1 skrll use_parallel = 0;
308 1.1 skrll break;
309 1.1 skrll
310 1.1 skrll case OPTION_WARN_PARALLEL:
311 1.1 skrll warn_explicit_parallel_conflicts = 1;
312 1.1 skrll break;
313 1.1 skrll
314 1.1 skrll case OPTION_NO_WARN_PARALLEL:
315 1.1 skrll warn_explicit_parallel_conflicts = 0;
316 1.1 skrll break;
317 1.1 skrll
318 1.1 skrll case OPTION_IGNORE_PARALLEL:
319 1.1 skrll ignore_parallel_conflicts = 1;
320 1.1 skrll break;
321 1.1 skrll
322 1.1 skrll case OPTION_NO_IGNORE_PARALLEL:
323 1.1 skrll ignore_parallel_conflicts = 0;
324 1.1 skrll break;
325 1.1 skrll
326 1.1 skrll case OPTION_SPECIAL:
327 1.1 skrll if (enable_m32rx)
328 1.1 skrll enable_special = 1;
329 1.1 skrll else
330 1.1 skrll {
331 1.1 skrll /* Pretend that we do not recognise this option. */
332 1.1 skrll as_bad (_("Unrecognised option: -hidden"));
333 1.1 skrll return 0;
334 1.1 skrll }
335 1.1 skrll break;
336 1.1 skrll
337 1.1 skrll case OPTION_SPECIAL_M32R:
338 1.1 skrll enable_special_m32r = 1;
339 1.1 skrll break;
340 1.1 skrll
341 1.1 skrll case OPTION_NO_SPECIAL_M32R:
342 1.1 skrll enable_special_m32r = 0;
343 1.1 skrll break;
344 1.1 skrll
345 1.1 skrll case OPTION_SPECIAL_FLOAT:
346 1.1 skrll enable_special_float = 1;
347 1.1 skrll break;
348 1.1 skrll
349 1.1 skrll case OPTION_WARN_UNMATCHED:
350 1.1 skrll warn_unmatched_high = 1;
351 1.1 skrll break;
352 1.1 skrll
353 1.1 skrll case OPTION_NO_WARN_UNMATCHED:
354 1.1 skrll warn_unmatched_high = 0;
355 1.1 skrll break;
356 1.1 skrll
357 1.1 skrll case 'K':
358 1.1 skrll if (strcmp (arg, "PIC") != 0)
359 1.1 skrll as_warn (_("Unrecognized option following -K"));
360 1.1 skrll else
361 1.1 skrll pic_code = 1;
362 1.1 skrll break;
363 1.1 skrll
364 1.1 skrll default:
365 1.1 skrll return 0;
366 1.1 skrll }
367 1.1 skrll
368 1.1 skrll return 1;
369 1.1 skrll }
370 1.1 skrll
371 1.1 skrll void
372 1.1 skrll md_show_usage (FILE *stream)
373 1.1 skrll {
374 1.1 skrll fprintf (stream, _(" M32R specific command line options:\n"));
375 1.1 skrll
376 1.1 skrll fprintf (stream, _("\
377 1.1 skrll -m32r disable support for the m32rx instruction set\n"));
378 1.1 skrll fprintf (stream, _("\
379 1.1 skrll -m32rx support the extended m32rx instruction set\n"));
380 1.1 skrll fprintf (stream, _("\
381 1.1 skrll -m32r2 support the extended m32r2 instruction set\n"));
382 1.1 skrll fprintf (stream, _("\
383 1.1 skrll -EL,-little produce little endian code and data\n"));
384 1.1 skrll fprintf (stream, _("\
385 1.1 skrll -EB,-big produce big endian code and data\n"));
386 1.1 skrll fprintf (stream, _("\
387 1.1 skrll -parallel try to combine instructions in parallel\n"));
388 1.1 skrll fprintf (stream, _("\
389 1.1 skrll -no-parallel disable -parallel\n"));
390 1.1 skrll fprintf (stream, _("\
391 1.1 skrll -no-bitinst disallow the M32R2's extended bit-field instructions\n"));
392 1.1 skrll fprintf (stream, _("\
393 1.1 skrll -O try to optimize code. Implies -parallel\n"));
394 1.1 skrll
395 1.1 skrll fprintf (stream, _("\
396 1.1.1.6 christos -warn-explicit-parallel-conflicts warn when parallel instructions\n"));
397 1.1 skrll fprintf (stream, _("\
398 1.1 skrll might violate constraints\n"));
399 1.1 skrll fprintf (stream, _("\
400 1.1.1.6 christos -no-warn-explicit-parallel-conflicts do not warn when parallel\n"));
401 1.1 skrll fprintf (stream, _("\
402 1.1 skrll instructions might violate constraints\n"));
403 1.1 skrll fprintf (stream, _("\
404 1.1 skrll -Wp synonym for -warn-explicit-parallel-conflicts\n"));
405 1.1 skrll fprintf (stream, _("\
406 1.1 skrll -Wnp synonym for -no-warn-explicit-parallel-conflicts\n"));
407 1.1 skrll fprintf (stream, _("\
408 1.1.1.3 christos -ignore-parallel-conflicts do not check parallel instructions\n"));
409 1.1 skrll fprintf (stream, _("\
410 1.1 skrll for constraint violations\n"));
411 1.1 skrll fprintf (stream, _("\
412 1.1.1.3 christos -no-ignore-parallel-conflicts check parallel instructions for\n"));
413 1.1 skrll fprintf (stream, _("\
414 1.1 skrll constraint violations\n"));
415 1.1 skrll fprintf (stream, _("\
416 1.1 skrll -Ip synonym for -ignore-parallel-conflicts\n"));
417 1.1 skrll fprintf (stream, _("\
418 1.1 skrll -nIp synonym for -no-ignore-parallel-conflicts\n"));
419 1.1 skrll
420 1.1 skrll fprintf (stream, _("\
421 1.1 skrll -warn-unmatched-high warn when an (s)high reloc has no matching low reloc\n"));
422 1.1 skrll fprintf (stream, _("\
423 1.1 skrll -no-warn-unmatched-high do not warn about missing low relocs\n"));
424 1.1 skrll fprintf (stream, _("\
425 1.1 skrll -Wuh synonym for -warn-unmatched-high\n"));
426 1.1 skrll fprintf (stream, _("\
427 1.1 skrll -Wnuh synonym for -no-warn-unmatched-high\n"));
428 1.1 skrll
429 1.1 skrll fprintf (stream, _("\
430 1.1 skrll -KPIC generate PIC\n"));
431 1.1 skrll }
432 1.1 skrll
433 1.1 skrll /* Set by md_assemble for use by m32r_fill_insn. */
434 1.1 skrll static subsegT prev_subseg;
435 1.1 skrll static segT prev_seg;
436 1.1 skrll
437 1.1 skrll #define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
438 1.1 skrll symbolS * GOT_symbol;
439 1.1 skrll
440 1.1 skrll static inline int
441 1.1 skrll m32r_PIC_related_p (symbolS *sym)
442 1.1 skrll {
443 1.1 skrll expressionS *exp;
444 1.1 skrll
445 1.1 skrll if (! sym)
446 1.1 skrll return 0;
447 1.1 skrll
448 1.1 skrll if (sym == GOT_symbol)
449 1.1 skrll return 1;
450 1.1 skrll
451 1.1 skrll exp = symbol_get_value_expression (sym);
452 1.1 skrll
453 1.1 skrll return (exp->X_op == O_PIC_reloc
454 1.1 skrll || exp->X_md == BFD_RELOC_M32R_26_PLTREL
455 1.1 skrll || m32r_PIC_related_p (exp->X_add_symbol)
456 1.1 skrll || m32r_PIC_related_p (exp->X_op_symbol));
457 1.1 skrll }
458 1.1 skrll
459 1.1 skrll static inline int
460 1.1 skrll m32r_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p)
461 1.1 skrll {
462 1.1 skrll expressionS *exp = main_exp;
463 1.1 skrll
464 1.1 skrll if (exp->X_op == O_add && m32r_PIC_related_p (exp->X_op_symbol))
465 1.1 skrll return 1;
466 1.1 skrll
467 1.1 skrll if (exp->X_op == O_symbol && exp->X_add_symbol)
468 1.1 skrll {
469 1.1 skrll if (exp->X_add_symbol == GOT_symbol)
470 1.1 skrll {
471 1.1 skrll *r_type_p = BFD_RELOC_M32R_GOTPC24;
472 1.1 skrll return 0;
473 1.1 skrll }
474 1.1 skrll }
475 1.1 skrll else if (exp->X_op == O_add)
476 1.1 skrll {
477 1.1 skrll exp = symbol_get_value_expression (exp->X_add_symbol);
478 1.1 skrll if (! exp)
479 1.1 skrll return 0;
480 1.1 skrll }
481 1.1 skrll
482 1.1 skrll if (exp->X_op == O_PIC_reloc)
483 1.1 skrll {
484 1.1 skrll *r_type_p = exp->X_md;
485 1.1 skrll if (exp == main_exp)
486 1.1 skrll exp->X_op = O_symbol;
487 1.1 skrll else
488 1.1 skrll {
489 1.1 skrll main_exp->X_add_symbol = exp->X_add_symbol;
490 1.1 skrll main_exp->X_add_number += exp->X_add_number;
491 1.1 skrll }
492 1.1 skrll }
493 1.1 skrll else
494 1.1 skrll return (m32r_PIC_related_p (exp->X_add_symbol)
495 1.1 skrll || m32r_PIC_related_p (exp->X_op_symbol));
496 1.1 skrll
497 1.1 skrll return 0;
498 1.1 skrll }
499 1.1 skrll
500 1.1 skrll /* FIXME: Should be machine generated. */
501 1.1 skrll #define NOP_INSN 0x7000
502 1.1 skrll #define PAR_NOP_INSN 0xf000 /* Can only be used in 2nd slot. */
503 1.1 skrll
504 1.1 skrll /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
505 1.1 skrll of an rs_align_code fragment. */
506 1.1 skrll
507 1.1 skrll void
508 1.1 skrll m32r_handle_align (fragS *fragp)
509 1.1 skrll {
510 1.1 skrll static const unsigned char nop_pattern[] = { 0xf0, 0x00 };
511 1.1 skrll static const unsigned char multi_nop_pattern[] = { 0x70, 0x00, 0xf0, 0x00 };
512 1.1 skrll
513 1.1 skrll int bytes, fix;
514 1.1 skrll char *p;
515 1.1 skrll
516 1.1 skrll if (fragp->fr_type != rs_align_code)
517 1.1 skrll return;
518 1.1 skrll
519 1.1 skrll bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
520 1.1 skrll p = fragp->fr_literal + fragp->fr_fix;
521 1.1 skrll fix = 0;
522 1.1 skrll
523 1.1 skrll if (bytes & 1)
524 1.1 skrll {
525 1.1 skrll fix = 1;
526 1.1 skrll *p++ = 0;
527 1.1 skrll bytes--;
528 1.1 skrll }
529 1.1 skrll
530 1.1 skrll if (bytes & 2)
531 1.1 skrll {
532 1.1 skrll memcpy (p, nop_pattern, 2);
533 1.1 skrll p += 2;
534 1.1 skrll bytes -= 2;
535 1.1 skrll fix += 2;
536 1.1 skrll }
537 1.1 skrll
538 1.1 skrll memcpy (p, multi_nop_pattern, 4);
539 1.1 skrll
540 1.1 skrll fragp->fr_fix += fix;
541 1.1 skrll fragp->fr_var = 4;
542 1.1 skrll }
543 1.1 skrll
544 1.1 skrll /* If the last instruction was the first of 2 16 bit insns,
545 1.1 skrll output a nop to move the PC to a 32 bit boundary.
546 1.1 skrll
547 1.1 skrll This is done via an alignment specification since branch relaxing
548 1.1 skrll may make it unnecessary.
549 1.1 skrll
550 1.1 skrll Internally, we need to output one of these each time a 32 bit insn is
551 1.1 skrll seen after an insn that is relaxable. */
552 1.1 skrll
553 1.1 skrll static void
554 1.1 skrll fill_insn (int ignore ATTRIBUTE_UNUSED)
555 1.1 skrll {
556 1.1 skrll frag_align_code (2, 0);
557 1.1 skrll prev_insn.insn = NULL;
558 1.1 skrll seen_relaxable_p = 0;
559 1.1 skrll }
560 1.1 skrll
561 1.1 skrll /* Record the symbol so that when we output the insn, we can create
562 1.1 skrll a symbol that is at the start of the instruction. This is used
563 1.1 skrll to emit the label for the start of a breakpoint without causing
564 1.1 skrll the assembler to emit a NOP if the previous instruction was a
565 1.1 skrll 16 bit instruction. */
566 1.1 skrll
567 1.1 skrll static void
568 1.1 skrll debug_sym (int ignore ATTRIBUTE_UNUSED)
569 1.1 skrll {
570 1.1 skrll char *name;
571 1.1.1.2 christos char delim;
572 1.1 skrll symbolS *symbolP;
573 1.1.1.4 christos sym_linkS *lnk;
574 1.1 skrll
575 1.1 skrll delim = get_symbol_name (&name);
576 1.1 skrll
577 1.1 skrll if ((symbolP = symbol_find (name)) == NULL
578 1.1 skrll && (symbolP = md_undefined_symbol (name)) == NULL)
579 1.1 skrll symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
580 1.1 skrll
581 1.1 skrll symbol_table_insert (symbolP);
582 1.1 skrll if (S_IS_DEFINED (symbolP) && (S_GET_SEGMENT (symbolP) != reg_section
583 1.1 skrll || S_IS_EXTERNAL (symbolP)
584 1.1 skrll || S_IS_WEAK (symbolP)))
585 1.1 skrll /* xgettext:c-format */
586 1.1 skrll as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
587 1.1 skrll
588 1.1.1.5 christos else
589 1.1.1.2 christos {
590 1.1.1.2 christos lnk = XNEW (sym_linkS);
591 1.1.1.2 christos lnk->symbol = symbolP;
592 1.1 skrll lnk->next = debug_sym_link;
593 1.1 skrll debug_sym_link = lnk;
594 1.1 skrll symbol_get_obj (symbolP)->local = 1;
595 1.1.1.4 christos }
596 1.1 skrll
597 1.1 skrll (void) restore_line_pointer (delim);
598 1.1 skrll demand_empty_rest_of_line ();
599 1.1 skrll }
600 1.1 skrll
601 1.1 skrll /* Second pass to expanding the debug symbols, go through linked
602 1.1 skrll list of symbols and reassign the address. */
603 1.1 skrll
604 1.1 skrll static void
605 1.1 skrll expand_debug_syms (sym_linkS *syms, int align)
606 1.1 skrll {
607 1.1 skrll char *save_input_line = input_line_pointer;
608 1.1 skrll sym_linkS *next_syms;
609 1.1 skrll
610 1.1 skrll if (!syms)
611 1.1 skrll return;
612 1.1 skrll
613 1.1 skrll (void) frag_align_code (align, 0);
614 1.1 skrll for (; syms != (sym_linkS *) 0; syms = next_syms)
615 1.1 skrll {
616 1.1.1.5 christos symbolS *symbolP = syms->symbol;
617 1.1 skrll next_syms = syms->next;
618 1.1 skrll input_line_pointer = (char *) ".\n";
619 1.1 skrll pseudo_set (symbolP);
620 1.1 skrll free ((char *) syms);
621 1.1 skrll }
622 1.1 skrll
623 1.1 skrll input_line_pointer = save_input_line;
624 1.1 skrll }
625 1.1 skrll
626 1.1 skrll void
627 1.1 skrll m32r_flush_pending_output (void)
628 1.1 skrll {
629 1.1 skrll if (debug_sym_link)
630 1.1 skrll {
631 1.1 skrll expand_debug_syms (debug_sym_link, 1);
632 1.1 skrll debug_sym_link = (sym_linkS *) 0;
633 1.1 skrll }
634 1.1 skrll }
635 1.1 skrll
636 1.1 skrll /* Cover function to fill_insn called after a label and at end of assembly.
637 1.1 skrll The result is always 1: we're called in a conditional to see if the
638 1.1 skrll current line is a label. */
639 1.1 skrll
640 1.1 skrll int
641 1.1 skrll m32r_fill_insn (int done)
642 1.1 skrll {
643 1.1 skrll if (prev_seg != NULL)
644 1.1 skrll {
645 1.1 skrll segT seg = now_seg;
646 1.1 skrll subsegT subseg = now_subseg;
647 1.1 skrll
648 1.1 skrll subseg_set (prev_seg, prev_subseg);
649 1.1 skrll
650 1.1 skrll fill_insn (0);
651 1.1 skrll
652 1.1 skrll subseg_set (seg, subseg);
653 1.1 skrll }
654 1.1 skrll
655 1.1 skrll if (done && debug_sym_link)
656 1.1 skrll {
657 1.1 skrll expand_debug_syms (debug_sym_link, 1);
658 1.1 skrll debug_sym_link = (sym_linkS *) 0;
659 1.1 skrll }
660 1.1 skrll
661 1.1 skrll return 1;
662 1.1 skrll }
663 1.1 skrll
664 1.1 skrll /* The default target format to use. */
666 1.1 skrll
667 1.1 skrll const char *
668 1.1 skrll m32r_target_format (void)
669 1.1 skrll {
670 1.1 skrll #ifdef TE_LINUX
671 1.1 skrll if (target_big_endian)
672 1.1 skrll return "elf32-m32r-linux";
673 1.1 skrll else
674 1.1 skrll return "elf32-m32rle-linux";
675 1.1 skrll #else
676 1.1 skrll if (target_big_endian)
677 1.1 skrll return "elf32-m32r";
678 1.1 skrll else
679 1.1 skrll return "elf32-m32rle";
680 1.1 skrll #endif
681 1.1 skrll }
682 1.1 skrll
683 1.1 skrll void
684 1.1 skrll md_begin (void)
685 1.1 skrll {
686 1.1 skrll flagword applicable;
687 1.1 skrll segT seg;
688 1.1 skrll subsegT subseg;
689 1.1 skrll
690 1.1 skrll /* Initialize the `cgen' interface. */
691 1.1 skrll
692 1.1 skrll /* Set the machine number and endian. */
693 1.1 skrll gas_cgen_cpu_desc = m32r_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, 0,
694 1.1 skrll CGEN_CPU_OPEN_ENDIAN,
695 1.1 skrll (target_big_endian ?
696 1.1 skrll CGEN_ENDIAN_BIG : CGEN_ENDIAN_LITTLE),
697 1.1 skrll CGEN_CPU_OPEN_END);
698 1.1 skrll m32r_cgen_init_asm (gas_cgen_cpu_desc);
699 1.1 skrll
700 1.1 skrll /* The operand instance table is used during optimization to determine
701 1.1 skrll which insns can be executed in parallel. It is also used to give
702 1.1 skrll warnings regarding operand interference in parallel insns. */
703 1.1 skrll m32r_cgen_init_opinst_table (gas_cgen_cpu_desc);
704 1.1 skrll
705 1.1 skrll /* This is a callback from cgen to gas to parse operands. */
706 1.1 skrll cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand);
707 1.1 skrll
708 1.1 skrll /* Save the current subseg so we can restore it [it's the default one and
709 1.1 skrll we don't want the initial section to be .sbss]. */
710 1.1 skrll seg = now_seg;
711 1.1 skrll subseg = now_subseg;
712 1.1 skrll
713 1.1 skrll /* The sbss section is for local .scomm symbols. */
714 1.1 skrll sbss_section = subseg_new (".sbss", 0);
715 1.1 skrll seg_info (sbss_section)->bss = 1;
716 1.1.1.7 christos
717 1.1 skrll /* This is copied from perform_an_assembly_pass. */
718 1.1 skrll applicable = bfd_applicable_section_flags (stdoutput);
719 1.1 skrll bfd_set_section_flags (sbss_section, applicable & SEC_ALLOC);
720 1.1 skrll
721 1.1 skrll subseg_set (seg, subseg);
722 1.1.1.3 christos
723 1.1 skrll /* We must construct a fake section similar to bfd_com_section
724 1.1 skrll but with the name .scommon. */
725 1.1 skrll scom_section = *bfd_com_section_ptr;
726 1.1 skrll scom_section.name = ".scommon";
727 1.1.1.3 christos scom_section.output_section = & scom_section;
728 1.1 skrll scom_section.symbol = & scom_symbol;
729 1.1 skrll scom_section.symbol_ptr_ptr = & scom_section.symbol;
730 1.1 skrll scom_symbol = * bfd_com_section_ptr->symbol;
731 1.1 skrll scom_symbol.name = ".scommon";
732 1.1 skrll scom_symbol.section = & scom_section;
733 1.1 skrll
734 1.1 skrll allow_m32rx (enable_m32rx);
735 1.1 skrll
736 1.1 skrll gas_cgen_initialize_saved_fixups_array ();
737 1.1 skrll }
738 1.1 skrll
739 1.1 skrll #define OPERAND_IS_COND_BIT(operand, indices, index) \
740 1.1 skrll ((operand)->hw_type == HW_H_COND \
741 1.1 skrll || ((operand)->hw_type == HW_H_PSW) \
742 1.1 skrll || ((operand)->hw_type == HW_H_CR \
743 1.1 skrll && (indices [index] == 0 || indices [index] == 1)))
744 1.1 skrll
745 1.1 skrll /* Returns true if an output of instruction 'a' is referenced by an operand
746 1.1 skrll of instruction 'b'. If 'check_outputs' is true then b's outputs are
747 1.1 skrll checked, otherwise its inputs are examined. */
748 1.1 skrll
749 1.1 skrll static int
750 1.1 skrll first_writes_to_seconds_operands (m32r_insn *a,
751 1.1 skrll m32r_insn *b,
752 1.1 skrll const int check_outputs)
753 1.1 skrll {
754 1.1 skrll const CGEN_OPINST *a_operands = CGEN_INSN_OPERANDS (a->insn);
755 1.1 skrll const CGEN_OPINST *b_ops = CGEN_INSN_OPERANDS (b->insn);
756 1.1 skrll int a_index;
757 1.1 skrll
758 1.1 skrll if (ignore_parallel_conflicts)
759 1.1 skrll return 0;
760 1.1 skrll
761 1.1 skrll /* If at least one of the instructions takes no operands, then there is
762 1.1 skrll nothing to check. There really are instructions without operands,
763 1.1 skrll eg 'nop'. */
764 1.1 skrll if (a_operands == NULL || b_ops == NULL)
765 1.1 skrll return 0;
766 1.1 skrll
767 1.1 skrll /* Scan the operand list of 'a' looking for an output operand. */
768 1.1 skrll for (a_index = 0;
769 1.1 skrll a_operands->type != CGEN_OPINST_END;
770 1.1 skrll a_index ++, a_operands ++)
771 1.1 skrll {
772 1.1 skrll if (a_operands->type == CGEN_OPINST_OUTPUT)
773 1.1 skrll {
774 1.1 skrll int b_index;
775 1.1 skrll const CGEN_OPINST *b_operands = b_ops;
776 1.1 skrll
777 1.1 skrll /* Special Case:
778 1.1 skrll The Condition bit 'C' is a shadow of the CBR register (control
779 1.1 skrll register 1) and also a shadow of bit 31 of the program status
780 1.1 skrll word (control register 0). For now this is handled here, rather
781 1.1 skrll than by cgen.... */
782 1.1 skrll
783 1.1 skrll if (OPERAND_IS_COND_BIT (a_operands, a->indices, a_index))
784 1.1 skrll {
785 1.1 skrll /* Scan operand list of 'b' looking for another reference to the
786 1.1 skrll condition bit, which goes in the right direction. */
787 1.1 skrll for (b_index = 0;
788 1.1 skrll b_operands->type != CGEN_OPINST_END;
789 1.1 skrll b_index++, b_operands++)
790 1.1 skrll {
791 1.1 skrll if ((b_operands->type
792 1.1 skrll == (check_outputs
793 1.1 skrll ? CGEN_OPINST_OUTPUT
794 1.1 skrll : CGEN_OPINST_INPUT))
795 1.1 skrll && OPERAND_IS_COND_BIT (b_operands, b->indices, b_index))
796 1.1 skrll return 1;
797 1.1 skrll }
798 1.1 skrll }
799 1.1 skrll else
800 1.1 skrll {
801 1.1 skrll /* Scan operand list of 'b' looking for an operand that
802 1.1 skrll references the same hardware element, and which goes in the
803 1.1 skrll right direction. */
804 1.1 skrll for (b_index = 0;
805 1.1 skrll b_operands->type != CGEN_OPINST_END;
806 1.1 skrll b_index++, b_operands++)
807 1.1 skrll {
808 1.1 skrll if ((b_operands->type
809 1.1 skrll == (check_outputs
810 1.1 skrll ? CGEN_OPINST_OUTPUT
811 1.1 skrll : CGEN_OPINST_INPUT))
812 1.1 skrll && (b_operands->hw_type == a_operands->hw_type)
813 1.1 skrll && (a->indices[a_index] == b->indices[b_index]))
814 1.1 skrll return 1;
815 1.1 skrll }
816 1.1 skrll }
817 1.1 skrll }
818 1.1 skrll }
819 1.1 skrll
820 1.1 skrll return 0;
821 1.1 skrll }
822 1.1 skrll
823 1.1 skrll /* Returns true if the insn can (potentially) alter the program counter. */
824 1.1 skrll
825 1.1 skrll static int
826 1.1 skrll writes_to_pc (m32r_insn *a)
827 1.1 skrll {
828 1.1 skrll if (CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_UNCOND_CTI)
829 1.1 skrll || CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_COND_CTI))
830 1.1 skrll return 1;
831 1.1 skrll return 0;
832 1.1 skrll }
833 1.1 skrll
834 1.1 skrll /* Return NULL if the two 16 bit insns can be executed in parallel.
835 1.1 skrll Otherwise return a pointer to an error message explaining why not. */
836 1.1 skrll
837 1.1 skrll static const char *
838 1.1 skrll can_make_parallel (m32r_insn *a, m32r_insn *b)
839 1.1 skrll {
840 1.1 skrll PIPE_ATTR a_pipe;
841 1.1 skrll PIPE_ATTR b_pipe;
842 1.1 skrll
843 1.1 skrll /* Make sure the instructions are the right length. */
844 1.1 skrll if (CGEN_FIELDS_BITSIZE (&a->fields) != 16
845 1.1 skrll || CGEN_FIELDS_BITSIZE (&b->fields) != 16)
846 1.1 skrll abort ();
847 1.1 skrll
848 1.1 skrll if (first_writes_to_seconds_operands (a, b, TRUE))
849 1.1 skrll return _("instructions write to the same destination register.");
850 1.1 skrll
851 1.1 skrll a_pipe = CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_PIPE);
852 1.1 skrll b_pipe = CGEN_INSN_ATTR_VALUE (b->insn, CGEN_INSN_PIPE);
853 1.1 skrll
854 1.1 skrll /* Make sure that the instructions use the correct execution pipelines. */
855 1.1 skrll if (a_pipe == PIPE_NONE
856 1.1 skrll || b_pipe == PIPE_NONE)
857 1.1 skrll return _("Instructions do not use parallel execution pipelines.");
858 1.1 skrll
859 1.1 skrll /* Leave this test for last, since it is the only test that can
860 1.1 skrll go away if the instructions are swapped, and we want to make
861 1.1 skrll sure that any other errors are detected before this happens. */
862 1.1 skrll if (a_pipe == PIPE_S
863 1.1 skrll || b_pipe == PIPE_O
864 1.1 skrll || (b_pipe == PIPE_O_OS && (enable_m32rx != 2)))
865 1.1 skrll return _("Instructions share the same execution pipeline");
866 1.1 skrll
867 1.1 skrll return NULL;
868 1.1 skrll }
869 1.1 skrll
870 1.1 skrll /* Force the top bit of the second 16-bit insn to be set. */
871 1.1 skrll
872 1.1 skrll static void
873 1.1 skrll make_parallel (CGEN_INSN_BYTES_PTR buffer)
874 1.1 skrll {
875 1.1 skrll #if CGEN_INT_INSN_P
876 1.1 skrll *buffer |= 0x8000;
877 1.1 skrll #else
878 1.1 skrll buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
879 1.1 skrll |= 0x80;
880 1.1 skrll #endif
881 1.1 skrll }
882 1.1 skrll
883 1.1 skrll /* Same as make_parallel except buffer contains the bytes in target order. */
884 1.1 skrll
885 1.1 skrll static void
886 1.1 skrll target_make_parallel (char *buffer)
887 1.1 skrll {
888 1.1 skrll buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
889 1.1 skrll |= 0x80;
890 1.1 skrll }
891 1.1 skrll
892 1.1 skrll /* Assemble two instructions with an explicit parallel operation (||) or
893 1.1 skrll sequential operation (->). */
894 1.1 skrll
895 1.1 skrll static void
896 1.1 skrll assemble_two_insns (char *str1, char *str2, int parallel_p)
897 1.1 skrll {
898 1.1 skrll char *str3;
899 1.1 skrll m32r_insn first;
900 1.1 skrll m32r_insn second;
901 1.1 skrll char *errmsg;
902 1.1 skrll char save_str2 = *str2;
903 1.1 skrll
904 1.1 skrll /* Separate the two instructions. */
905 1.1 skrll *str2 = 0;
906 1.1 skrll
907 1.1 skrll /* Make sure the two insns begin on a 32 bit boundary.
908 1.1 skrll This is also done for the serial case (foo -> bar), relaxing doesn't
909 1.1 skrll affect insns written like this.
910 1.1 skrll Note that we must always do this as we can't assume anything about
911 1.1 skrll whether we're currently on a 32 bit boundary or not. Relaxing may
912 1.1 skrll change this. */
913 1.1 skrll fill_insn (0);
914 1.1 skrll
915 1.1 skrll first.debug_sym_link = debug_sym_link;
916 1.1 skrll debug_sym_link = (sym_linkS *) 0;
917 1.1 skrll
918 1.1 skrll /* Parse the first instruction. */
919 1.1.1.2 christos if (! (first.insn = m32r_cgen_assemble_insn
920 1.1 skrll (gas_cgen_cpu_desc, str1, & first.fields, first.buffer, & errmsg)))
921 1.1 skrll {
922 1.1 skrll as_bad ("%s", errmsg);
923 1.1 skrll return;
924 1.1 skrll }
925 1.1 skrll
926 1.1 skrll /* Check it. */
927 1.1 skrll if (CGEN_FIELDS_BITSIZE (&first.fields) != 16)
928 1.1 skrll {
929 1.1 skrll /* xgettext:c-format */
930 1.1 skrll as_bad (_("not a 16 bit instruction '%s'"), str1);
931 1.1 skrll return;
932 1.1 skrll }
933 1.1 skrll #ifdef E_M32R2_ARCH
934 1.1 skrll else if ((enable_m32rx == 1)
935 1.1 skrll /* FIXME: Need standard macro to perform this test. */
936 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
937 1.1 skrll & (1 << MACH_M32R2))
938 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
939 1.1 skrll & (1 << MACH_M32RX)))))
940 1.1 skrll {
941 1.1 skrll /* xgettext:c-format */
942 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str1);
943 1.1 skrll return;
944 1.1 skrll }
945 1.1 skrll else if ((! enable_special
946 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
947 1.1 skrll || (! enable_special_m32r
948 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)))
949 1.1 skrll #else
950 1.1 skrll else if (! enable_special
951 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
952 1.1 skrll #endif
953 1.1 skrll {
954 1.1 skrll /* xgettext:c-format */
955 1.1 skrll as_bad (_("unknown instruction '%s'"), str1);
956 1.1 skrll return;
957 1.1 skrll }
958 1.1 skrll else if (! enable_m32rx
959 1.1 skrll /* FIXME: Need standard macro to perform this test. */
960 1.1 skrll && (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
961 1.1 skrll == (1 << MACH_M32RX)))
962 1.1 skrll {
963 1.1 skrll /* xgettext:c-format */
964 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str1);
965 1.1 skrll return;
966 1.1 skrll }
967 1.1 skrll
968 1.1 skrll /* Check to see if this is an allowable parallel insn. */
969 1.1 skrll if (parallel_p
970 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_PIPE) == PIPE_NONE)
971 1.1 skrll {
972 1.1 skrll /* xgettext:c-format */
973 1.1 skrll as_bad (_("instruction '%s' cannot be executed in parallel."), str1);
974 1.1 skrll return;
975 1.1 skrll }
976 1.1 skrll
977 1.1 skrll /* Restore the original assembly text, just in case it is needed. */
978 1.1 skrll *str2 = save_str2;
979 1.1 skrll
980 1.1 skrll /* Save the original string pointer. */
981 1.1 skrll str3 = str1;
982 1.1 skrll
983 1.1 skrll /* Advanced past the parsed string. */
984 1.1 skrll str1 = str2 + 2;
985 1.1 skrll
986 1.1 skrll /* Remember the entire string in case it is needed for error
987 1.1 skrll messages. */
988 1.1 skrll str2 = str3;
989 1.1 skrll
990 1.1 skrll /* Convert the opcode to lower case. */
991 1.1 skrll {
992 1.1 skrll char *s2 = str1;
993 1.1 skrll
994 1.1 skrll while (ISSPACE (*s2++))
995 1.1 skrll continue;
996 1.1 skrll
997 1.1 skrll --s2;
998 1.1 skrll
999 1.1 skrll while (ISALNUM (*s2))
1000 1.1 skrll {
1001 1.1 skrll *s2 = TOLOWER (*s2);
1002 1.1 skrll s2++;
1003 1.1 skrll }
1004 1.1 skrll }
1005 1.1 skrll
1006 1.1 skrll /* Preserve any fixups that have been generated and reset the list
1007 1.1 skrll to empty. */
1008 1.1 skrll gas_cgen_save_fixups (0);
1009 1.1 skrll
1010 1.1 skrll /* Get the indices of the operands of the instruction. */
1011 1.1 skrll /* FIXME: CGEN_FIELDS is already recorded, but relying on that fact
1012 1.1 skrll doesn't seem right. Perhaps allow passing fields like we do insn. */
1013 1.1 skrll /* FIXME: ALIAS insns do not have operands, so we use this function
1014 1.1 skrll to find the equivalent insn and overwrite the value stored in our
1015 1.1 skrll structure. We still need the original insn, however, since this
1016 1.1 skrll may have certain attributes that are not present in the unaliased
1017 1.1 skrll version (eg relaxability). When aliases behave differently this
1018 1.1 skrll may have to change. */
1019 1.1 skrll first.orig_insn = first.insn;
1020 1.1 skrll {
1021 1.1 skrll CGEN_FIELDS tmp_fields;
1022 1.1 skrll first.insn = cgen_lookup_get_insn_operands
1023 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (first.buffer), NULL, 16,
1024 1.1 skrll first.indices, &tmp_fields);
1025 1.1 skrll }
1026 1.1 skrll
1027 1.1 skrll if (first.insn == NULL)
1028 1.1 skrll as_fatal (_("internal error: lookup/get operands failed"));
1029 1.1 skrll
1030 1.1 skrll second.debug_sym_link = NULL;
1031 1.1 skrll
1032 1.1 skrll /* Parse the second instruction. */
1033 1.1.1.2 christos if (! (second.insn = m32r_cgen_assemble_insn
1034 1.1 skrll (gas_cgen_cpu_desc, str1, & second.fields, second.buffer, & errmsg)))
1035 1.1 skrll {
1036 1.1 skrll as_bad ("%s", errmsg);
1037 1.1 skrll return;
1038 1.1 skrll }
1039 1.1 skrll
1040 1.1 skrll /* Check it. */
1041 1.1 skrll if (CGEN_FIELDS_BITSIZE (&second.fields) != 16)
1042 1.1 skrll {
1043 1.1 skrll /* xgettext:c-format */
1044 1.1 skrll as_bad (_("not a 16 bit instruction '%s'"), str1);
1045 1.1 skrll return;
1046 1.1 skrll }
1047 1.1 skrll #ifdef E_M32R2_ARCH
1048 1.1 skrll else if ((enable_m32rx == 1)
1049 1.1 skrll /* FIXME: Need standard macro to perform this test. */
1050 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1051 1.1 skrll & (1 << MACH_M32R2))
1052 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1053 1.1 skrll & (1 << MACH_M32RX)))))
1054 1.1 skrll {
1055 1.1 skrll /* xgettext:c-format */
1056 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str1);
1057 1.1 skrll return;
1058 1.1 skrll }
1059 1.1 skrll else if ((! enable_special
1060 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1061 1.1 skrll || (! enable_special_m32r
1062 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R)))
1063 1.1 skrll #else
1064 1.1 skrll else if (! enable_special
1065 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1066 1.1 skrll #endif
1067 1.1 skrll {
1068 1.1 skrll /* xgettext:c-format */
1069 1.1 skrll as_bad (_("unknown instruction '%s'"), str1);
1070 1.1 skrll return;
1071 1.1 skrll }
1072 1.1 skrll else if (! enable_m32rx
1073 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1074 1.1 skrll {
1075 1.1 skrll /* xgettext:c-format */
1076 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str1);
1077 1.1 skrll return;
1078 1.1 skrll }
1079 1.1 skrll
1080 1.1 skrll /* Check to see if this is an allowable parallel insn. */
1081 1.1 skrll if (parallel_p
1082 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_PIPE) == PIPE_NONE)
1083 1.1 skrll {
1084 1.1 skrll /* xgettext:c-format */
1085 1.1 skrll as_bad (_("instruction '%s' cannot be executed in parallel."), str1);
1086 1.1 skrll return;
1087 1.1 skrll }
1088 1.1 skrll
1089 1.1 skrll if (parallel_p && ! enable_m32rx)
1090 1.1 skrll {
1091 1.1 skrll if (CGEN_INSN_NUM (first.insn) != M32R_INSN_NOP
1092 1.1 skrll && CGEN_INSN_NUM (second.insn) != M32R_INSN_NOP)
1093 1.1 skrll {
1094 1.1 skrll /* xgettext:c-format */
1095 1.1 skrll as_bad (_("'%s': only the NOP instruction can be issued in parallel on the m32r"), str2);
1096 1.1 skrll return;
1097 1.1 skrll }
1098 1.1 skrll }
1099 1.1 skrll
1100 1.1 skrll /* Get the indices of the operands of the instruction. */
1101 1.1 skrll second.orig_insn = second.insn;
1102 1.1 skrll {
1103 1.1 skrll CGEN_FIELDS tmp_fields;
1104 1.1 skrll second.insn = cgen_lookup_get_insn_operands
1105 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (second.buffer), NULL, 16,
1106 1.1 skrll second.indices, &tmp_fields);
1107 1.1 skrll }
1108 1.1 skrll
1109 1.1 skrll if (second.insn == NULL)
1110 1.1 skrll as_fatal (_("internal error: lookup/get operands failed"));
1111 1.1 skrll
1112 1.1 skrll /* We assume that if the first instruction writes to a register that is
1113 1.1 skrll read by the second instruction it is because the programmer intended
1114 1.1 skrll this to happen, (after all they have explicitly requested that these
1115 1.1 skrll two instructions be executed in parallel). Although if the global
1116 1.1 skrll variable warn_explicit_parallel_conflicts is true then we do generate
1117 1.1 skrll a warning message. Similarly we assume that parallel branch and jump
1118 1.1 skrll instructions are deliberate and should not produce errors. */
1119 1.1 skrll
1120 1.1 skrll if (parallel_p && warn_explicit_parallel_conflicts)
1121 1.1 skrll {
1122 1.1 skrll if (first_writes_to_seconds_operands (&first, &second, FALSE))
1123 1.1 skrll /* xgettext:c-format */
1124 1.1 skrll as_warn (_("%s: output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?"), str2);
1125 1.1 skrll
1126 1.1 skrll if (first_writes_to_seconds_operands (&second, &first, FALSE))
1127 1.1 skrll /* xgettext:c-format */
1128 1.1 skrll as_warn (_("%s: output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?"), str2);
1129 1.1 skrll }
1130 1.1 skrll
1131 1.1 skrll if (!parallel_p
1132 1.1 skrll || (errmsg = (char *) can_make_parallel (&first, &second)) == NULL)
1133 1.1 skrll {
1134 1.1 skrll /* Get the fixups for the first instruction. */
1135 1.1 skrll gas_cgen_swap_fixups (0);
1136 1.1 skrll
1137 1.1 skrll /* Write it out. */
1138 1.1 skrll expand_debug_syms (first.debug_sym_link, 1);
1139 1.1 skrll gas_cgen_finish_insn (first.orig_insn, first.buffer,
1140 1.1 skrll CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1141 1.1 skrll
1142 1.1 skrll /* Force the top bit of the second insn to be set. */
1143 1.1 skrll if (parallel_p)
1144 1.1 skrll make_parallel (second.buffer);
1145 1.1 skrll
1146 1.1 skrll /* Get its fixups. */
1147 1.1 skrll gas_cgen_restore_fixups (0);
1148 1.1 skrll
1149 1.1 skrll /* Write it out. */
1150 1.1 skrll expand_debug_syms (second.debug_sym_link, 1);
1151 1.1 skrll gas_cgen_finish_insn (second.orig_insn, second.buffer,
1152 1.1 skrll CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1153 1.1 skrll }
1154 1.1 skrll /* Try swapping the instructions to see if they work that way. */
1155 1.1 skrll else if (can_make_parallel (&second, &first) == NULL)
1156 1.1 skrll {
1157 1.1 skrll /* Write out the second instruction first. */
1158 1.1 skrll expand_debug_syms (second.debug_sym_link, 1);
1159 1.1 skrll gas_cgen_finish_insn (second.orig_insn, second.buffer,
1160 1.1 skrll CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1161 1.1 skrll
1162 1.1 skrll /* Force the top bit of the first instruction to be set. */
1163 1.1 skrll make_parallel (first.buffer);
1164 1.1 skrll
1165 1.1 skrll /* Get the fixups for the first instruction. */
1166 1.1 skrll gas_cgen_restore_fixups (0);
1167 1.1 skrll
1168 1.1 skrll /* Write out the first instruction. */
1169 1.1 skrll expand_debug_syms (first.debug_sym_link, 1);
1170 1.1 skrll gas_cgen_finish_insn (first.orig_insn, first.buffer,
1171 1.1 skrll CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1172 1.1 skrll }
1173 1.1 skrll else
1174 1.1 skrll {
1175 1.1 skrll as_bad ("'%s': %s", str2, errmsg);
1176 1.1 skrll return;
1177 1.1 skrll }
1178 1.1 skrll
1179 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL)
1180 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1181 1.1 skrll m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1182 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)
1183 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R))
1184 1.1 skrll m32r_flags |= E_M32R_HAS_BIT_INST;
1185 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_FLOAT)
1186 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_FLOAT))
1187 1.1 skrll m32r_flags |= E_M32R_HAS_FLOAT_INST;
1188 1.1 skrll
1189 1.1 skrll /* Set these so m32r_fill_insn can use them. */
1190 1.1 skrll prev_seg = now_seg;
1191 1.1 skrll prev_subseg = now_subseg;
1192 1.1 skrll }
1193 1.1 skrll
1194 1.1 skrll void
1195 1.1 skrll md_assemble (char *str)
1196 1.1 skrll {
1197 1.1 skrll m32r_insn insn;
1198 1.1 skrll char *errmsg;
1199 1.1 skrll char *str2 = NULL;
1200 1.1 skrll
1201 1.1 skrll /* Initialize GAS's cgen interface for a new instruction. */
1202 1.1 skrll gas_cgen_init_parse ();
1203 1.1 skrll
1204 1.1 skrll /* Look for a parallel instruction separator. */
1205 1.1 skrll if ((str2 = strstr (str, "||")) != NULL)
1206 1.1 skrll {
1207 1.1 skrll assemble_two_insns (str, str2, 1);
1208 1.1 skrll m32r_flags |= E_M32R_HAS_PARALLEL;
1209 1.1 skrll return;
1210 1.1 skrll }
1211 1.1 skrll
1212 1.1 skrll /* Also look for a sequential instruction separator. */
1213 1.1 skrll if ((str2 = strstr (str, "->")) != NULL)
1214 1.1 skrll {
1215 1.1 skrll assemble_two_insns (str, str2, 0);
1216 1.1 skrll return;
1217 1.1 skrll }
1218 1.1 skrll
1219 1.1 skrll insn.debug_sym_link = debug_sym_link;
1220 1.1 skrll debug_sym_link = (sym_linkS *) 0;
1221 1.1 skrll
1222 1.1 skrll insn.insn = m32r_cgen_assemble_insn
1223 1.1 skrll (gas_cgen_cpu_desc, str, &insn.fields, insn.buffer, & errmsg);
1224 1.1.1.2 christos
1225 1.1 skrll if (!insn.insn)
1226 1.1 skrll {
1227 1.1 skrll as_bad ("%s", errmsg);
1228 1.1 skrll return;
1229 1.1 skrll }
1230 1.1 skrll
1231 1.1 skrll #ifdef E_M32R2_ARCH
1232 1.1 skrll if ((enable_m32rx == 1)
1233 1.1 skrll /* FIXME: Need standard macro to perform this test. */
1234 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1235 1.1 skrll & (1 << MACH_M32R2))
1236 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1237 1.1 skrll & (1 << MACH_M32RX)))))
1238 1.1 skrll {
1239 1.1 skrll /* xgettext:c-format */
1240 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str);
1241 1.1 skrll return;
1242 1.1 skrll }
1243 1.1 skrll else if ((! enable_special
1244 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1245 1.1 skrll || (! enable_special_m32r
1246 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R)))
1247 1.1 skrll #else
1248 1.1 skrll if (! enable_special
1249 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1250 1.1 skrll #endif
1251 1.1 skrll {
1252 1.1 skrll /* xgettext:c-format */
1253 1.1 skrll as_bad (_("unknown instruction '%s'"), str);
1254 1.1 skrll return;
1255 1.1 skrll }
1256 1.1 skrll else if (! enable_m32rx
1257 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1258 1.1 skrll {
1259 1.1 skrll /* xgettext:c-format */
1260 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str);
1261 1.1 skrll return;
1262 1.1 skrll }
1263 1.1 skrll
1264 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1265 1.1 skrll m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1266 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R))
1267 1.1 skrll m32r_flags |= E_M32R_HAS_BIT_INST;
1268 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_FLOAT))
1269 1.1 skrll m32r_flags |= E_M32R_HAS_FLOAT_INST;
1270 1.1 skrll
1271 1.1 skrll if (CGEN_INSN_BITSIZE (insn.insn) == 32)
1272 1.1 skrll {
1273 1.1 skrll /* 32 bit insns must live on 32 bit boundaries. */
1274 1.1 skrll if (prev_insn.insn || seen_relaxable_p)
1275 1.1 skrll {
1276 1.1 skrll /* ??? If calling fill_insn too many times turns us into a memory
1277 1.1 skrll pig, can we call a fn to assemble a nop instead of
1278 1.1 skrll !seen_relaxable_p? */
1279 1.1 skrll fill_insn (0);
1280 1.1 skrll }
1281 1.1 skrll
1282 1.1 skrll expand_debug_syms (insn.debug_sym_link, 2);
1283 1.1 skrll
1284 1.1 skrll /* Doesn't really matter what we pass for RELAX_P here. */
1285 1.1 skrll gas_cgen_finish_insn (insn.insn, insn.buffer,
1286 1.1 skrll CGEN_FIELDS_BITSIZE (&insn.fields), 1, NULL);
1287 1.1 skrll }
1288 1.1 skrll else
1289 1.1 skrll {
1290 1.1 skrll int on_32bit_boundary_p;
1291 1.1 skrll int swap = FALSE;
1292 1.1 skrll
1293 1.1 skrll if (CGEN_INSN_BITSIZE (insn.insn) != 16)
1294 1.1 skrll abort ();
1295 1.1 skrll
1296 1.1 skrll insn.orig_insn = insn.insn;
1297 1.1 skrll
1298 1.1 skrll /* If the previous insn was relaxable, then it may be expanded
1299 1.1 skrll to fill the current 16 bit slot. Emit a NOP here to occupy
1300 1.1 skrll this slot, so that we can start at optimizing at a 32 bit
1301 1.1 skrll boundary. */
1302 1.1 skrll if (prev_insn.insn && seen_relaxable_p && optimize)
1303 1.1 skrll fill_insn (0);
1304 1.1 skrll
1305 1.1 skrll if (enable_m32rx)
1306 1.1 skrll {
1307 1.1 skrll /* Get the indices of the operands of the instruction.
1308 1.1 skrll FIXME: See assemble_parallel for notes on orig_insn. */
1309 1.1 skrll {
1310 1.1 skrll CGEN_FIELDS tmp_fields;
1311 1.1 skrll insn.insn = cgen_lookup_get_insn_operands
1312 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (insn.buffer), NULL,
1313 1.1 skrll 16, insn.indices, &tmp_fields);
1314 1.1 skrll }
1315 1.1 skrll
1316 1.1 skrll if (insn.insn == NULL)
1317 1.1 skrll as_fatal (_("internal error: lookup/get operands failed"));
1318 1.1 skrll }
1319 1.1 skrll
1320 1.1 skrll /* Compute whether we're on a 32 bit boundary or not.
1321 1.1 skrll prev_insn.insn is NULL when we're on a 32 bit boundary. */
1322 1.1 skrll on_32bit_boundary_p = prev_insn.insn == NULL;
1323 1.1 skrll
1324 1.1 skrll /* Change a frag to, if each insn to swap is in a different frag.
1325 1.1 skrll It must keep only one instruction in a frag. */
1326 1.1 skrll if (parallel() && on_32bit_boundary_p)
1327 1.1 skrll {
1328 1.1 skrll frag_wane (frag_now);
1329 1.1 skrll frag_new (0);
1330 1.1 skrll }
1331 1.1 skrll
1332 1.1 skrll /* Look to see if this instruction can be combined with the
1333 1.1 skrll previous instruction to make one, parallel, 32 bit instruction.
1334 1.1 skrll If the previous instruction (potentially) changed the flow of
1335 1.1 skrll program control, then it cannot be combined with the current
1336 1.1 skrll instruction. If the current instruction is relaxable, then it
1337 1.1 skrll might be replaced with a longer version, so we cannot combine it.
1338 1.1 skrll Also if the output of the previous instruction is used as an
1339 1.1 skrll input to the current instruction then it cannot be combined.
1340 1.1 skrll Otherwise call can_make_parallel() with both orderings of the
1341 1.1 skrll instructions to see if they can be combined. */
1342 1.1 skrll if (! on_32bit_boundary_p
1343 1.1 skrll && parallel ()
1344 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) == 0
1345 1.1 skrll && ! writes_to_pc (&prev_insn)
1346 1.1 skrll && ! first_writes_to_seconds_operands (&prev_insn, &insn, FALSE))
1347 1.1 skrll {
1348 1.1 skrll if (can_make_parallel (&prev_insn, &insn) == NULL)
1349 1.1 skrll make_parallel (insn.buffer);
1350 1.1 skrll else if (can_make_parallel (&insn, &prev_insn) == NULL)
1351 1.1 skrll swap = TRUE;
1352 1.1 skrll }
1353 1.1 skrll
1354 1.1 skrll expand_debug_syms (insn.debug_sym_link, 1);
1355 1.1 skrll
1356 1.1 skrll {
1357 1.1 skrll int i;
1358 1.1 skrll finished_insnS fi;
1359 1.1 skrll
1360 1.1 skrll /* Ensure each pair of 16 bit insns is in the same frag. */
1361 1.1 skrll frag_grow (4);
1362 1.1 skrll
1363 1.1 skrll gas_cgen_finish_insn (insn.orig_insn, insn.buffer,
1364 1.1 skrll CGEN_FIELDS_BITSIZE (&insn.fields),
1365 1.1 skrll 1 /* relax_p */, &fi);
1366 1.1 skrll insn.addr = fi.addr;
1367 1.1 skrll insn.frag = fi.frag;
1368 1.1 skrll insn.num_fixups = fi.num_fixups;
1369 1.1 skrll for (i = 0; i < fi.num_fixups; ++i)
1370 1.1 skrll insn.fixups[i] = fi.fixups[i];
1371 1.1 skrll }
1372 1.1 skrll
1373 1.1 skrll if (swap)
1374 1.1 skrll {
1375 1.1 skrll int i, tmp;
1376 1.1 skrll
1377 1.1 skrll #define SWAP_BYTES(a,b) tmp = a; a = b; b = tmp
1378 1.1 skrll
1379 1.1 skrll /* Swap the two insns */
1380 1.1 skrll SWAP_BYTES (prev_insn.addr[0], insn.addr[0]);
1381 1.1 skrll SWAP_BYTES (prev_insn.addr[1], insn.addr[1]);
1382 1.1 skrll
1383 1.1 skrll target_make_parallel (insn.addr);
1384 1.1 skrll
1385 1.1 skrll /* Swap any relaxable frags recorded for the two insns. */
1386 1.1 skrll /* FIXME: Clarify. relaxation precludes parallel insns */
1387 1.1 skrll if (prev_insn.frag->fr_opcode == prev_insn.addr)
1388 1.1 skrll prev_insn.frag->fr_opcode = insn.addr;
1389 1.1 skrll else if (insn.frag->fr_opcode == insn.addr)
1390 1.1 skrll insn.frag->fr_opcode = prev_insn.addr;
1391 1.1 skrll
1392 1.1 skrll /* Change a frag to, if each insn is in a different frag.
1393 1.1 skrll It must keep only one instruction in a frag. */
1394 1.1 skrll if (prev_insn.frag != insn.frag)
1395 1.1 skrll {
1396 1.1 skrll for (i = 0; i < prev_insn.num_fixups; ++i)
1397 1.1 skrll prev_insn.fixups[i]->fx_frag = insn.frag;
1398 1.1 skrll for (i = 0; i < insn.num_fixups; ++i)
1399 1.1 skrll insn.fixups[i]->fx_frag = prev_insn.frag;
1400 1.1 skrll }
1401 1.1 skrll else
1402 1.1 skrll {
1403 1.1 skrll /* Update the addresses in any fixups.
1404 1.1 skrll Note that we don't have to handle the case where each insn is in
1405 1.1 skrll a different frag as we ensure they're in the same frag above. */
1406 1.1 skrll for (i = 0; i < prev_insn.num_fixups; ++i)
1407 1.1 skrll prev_insn.fixups[i]->fx_where += 2;
1408 1.1 skrll for (i = 0; i < insn.num_fixups; ++i)
1409 1.1 skrll insn.fixups[i]->fx_where -= 2;
1410 1.1 skrll }
1411 1.1 skrll }
1412 1.1 skrll
1413 1.1 skrll /* Keep track of whether we've seen a pair of 16 bit insns.
1414 1.1 skrll prev_insn.insn is NULL when we're on a 32 bit boundary. */
1415 1.1 skrll if (on_32bit_boundary_p)
1416 1.1 skrll prev_insn = insn;
1417 1.1 skrll else
1418 1.1 skrll prev_insn.insn = NULL;
1419 1.1 skrll
1420 1.1 skrll /* If the insn needs the following one to be on a 32 bit boundary
1421 1.1 skrll (e.g. subroutine calls), fill this insn's slot. */
1422 1.1 skrll if (on_32bit_boundary_p
1423 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_FILL_SLOT) != 0)
1424 1.1 skrll fill_insn (0);
1425 1.1 skrll
1426 1.1 skrll /* If this is a relaxable insn (can be replaced with a larger version)
1427 1.1 skrll mark the fact so that we can emit an alignment directive for a
1428 1.1 skrll following 32 bit insn if we see one. */
1429 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) != 0)
1430 1.1 skrll seen_relaxable_p = 1;
1431 1.1 skrll }
1432 1.1 skrll
1433 1.1 skrll /* Set these so m32r_fill_insn can use them. */
1434 1.1 skrll prev_seg = now_seg;
1435 1.1 skrll prev_subseg = now_subseg;
1436 1.1 skrll }
1437 1.1 skrll
1438 1.1 skrll /* The syntax in the manual says constants begin with '#'.
1439 1.1 skrll We just ignore it. */
1440 1.1 skrll
1441 1.1 skrll void
1442 1.1 skrll md_operand (expressionS *expressionP)
1443 1.1 skrll {
1444 1.1 skrll if (*input_line_pointer == '#')
1445 1.1 skrll {
1446 1.1 skrll input_line_pointer++;
1447 1.1 skrll expression (expressionP);
1448 1.1 skrll }
1449 1.1 skrll }
1450 1.1 skrll
1451 1.1.1.7 christos valueT
1452 1.1 skrll md_section_align (segT segment, valueT size)
1453 1.1.1.4 christos {
1454 1.1 skrll int align = bfd_section_alignment (segment);
1455 1.1 skrll
1456 1.1 skrll return ((size + (1 << align) - 1) & -(1 << align));
1457 1.1 skrll }
1458 1.1 skrll
1459 1.1 skrll symbolS *
1460 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1461 1.1 skrll {
1462 1.1 skrll return 0;
1463 1.1 skrll }
1464 1.1 skrll
1465 1.1 skrll /* .scomm pseudo-op handler.
1467 1.1 skrll
1468 1.1 skrll This is a new pseudo-op to handle putting objects in .scommon.
1469 1.1 skrll By doing this the linker won't need to do any work,
1470 1.1 skrll and more importantly it removes the implicit -G arg necessary to
1471 1.1 skrll correctly link the object file. */
1472 1.1 skrll
1473 1.1 skrll static void
1474 1.1 skrll m32r_scomm (int ignore ATTRIBUTE_UNUSED)
1475 1.1 skrll {
1476 1.1 skrll char *name;
1477 1.1 skrll char c;
1478 1.1 skrll char *p;
1479 1.1 skrll offsetT size;
1480 1.1.1.4 christos symbolS *symbolP;
1481 1.1 skrll offsetT align;
1482 1.1 skrll int align2;
1483 1.1 skrll
1484 1.1 skrll c = get_symbol_name (&name);
1485 1.1.1.4 christos
1486 1.1 skrll /* Just after name is now '\0'. */
1487 1.1 skrll p = input_line_pointer;
1488 1.1 skrll *p = c;
1489 1.1 skrll SKIP_WHITESPACE_AFTER_NAME ();
1490 1.1 skrll if (*input_line_pointer != ',')
1491 1.1 skrll {
1492 1.1 skrll as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1493 1.1 skrll ignore_rest_of_line ();
1494 1.1 skrll return;
1495 1.1 skrll }
1496 1.1 skrll
1497 1.1 skrll /* Skip ','. */
1498 1.1 skrll input_line_pointer++;
1499 1.1 skrll if ((size = get_absolute_expression ()) < 0)
1500 1.1 skrll {
1501 1.1 skrll /* xgettext:c-format */
1502 1.1 skrll as_warn (_(".SCOMMon length (%ld.) <0! Ignored."), (long) size);
1503 1.1 skrll ignore_rest_of_line ();
1504 1.1 skrll return;
1505 1.1 skrll }
1506 1.1 skrll
1507 1.1 skrll /* The third argument to .scomm is the alignment. */
1508 1.1 skrll if (*input_line_pointer != ',')
1509 1.1 skrll align = 8;
1510 1.1 skrll else
1511 1.1 skrll {
1512 1.1 skrll ++input_line_pointer;
1513 1.1 skrll align = get_absolute_expression ();
1514 1.1 skrll if (align <= 0)
1515 1.1 skrll {
1516 1.1 skrll as_warn (_("ignoring bad alignment"));
1517 1.1 skrll align = 8;
1518 1.1 skrll }
1519 1.1 skrll }
1520 1.1 skrll
1521 1.1 skrll /* Convert to a power of 2 alignment. */
1522 1.1 skrll if (align)
1523 1.1 skrll {
1524 1.1 skrll for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
1525 1.1 skrll continue;
1526 1.1 skrll if (align != 1)
1527 1.1 skrll {
1528 1.1 skrll as_bad (_("Common alignment not a power of 2"));
1529 1.1 skrll ignore_rest_of_line ();
1530 1.1 skrll return;
1531 1.1 skrll }
1532 1.1 skrll }
1533 1.1 skrll else
1534 1.1 skrll align2 = 0;
1535 1.1 skrll
1536 1.1 skrll *p = 0;
1537 1.1 skrll symbolP = symbol_find_or_make (name);
1538 1.1 skrll *p = c;
1539 1.1 skrll
1540 1.1 skrll if (S_IS_DEFINED (symbolP))
1541 1.1 skrll {
1542 1.1 skrll /* xgettext:c-format */
1543 1.1 skrll as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1544 1.1 skrll S_GET_NAME (symbolP));
1545 1.1 skrll ignore_rest_of_line ();
1546 1.1 skrll return;
1547 1.1 skrll }
1548 1.1 skrll
1549 1.1 skrll if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1550 1.1 skrll {
1551 1.1 skrll /* xgettext:c-format */
1552 1.1 skrll as_bad (_("Length of .scomm \"%s\" is already %ld. Not changed to %ld."),
1553 1.1 skrll S_GET_NAME (symbolP),
1554 1.1 skrll (long) S_GET_VALUE (symbolP),
1555 1.1 skrll (long) size);
1556 1.1 skrll
1557 1.1 skrll ignore_rest_of_line ();
1558 1.1 skrll return;
1559 1.1 skrll }
1560 1.1 skrll
1561 1.1 skrll if (symbol_get_obj (symbolP)->local)
1562 1.1 skrll {
1563 1.1 skrll segT old_sec = now_seg;
1564 1.1 skrll int old_subsec = now_subseg;
1565 1.1 skrll char *pfrag;
1566 1.1 skrll
1567 1.1 skrll record_alignment (sbss_section, align2);
1568 1.1 skrll subseg_set (sbss_section, 0);
1569 1.1 skrll
1570 1.1 skrll if (align2)
1571 1.1 skrll frag_align (align2, 0, 0);
1572 1.1 skrll
1573 1.1 skrll if (S_GET_SEGMENT (symbolP) == sbss_section)
1574 1.1 skrll symbol_get_frag (symbolP)->fr_symbol = 0;
1575 1.1 skrll
1576 1.1 skrll symbol_set_frag (symbolP, frag_now);
1577 1.1 skrll
1578 1.1 skrll pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1579 1.1 skrll (char *) 0);
1580 1.1 skrll *pfrag = 0;
1581 1.1 skrll S_SET_SIZE (symbolP, size);
1582 1.1 skrll S_SET_SEGMENT (symbolP, sbss_section);
1583 1.1 skrll S_CLEAR_EXTERNAL (symbolP);
1584 1.1 skrll subseg_set (old_sec, old_subsec);
1585 1.1 skrll }
1586 1.1 skrll else
1587 1.1 skrll {
1588 1.1 skrll S_SET_VALUE (symbolP, (valueT) size);
1589 1.1 skrll S_SET_ALIGN (symbolP, align2);
1590 1.1 skrll S_SET_EXTERNAL (symbolP);
1591 1.1 skrll S_SET_SEGMENT (symbolP, &scom_section);
1592 1.1 skrll }
1593 1.1 skrll
1594 1.1 skrll demand_empty_rest_of_line ();
1595 1.1 skrll }
1596 1.1 skrll
1597 1.1 skrll /* The target specific pseudo-ops which we support. */
1598 1.1 skrll const pseudo_typeS md_pseudo_table[] =
1599 1.1 skrll {
1600 1.1 skrll { "word", cons, 4 },
1601 1.1 skrll { "fillinsn", fill_insn, 0 },
1602 1.1 skrll { "scomm", m32r_scomm, 0 },
1603 1.1 skrll { "debugsym", debug_sym, 0 },
1604 1.1 skrll { "m32r", allow_m32rx, 0 },
1605 1.1 skrll { "m32rx", allow_m32rx, 1 },
1606 1.1 skrll { "m32r2", allow_m32rx, 2 },
1607 1.1 skrll { "little", little, 1 },
1608 1.1 skrll { "big", little, 0 },
1609 1.1 skrll { NULL, NULL, 0 }
1610 1.1 skrll };
1611 1.1 skrll
1612 1.1 skrll /* Interface to relax_segment. */
1614 1.1 skrll
1615 1.1 skrll /* FIXME: Build table by hand, get it working, then machine generate. */
1616 1.1 skrll
1617 1.1 skrll const relax_typeS md_relax_table[] =
1618 1.1 skrll {
1619 1.1 skrll /* The fields are:
1620 1.1 skrll 1) most positive reach of this state,
1621 1.1 skrll 2) most negative reach of this state,
1622 1.1 skrll 3) how many bytes this mode will add to the size of the current frag
1623 1.1 skrll 4) which index into the table to try if we can't fit into this one. */
1624 1.1 skrll
1625 1.1 skrll /* The first entry must be unused because an `rlx_more' value of zero ends
1626 1.1 skrll each list. */
1627 1.1 skrll {1, 1, 0, 0},
1628 1.1 skrll
1629 1.1 skrll /* The displacement used by GAS is from the end of the 2 byte insn,
1630 1.1 skrll so we subtract 2 from the following. */
1631 1.1 skrll /* 16 bit insn, 8 bit disp -> 10 bit range.
1632 1.1 skrll This doesn't handle a branch in the right slot at the border:
1633 1.1 skrll the "& -4" isn't taken into account. It's not important enough to
1634 1.1 skrll complicate things over it, so we subtract an extra 2 (or + 2 in -ve
1635 1.1 skrll case). */
1636 1.1 skrll {511 - 2 - 2, -512 - 2 + 2, 0, 2 },
1637 1.1 skrll /* 32 bit insn, 24 bit disp -> 26 bit range. */
1638 1.1 skrll {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 },
1639 1.1 skrll /* Same thing, but with leading nop for alignment. */
1640 1.1 skrll {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 }
1641 1.1 skrll };
1642 1.1 skrll
1643 1.1 skrll long
1644 1.1 skrll m32r_relax_frag (segT segment, fragS *fragP, long stretch)
1645 1.1 skrll {
1646 1.1 skrll /* Address of branch insn. */
1647 1.1 skrll long address = fragP->fr_address + fragP->fr_fix - 2;
1648 1.1 skrll long growth = 0;
1649 1.1 skrll
1650 1.1 skrll /* Keep 32 bit insns aligned on 32 bit boundaries. */
1651 1.1 skrll if (fragP->fr_subtype == 2)
1652 1.1 skrll {
1653 1.1 skrll if ((address & 3) != 0)
1654 1.1 skrll {
1655 1.1 skrll fragP->fr_subtype = 3;
1656 1.1 skrll growth = 2;
1657 1.1 skrll }
1658 1.1 skrll }
1659 1.1 skrll else if (fragP->fr_subtype == 3)
1660 1.1 skrll {
1661 1.1 skrll if ((address & 3) == 0)
1662 1.1 skrll {
1663 1.1 skrll fragP->fr_subtype = 2;
1664 1.1 skrll growth = -2;
1665 1.1 skrll }
1666 1.1 skrll }
1667 1.1 skrll else
1668 1.1 skrll {
1669 1.1 skrll growth = relax_frag (segment, fragP, stretch);
1670 1.1 skrll
1671 1.1 skrll /* Long jump on odd halfword boundary? */
1672 1.1 skrll if (fragP->fr_subtype == 2 && (address & 3) != 0)
1673 1.1 skrll {
1674 1.1 skrll fragP->fr_subtype = 3;
1675 1.1 skrll growth += 2;
1676 1.1 skrll }
1677 1.1 skrll }
1678 1.1 skrll
1679 1.1 skrll return growth;
1680 1.1 skrll }
1681 1.1 skrll
1682 1.1 skrll /* Return an initial guess of the length by which a fragment must grow to
1683 1.1 skrll hold a branch to reach its destination.
1684 1.1 skrll Also updates fr_type/fr_subtype as necessary.
1685 1.1 skrll
1686 1.1 skrll Called just before doing relaxation.
1687 1.1 skrll Any symbol that is now undefined will not become defined.
1688 1.1 skrll The guess for fr_var is ACTUALLY the growth beyond fr_fix.
1689 1.1 skrll Whatever we do to grow fr_fix or fr_var contributes to our returned value.
1690 1.1 skrll Although it may not be explicit in the frag, pretend fr_var starts
1691 1.1 skrll with a 0 value. */
1692 1.1 skrll
1693 1.1 skrll int
1694 1.1 skrll md_estimate_size_before_relax (fragS *fragP, segT segment)
1695 1.1 skrll {
1696 1.1 skrll /* The only thing we have to handle here are symbols outside of the
1697 1.1 skrll current segment. They may be undefined or in a different segment in
1698 1.1 skrll which case linker scripts may place them anywhere.
1699 1.1 skrll However, we can't finish the fragment here and emit the reloc as insn
1700 1.1 skrll alignment requirements may move the insn about. */
1701 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != segment
1702 1.1 skrll || S_IS_EXTERNAL (fragP->fr_symbol)
1703 1.1 skrll || S_IS_WEAK (fragP->fr_symbol))
1704 1.1 skrll {
1705 1.1 skrll /* The symbol is undefined in this segment.
1706 1.1 skrll Change the relaxation subtype to the max allowable and leave
1707 1.1 skrll all further handling to md_convert_frag. */
1708 1.1 skrll fragP->fr_subtype = 2;
1709 1.1 skrll
1710 1.1 skrll {
1711 1.1 skrll const CGEN_INSN *insn;
1712 1.1 skrll int i;
1713 1.1 skrll
1714 1.1 skrll /* Update the recorded insn.
1715 1.1 skrll Fortunately we don't have to look very far.
1716 1.1 skrll FIXME: Change this to record in the instruction the next higher
1717 1.1 skrll relaxable insn to use. */
1718 1.1 skrll for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++)
1719 1.1 skrll {
1720 1.1 skrll if ((strcmp (CGEN_INSN_MNEMONIC (insn),
1721 1.1 skrll CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn))
1722 1.1 skrll == 0)
1723 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED))
1724 1.1 skrll break;
1725 1.1 skrll }
1726 1.1 skrll if (i == 4)
1727 1.1 skrll abort ();
1728 1.1 skrll
1729 1.1 skrll fragP->fr_cgen.insn = insn;
1730 1.1 skrll return 2;
1731 1.1 skrll }
1732 1.1 skrll }
1733 1.1 skrll
1734 1.1 skrll return md_relax_table[fragP->fr_subtype].rlx_length;
1735 1.1 skrll }
1736 1.1 skrll
1737 1.1 skrll /* *FRAGP has been relaxed to its final size, and now needs to have
1738 1.1 skrll the bytes inside it modified to conform to the new size.
1739 1.1 skrll
1740 1.1 skrll Called after relaxation is finished.
1741 1.1 skrll fragP->fr_type == rs_machine_dependent.
1742 1.1 skrll fragP->fr_subtype is the subtype of what the address relaxed to. */
1743 1.1 skrll
1744 1.1 skrll void
1745 1.1 skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1746 1.1 skrll segT sec,
1747 1.1 skrll fragS *fragP)
1748 1.1 skrll {
1749 1.1 skrll char *opcode;
1750 1.1 skrll char *displacement;
1751 1.1 skrll int target_address;
1752 1.1 skrll int opcode_address;
1753 1.1 skrll int extension;
1754 1.1 skrll int addend;
1755 1.1 skrll
1756 1.1 skrll opcode = fragP->fr_opcode;
1757 1.1 skrll
1758 1.1 skrll /* Address opcode resides at in file space. */
1759 1.1 skrll opcode_address = fragP->fr_address + fragP->fr_fix - 2;
1760 1.1 skrll
1761 1.1 skrll switch (fragP->fr_subtype)
1762 1.1 skrll {
1763 1.1 skrll case 1:
1764 1.1 skrll extension = 0;
1765 1.1 skrll displacement = &opcode[1];
1766 1.1 skrll break;
1767 1.1 skrll case 2:
1768 1.1 skrll opcode[0] |= 0x80;
1769 1.1 skrll extension = 2;
1770 1.1 skrll displacement = &opcode[1];
1771 1.1 skrll break;
1772 1.1 skrll case 3:
1773 1.1 skrll opcode[2] = opcode[0] | 0x80;
1774 1.1 skrll md_number_to_chars (opcode, PAR_NOP_INSN, 2);
1775 1.1 skrll opcode_address += 2;
1776 1.1 skrll extension = 4;
1777 1.1 skrll displacement = &opcode[3];
1778 1.1 skrll break;
1779 1.1 skrll default:
1780 1.1 skrll abort ();
1781 1.1 skrll }
1782 1.1 skrll
1783 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != sec
1784 1.1 skrll || S_IS_EXTERNAL (fragP->fr_symbol)
1785 1.1 skrll || S_IS_WEAK (fragP->fr_symbol))
1786 1.1 skrll {
1787 1.1 skrll /* Symbol must be resolved by linker. */
1788 1.1 skrll if (fragP->fr_offset & 3)
1789 1.1 skrll as_warn (_("Addend to unresolved symbol not on word boundary."));
1790 1.1 skrll #ifdef USE_M32R_OLD_RELOC
1791 1.1 skrll addend = fragP->fr_offset >> 2; /* Old M32R used USE_REL. */
1792 1.1 skrll #else
1793 1.1 skrll addend = 0;
1794 1.1 skrll #endif
1795 1.1 skrll }
1796 1.1 skrll else
1797 1.1 skrll {
1798 1.1 skrll /* Address we want to reach in file space. */
1799 1.1 skrll target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
1800 1.1 skrll addend = (target_address - (opcode_address & -4)) >> 2;
1801 1.1 skrll }
1802 1.1 skrll
1803 1.1 skrll /* Create a relocation for symbols that must be resolved by the linker.
1804 1.1 skrll Otherwise output the completed insn. */
1805 1.1 skrll
1806 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != sec
1807 1.1.1.2 christos || S_IS_EXTERNAL (fragP->fr_symbol)
1808 1.1.1.2 christos || S_IS_WEAK (fragP->fr_symbol))
1809 1.1 skrll {
1810 1.1 skrll fixS *fixP;
1811 1.1 skrll
1812 1.1 skrll gas_assert (fragP->fr_subtype != 1);
1813 1.1 skrll gas_assert (fragP->fr_cgen.insn != 0);
1814 1.1 skrll
1815 1.1 skrll fixP = gas_cgen_record_fixup (fragP,
1816 1.1 skrll /* Offset of branch insn in frag. */
1817 1.1 skrll fragP->fr_fix + extension - 4,
1818 1.1 skrll fragP->fr_cgen.insn,
1819 1.1 skrll 4 /* Length. */,
1820 1.1 skrll /* FIXME: quick hack. */
1821 1.1 skrll cgen_operand_lookup_by_num (gas_cgen_cpu_desc,
1822 1.1 skrll M32R_OPERAND_DISP24),
1823 1.1 skrll fragP->fr_cgen.opinfo,
1824 1.1 skrll fragP->fr_symbol, fragP->fr_offset);
1825 1.1 skrll if (fragP->fr_cgen.opinfo)
1826 1.1 skrll fixP->fx_r_type = fragP->fr_cgen.opinfo;
1827 1.1 skrll }
1828 1.1 skrll
1829 1.1 skrll #define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
1830 1.1 skrll
1831 1.1 skrll md_number_to_chars (displacement, (valueT) addend,
1832 1.1 skrll SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
1833 1.1 skrll
1834 1.1 skrll fragP->fr_fix += extension;
1835 1.1 skrll }
1836 1.1 skrll
1837 1.1 skrll /* Functions concerning relocs. */
1839 1.1 skrll
1840 1.1 skrll /* The location from which a PC relative jump should be calculated,
1841 1.1 skrll given a PC relative reloc. */
1842 1.1 skrll
1843 1.1 skrll long
1844 1.1 skrll md_pcrel_from_section (fixS *fixP, segT sec)
1845 1.1 skrll {
1846 1.1 skrll if (fixP->fx_addsy != (symbolS *) NULL
1847 1.1 skrll && (! S_IS_DEFINED (fixP->fx_addsy)
1848 1.1 skrll || S_GET_SEGMENT (fixP->fx_addsy) != sec
1849 1.1 skrll || S_IS_EXTERNAL (fixP->fx_addsy)
1850 1.1 skrll || S_IS_WEAK (fixP->fx_addsy)))
1851 1.1 skrll {
1852 1.1 skrll if (S_GET_SEGMENT (fixP->fx_addsy) != sec
1853 1.1 skrll && S_IS_DEFINED (fixP->fx_addsy)
1854 1.1 skrll && ! S_IS_EXTERNAL (fixP->fx_addsy)
1855 1.1 skrll && ! S_IS_WEAK (fixP->fx_addsy))
1856 1.1 skrll return fixP->fx_offset;
1857 1.1 skrll
1858 1.1 skrll /* The symbol is undefined (or is defined but not in this section).
1859 1.1 skrll Let the linker figure it out. */
1860 1.1 skrll return 0;
1861 1.1 skrll }
1862 1.1 skrll
1863 1.1 skrll return (fixP->fx_frag->fr_address + fixP->fx_where) & -4L;
1864 1.1 skrll }
1865 1.1 skrll
1866 1.1 skrll /* Return the bfd reloc type for OPERAND of INSN at fixup FIXP.
1867 1.1 skrll Returns BFD_RELOC_NONE if no reloc type can be found.
1868 1.1 skrll *FIXP may be modified if desired. */
1869 1.1 skrll
1870 1.1 skrll bfd_reloc_code_real_type
1871 1.1 skrll md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
1872 1.1 skrll const CGEN_OPERAND *operand,
1873 1.1 skrll fixS *fixP)
1874 1.1 skrll {
1875 1.1 skrll switch (operand->type)
1876 1.1 skrll {
1877 1.1 skrll case M32R_OPERAND_DISP8: return BFD_RELOC_M32R_10_PCREL;
1878 1.1 skrll case M32R_OPERAND_DISP16: return BFD_RELOC_M32R_18_PCREL;
1879 1.1 skrll case M32R_OPERAND_DISP24: return BFD_RELOC_M32R_26_PCREL;
1880 1.1 skrll case M32R_OPERAND_UIMM24: return BFD_RELOC_M32R_24;
1881 1.1 skrll case M32R_OPERAND_HI16:
1882 1.1 skrll case M32R_OPERAND_SLO16:
1883 1.1 skrll case M32R_OPERAND_ULO16:
1884 1.1 skrll /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1885 1.1 skrll if (fixP->fx_cgen.opinfo != 0)
1886 1.1 skrll return fixP->fx_cgen.opinfo;
1887 1.1 skrll break;
1888 1.1 skrll default:
1889 1.1 skrll /* Avoid -Wall warning. */
1890 1.1 skrll break;
1891 1.1 skrll }
1892 1.1 skrll return BFD_RELOC_NONE;
1893 1.1 skrll }
1894 1.1 skrll
1895 1.1 skrll /* Record a HI16 reloc for later matching with its LO16 cousin. */
1896 1.1 skrll
1897 1.1 skrll static void
1898 1.1.1.2 christos m32r_record_hi16 (int reloc_type,
1899 1.1 skrll fixS *fixP,
1900 1.1 skrll segT seg ATTRIBUTE_UNUSED)
1901 1.1.1.5 christos {
1902 1.1 skrll struct m32r_hi_fixup *hi_fixup;
1903 1.1 skrll
1904 1.1 skrll gas_assert (reloc_type == BFD_RELOC_M32R_HI16_SLO
1905 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_ULO);
1906 1.1 skrll
1907 1.1 skrll hi_fixup = XNEW (struct m32r_hi_fixup);
1908 1.1 skrll hi_fixup->fixp = fixP;
1909 1.1 skrll hi_fixup->seg = now_seg;
1910 1.1 skrll hi_fixup->next = m32r_hi_fixup_list;
1911 1.1 skrll
1912 1.1 skrll m32r_hi_fixup_list = hi_fixup;
1913 1.1 skrll }
1914 1.1 skrll
1915 1.1 skrll /* Called while parsing an instruction to create a fixup.
1916 1.1 skrll We need to check for HI16 relocs and queue them up for later sorting. */
1917 1.1 skrll
1918 1.1 skrll fixS *
1919 1.1 skrll m32r_cgen_record_fixup_exp (fragS *frag,
1920 1.1 skrll int where,
1921 1.1 skrll const CGEN_INSN *insn,
1922 1.1 skrll int length,
1923 1.1 skrll const CGEN_OPERAND *operand,
1924 1.1 skrll int opinfo,
1925 1.1 skrll expressionS *exp)
1926 1.1 skrll {
1927 1.1 skrll fixS *fixP;
1928 1.1 skrll bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED;
1929 1.1 skrll
1930 1.1 skrll if (m32r_check_fixup (exp, &r_type))
1931 1.1 skrll as_bad (_("Invalid PIC expression."));
1932 1.1 skrll
1933 1.1 skrll fixP = gas_cgen_record_fixup_exp (frag, where, insn, length,
1934 1.1 skrll operand, opinfo, exp);
1935 1.1 skrll
1936 1.1 skrll switch (operand->type)
1937 1.1 skrll {
1938 1.1 skrll case M32R_OPERAND_HI16:
1939 1.1 skrll /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1940 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO
1941 1.1 skrll || fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1942 1.1 skrll m32r_record_hi16 (fixP->fx_cgen.opinfo, fixP, now_seg);
1943 1.1 skrll break;
1944 1.1 skrll
1945 1.1 skrll default:
1946 1.1 skrll /* Avoid -Wall warning. */
1947 1.1 skrll break;
1948 1.1 skrll }
1949 1.1 skrll
1950 1.1 skrll switch (r_type)
1951 1.1 skrll {
1952 1.1 skrll case BFD_RELOC_UNUSED:
1953 1.1 skrll default:
1954 1.1 skrll return fixP;
1955 1.1 skrll
1956 1.1 skrll case BFD_RELOC_M32R_GOTPC24:
1957 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1958 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_HI_SLO;
1959 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1960 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_HI_ULO;
1961 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1962 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_LO;
1963 1.1 skrll break;
1964 1.1 skrll
1965 1.1 skrll case BFD_RELOC_M32R_GOT24:
1966 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1967 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_HI_SLO;
1968 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1969 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_HI_ULO;
1970 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1971 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_LO;
1972 1.1 skrll break;
1973 1.1 skrll
1974 1.1 skrll case BFD_RELOC_M32R_GOTOFF:
1975 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1976 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_HI_SLO;
1977 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1978 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_HI_ULO;
1979 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1980 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_LO;
1981 1.1 skrll break;
1982 1.1 skrll
1983 1.1 skrll case BFD_RELOC_M32R_26_PLTREL:
1984 1.1 skrll as_bad (_("Invalid PIC expression."));
1985 1.1 skrll break;
1986 1.1 skrll }
1987 1.1 skrll
1988 1.1 skrll fixP->fx_r_type = r_type;
1989 1.1 skrll
1990 1.1 skrll return fixP;
1991 1.1 skrll }
1992 1.1 skrll
1993 1.1 skrll /* Return BFD reloc type from opinfo field in a fixS.
1994 1.1 skrll It's tricky using fx_r_type in m32r_frob_file because the values
1995 1.1 skrll are BFD_RELOC_UNUSED + operand number. */
1996 1.1 skrll #define FX_OPINFO_R_TYPE(f) ((f)->fx_cgen.opinfo)
1997 1.1 skrll
1998 1.1 skrll /* Sort any unmatched HI16 relocs so that they immediately precede
1999 1.1 skrll the corresponding LO16 reloc. This is called before md_apply_fix and
2000 1.1 skrll tc_gen_reloc. */
2001 1.1 skrll
2002 1.1 skrll void
2003 1.1 skrll m32r_frob_file (void)
2004 1.1 skrll {
2005 1.1 skrll struct m32r_hi_fixup *l;
2006 1.1.1.2 christos
2007 1.1 skrll for (l = m32r_hi_fixup_list; l != NULL; l = l->next)
2008 1.1 skrll {
2009 1.1 skrll segment_info_type *seginfo;
2010 1.1 skrll int pass;
2011 1.1 skrll
2012 1.1 skrll gas_assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO
2013 1.1 skrll || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO);
2014 1.1 skrll
2015 1.1 skrll /* Check quickly whether the next fixup happens to be a matching low. */
2016 1.1 skrll if (l->fixp->fx_next != NULL
2017 1.1 skrll && FX_OPINFO_R_TYPE (l->fixp->fx_next) == BFD_RELOC_M32R_LO16
2018 1.1 skrll && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
2019 1.1 skrll && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
2020 1.1 skrll continue;
2021 1.1 skrll
2022 1.1 skrll /* Look through the fixups for this segment for a matching `low'.
2023 1.1 skrll When we find one, move the high/shigh just in front of it. We do
2024 1.1 skrll this in two passes. In the first pass, we try to find a
2025 1.1 skrll unique `low'. In the second pass, we permit multiple high's
2026 1.1 skrll relocs for a single `low'. */
2027 1.1 skrll seginfo = seg_info (l->seg);
2028 1.1 skrll for (pass = 0; pass < 2; pass++)
2029 1.1 skrll {
2030 1.1 skrll fixS *f;
2031 1.1 skrll fixS *prev;
2032 1.1 skrll
2033 1.1 skrll prev = NULL;
2034 1.1 skrll for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
2035 1.1 skrll {
2036 1.1 skrll /* Check whether this is a `low' fixup which matches l->fixp. */
2037 1.1 skrll if (FX_OPINFO_R_TYPE (f) == BFD_RELOC_M32R_LO16
2038 1.1 skrll && f->fx_addsy == l->fixp->fx_addsy
2039 1.1 skrll && f->fx_offset == l->fixp->fx_offset
2040 1.1 skrll && (pass == 1
2041 1.1 skrll || prev == NULL
2042 1.1 skrll || (FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_SLO
2043 1.1 skrll && FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_ULO)
2044 1.1 skrll || prev->fx_addsy != f->fx_addsy
2045 1.1 skrll || prev->fx_offset != f->fx_offset))
2046 1.1 skrll {
2047 1.1.1.2 christos fixS **pf;
2048 1.1 skrll
2049 1.1 skrll /* Move l->fixp before f. */
2050 1.1 skrll for (pf = &seginfo->fix_root;
2051 1.1 skrll *pf != l->fixp;
2052 1.1 skrll pf = & (*pf)->fx_next)
2053 1.1 skrll gas_assert (*pf != NULL);
2054 1.1 skrll
2055 1.1 skrll *pf = l->fixp->fx_next;
2056 1.1 skrll
2057 1.1 skrll l->fixp->fx_next = f;
2058 1.1 skrll if (prev == NULL)
2059 1.1 skrll seginfo->fix_root = l->fixp;
2060 1.1 skrll else
2061 1.1 skrll prev->fx_next = l->fixp;
2062 1.1 skrll
2063 1.1 skrll break;
2064 1.1 skrll }
2065 1.1 skrll
2066 1.1 skrll prev = f;
2067 1.1 skrll }
2068 1.1 skrll
2069 1.1 skrll if (f != NULL)
2070 1.1 skrll break;
2071 1.1 skrll
2072 1.1 skrll if (pass == 1
2073 1.1 skrll && warn_unmatched_high)
2074 1.1 skrll as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
2075 1.1 skrll _("Unmatched high/shigh reloc"));
2076 1.1 skrll }
2077 1.1 skrll }
2078 1.1 skrll }
2079 1.1 skrll
2080 1.1 skrll /* See whether we need to force a relocation into the output file.
2081 1.1 skrll This is used to force out switch and PC relative relocations when
2082 1.1 skrll relaxing. */
2083 1.1 skrll
2084 1.1 skrll int
2085 1.1 skrll m32r_force_relocation (fixS *fix)
2086 1.1 skrll {
2087 1.1 skrll if (generic_force_reloc (fix))
2088 1.1 skrll return 1;
2089 1.1 skrll
2090 1.1 skrll if (! m32r_relax)
2091 1.1 skrll return 0;
2092 1.1 skrll
2093 1.1 skrll return fix->fx_pcrel;
2094 1.1 skrll }
2095 1.1 skrll
2096 1.1 skrll /* Write a value out to the object file, using the appropriate endianness. */
2098 1.1 skrll
2099 1.1 skrll void
2100 1.1 skrll md_number_to_chars (char *buf, valueT val, int n)
2101 1.1 skrll {
2102 1.1 skrll if (target_big_endian)
2103 1.1 skrll number_to_chars_bigendian (buf, val, n);
2104 1.1 skrll else
2105 1.1 skrll number_to_chars_littleendian (buf, val, n);
2106 1.1.1.5 christos }
2107 1.1 skrll
2108 1.1 skrll /* Turn a string in input_line_pointer into a floating point constant
2109 1.1 skrll of type TYPE, and store the appropriate bytes in *LITP. The number
2110 1.1 skrll of LITTLENUMS emitted is stored in *SIZEP. An error message is
2111 1.1 skrll returned, or NULL on OK. */
2112 1.1 skrll
2113 1.1 skrll const char *
2114 1.1 skrll md_atof (int type, char *litP, int *sizeP)
2115 1.1 skrll {
2116 1.1 skrll return ieee_md_atof (type, litP, sizeP, target_big_endian);
2117 1.1 skrll }
2118 1.1 skrll
2119 1.1 skrll void
2120 1.1 skrll m32r_elf_section_change_hook (void)
2121 1.1 skrll {
2122 1.1 skrll /* If we have reached the end of a section and we have just emitted a
2123 1.1 skrll 16 bit insn, then emit a nop to make sure that the section ends on
2124 1.1 skrll a 32 bit boundary. */
2125 1.1 skrll
2126 1.1 skrll if (prev_insn.insn || seen_relaxable_p)
2127 1.1 skrll (void) m32r_fill_insn (0);
2128 1.1 skrll }
2129 1.1 skrll
2130 1.1 skrll /* Return true if can adjust the reloc to be relative to its section
2131 1.1 skrll (such as .data) instead of relative to some symbol. */
2132 1.1 skrll
2133 1.1 skrll bfd_boolean
2134 1.1 skrll m32r_fix_adjustable (fixS *fixP)
2135 1.1 skrll {
2136 1.1 skrll bfd_reloc_code_real_type reloc_type;
2137 1.1 skrll
2138 1.1 skrll if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
2139 1.1 skrll {
2140 1.1 skrll const CGEN_INSN *insn = NULL;
2141 1.1 skrll int opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
2142 1.1 skrll const CGEN_OPERAND *operand =
2143 1.1 skrll cgen_operand_lookup_by_num(gas_cgen_cpu_desc, opindex);
2144 1.1 skrll
2145 1.1 skrll reloc_type = md_cgen_lookup_reloc (insn, operand, fixP);
2146 1.1 skrll }
2147 1.1 skrll else
2148 1.1 skrll reloc_type = fixP->fx_r_type;
2149 1.1 skrll
2150 1.1 skrll if (fixP->fx_addsy == NULL)
2151 1.1 skrll return 1;
2152 1.1 skrll
2153 1.1 skrll /* Prevent all adjustments to global symbols. */
2154 1.1 skrll if (S_IS_EXTERNAL (fixP->fx_addsy))
2155 1.1 skrll return 0;
2156 1.1 skrll if (S_IS_WEAK (fixP->fx_addsy))
2157 1.1 skrll return 0;
2158 1.1 skrll
2159 1.1 skrll if (pic_code
2160 1.1 skrll && (reloc_type == BFD_RELOC_M32R_24
2161 1.1 skrll || reloc_type == BFD_RELOC_M32R_26_PCREL
2162 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_SLO
2163 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_ULO
2164 1.1 skrll || reloc_type == BFD_RELOC_M32R_LO16))
2165 1.1 skrll return 0;
2166 1.1 skrll
2167 1.1 skrll if (reloc_type == BFD_RELOC_M32R_GOT24
2168 1.1 skrll || reloc_type == BFD_RELOC_M32R_26_PLTREL
2169 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_HI_SLO
2170 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_HI_ULO
2171 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_LO
2172 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_HI_SLO
2173 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_HI_ULO
2174 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_LO)
2175 1.1 skrll return 0;
2176 1.1 skrll
2177 1.1 skrll /* We need the symbol name for the VTABLE entries. */
2178 1.1 skrll if (reloc_type == BFD_RELOC_VTABLE_INHERIT
2179 1.1 skrll || reloc_type == BFD_RELOC_VTABLE_ENTRY)
2180 1.1 skrll return 0;
2181 1.1 skrll
2182 1.1 skrll return 1;
2183 1.1 skrll }
2184 1.1 skrll
2185 1.1 skrll void
2186 1.1 skrll m32r_elf_final_processing (void)
2187 1.1 skrll {
2188 1.1 skrll if (use_parallel)
2189 1.1 skrll m32r_flags |= E_M32R_HAS_PARALLEL;
2190 1.1 skrll elf_elfheader (stdoutput)->e_flags |= m32r_flags;
2191 1.1 skrll }
2192 1.1 skrll
2193 1.1 skrll /* Translate internal representation of relocation info to BFD target
2194 1.1.1.4 christos format. */
2195 1.1.1.5 christos
2196 1.1.1.4 christos arelent *
2197 1.1.1.5 christos tc_gen_reloc (asection * section, fixS * fixP)
2198 1.1 skrll {
2199 1.1 skrll arelent * reloc;
2200 1.1 skrll bfd_reloc_code_real_type code;
2201 1.1 skrll
2202 1.1 skrll reloc = XNEW (arelent);
2203 1.1 skrll
2204 1.1 skrll reloc->sym_ptr_ptr = XNEW (asymbol *);
2205 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
2206 1.1 skrll reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
2207 1.1 skrll
2208 1.1 skrll if (fixP->fx_pcrel)
2209 1.1 skrll {
2210 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_32)
2211 1.1.1.4 christos fixP->fx_r_type = BFD_RELOC_32_PCREL;
2212 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_16)
2213 1.1 skrll {
2214 1.1 skrll fixP->fx_r_type = BFD_RELOC_16_PCREL;
2215 1.1 skrll bfd_set_error (bfd_error_bad_value);
2216 1.1 skrll }
2217 1.1 skrll }
2218 1.1 skrll
2219 1.1 skrll code = fixP->fx_r_type;
2220 1.1 skrll if (pic_code)
2221 1.1 skrll {
2222 1.1 skrll #ifdef DEBUG_PIC
2223 1.1 skrll printf("%s",bfd_get_reloc_code_name(code));
2224 1.1 skrll #endif
2225 1.1 skrll switch (code)
2226 1.1 skrll {
2227 1.1 skrll case BFD_RELOC_M32R_26_PCREL:
2228 1.1 skrll code = BFD_RELOC_M32R_26_PLTREL;
2229 1.1 skrll break;
2230 1.1 skrll
2231 1.1 skrll case BFD_RELOC_M32R_24:
2232 1.1 skrll if (fixP->fx_addsy != NULL
2233 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2234 1.1 skrll code = BFD_RELOC_M32R_GOTPC24;
2235 1.1 skrll else
2236 1.1 skrll code = BFD_RELOC_M32R_GOT24;
2237 1.1 skrll break;
2238 1.1 skrll
2239 1.1 skrll case BFD_RELOC_M32R_HI16_ULO:
2240 1.1 skrll if (fixP->fx_addsy != NULL
2241 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2242 1.1 skrll code = BFD_RELOC_M32R_GOTPC_HI_ULO;
2243 1.1 skrll else
2244 1.1 skrll code = BFD_RELOC_M32R_GOT16_HI_ULO;
2245 1.1 skrll break;
2246 1.1 skrll
2247 1.1 skrll case BFD_RELOC_M32R_HI16_SLO:
2248 1.1 skrll if (fixP->fx_addsy != NULL
2249 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2250 1.1 skrll code = BFD_RELOC_M32R_GOTPC_HI_SLO;
2251 1.1 skrll else
2252 1.1 skrll code = BFD_RELOC_M32R_GOT16_HI_SLO;
2253 1.1 skrll break;
2254 1.1 skrll
2255 1.1 skrll case BFD_RELOC_M32R_LO16:
2256 1.1 skrll if (fixP->fx_addsy != NULL
2257 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2258 1.1 skrll code = BFD_RELOC_M32R_GOTPC_LO;
2259 1.1 skrll else
2260 1.1 skrll code = BFD_RELOC_M32R_GOT16_LO;
2261 1.1 skrll break;
2262 1.1 skrll
2263 1.1.1.4 christos default:
2264 1.1 skrll break;
2265 1.1 skrll }
2266 1.1 skrll #ifdef DEBUG_PIC
2267 1.1 skrll printf(" => %s",bfd_get_reloc_code_name(code));
2268 1.1 skrll #endif
2269 1.1 skrll }
2270 1.1 skrll
2271 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2272 1.1 skrll
2273 1.1 skrll #ifdef DEBUG_PIC
2274 1.1 skrll printf(" => %s\n",reloc->howto->name);
2275 1.1 skrll #endif
2276 1.1 skrll
2277 1.1.1.4 christos if (reloc->howto == (reloc_howto_type *) NULL)
2278 1.1 skrll {
2279 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
2280 1.1 skrll _("internal error: can't export reloc type %d (`%s')"),
2281 1.1 skrll fixP->fx_r_type, bfd_get_reloc_code_name (code));
2282 1.1 skrll return NULL;
2283 1.1 skrll }
2284 1.1 skrll
2285 1.1 skrll /* Use fx_offset for these cases. */
2286 1.1 skrll if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
2287 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2288 1.1 skrll || fixP->fx_r_type == BFD_RELOC_32_PCREL)
2289 1.1 skrll reloc->addend = fixP->fx_offset;
2290 1.1 skrll else if ((!pic_code
2291 1.1.1.6 christos && code != BFD_RELOC_M32R_26_PLTREL)
2292 1.1 skrll && fixP->fx_pcrel
2293 1.1 skrll && fixP->fx_addsy != NULL
2294 1.1 skrll && (S_GET_SEGMENT(fixP->fx_addsy) != section)
2295 1.1.1.4 christos && S_IS_DEFINED (fixP->fx_addsy)
2296 1.1 skrll && ! S_IS_EXTERNAL(fixP->fx_addsy)
2297 1.1 skrll && ! S_IS_WEAK(fixP->fx_addsy))
2298 1.1 skrll /* Already used fx_offset in the opcode field itself. */
2299 1.1 skrll reloc->addend = fixP->fx_offset;
2300 1.1.1.5 christos else
2301 1.1 skrll reloc->addend = fixP->fx_addnumber;
2302 1.1 skrll
2303 1.1 skrll return reloc;
2304 1.1 skrll }
2305 1.1 skrll
2306 1.1 skrll inline static char *
2307 1.1 skrll m32r_end_of_match (char *cont, const char *what)
2308 1.1 skrll {
2309 1.1 skrll int len = strlen (what);
2310 1.1 skrll
2311 1.1 skrll if (strncasecmp (cont, what, strlen (what)) == 0
2312 1.1 skrll && ! is_part_of_name (cont[len]))
2313 1.1 skrll return cont + len;
2314 1.1 skrll
2315 1.1 skrll return NULL;
2316 1.1 skrll }
2317 1.1 skrll
2318 1.1 skrll int
2319 1.1 skrll m32r_parse_name (char const *name,
2320 1.1 skrll expressionS *exprP,
2321 1.1 skrll enum expr_mode mode,
2322 1.1 skrll char *nextcharP)
2323 1.1 skrll {
2324 1.1 skrll char *next = input_line_pointer;
2325 1.1 skrll char *next_end;
2326 1.1 skrll int reloc_type;
2327 1.1 skrll operatorT op_type;
2328 1.1 skrll segT segment;
2329 1.1 skrll
2330 1.1 skrll exprP->X_op_symbol = NULL;
2331 1.1 skrll exprP->X_md = BFD_RELOC_UNUSED;
2332 1.1 skrll
2333 1.1 skrll if (strcmp (name, GOT_NAME) == 0)
2334 1.1 skrll {
2335 1.1 skrll if (! GOT_symbol)
2336 1.1 skrll GOT_symbol = symbol_find_or_make (name);
2337 1.1 skrll
2338 1.1 skrll exprP->X_add_symbol = GOT_symbol;
2339 1.1 skrll no_suffix:
2340 1.1 skrll /* If we have an absolute symbol or a
2341 1.1 skrll reg, then we know its value now. */
2342 1.1 skrll segment = S_GET_SEGMENT (exprP->X_add_symbol);
2343 1.1 skrll if (mode != expr_defer && segment == absolute_section)
2344 1.1 skrll {
2345 1.1 skrll exprP->X_op = O_constant;
2346 1.1 skrll exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2347 1.1 skrll exprP->X_add_symbol = NULL;
2348 1.1 skrll }
2349 1.1 skrll else if (mode != expr_defer && segment == reg_section)
2350 1.1 skrll {
2351 1.1 skrll exprP->X_op = O_register;
2352 1.1 skrll exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2353 1.1 skrll exprP->X_add_symbol = NULL;
2354 1.1 skrll }
2355 1.1 skrll else
2356 1.1 skrll {
2357 1.1 skrll exprP->X_op = O_symbol;
2358 1.1 skrll exprP->X_add_number = 0;
2359 1.1 skrll }
2360 1.1 skrll
2361 1.1 skrll return 1;
2362 1.1 skrll }
2363 1.1 skrll
2364 1.1 skrll exprP->X_add_symbol = symbol_find_or_make (name);
2365 1.1 skrll
2366 1.1 skrll if (*nextcharP != '@')
2367 1.1 skrll goto no_suffix;
2368 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "GOTOFF")))
2369 1.1 skrll {
2370 1.1 skrll reloc_type = BFD_RELOC_M32R_GOTOFF;
2371 1.1 skrll op_type = O_PIC_reloc;
2372 1.1 skrll }
2373 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "GOT")))
2374 1.1 skrll {
2375 1.1 skrll reloc_type = BFD_RELOC_M32R_GOT24;
2376 1.1 skrll op_type = O_PIC_reloc;
2377 1.1 skrll }
2378 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "PLT")))
2379 1.1 skrll {
2380 1.1 skrll reloc_type = BFD_RELOC_M32R_26_PLTREL;
2381 1.1 skrll op_type = O_PIC_reloc;
2382 1.1 skrll }
2383 1.1 skrll else
2384 1.1 skrll goto no_suffix;
2385 1.1 skrll
2386 1.1 skrll *input_line_pointer = *nextcharP;
2387 1.1 skrll input_line_pointer = next_end;
2388 1.1 skrll *nextcharP = *input_line_pointer;
2389 1.1 skrll *input_line_pointer = '\0';
2390 1.1 skrll
2391 1.1 skrll exprP->X_op = op_type;
2392 1.1 skrll exprP->X_add_number = 0;
2393 1.1 skrll exprP->X_md = reloc_type;
2394 1.1 skrll
2395 1.1 skrll return 1;
2396 1.1 skrll }
2397 1.1 skrll
2398 1.1 skrll int
2399 1.1 skrll m32r_cgen_parse_fix_exp(int opinfo, expressionS *exp)
2400 1.1 skrll {
2401 1.1 skrll if (exp->X_op == O_PIC_reloc
2402 1.1 skrll && exp->X_md == BFD_RELOC_M32R_26_PLTREL)
2403 {
2404 exp->X_op = O_symbol;
2405 opinfo = exp->X_md;
2406 }
2407
2408 return opinfo;
2409 }
2410