tc-m32r.c revision 1.1.1.8 1 1.1 skrll /* tc-m32r.c -- Assembler for the Renesas M32R.
2 1.1.1.8 christos Copyright (C) 1996-2022 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.1.8 christos 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, &zero_address_frag, 0);
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.8 christos
717 1.1.1.8 christos /* 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,
720 1.1 skrll applicable & (SEC_ALLOC | SEC_SMALL_DATA));
721 1.1 skrll
722 1.1 skrll subseg_set (seg, subseg);
723 1.1.1.3 christos
724 1.1 skrll /* We must construct a fake section similar to bfd_com_section
725 1.1.1.8 christos but with the name .scommon. */
726 1.1 skrll scom_section = *bfd_com_section_ptr;
727 1.1 skrll scom_section.name = ".scommon";
728 1.1 skrll scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
729 1.1.1.3 christos scom_section.output_section = & scom_section;
730 1.1 skrll scom_section.symbol = & scom_symbol;
731 1.1 skrll scom_section.symbol_ptr_ptr = & scom_section.symbol;
732 1.1 skrll scom_symbol = * bfd_com_section_ptr->symbol;
733 1.1 skrll scom_symbol.name = ".scommon";
734 1.1 skrll scom_symbol.section = & scom_section;
735 1.1 skrll
736 1.1 skrll allow_m32rx (enable_m32rx);
737 1.1 skrll
738 1.1 skrll gas_cgen_initialize_saved_fixups_array ();
739 1.1 skrll }
740 1.1 skrll
741 1.1 skrll #define OPERAND_IS_COND_BIT(operand, indices, index) \
742 1.1 skrll ((operand)->hw_type == HW_H_COND \
743 1.1 skrll || ((operand)->hw_type == HW_H_PSW) \
744 1.1 skrll || ((operand)->hw_type == HW_H_CR \
745 1.1 skrll && (indices [index] == 0 || indices [index] == 1)))
746 1.1 skrll
747 1.1 skrll /* Returns true if an output of instruction 'a' is referenced by an operand
748 1.1 skrll of instruction 'b'. If 'check_outputs' is true then b's outputs are
749 1.1 skrll checked, otherwise its inputs are examined. */
750 1.1 skrll
751 1.1 skrll static int
752 1.1 skrll first_writes_to_seconds_operands (m32r_insn *a,
753 1.1 skrll m32r_insn *b,
754 1.1 skrll const int check_outputs)
755 1.1 skrll {
756 1.1 skrll const CGEN_OPINST *a_operands = CGEN_INSN_OPERANDS (a->insn);
757 1.1 skrll const CGEN_OPINST *b_ops = CGEN_INSN_OPERANDS (b->insn);
758 1.1 skrll int a_index;
759 1.1 skrll
760 1.1 skrll if (ignore_parallel_conflicts)
761 1.1 skrll return 0;
762 1.1 skrll
763 1.1 skrll /* If at least one of the instructions takes no operands, then there is
764 1.1 skrll nothing to check. There really are instructions without operands,
765 1.1 skrll eg 'nop'. */
766 1.1 skrll if (a_operands == NULL || b_ops == NULL)
767 1.1 skrll return 0;
768 1.1 skrll
769 1.1 skrll /* Scan the operand list of 'a' looking for an output operand. */
770 1.1 skrll for (a_index = 0;
771 1.1 skrll a_operands->type != CGEN_OPINST_END;
772 1.1 skrll a_index ++, a_operands ++)
773 1.1 skrll {
774 1.1 skrll if (a_operands->type == CGEN_OPINST_OUTPUT)
775 1.1 skrll {
776 1.1 skrll int b_index;
777 1.1 skrll const CGEN_OPINST *b_operands = b_ops;
778 1.1 skrll
779 1.1 skrll /* Special Case:
780 1.1 skrll The Condition bit 'C' is a shadow of the CBR register (control
781 1.1 skrll register 1) and also a shadow of bit 31 of the program status
782 1.1 skrll word (control register 0). For now this is handled here, rather
783 1.1 skrll than by cgen.... */
784 1.1 skrll
785 1.1 skrll if (OPERAND_IS_COND_BIT (a_operands, a->indices, a_index))
786 1.1 skrll {
787 1.1 skrll /* Scan operand list of 'b' looking for another reference to the
788 1.1 skrll condition bit, which goes in the right direction. */
789 1.1 skrll for (b_index = 0;
790 1.1 skrll b_operands->type != CGEN_OPINST_END;
791 1.1 skrll b_index++, b_operands++)
792 1.1 skrll {
793 1.1 skrll if ((b_operands->type
794 1.1 skrll == (check_outputs
795 1.1 skrll ? CGEN_OPINST_OUTPUT
796 1.1 skrll : CGEN_OPINST_INPUT))
797 1.1 skrll && OPERAND_IS_COND_BIT (b_operands, b->indices, b_index))
798 1.1 skrll return 1;
799 1.1 skrll }
800 1.1 skrll }
801 1.1 skrll else
802 1.1 skrll {
803 1.1 skrll /* Scan operand list of 'b' looking for an operand that
804 1.1 skrll references the same hardware element, and which goes in the
805 1.1 skrll right direction. */
806 1.1 skrll for (b_index = 0;
807 1.1 skrll b_operands->type != CGEN_OPINST_END;
808 1.1 skrll b_index++, b_operands++)
809 1.1 skrll {
810 1.1 skrll if ((b_operands->type
811 1.1 skrll == (check_outputs
812 1.1 skrll ? CGEN_OPINST_OUTPUT
813 1.1 skrll : CGEN_OPINST_INPUT))
814 1.1 skrll && (b_operands->hw_type == a_operands->hw_type)
815 1.1 skrll && (a->indices[a_index] == b->indices[b_index]))
816 1.1 skrll return 1;
817 1.1 skrll }
818 1.1 skrll }
819 1.1 skrll }
820 1.1 skrll }
821 1.1 skrll
822 1.1 skrll return 0;
823 1.1 skrll }
824 1.1 skrll
825 1.1 skrll /* Returns true if the insn can (potentially) alter the program counter. */
826 1.1 skrll
827 1.1 skrll static int
828 1.1 skrll writes_to_pc (m32r_insn *a)
829 1.1 skrll {
830 1.1 skrll if (CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_UNCOND_CTI)
831 1.1 skrll || CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_COND_CTI))
832 1.1 skrll return 1;
833 1.1 skrll return 0;
834 1.1 skrll }
835 1.1 skrll
836 1.1 skrll /* Return NULL if the two 16 bit insns can be executed in parallel.
837 1.1 skrll Otherwise return a pointer to an error message explaining why not. */
838 1.1 skrll
839 1.1 skrll static const char *
840 1.1 skrll can_make_parallel (m32r_insn *a, m32r_insn *b)
841 1.1 skrll {
842 1.1 skrll PIPE_ATTR a_pipe;
843 1.1 skrll PIPE_ATTR b_pipe;
844 1.1 skrll
845 1.1 skrll /* Make sure the instructions are the right length. */
846 1.1 skrll if (CGEN_FIELDS_BITSIZE (&a->fields) != 16
847 1.1.1.8 christos || CGEN_FIELDS_BITSIZE (&b->fields) != 16)
848 1.1 skrll abort ();
849 1.1 skrll
850 1.1 skrll if (first_writes_to_seconds_operands (a, b, true))
851 1.1 skrll return _("instructions write to the same destination register.");
852 1.1 skrll
853 1.1 skrll a_pipe = CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_PIPE);
854 1.1 skrll b_pipe = CGEN_INSN_ATTR_VALUE (b->insn, CGEN_INSN_PIPE);
855 1.1 skrll
856 1.1 skrll /* Make sure that the instructions use the correct execution pipelines. */
857 1.1 skrll if (a_pipe == PIPE_NONE
858 1.1 skrll || b_pipe == PIPE_NONE)
859 1.1 skrll return _("Instructions do not use parallel execution pipelines.");
860 1.1 skrll
861 1.1 skrll /* Leave this test for last, since it is the only test that can
862 1.1 skrll go away if the instructions are swapped, and we want to make
863 1.1 skrll sure that any other errors are detected before this happens. */
864 1.1 skrll if (a_pipe == PIPE_S
865 1.1 skrll || b_pipe == PIPE_O
866 1.1 skrll || (b_pipe == PIPE_O_OS && (enable_m32rx != 2)))
867 1.1 skrll return _("Instructions share the same execution pipeline");
868 1.1 skrll
869 1.1 skrll return NULL;
870 1.1 skrll }
871 1.1 skrll
872 1.1 skrll /* Force the top bit of the second 16-bit insn to be set. */
873 1.1 skrll
874 1.1 skrll static void
875 1.1 skrll make_parallel (CGEN_INSN_BYTES_PTR buffer)
876 1.1 skrll {
877 1.1 skrll #if CGEN_INT_INSN_P
878 1.1 skrll *buffer |= 0x8000;
879 1.1 skrll #else
880 1.1 skrll buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
881 1.1 skrll |= 0x80;
882 1.1 skrll #endif
883 1.1 skrll }
884 1.1 skrll
885 1.1 skrll /* Same as make_parallel except buffer contains the bytes in target order. */
886 1.1 skrll
887 1.1 skrll static void
888 1.1 skrll target_make_parallel (char *buffer)
889 1.1 skrll {
890 1.1 skrll buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
891 1.1 skrll |= 0x80;
892 1.1 skrll }
893 1.1 skrll
894 1.1 skrll /* Assemble two instructions with an explicit parallel operation (||) or
895 1.1 skrll sequential operation (->). */
896 1.1 skrll
897 1.1 skrll static void
898 1.1 skrll assemble_two_insns (char *str1, char *str2, int parallel_p)
899 1.1 skrll {
900 1.1 skrll char *str3;
901 1.1 skrll m32r_insn first;
902 1.1 skrll m32r_insn second;
903 1.1 skrll char *errmsg;
904 1.1 skrll char save_str2 = *str2;
905 1.1 skrll
906 1.1 skrll /* Separate the two instructions. */
907 1.1 skrll *str2 = 0;
908 1.1 skrll
909 1.1 skrll /* Make sure the two insns begin on a 32 bit boundary.
910 1.1 skrll This is also done for the serial case (foo -> bar), relaxing doesn't
911 1.1 skrll affect insns written like this.
912 1.1 skrll Note that we must always do this as we can't assume anything about
913 1.1 skrll whether we're currently on a 32 bit boundary or not. Relaxing may
914 1.1 skrll change this. */
915 1.1 skrll fill_insn (0);
916 1.1 skrll
917 1.1 skrll first.debug_sym_link = debug_sym_link;
918 1.1 skrll debug_sym_link = (sym_linkS *) 0;
919 1.1 skrll
920 1.1 skrll /* Parse the first instruction. */
921 1.1.1.2 christos if (! (first.insn = m32r_cgen_assemble_insn
922 1.1 skrll (gas_cgen_cpu_desc, str1, & first.fields, first.buffer, & errmsg)))
923 1.1 skrll {
924 1.1 skrll as_bad ("%s", errmsg);
925 1.1 skrll return;
926 1.1 skrll }
927 1.1 skrll
928 1.1 skrll /* Check it. */
929 1.1 skrll if (CGEN_FIELDS_BITSIZE (&first.fields) != 16)
930 1.1 skrll {
931 1.1 skrll /* xgettext:c-format */
932 1.1 skrll as_bad (_("not a 16 bit instruction '%s'"), str1);
933 1.1 skrll return;
934 1.1 skrll }
935 1.1 skrll #ifdef E_M32R2_ARCH
936 1.1 skrll else if ((enable_m32rx == 1)
937 1.1 skrll /* FIXME: Need standard macro to perform this test. */
938 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
939 1.1 skrll & (1 << MACH_M32R2))
940 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
941 1.1 skrll & (1 << MACH_M32RX)))))
942 1.1 skrll {
943 1.1 skrll /* xgettext:c-format */
944 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str1);
945 1.1 skrll return;
946 1.1 skrll }
947 1.1 skrll else if ((! enable_special
948 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
949 1.1 skrll || (! enable_special_m32r
950 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)))
951 1.1 skrll #else
952 1.1 skrll else if (! enable_special
953 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
954 1.1 skrll #endif
955 1.1 skrll {
956 1.1 skrll /* xgettext:c-format */
957 1.1 skrll as_bad (_("unknown instruction '%s'"), str1);
958 1.1 skrll return;
959 1.1 skrll }
960 1.1 skrll else if (! enable_m32rx
961 1.1 skrll /* FIXME: Need standard macro to perform this test. */
962 1.1 skrll && (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
963 1.1 skrll == (1 << MACH_M32RX)))
964 1.1 skrll {
965 1.1 skrll /* xgettext:c-format */
966 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str1);
967 1.1 skrll return;
968 1.1 skrll }
969 1.1 skrll
970 1.1 skrll /* Check to see if this is an allowable parallel insn. */
971 1.1 skrll if (parallel_p
972 1.1 skrll && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_PIPE) == PIPE_NONE)
973 1.1 skrll {
974 1.1 skrll /* xgettext:c-format */
975 1.1 skrll as_bad (_("instruction '%s' cannot be executed in parallel."), str1);
976 1.1 skrll return;
977 1.1 skrll }
978 1.1 skrll
979 1.1 skrll /* Restore the original assembly text, just in case it is needed. */
980 1.1 skrll *str2 = save_str2;
981 1.1 skrll
982 1.1 skrll /* Save the original string pointer. */
983 1.1 skrll str3 = str1;
984 1.1 skrll
985 1.1 skrll /* Advanced past the parsed string. */
986 1.1 skrll str1 = str2 + 2;
987 1.1 skrll
988 1.1 skrll /* Remember the entire string in case it is needed for error
989 1.1 skrll messages. */
990 1.1 skrll str2 = str3;
991 1.1 skrll
992 1.1 skrll /* Convert the opcode to lower case. */
993 1.1 skrll {
994 1.1 skrll char *s2 = str1;
995 1.1 skrll
996 1.1 skrll while (ISSPACE (*s2++))
997 1.1 skrll continue;
998 1.1 skrll
999 1.1 skrll --s2;
1000 1.1 skrll
1001 1.1 skrll while (ISALNUM (*s2))
1002 1.1 skrll {
1003 1.1 skrll *s2 = TOLOWER (*s2);
1004 1.1 skrll s2++;
1005 1.1 skrll }
1006 1.1 skrll }
1007 1.1 skrll
1008 1.1 skrll /* Preserve any fixups that have been generated and reset the list
1009 1.1 skrll to empty. */
1010 1.1 skrll gas_cgen_save_fixups (0);
1011 1.1 skrll
1012 1.1 skrll /* Get the indices of the operands of the instruction. */
1013 1.1 skrll /* FIXME: CGEN_FIELDS is already recorded, but relying on that fact
1014 1.1 skrll doesn't seem right. Perhaps allow passing fields like we do insn. */
1015 1.1 skrll /* FIXME: ALIAS insns do not have operands, so we use this function
1016 1.1 skrll to find the equivalent insn and overwrite the value stored in our
1017 1.1 skrll structure. We still need the original insn, however, since this
1018 1.1 skrll may have certain attributes that are not present in the unaliased
1019 1.1 skrll version (eg relaxability). When aliases behave differently this
1020 1.1 skrll may have to change. */
1021 1.1 skrll first.orig_insn = first.insn;
1022 1.1 skrll {
1023 1.1 skrll CGEN_FIELDS tmp_fields;
1024 1.1 skrll first.insn = cgen_lookup_get_insn_operands
1025 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (first.buffer), NULL, 16,
1026 1.1 skrll first.indices, &tmp_fields);
1027 1.1 skrll }
1028 1.1 skrll
1029 1.1 skrll if (first.insn == NULL)
1030 1.1 skrll as_fatal (_("internal error: lookup/get operands failed"));
1031 1.1 skrll
1032 1.1 skrll second.debug_sym_link = NULL;
1033 1.1 skrll
1034 1.1 skrll /* Parse the second instruction. */
1035 1.1.1.2 christos if (! (second.insn = m32r_cgen_assemble_insn
1036 1.1 skrll (gas_cgen_cpu_desc, str1, & second.fields, second.buffer, & errmsg)))
1037 1.1 skrll {
1038 1.1 skrll as_bad ("%s", errmsg);
1039 1.1 skrll return;
1040 1.1 skrll }
1041 1.1 skrll
1042 1.1 skrll /* Check it. */
1043 1.1 skrll if (CGEN_FIELDS_BITSIZE (&second.fields) != 16)
1044 1.1 skrll {
1045 1.1 skrll /* xgettext:c-format */
1046 1.1 skrll as_bad (_("not a 16 bit instruction '%s'"), str1);
1047 1.1 skrll return;
1048 1.1 skrll }
1049 1.1 skrll #ifdef E_M32R2_ARCH
1050 1.1 skrll else if ((enable_m32rx == 1)
1051 1.1 skrll /* FIXME: Need standard macro to perform this test. */
1052 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1053 1.1 skrll & (1 << MACH_M32R2))
1054 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1055 1.1 skrll & (1 << MACH_M32RX)))))
1056 1.1 skrll {
1057 1.1 skrll /* xgettext:c-format */
1058 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str1);
1059 1.1 skrll return;
1060 1.1 skrll }
1061 1.1 skrll else if ((! enable_special
1062 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1063 1.1 skrll || (! enable_special_m32r
1064 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R)))
1065 1.1 skrll #else
1066 1.1 skrll else if (! enable_special
1067 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1068 1.1 skrll #endif
1069 1.1 skrll {
1070 1.1 skrll /* xgettext:c-format */
1071 1.1 skrll as_bad (_("unknown instruction '%s'"), str1);
1072 1.1 skrll return;
1073 1.1 skrll }
1074 1.1 skrll else if (! enable_m32rx
1075 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1076 1.1 skrll {
1077 1.1 skrll /* xgettext:c-format */
1078 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str1);
1079 1.1 skrll return;
1080 1.1 skrll }
1081 1.1 skrll
1082 1.1 skrll /* Check to see if this is an allowable parallel insn. */
1083 1.1 skrll if (parallel_p
1084 1.1 skrll && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_PIPE) == PIPE_NONE)
1085 1.1 skrll {
1086 1.1 skrll /* xgettext:c-format */
1087 1.1 skrll as_bad (_("instruction '%s' cannot be executed in parallel."), str1);
1088 1.1 skrll return;
1089 1.1 skrll }
1090 1.1 skrll
1091 1.1 skrll if (parallel_p && ! enable_m32rx)
1092 1.1 skrll {
1093 1.1 skrll if (CGEN_INSN_NUM (first.insn) != M32R_INSN_NOP
1094 1.1 skrll && CGEN_INSN_NUM (second.insn) != M32R_INSN_NOP)
1095 1.1 skrll {
1096 1.1 skrll /* xgettext:c-format */
1097 1.1 skrll as_bad (_("'%s': only the NOP instruction can be issued in parallel on the m32r"), str2);
1098 1.1 skrll return;
1099 1.1 skrll }
1100 1.1 skrll }
1101 1.1 skrll
1102 1.1 skrll /* Get the indices of the operands of the instruction. */
1103 1.1 skrll second.orig_insn = second.insn;
1104 1.1 skrll {
1105 1.1 skrll CGEN_FIELDS tmp_fields;
1106 1.1 skrll second.insn = cgen_lookup_get_insn_operands
1107 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (second.buffer), NULL, 16,
1108 1.1 skrll second.indices, &tmp_fields);
1109 1.1 skrll }
1110 1.1 skrll
1111 1.1 skrll if (second.insn == NULL)
1112 1.1 skrll as_fatal (_("internal error: lookup/get operands failed"));
1113 1.1 skrll
1114 1.1 skrll /* We assume that if the first instruction writes to a register that is
1115 1.1 skrll read by the second instruction it is because the programmer intended
1116 1.1 skrll this to happen, (after all they have explicitly requested that these
1117 1.1 skrll two instructions be executed in parallel). Although if the global
1118 1.1 skrll variable warn_explicit_parallel_conflicts is true then we do generate
1119 1.1 skrll a warning message. Similarly we assume that parallel branch and jump
1120 1.1 skrll instructions are deliberate and should not produce errors. */
1121 1.1.1.8 christos
1122 1.1 skrll if (parallel_p && warn_explicit_parallel_conflicts)
1123 1.1 skrll {
1124 1.1 skrll if (first_writes_to_seconds_operands (&first, &second, false))
1125 1.1.1.8 christos /* xgettext:c-format */
1126 1.1 skrll as_warn (_("%s: output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?"), str2);
1127 1.1 skrll
1128 1.1 skrll if (first_writes_to_seconds_operands (&second, &first, false))
1129 1.1 skrll /* xgettext:c-format */
1130 1.1 skrll as_warn (_("%s: output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?"), str2);
1131 1.1 skrll }
1132 1.1 skrll
1133 1.1 skrll if (!parallel_p
1134 1.1 skrll || (errmsg = (char *) can_make_parallel (&first, &second)) == NULL)
1135 1.1 skrll {
1136 1.1 skrll /* Get the fixups for the first instruction. */
1137 1.1 skrll gas_cgen_swap_fixups (0);
1138 1.1 skrll
1139 1.1 skrll /* Write it out. */
1140 1.1 skrll expand_debug_syms (first.debug_sym_link, 1);
1141 1.1 skrll gas_cgen_finish_insn (first.orig_insn, first.buffer,
1142 1.1 skrll CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1143 1.1 skrll
1144 1.1 skrll /* Force the top bit of the second insn to be set. */
1145 1.1 skrll if (parallel_p)
1146 1.1 skrll make_parallel (second.buffer);
1147 1.1 skrll
1148 1.1 skrll /* Get its fixups. */
1149 1.1 skrll gas_cgen_restore_fixups (0);
1150 1.1 skrll
1151 1.1 skrll /* Write it out. */
1152 1.1 skrll expand_debug_syms (second.debug_sym_link, 1);
1153 1.1 skrll gas_cgen_finish_insn (second.orig_insn, second.buffer,
1154 1.1 skrll CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1155 1.1 skrll }
1156 1.1 skrll /* Try swapping the instructions to see if they work that way. */
1157 1.1 skrll else if (can_make_parallel (&second, &first) == NULL)
1158 1.1 skrll {
1159 1.1 skrll /* Write out the second instruction first. */
1160 1.1 skrll expand_debug_syms (second.debug_sym_link, 1);
1161 1.1 skrll gas_cgen_finish_insn (second.orig_insn, second.buffer,
1162 1.1 skrll CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1163 1.1 skrll
1164 1.1 skrll /* Force the top bit of the first instruction to be set. */
1165 1.1 skrll make_parallel (first.buffer);
1166 1.1 skrll
1167 1.1 skrll /* Get the fixups for the first instruction. */
1168 1.1 skrll gas_cgen_restore_fixups (0);
1169 1.1 skrll
1170 1.1 skrll /* Write out the first instruction. */
1171 1.1 skrll expand_debug_syms (first.debug_sym_link, 1);
1172 1.1 skrll gas_cgen_finish_insn (first.orig_insn, first.buffer,
1173 1.1 skrll CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1174 1.1 skrll }
1175 1.1 skrll else
1176 1.1 skrll {
1177 1.1 skrll as_bad ("'%s': %s", str2, errmsg);
1178 1.1 skrll return;
1179 1.1 skrll }
1180 1.1 skrll
1181 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL)
1182 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1183 1.1 skrll m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1184 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)
1185 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R))
1186 1.1 skrll m32r_flags |= E_M32R_HAS_BIT_INST;
1187 1.1 skrll if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_FLOAT)
1188 1.1 skrll || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_FLOAT))
1189 1.1 skrll m32r_flags |= E_M32R_HAS_FLOAT_INST;
1190 1.1 skrll
1191 1.1 skrll /* Set these so m32r_fill_insn can use them. */
1192 1.1 skrll prev_seg = now_seg;
1193 1.1 skrll prev_subseg = now_subseg;
1194 1.1 skrll }
1195 1.1 skrll
1196 1.1 skrll void
1197 1.1 skrll md_assemble (char *str)
1198 1.1 skrll {
1199 1.1 skrll m32r_insn insn;
1200 1.1 skrll char *errmsg;
1201 1.1 skrll char *str2 = NULL;
1202 1.1 skrll
1203 1.1 skrll /* Initialize GAS's cgen interface for a new instruction. */
1204 1.1 skrll gas_cgen_init_parse ();
1205 1.1 skrll
1206 1.1 skrll /* Look for a parallel instruction separator. */
1207 1.1 skrll if ((str2 = strstr (str, "||")) != NULL)
1208 1.1 skrll {
1209 1.1 skrll assemble_two_insns (str, str2, 1);
1210 1.1 skrll m32r_flags |= E_M32R_HAS_PARALLEL;
1211 1.1 skrll return;
1212 1.1 skrll }
1213 1.1 skrll
1214 1.1 skrll /* Also look for a sequential instruction separator. */
1215 1.1 skrll if ((str2 = strstr (str, "->")) != NULL)
1216 1.1 skrll {
1217 1.1 skrll assemble_two_insns (str, str2, 0);
1218 1.1 skrll return;
1219 1.1 skrll }
1220 1.1 skrll
1221 1.1 skrll insn.debug_sym_link = debug_sym_link;
1222 1.1 skrll debug_sym_link = (sym_linkS *) 0;
1223 1.1 skrll
1224 1.1 skrll insn.insn = m32r_cgen_assemble_insn
1225 1.1 skrll (gas_cgen_cpu_desc, str, &insn.fields, insn.buffer, & errmsg);
1226 1.1.1.2 christos
1227 1.1 skrll if (!insn.insn)
1228 1.1 skrll {
1229 1.1 skrll as_bad ("%s", errmsg);
1230 1.1 skrll return;
1231 1.1 skrll }
1232 1.1 skrll
1233 1.1 skrll #ifdef E_M32R2_ARCH
1234 1.1 skrll if ((enable_m32rx == 1)
1235 1.1 skrll /* FIXME: Need standard macro to perform this test. */
1236 1.1 skrll && ((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1237 1.1 skrll & (1 << MACH_M32R2))
1238 1.1 skrll && !((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1239 1.1 skrll & (1 << MACH_M32RX)))))
1240 1.1 skrll {
1241 1.1 skrll /* xgettext:c-format */
1242 1.1 skrll as_bad (_("instruction '%s' is for the M32R2 only"), str);
1243 1.1 skrll return;
1244 1.1 skrll }
1245 1.1 skrll else if ((! enable_special
1246 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1247 1.1 skrll || (! enable_special_m32r
1248 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R)))
1249 1.1 skrll #else
1250 1.1 skrll if (! enable_special
1251 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1252 1.1 skrll #endif
1253 1.1 skrll {
1254 1.1 skrll /* xgettext:c-format */
1255 1.1 skrll as_bad (_("unknown instruction '%s'"), str);
1256 1.1 skrll return;
1257 1.1 skrll }
1258 1.1 skrll else if (! enable_m32rx
1259 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1260 1.1 skrll {
1261 1.1 skrll /* xgettext:c-format */
1262 1.1 skrll as_bad (_("instruction '%s' is for the M32RX only"), str);
1263 1.1 skrll return;
1264 1.1 skrll }
1265 1.1 skrll
1266 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1267 1.1 skrll m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1268 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R))
1269 1.1 skrll m32r_flags |= E_M32R_HAS_BIT_INST;
1270 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_FLOAT))
1271 1.1 skrll m32r_flags |= E_M32R_HAS_FLOAT_INST;
1272 1.1 skrll
1273 1.1 skrll if (CGEN_INSN_BITSIZE (insn.insn) == 32)
1274 1.1 skrll {
1275 1.1 skrll /* 32 bit insns must live on 32 bit boundaries. */
1276 1.1 skrll if (prev_insn.insn || seen_relaxable_p)
1277 1.1 skrll {
1278 1.1 skrll /* ??? If calling fill_insn too many times turns us into a memory
1279 1.1 skrll pig, can we call a fn to assemble a nop instead of
1280 1.1 skrll !seen_relaxable_p? */
1281 1.1 skrll fill_insn (0);
1282 1.1 skrll }
1283 1.1 skrll
1284 1.1 skrll expand_debug_syms (insn.debug_sym_link, 2);
1285 1.1 skrll
1286 1.1 skrll /* Doesn't really matter what we pass for RELAX_P here. */
1287 1.1 skrll gas_cgen_finish_insn (insn.insn, insn.buffer,
1288 1.1 skrll CGEN_FIELDS_BITSIZE (&insn.fields), 1, NULL);
1289 1.1 skrll }
1290 1.1.1.8 christos else
1291 1.1 skrll {
1292 1.1 skrll int on_32bit_boundary_p;
1293 1.1 skrll int swap = false;
1294 1.1 skrll
1295 1.1 skrll if (CGEN_INSN_BITSIZE (insn.insn) != 16)
1296 1.1 skrll abort ();
1297 1.1 skrll
1298 1.1 skrll insn.orig_insn = insn.insn;
1299 1.1 skrll
1300 1.1 skrll /* If the previous insn was relaxable, then it may be expanded
1301 1.1 skrll to fill the current 16 bit slot. Emit a NOP here to occupy
1302 1.1 skrll this slot, so that we can start at optimizing at a 32 bit
1303 1.1 skrll boundary. */
1304 1.1 skrll if (prev_insn.insn && seen_relaxable_p && optimize)
1305 1.1 skrll fill_insn (0);
1306 1.1 skrll
1307 1.1 skrll if (enable_m32rx)
1308 1.1 skrll {
1309 1.1 skrll /* Get the indices of the operands of the instruction.
1310 1.1 skrll FIXME: See assemble_parallel for notes on orig_insn. */
1311 1.1 skrll {
1312 1.1 skrll CGEN_FIELDS tmp_fields;
1313 1.1 skrll insn.insn = cgen_lookup_get_insn_operands
1314 1.1 skrll (gas_cgen_cpu_desc, NULL, INSN_VALUE (insn.buffer), NULL,
1315 1.1 skrll 16, insn.indices, &tmp_fields);
1316 1.1 skrll }
1317 1.1 skrll
1318 1.1 skrll if (insn.insn == NULL)
1319 1.1 skrll as_fatal (_("internal error: lookup/get operands failed"));
1320 1.1 skrll }
1321 1.1 skrll
1322 1.1 skrll /* Compute whether we're on a 32 bit boundary or not.
1323 1.1 skrll prev_insn.insn is NULL when we're on a 32 bit boundary. */
1324 1.1 skrll on_32bit_boundary_p = prev_insn.insn == NULL;
1325 1.1 skrll
1326 1.1 skrll /* Change a frag to, if each insn to swap is in a different frag.
1327 1.1 skrll It must keep only one instruction in a frag. */
1328 1.1 skrll if (parallel() && on_32bit_boundary_p)
1329 1.1 skrll {
1330 1.1 skrll frag_wane (frag_now);
1331 1.1 skrll frag_new (0);
1332 1.1 skrll }
1333 1.1 skrll
1334 1.1 skrll /* Look to see if this instruction can be combined with the
1335 1.1 skrll previous instruction to make one, parallel, 32 bit instruction.
1336 1.1 skrll If the previous instruction (potentially) changed the flow of
1337 1.1 skrll program control, then it cannot be combined with the current
1338 1.1 skrll instruction. If the current instruction is relaxable, then it
1339 1.1 skrll might be replaced with a longer version, so we cannot combine it.
1340 1.1 skrll Also if the output of the previous instruction is used as an
1341 1.1 skrll input to the current instruction then it cannot be combined.
1342 1.1 skrll Otherwise call can_make_parallel() with both orderings of the
1343 1.1 skrll instructions to see if they can be combined. */
1344 1.1 skrll if (! on_32bit_boundary_p
1345 1.1.1.8 christos && parallel ()
1346 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) == 0
1347 1.1 skrll && ! writes_to_pc (&prev_insn)
1348 1.1 skrll && ! first_writes_to_seconds_operands (&prev_insn, &insn, false))
1349 1.1 skrll {
1350 1.1.1.8 christos if (can_make_parallel (&prev_insn, &insn) == NULL)
1351 1.1 skrll make_parallel (insn.buffer);
1352 1.1 skrll else if (can_make_parallel (&insn, &prev_insn) == NULL)
1353 1.1 skrll swap = true;
1354 1.1 skrll }
1355 1.1 skrll
1356 1.1 skrll expand_debug_syms (insn.debug_sym_link, 1);
1357 1.1 skrll
1358 1.1 skrll {
1359 1.1 skrll int i;
1360 1.1 skrll finished_insnS fi;
1361 1.1 skrll
1362 1.1 skrll /* Ensure each pair of 16 bit insns is in the same frag. */
1363 1.1 skrll frag_grow (4);
1364 1.1 skrll
1365 1.1 skrll gas_cgen_finish_insn (insn.orig_insn, insn.buffer,
1366 1.1 skrll CGEN_FIELDS_BITSIZE (&insn.fields),
1367 1.1 skrll 1 /* relax_p */, &fi);
1368 1.1 skrll insn.addr = fi.addr;
1369 1.1 skrll insn.frag = fi.frag;
1370 1.1 skrll insn.num_fixups = fi.num_fixups;
1371 1.1 skrll for (i = 0; i < fi.num_fixups; ++i)
1372 1.1 skrll insn.fixups[i] = fi.fixups[i];
1373 1.1 skrll }
1374 1.1 skrll
1375 1.1 skrll if (swap)
1376 1.1 skrll {
1377 1.1 skrll int i, tmp;
1378 1.1 skrll
1379 1.1 skrll #define SWAP_BYTES(a,b) tmp = a; a = b; b = tmp
1380 1.1 skrll
1381 1.1 skrll /* Swap the two insns */
1382 1.1 skrll SWAP_BYTES (prev_insn.addr[0], insn.addr[0]);
1383 1.1 skrll SWAP_BYTES (prev_insn.addr[1], insn.addr[1]);
1384 1.1 skrll
1385 1.1 skrll target_make_parallel (insn.addr);
1386 1.1 skrll
1387 1.1 skrll /* Swap any relaxable frags recorded for the two insns. */
1388 1.1 skrll /* FIXME: Clarify. relaxation precludes parallel insns */
1389 1.1 skrll if (prev_insn.frag->fr_opcode == prev_insn.addr)
1390 1.1 skrll prev_insn.frag->fr_opcode = insn.addr;
1391 1.1 skrll else if (insn.frag->fr_opcode == insn.addr)
1392 1.1 skrll insn.frag->fr_opcode = prev_insn.addr;
1393 1.1 skrll
1394 1.1 skrll /* Change a frag to, if each insn is in a different frag.
1395 1.1 skrll It must keep only one instruction in a frag. */
1396 1.1 skrll if (prev_insn.frag != insn.frag)
1397 1.1 skrll {
1398 1.1 skrll for (i = 0; i < prev_insn.num_fixups; ++i)
1399 1.1 skrll prev_insn.fixups[i]->fx_frag = insn.frag;
1400 1.1 skrll for (i = 0; i < insn.num_fixups; ++i)
1401 1.1 skrll insn.fixups[i]->fx_frag = prev_insn.frag;
1402 1.1 skrll }
1403 1.1 skrll else
1404 1.1 skrll {
1405 1.1 skrll /* Update the addresses in any fixups.
1406 1.1 skrll Note that we don't have to handle the case where each insn is in
1407 1.1 skrll a different frag as we ensure they're in the same frag above. */
1408 1.1 skrll for (i = 0; i < prev_insn.num_fixups; ++i)
1409 1.1 skrll prev_insn.fixups[i]->fx_where += 2;
1410 1.1 skrll for (i = 0; i < insn.num_fixups; ++i)
1411 1.1 skrll insn.fixups[i]->fx_where -= 2;
1412 1.1 skrll }
1413 1.1 skrll }
1414 1.1 skrll
1415 1.1 skrll /* Keep track of whether we've seen a pair of 16 bit insns.
1416 1.1 skrll prev_insn.insn is NULL when we're on a 32 bit boundary. */
1417 1.1 skrll if (on_32bit_boundary_p)
1418 1.1 skrll prev_insn = insn;
1419 1.1 skrll else
1420 1.1 skrll prev_insn.insn = NULL;
1421 1.1 skrll
1422 1.1 skrll /* If the insn needs the following one to be on a 32 bit boundary
1423 1.1 skrll (e.g. subroutine calls), fill this insn's slot. */
1424 1.1 skrll if (on_32bit_boundary_p
1425 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_FILL_SLOT) != 0)
1426 1.1 skrll fill_insn (0);
1427 1.1 skrll
1428 1.1 skrll /* If this is a relaxable insn (can be replaced with a larger version)
1429 1.1 skrll mark the fact so that we can emit an alignment directive for a
1430 1.1 skrll following 32 bit insn if we see one. */
1431 1.1 skrll if (CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) != 0)
1432 1.1 skrll seen_relaxable_p = 1;
1433 1.1 skrll }
1434 1.1 skrll
1435 1.1 skrll /* Set these so m32r_fill_insn can use them. */
1436 1.1 skrll prev_seg = now_seg;
1437 1.1 skrll prev_subseg = now_subseg;
1438 1.1 skrll }
1439 1.1 skrll
1440 1.1 skrll /* The syntax in the manual says constants begin with '#'.
1441 1.1 skrll We just ignore it. */
1442 1.1 skrll
1443 1.1 skrll void
1444 1.1 skrll md_operand (expressionS *expressionP)
1445 1.1 skrll {
1446 1.1 skrll if (*input_line_pointer == '#')
1447 1.1 skrll {
1448 1.1 skrll input_line_pointer++;
1449 1.1 skrll expression (expressionP);
1450 1.1 skrll }
1451 1.1 skrll }
1452 1.1 skrll
1453 1.1.1.7 christos valueT
1454 1.1 skrll md_section_align (segT segment, valueT size)
1455 1.1.1.4 christos {
1456 1.1 skrll int align = bfd_section_alignment (segment);
1457 1.1 skrll
1458 1.1 skrll return ((size + (1 << align) - 1) & -(1 << align));
1459 1.1 skrll }
1460 1.1 skrll
1461 1.1 skrll symbolS *
1462 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1463 1.1 skrll {
1464 1.1 skrll return 0;
1465 1.1 skrll }
1466 1.1 skrll
1467 1.1 skrll /* .scomm pseudo-op handler.
1469 1.1 skrll
1470 1.1 skrll This is a new pseudo-op to handle putting objects in .scommon.
1471 1.1 skrll By doing this the linker won't need to do any work,
1472 1.1 skrll and more importantly it removes the implicit -G arg necessary to
1473 1.1 skrll correctly link the object file. */
1474 1.1 skrll
1475 1.1 skrll static void
1476 1.1 skrll m32r_scomm (int ignore ATTRIBUTE_UNUSED)
1477 1.1 skrll {
1478 1.1 skrll char *name;
1479 1.1 skrll char c;
1480 1.1 skrll char *p;
1481 1.1 skrll offsetT size;
1482 1.1.1.4 christos symbolS *symbolP;
1483 1.1 skrll offsetT align;
1484 1.1 skrll int align2;
1485 1.1 skrll
1486 1.1 skrll c = get_symbol_name (&name);
1487 1.1.1.4 christos
1488 1.1 skrll /* Just after name is now '\0'. */
1489 1.1 skrll p = input_line_pointer;
1490 1.1 skrll *p = c;
1491 1.1 skrll SKIP_WHITESPACE_AFTER_NAME ();
1492 1.1 skrll if (*input_line_pointer != ',')
1493 1.1 skrll {
1494 1.1 skrll as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1495 1.1 skrll ignore_rest_of_line ();
1496 1.1 skrll return;
1497 1.1 skrll }
1498 1.1 skrll
1499 1.1 skrll /* Skip ','. */
1500 1.1 skrll input_line_pointer++;
1501 1.1 skrll if ((size = get_absolute_expression ()) < 0)
1502 1.1 skrll {
1503 1.1 skrll /* xgettext:c-format */
1504 1.1 skrll as_warn (_(".SCOMMon length (%ld.) <0! Ignored."), (long) size);
1505 1.1 skrll ignore_rest_of_line ();
1506 1.1 skrll return;
1507 1.1 skrll }
1508 1.1 skrll
1509 1.1 skrll /* The third argument to .scomm is the alignment. */
1510 1.1 skrll if (*input_line_pointer != ',')
1511 1.1 skrll align = 8;
1512 1.1 skrll else
1513 1.1 skrll {
1514 1.1 skrll ++input_line_pointer;
1515 1.1 skrll align = get_absolute_expression ();
1516 1.1 skrll if (align <= 0)
1517 1.1 skrll {
1518 1.1 skrll as_warn (_("ignoring bad alignment"));
1519 1.1 skrll align = 8;
1520 1.1 skrll }
1521 1.1 skrll }
1522 1.1 skrll
1523 1.1 skrll /* Convert to a power of 2 alignment. */
1524 1.1 skrll if (align)
1525 1.1 skrll {
1526 1.1 skrll for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
1527 1.1 skrll continue;
1528 1.1 skrll if (align != 1)
1529 1.1 skrll {
1530 1.1 skrll as_bad (_("Common alignment not a power of 2"));
1531 1.1 skrll ignore_rest_of_line ();
1532 1.1 skrll return;
1533 1.1 skrll }
1534 1.1 skrll }
1535 1.1 skrll else
1536 1.1 skrll align2 = 0;
1537 1.1 skrll
1538 1.1 skrll *p = 0;
1539 1.1 skrll symbolP = symbol_find_or_make (name);
1540 1.1 skrll *p = c;
1541 1.1 skrll
1542 1.1 skrll if (S_IS_DEFINED (symbolP))
1543 1.1 skrll {
1544 1.1 skrll /* xgettext:c-format */
1545 1.1 skrll as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1546 1.1 skrll S_GET_NAME (symbolP));
1547 1.1 skrll ignore_rest_of_line ();
1548 1.1 skrll return;
1549 1.1 skrll }
1550 1.1 skrll
1551 1.1 skrll if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1552 1.1 skrll {
1553 1.1 skrll /* xgettext:c-format */
1554 1.1 skrll as_bad (_("Length of .scomm \"%s\" is already %ld. Not changed to %ld."),
1555 1.1 skrll S_GET_NAME (symbolP),
1556 1.1 skrll (long) S_GET_VALUE (symbolP),
1557 1.1 skrll (long) size);
1558 1.1 skrll
1559 1.1 skrll ignore_rest_of_line ();
1560 1.1 skrll return;
1561 1.1 skrll }
1562 1.1 skrll
1563 1.1 skrll if (symbol_get_obj (symbolP)->local)
1564 1.1 skrll {
1565 1.1 skrll segT old_sec = now_seg;
1566 1.1 skrll int old_subsec = now_subseg;
1567 1.1 skrll char *pfrag;
1568 1.1 skrll
1569 1.1 skrll record_alignment (sbss_section, align2);
1570 1.1 skrll subseg_set (sbss_section, 0);
1571 1.1 skrll
1572 1.1 skrll if (align2)
1573 1.1 skrll frag_align (align2, 0, 0);
1574 1.1 skrll
1575 1.1 skrll if (S_GET_SEGMENT (symbolP) == sbss_section)
1576 1.1 skrll symbol_get_frag (symbolP)->fr_symbol = 0;
1577 1.1 skrll
1578 1.1 skrll symbol_set_frag (symbolP, frag_now);
1579 1.1 skrll
1580 1.1 skrll pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1581 1.1 skrll (char *) 0);
1582 1.1 skrll *pfrag = 0;
1583 1.1 skrll S_SET_SIZE (symbolP, size);
1584 1.1 skrll S_SET_SEGMENT (symbolP, sbss_section);
1585 1.1 skrll S_CLEAR_EXTERNAL (symbolP);
1586 1.1 skrll subseg_set (old_sec, old_subsec);
1587 1.1 skrll }
1588 1.1 skrll else
1589 1.1 skrll {
1590 1.1 skrll S_SET_VALUE (symbolP, (valueT) size);
1591 1.1 skrll S_SET_ALIGN (symbolP, align2);
1592 1.1 skrll S_SET_EXTERNAL (symbolP);
1593 1.1 skrll S_SET_SEGMENT (symbolP, &scom_section);
1594 1.1 skrll }
1595 1.1 skrll
1596 1.1 skrll demand_empty_rest_of_line ();
1597 1.1 skrll }
1598 1.1 skrll
1599 1.1 skrll /* The target specific pseudo-ops which we support. */
1600 1.1 skrll const pseudo_typeS md_pseudo_table[] =
1601 1.1 skrll {
1602 1.1 skrll { "word", cons, 4 },
1603 1.1 skrll { "fillinsn", fill_insn, 0 },
1604 1.1 skrll { "scomm", m32r_scomm, 0 },
1605 1.1 skrll { "debugsym", debug_sym, 0 },
1606 1.1 skrll { "m32r", allow_m32rx, 0 },
1607 1.1 skrll { "m32rx", allow_m32rx, 1 },
1608 1.1 skrll { "m32r2", allow_m32rx, 2 },
1609 1.1 skrll { "little", little, 1 },
1610 1.1 skrll { "big", little, 0 },
1611 1.1 skrll { NULL, NULL, 0 }
1612 1.1 skrll };
1613 1.1 skrll
1614 1.1 skrll /* Interface to relax_segment. */
1616 1.1 skrll
1617 1.1 skrll /* FIXME: Build table by hand, get it working, then machine generate. */
1618 1.1 skrll
1619 1.1 skrll const relax_typeS md_relax_table[] =
1620 1.1 skrll {
1621 1.1 skrll /* The fields are:
1622 1.1 skrll 1) most positive reach of this state,
1623 1.1 skrll 2) most negative reach of this state,
1624 1.1 skrll 3) how many bytes this mode will add to the size of the current frag
1625 1.1 skrll 4) which index into the table to try if we can't fit into this one. */
1626 1.1 skrll
1627 1.1 skrll /* The first entry must be unused because an `rlx_more' value of zero ends
1628 1.1 skrll each list. */
1629 1.1 skrll {1, 1, 0, 0},
1630 1.1 skrll
1631 1.1 skrll /* The displacement used by GAS is from the end of the 2 byte insn,
1632 1.1 skrll so we subtract 2 from the following. */
1633 1.1 skrll /* 16 bit insn, 8 bit disp -> 10 bit range.
1634 1.1 skrll This doesn't handle a branch in the right slot at the border:
1635 1.1 skrll the "& -4" isn't taken into account. It's not important enough to
1636 1.1 skrll complicate things over it, so we subtract an extra 2 (or + 2 in -ve
1637 1.1 skrll case). */
1638 1.1 skrll {511 - 2 - 2, -512 - 2 + 2, 0, 2 },
1639 1.1 skrll /* 32 bit insn, 24 bit disp -> 26 bit range. */
1640 1.1 skrll {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 },
1641 1.1 skrll /* Same thing, but with leading nop for alignment. */
1642 1.1 skrll {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 }
1643 1.1 skrll };
1644 1.1 skrll
1645 1.1 skrll long
1646 1.1 skrll m32r_relax_frag (segT segment, fragS *fragP, long stretch)
1647 1.1 skrll {
1648 1.1 skrll /* Address of branch insn. */
1649 1.1 skrll long address = fragP->fr_address + fragP->fr_fix - 2;
1650 1.1 skrll long growth = 0;
1651 1.1 skrll
1652 1.1 skrll /* Keep 32 bit insns aligned on 32 bit boundaries. */
1653 1.1 skrll if (fragP->fr_subtype == 2)
1654 1.1 skrll {
1655 1.1 skrll if ((address & 3) != 0)
1656 1.1 skrll {
1657 1.1 skrll fragP->fr_subtype = 3;
1658 1.1 skrll growth = 2;
1659 1.1 skrll }
1660 1.1 skrll }
1661 1.1 skrll else if (fragP->fr_subtype == 3)
1662 1.1 skrll {
1663 1.1 skrll if ((address & 3) == 0)
1664 1.1 skrll {
1665 1.1 skrll fragP->fr_subtype = 2;
1666 1.1 skrll growth = -2;
1667 1.1 skrll }
1668 1.1 skrll }
1669 1.1 skrll else
1670 1.1 skrll {
1671 1.1 skrll growth = relax_frag (segment, fragP, stretch);
1672 1.1 skrll
1673 1.1 skrll /* Long jump on odd halfword boundary? */
1674 1.1 skrll if (fragP->fr_subtype == 2 && (address & 3) != 0)
1675 1.1 skrll {
1676 1.1 skrll fragP->fr_subtype = 3;
1677 1.1 skrll growth += 2;
1678 1.1 skrll }
1679 1.1 skrll }
1680 1.1 skrll
1681 1.1 skrll return growth;
1682 1.1 skrll }
1683 1.1 skrll
1684 1.1 skrll /* Return an initial guess of the length by which a fragment must grow to
1685 1.1 skrll hold a branch to reach its destination.
1686 1.1 skrll Also updates fr_type/fr_subtype as necessary.
1687 1.1 skrll
1688 1.1 skrll Called just before doing relaxation.
1689 1.1 skrll Any symbol that is now undefined will not become defined.
1690 1.1 skrll The guess for fr_var is ACTUALLY the growth beyond fr_fix.
1691 1.1 skrll Whatever we do to grow fr_fix or fr_var contributes to our returned value.
1692 1.1 skrll Although it may not be explicit in the frag, pretend fr_var starts
1693 1.1 skrll with a 0 value. */
1694 1.1 skrll
1695 1.1 skrll int
1696 1.1 skrll md_estimate_size_before_relax (fragS *fragP, segT segment)
1697 1.1 skrll {
1698 1.1 skrll /* The only thing we have to handle here are symbols outside of the
1699 1.1 skrll current segment. They may be undefined or in a different segment in
1700 1.1 skrll which case linker scripts may place them anywhere.
1701 1.1 skrll However, we can't finish the fragment here and emit the reloc as insn
1702 1.1 skrll alignment requirements may move the insn about. */
1703 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != segment
1704 1.1 skrll || S_IS_EXTERNAL (fragP->fr_symbol)
1705 1.1 skrll || S_IS_WEAK (fragP->fr_symbol))
1706 1.1 skrll {
1707 1.1 skrll /* The symbol is undefined in this segment.
1708 1.1 skrll Change the relaxation subtype to the max allowable and leave
1709 1.1 skrll all further handling to md_convert_frag. */
1710 1.1 skrll fragP->fr_subtype = 2;
1711 1.1 skrll
1712 1.1 skrll {
1713 1.1 skrll const CGEN_INSN *insn;
1714 1.1 skrll int i;
1715 1.1 skrll
1716 1.1 skrll /* Update the recorded insn.
1717 1.1 skrll Fortunately we don't have to look very far.
1718 1.1 skrll FIXME: Change this to record in the instruction the next higher
1719 1.1 skrll relaxable insn to use. */
1720 1.1 skrll for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++)
1721 1.1 skrll {
1722 1.1 skrll if ((strcmp (CGEN_INSN_MNEMONIC (insn),
1723 1.1 skrll CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn))
1724 1.1 skrll == 0)
1725 1.1 skrll && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED))
1726 1.1 skrll break;
1727 1.1 skrll }
1728 1.1 skrll if (i == 4)
1729 1.1 skrll abort ();
1730 1.1 skrll
1731 1.1 skrll fragP->fr_cgen.insn = insn;
1732 1.1 skrll return 2;
1733 1.1 skrll }
1734 1.1 skrll }
1735 1.1 skrll
1736 1.1 skrll return md_relax_table[fragP->fr_subtype].rlx_length;
1737 1.1 skrll }
1738 1.1 skrll
1739 1.1 skrll /* *FRAGP has been relaxed to its final size, and now needs to have
1740 1.1 skrll the bytes inside it modified to conform to the new size.
1741 1.1 skrll
1742 1.1 skrll Called after relaxation is finished.
1743 1.1 skrll fragP->fr_type == rs_machine_dependent.
1744 1.1 skrll fragP->fr_subtype is the subtype of what the address relaxed to. */
1745 1.1 skrll
1746 1.1 skrll void
1747 1.1 skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1748 1.1 skrll segT sec,
1749 1.1 skrll fragS *fragP)
1750 1.1 skrll {
1751 1.1 skrll char *opcode;
1752 1.1 skrll char *displacement;
1753 1.1 skrll int target_address;
1754 1.1 skrll int opcode_address;
1755 1.1 skrll int extension;
1756 1.1 skrll int addend;
1757 1.1 skrll
1758 1.1 skrll opcode = fragP->fr_opcode;
1759 1.1 skrll
1760 1.1 skrll /* Address opcode resides at in file space. */
1761 1.1 skrll opcode_address = fragP->fr_address + fragP->fr_fix - 2;
1762 1.1 skrll
1763 1.1 skrll switch (fragP->fr_subtype)
1764 1.1 skrll {
1765 1.1 skrll case 1:
1766 1.1 skrll extension = 0;
1767 1.1 skrll displacement = &opcode[1];
1768 1.1 skrll break;
1769 1.1 skrll case 2:
1770 1.1 skrll opcode[0] |= 0x80;
1771 1.1 skrll extension = 2;
1772 1.1 skrll displacement = &opcode[1];
1773 1.1 skrll break;
1774 1.1 skrll case 3:
1775 1.1 skrll opcode[2] = opcode[0] | 0x80;
1776 1.1 skrll md_number_to_chars (opcode, PAR_NOP_INSN, 2);
1777 1.1 skrll opcode_address += 2;
1778 1.1 skrll extension = 4;
1779 1.1 skrll displacement = &opcode[3];
1780 1.1 skrll break;
1781 1.1 skrll default:
1782 1.1 skrll abort ();
1783 1.1 skrll }
1784 1.1 skrll
1785 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != sec
1786 1.1 skrll || S_IS_EXTERNAL (fragP->fr_symbol)
1787 1.1 skrll || S_IS_WEAK (fragP->fr_symbol))
1788 1.1 skrll {
1789 1.1 skrll /* Symbol must be resolved by linker. */
1790 1.1 skrll if (fragP->fr_offset & 3)
1791 1.1 skrll as_warn (_("Addend to unresolved symbol not on word boundary."));
1792 1.1 skrll #ifdef USE_M32R_OLD_RELOC
1793 1.1 skrll addend = fragP->fr_offset >> 2; /* Old M32R used USE_REL. */
1794 1.1 skrll #else
1795 1.1 skrll addend = 0;
1796 1.1 skrll #endif
1797 1.1 skrll }
1798 1.1 skrll else
1799 1.1 skrll {
1800 1.1 skrll /* Address we want to reach in file space. */
1801 1.1 skrll target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
1802 1.1 skrll addend = (target_address - (opcode_address & -4)) >> 2;
1803 1.1 skrll }
1804 1.1 skrll
1805 1.1 skrll /* Create a relocation for symbols that must be resolved by the linker.
1806 1.1 skrll Otherwise output the completed insn. */
1807 1.1 skrll
1808 1.1 skrll if (S_GET_SEGMENT (fragP->fr_symbol) != sec
1809 1.1.1.2 christos || S_IS_EXTERNAL (fragP->fr_symbol)
1810 1.1.1.2 christos || S_IS_WEAK (fragP->fr_symbol))
1811 1.1 skrll {
1812 1.1 skrll fixS *fixP;
1813 1.1 skrll
1814 1.1 skrll gas_assert (fragP->fr_subtype != 1);
1815 1.1 skrll gas_assert (fragP->fr_cgen.insn != 0);
1816 1.1 skrll
1817 1.1 skrll fixP = gas_cgen_record_fixup (fragP,
1818 1.1 skrll /* Offset of branch insn in frag. */
1819 1.1 skrll fragP->fr_fix + extension - 4,
1820 1.1 skrll fragP->fr_cgen.insn,
1821 1.1 skrll 4 /* Length. */,
1822 1.1 skrll /* FIXME: quick hack. */
1823 1.1 skrll cgen_operand_lookup_by_num (gas_cgen_cpu_desc,
1824 1.1 skrll M32R_OPERAND_DISP24),
1825 1.1 skrll fragP->fr_cgen.opinfo,
1826 1.1 skrll fragP->fr_symbol, fragP->fr_offset);
1827 1.1 skrll if (fragP->fr_cgen.opinfo)
1828 1.1 skrll fixP->fx_r_type = fragP->fr_cgen.opinfo;
1829 1.1 skrll }
1830 1.1 skrll
1831 1.1 skrll #define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
1832 1.1 skrll
1833 1.1 skrll md_number_to_chars (displacement, (valueT) addend,
1834 1.1 skrll SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
1835 1.1 skrll
1836 1.1 skrll fragP->fr_fix += extension;
1837 1.1 skrll }
1838 1.1 skrll
1839 1.1 skrll /* Functions concerning relocs. */
1841 1.1 skrll
1842 1.1 skrll /* The location from which a PC relative jump should be calculated,
1843 1.1 skrll given a PC relative reloc. */
1844 1.1 skrll
1845 1.1 skrll long
1846 1.1 skrll md_pcrel_from_section (fixS *fixP, segT sec)
1847 1.1 skrll {
1848 1.1 skrll if (fixP->fx_addsy != (symbolS *) NULL
1849 1.1 skrll && (! S_IS_DEFINED (fixP->fx_addsy)
1850 1.1 skrll || S_GET_SEGMENT (fixP->fx_addsy) != sec
1851 1.1 skrll || S_IS_EXTERNAL (fixP->fx_addsy)
1852 1.1 skrll || S_IS_WEAK (fixP->fx_addsy)))
1853 1.1 skrll {
1854 1.1 skrll if (S_GET_SEGMENT (fixP->fx_addsy) != sec
1855 1.1 skrll && S_IS_DEFINED (fixP->fx_addsy)
1856 1.1 skrll && ! S_IS_EXTERNAL (fixP->fx_addsy)
1857 1.1 skrll && ! S_IS_WEAK (fixP->fx_addsy))
1858 1.1 skrll return fixP->fx_offset;
1859 1.1 skrll
1860 1.1 skrll /* The symbol is undefined (or is defined but not in this section).
1861 1.1 skrll Let the linker figure it out. */
1862 1.1 skrll return 0;
1863 1.1 skrll }
1864 1.1 skrll
1865 1.1 skrll return (fixP->fx_frag->fr_address + fixP->fx_where) & -4L;
1866 1.1 skrll }
1867 1.1 skrll
1868 1.1 skrll /* Return the bfd reloc type for OPERAND of INSN at fixup FIXP.
1869 1.1 skrll Returns BFD_RELOC_NONE if no reloc type can be found.
1870 1.1 skrll *FIXP may be modified if desired. */
1871 1.1 skrll
1872 1.1 skrll bfd_reloc_code_real_type
1873 1.1 skrll md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
1874 1.1 skrll const CGEN_OPERAND *operand,
1875 1.1 skrll fixS *fixP)
1876 1.1 skrll {
1877 1.1 skrll switch (operand->type)
1878 1.1 skrll {
1879 1.1 skrll case M32R_OPERAND_DISP8: return BFD_RELOC_M32R_10_PCREL;
1880 1.1 skrll case M32R_OPERAND_DISP16: return BFD_RELOC_M32R_18_PCREL;
1881 1.1 skrll case M32R_OPERAND_DISP24: return BFD_RELOC_M32R_26_PCREL;
1882 1.1 skrll case M32R_OPERAND_UIMM24: return BFD_RELOC_M32R_24;
1883 1.1 skrll case M32R_OPERAND_HI16:
1884 1.1 skrll case M32R_OPERAND_SLO16:
1885 1.1 skrll case M32R_OPERAND_ULO16:
1886 1.1 skrll /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1887 1.1 skrll if (fixP->fx_cgen.opinfo != 0)
1888 1.1 skrll return fixP->fx_cgen.opinfo;
1889 1.1 skrll break;
1890 1.1 skrll default:
1891 1.1 skrll /* Avoid -Wall warning. */
1892 1.1 skrll break;
1893 1.1 skrll }
1894 1.1 skrll return BFD_RELOC_NONE;
1895 1.1 skrll }
1896 1.1 skrll
1897 1.1 skrll /* Record a HI16 reloc for later matching with its LO16 cousin. */
1898 1.1 skrll
1899 1.1 skrll static void
1900 1.1.1.2 christos m32r_record_hi16 (int reloc_type,
1901 1.1 skrll fixS *fixP,
1902 1.1 skrll segT seg ATTRIBUTE_UNUSED)
1903 1.1.1.5 christos {
1904 1.1 skrll struct m32r_hi_fixup *hi_fixup;
1905 1.1 skrll
1906 1.1 skrll gas_assert (reloc_type == BFD_RELOC_M32R_HI16_SLO
1907 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_ULO);
1908 1.1 skrll
1909 1.1 skrll hi_fixup = XNEW (struct m32r_hi_fixup);
1910 1.1 skrll hi_fixup->fixp = fixP;
1911 1.1 skrll hi_fixup->seg = now_seg;
1912 1.1 skrll hi_fixup->next = m32r_hi_fixup_list;
1913 1.1 skrll
1914 1.1 skrll m32r_hi_fixup_list = hi_fixup;
1915 1.1 skrll }
1916 1.1 skrll
1917 1.1 skrll /* Called while parsing an instruction to create a fixup.
1918 1.1 skrll We need to check for HI16 relocs and queue them up for later sorting. */
1919 1.1 skrll
1920 1.1 skrll fixS *
1921 1.1 skrll m32r_cgen_record_fixup_exp (fragS *frag,
1922 1.1 skrll int where,
1923 1.1 skrll const CGEN_INSN *insn,
1924 1.1 skrll int length,
1925 1.1 skrll const CGEN_OPERAND *operand,
1926 1.1 skrll int opinfo,
1927 1.1 skrll expressionS *exp)
1928 1.1 skrll {
1929 1.1 skrll fixS *fixP;
1930 1.1 skrll bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED;
1931 1.1 skrll
1932 1.1 skrll if (m32r_check_fixup (exp, &r_type))
1933 1.1 skrll as_bad (_("Invalid PIC expression."));
1934 1.1 skrll
1935 1.1 skrll fixP = gas_cgen_record_fixup_exp (frag, where, insn, length,
1936 1.1 skrll operand, opinfo, exp);
1937 1.1 skrll
1938 1.1 skrll switch (operand->type)
1939 1.1 skrll {
1940 1.1 skrll case M32R_OPERAND_HI16:
1941 1.1 skrll /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1942 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO
1943 1.1 skrll || fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1944 1.1 skrll m32r_record_hi16 (fixP->fx_cgen.opinfo, fixP, now_seg);
1945 1.1 skrll break;
1946 1.1 skrll
1947 1.1 skrll default:
1948 1.1 skrll /* Avoid -Wall warning. */
1949 1.1 skrll break;
1950 1.1 skrll }
1951 1.1 skrll
1952 1.1 skrll switch (r_type)
1953 1.1 skrll {
1954 1.1 skrll case BFD_RELOC_UNUSED:
1955 1.1 skrll default:
1956 1.1 skrll return fixP;
1957 1.1 skrll
1958 1.1 skrll case BFD_RELOC_M32R_GOTPC24:
1959 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1960 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_HI_SLO;
1961 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1962 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_HI_ULO;
1963 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1964 1.1 skrll r_type = BFD_RELOC_M32R_GOTPC_LO;
1965 1.1 skrll break;
1966 1.1 skrll
1967 1.1 skrll case BFD_RELOC_M32R_GOT24:
1968 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1969 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_HI_SLO;
1970 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1971 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_HI_ULO;
1972 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1973 1.1 skrll r_type = BFD_RELOC_M32R_GOT16_LO;
1974 1.1 skrll break;
1975 1.1 skrll
1976 1.1 skrll case BFD_RELOC_M32R_GOTOFF:
1977 1.1 skrll if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO)
1978 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_HI_SLO;
1979 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1980 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_HI_ULO;
1981 1.1 skrll else if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_LO16)
1982 1.1 skrll r_type = BFD_RELOC_M32R_GOTOFF_LO;
1983 1.1 skrll break;
1984 1.1 skrll
1985 1.1 skrll case BFD_RELOC_M32R_26_PLTREL:
1986 1.1 skrll as_bad (_("Invalid PIC expression."));
1987 1.1 skrll break;
1988 1.1 skrll }
1989 1.1 skrll
1990 1.1 skrll fixP->fx_r_type = r_type;
1991 1.1 skrll
1992 1.1 skrll return fixP;
1993 1.1 skrll }
1994 1.1 skrll
1995 1.1 skrll /* Return BFD reloc type from opinfo field in a fixS.
1996 1.1 skrll It's tricky using fx_r_type in m32r_frob_file because the values
1997 1.1 skrll are BFD_RELOC_UNUSED + operand number. */
1998 1.1 skrll #define FX_OPINFO_R_TYPE(f) ((f)->fx_cgen.opinfo)
1999 1.1 skrll
2000 1.1 skrll /* Sort any unmatched HI16 relocs so that they immediately precede
2001 1.1 skrll the corresponding LO16 reloc. This is called before md_apply_fix and
2002 1.1 skrll tc_gen_reloc. */
2003 1.1 skrll
2004 1.1 skrll void
2005 1.1 skrll m32r_frob_file (void)
2006 1.1 skrll {
2007 1.1 skrll struct m32r_hi_fixup *l;
2008 1.1.1.2 christos
2009 1.1 skrll for (l = m32r_hi_fixup_list; l != NULL; l = l->next)
2010 1.1 skrll {
2011 1.1 skrll segment_info_type *seginfo;
2012 1.1 skrll int pass;
2013 1.1 skrll
2014 1.1 skrll gas_assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO
2015 1.1 skrll || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO);
2016 1.1 skrll
2017 1.1 skrll /* Check quickly whether the next fixup happens to be a matching low. */
2018 1.1 skrll if (l->fixp->fx_next != NULL
2019 1.1 skrll && FX_OPINFO_R_TYPE (l->fixp->fx_next) == BFD_RELOC_M32R_LO16
2020 1.1 skrll && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
2021 1.1 skrll && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
2022 1.1 skrll continue;
2023 1.1 skrll
2024 1.1 skrll /* Look through the fixups for this segment for a matching `low'.
2025 1.1 skrll When we find one, move the high/shigh just in front of it. We do
2026 1.1 skrll this in two passes. In the first pass, we try to find a
2027 1.1 skrll unique `low'. In the second pass, we permit multiple high's
2028 1.1 skrll relocs for a single `low'. */
2029 1.1 skrll seginfo = seg_info (l->seg);
2030 1.1 skrll for (pass = 0; pass < 2; pass++)
2031 1.1 skrll {
2032 1.1 skrll fixS *f;
2033 1.1 skrll fixS *prev;
2034 1.1 skrll
2035 1.1 skrll prev = NULL;
2036 1.1 skrll for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
2037 1.1 skrll {
2038 1.1 skrll /* Check whether this is a `low' fixup which matches l->fixp. */
2039 1.1 skrll if (FX_OPINFO_R_TYPE (f) == BFD_RELOC_M32R_LO16
2040 1.1 skrll && f->fx_addsy == l->fixp->fx_addsy
2041 1.1 skrll && f->fx_offset == l->fixp->fx_offset
2042 1.1 skrll && (pass == 1
2043 1.1 skrll || prev == NULL
2044 1.1 skrll || (FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_SLO
2045 1.1 skrll && FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_ULO)
2046 1.1 skrll || prev->fx_addsy != f->fx_addsy
2047 1.1 skrll || prev->fx_offset != f->fx_offset))
2048 1.1 skrll {
2049 1.1.1.2 christos fixS **pf;
2050 1.1 skrll
2051 1.1 skrll /* Move l->fixp before f. */
2052 1.1 skrll for (pf = &seginfo->fix_root;
2053 1.1 skrll *pf != l->fixp;
2054 1.1 skrll pf = & (*pf)->fx_next)
2055 1.1 skrll gas_assert (*pf != NULL);
2056 1.1 skrll
2057 1.1 skrll *pf = l->fixp->fx_next;
2058 1.1 skrll
2059 1.1 skrll l->fixp->fx_next = f;
2060 1.1 skrll if (prev == NULL)
2061 1.1 skrll seginfo->fix_root = l->fixp;
2062 1.1 skrll else
2063 1.1 skrll prev->fx_next = l->fixp;
2064 1.1 skrll
2065 1.1 skrll break;
2066 1.1 skrll }
2067 1.1 skrll
2068 1.1 skrll prev = f;
2069 1.1 skrll }
2070 1.1 skrll
2071 1.1 skrll if (f != NULL)
2072 1.1 skrll break;
2073 1.1 skrll
2074 1.1 skrll if (pass == 1
2075 1.1 skrll && warn_unmatched_high)
2076 1.1 skrll as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
2077 1.1 skrll _("Unmatched high/shigh reloc"));
2078 1.1 skrll }
2079 1.1 skrll }
2080 1.1 skrll }
2081 1.1 skrll
2082 1.1 skrll /* See whether we need to force a relocation into the output file.
2083 1.1 skrll This is used to force out switch and PC relative relocations when
2084 1.1 skrll relaxing. */
2085 1.1 skrll
2086 1.1 skrll int
2087 1.1 skrll m32r_force_relocation (fixS *fix)
2088 1.1 skrll {
2089 1.1 skrll if (generic_force_reloc (fix))
2090 1.1 skrll return 1;
2091 1.1 skrll
2092 1.1 skrll if (! m32r_relax)
2093 1.1 skrll return 0;
2094 1.1 skrll
2095 1.1 skrll return fix->fx_pcrel;
2096 1.1 skrll }
2097 1.1 skrll
2098 1.1 skrll /* Write a value out to the object file, using the appropriate endianness. */
2100 1.1 skrll
2101 1.1 skrll void
2102 1.1 skrll md_number_to_chars (char *buf, valueT val, int n)
2103 1.1 skrll {
2104 1.1 skrll if (target_big_endian)
2105 1.1 skrll number_to_chars_bigendian (buf, val, n);
2106 1.1 skrll else
2107 1.1 skrll number_to_chars_littleendian (buf, val, n);
2108 1.1.1.5 christos }
2109 1.1 skrll
2110 1.1 skrll /* Turn a string in input_line_pointer into a floating point constant
2111 1.1 skrll of type TYPE, and store the appropriate bytes in *LITP. The number
2112 1.1 skrll of LITTLENUMS emitted is stored in *SIZEP. An error message is
2113 1.1 skrll returned, or NULL on OK. */
2114 1.1 skrll
2115 1.1 skrll const char *
2116 1.1 skrll md_atof (int type, char *litP, int *sizeP)
2117 1.1 skrll {
2118 1.1 skrll return ieee_md_atof (type, litP, sizeP, target_big_endian);
2119 1.1 skrll }
2120 1.1 skrll
2121 1.1 skrll void
2122 1.1 skrll m32r_elf_section_change_hook (void)
2123 1.1 skrll {
2124 1.1 skrll /* If we have reached the end of a section and we have just emitted a
2125 1.1 skrll 16 bit insn, then emit a nop to make sure that the section ends on
2126 1.1 skrll a 32 bit boundary. */
2127 1.1 skrll
2128 1.1.1.8 christos if (prev_insn.insn || seen_relaxable_p)
2129 1.1 skrll (void) m32r_fill_insn (0);
2130 1.1 skrll }
2131 1.1 skrll
2132 1.1 skrll /* Return true if can adjust the reloc to be relative to its section
2133 1.1 skrll (such as .data) instead of relative to some symbol. */
2134 1.1 skrll
2135 1.1 skrll bool
2136 1.1 skrll m32r_fix_adjustable (fixS *fixP)
2137 1.1 skrll {
2138 1.1 skrll bfd_reloc_code_real_type reloc_type;
2139 1.1 skrll
2140 1.1 skrll if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
2141 1.1 skrll {
2142 1.1 skrll const CGEN_INSN *insn = NULL;
2143 1.1 skrll int opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
2144 1.1 skrll const CGEN_OPERAND *operand =
2145 1.1 skrll cgen_operand_lookup_by_num(gas_cgen_cpu_desc, opindex);
2146 1.1 skrll
2147 1.1 skrll reloc_type = md_cgen_lookup_reloc (insn, operand, fixP);
2148 1.1 skrll }
2149 1.1 skrll else
2150 1.1 skrll reloc_type = fixP->fx_r_type;
2151 1.1 skrll
2152 1.1 skrll if (fixP->fx_addsy == NULL)
2153 1.1 skrll return 1;
2154 1.1 skrll
2155 1.1 skrll /* Prevent all adjustments to global symbols. */
2156 1.1 skrll if (S_IS_EXTERNAL (fixP->fx_addsy))
2157 1.1 skrll return 0;
2158 1.1 skrll if (S_IS_WEAK (fixP->fx_addsy))
2159 1.1 skrll return 0;
2160 1.1 skrll
2161 1.1 skrll if (pic_code
2162 1.1 skrll && (reloc_type == BFD_RELOC_M32R_24
2163 1.1 skrll || reloc_type == BFD_RELOC_M32R_26_PCREL
2164 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_SLO
2165 1.1 skrll || reloc_type == BFD_RELOC_M32R_HI16_ULO
2166 1.1 skrll || reloc_type == BFD_RELOC_M32R_LO16))
2167 1.1 skrll return 0;
2168 1.1 skrll
2169 1.1 skrll if (reloc_type == BFD_RELOC_M32R_GOT24
2170 1.1 skrll || reloc_type == BFD_RELOC_M32R_26_PLTREL
2171 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_HI_SLO
2172 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_HI_ULO
2173 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOTPC_LO
2174 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_HI_SLO
2175 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_HI_ULO
2176 1.1 skrll || reloc_type == BFD_RELOC_M32R_GOT16_LO)
2177 1.1 skrll return 0;
2178 1.1 skrll
2179 1.1 skrll /* We need the symbol name for the VTABLE entries. */
2180 1.1 skrll if (reloc_type == BFD_RELOC_VTABLE_INHERIT
2181 1.1 skrll || reloc_type == BFD_RELOC_VTABLE_ENTRY)
2182 1.1 skrll return 0;
2183 1.1 skrll
2184 1.1 skrll return 1;
2185 1.1 skrll }
2186 1.1 skrll
2187 1.1 skrll void
2188 1.1 skrll m32r_elf_final_processing (void)
2189 1.1 skrll {
2190 1.1 skrll if (use_parallel)
2191 1.1 skrll m32r_flags |= E_M32R_HAS_PARALLEL;
2192 1.1 skrll elf_elfheader (stdoutput)->e_flags |= m32r_flags;
2193 1.1 skrll }
2194 1.1 skrll
2195 1.1 skrll /* Translate internal representation of relocation info to BFD target
2196 1.1.1.4 christos format. */
2197 1.1.1.5 christos
2198 1.1.1.4 christos arelent *
2199 1.1.1.5 christos tc_gen_reloc (asection * section, fixS * fixP)
2200 1.1 skrll {
2201 1.1 skrll arelent * reloc;
2202 1.1 skrll bfd_reloc_code_real_type code;
2203 1.1 skrll
2204 1.1 skrll reloc = XNEW (arelent);
2205 1.1 skrll
2206 1.1 skrll reloc->sym_ptr_ptr = XNEW (asymbol *);
2207 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
2208 1.1 skrll reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
2209 1.1 skrll
2210 1.1 skrll if (fixP->fx_pcrel)
2211 1.1 skrll {
2212 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_32)
2213 1.1.1.4 christos fixP->fx_r_type = BFD_RELOC_32_PCREL;
2214 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_16)
2215 1.1 skrll {
2216 1.1 skrll fixP->fx_r_type = BFD_RELOC_16_PCREL;
2217 1.1 skrll bfd_set_error (bfd_error_bad_value);
2218 1.1 skrll }
2219 1.1 skrll }
2220 1.1 skrll
2221 1.1 skrll code = fixP->fx_r_type;
2222 1.1 skrll if (pic_code)
2223 1.1 skrll {
2224 1.1 skrll #ifdef DEBUG_PIC
2225 1.1 skrll printf("%s",bfd_get_reloc_code_name(code));
2226 1.1 skrll #endif
2227 1.1 skrll switch (code)
2228 1.1 skrll {
2229 1.1 skrll case BFD_RELOC_M32R_26_PCREL:
2230 1.1 skrll code = BFD_RELOC_M32R_26_PLTREL;
2231 1.1 skrll break;
2232 1.1 skrll
2233 1.1 skrll case BFD_RELOC_M32R_24:
2234 1.1 skrll if (fixP->fx_addsy != NULL
2235 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2236 1.1 skrll code = BFD_RELOC_M32R_GOTPC24;
2237 1.1 skrll else
2238 1.1 skrll code = BFD_RELOC_M32R_GOT24;
2239 1.1 skrll break;
2240 1.1 skrll
2241 1.1 skrll case BFD_RELOC_M32R_HI16_ULO:
2242 1.1 skrll if (fixP->fx_addsy != NULL
2243 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2244 1.1 skrll code = BFD_RELOC_M32R_GOTPC_HI_ULO;
2245 1.1 skrll else
2246 1.1 skrll code = BFD_RELOC_M32R_GOT16_HI_ULO;
2247 1.1 skrll break;
2248 1.1 skrll
2249 1.1 skrll case BFD_RELOC_M32R_HI16_SLO:
2250 1.1 skrll if (fixP->fx_addsy != NULL
2251 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2252 1.1 skrll code = BFD_RELOC_M32R_GOTPC_HI_SLO;
2253 1.1 skrll else
2254 1.1 skrll code = BFD_RELOC_M32R_GOT16_HI_SLO;
2255 1.1 skrll break;
2256 1.1 skrll
2257 1.1 skrll case BFD_RELOC_M32R_LO16:
2258 1.1 skrll if (fixP->fx_addsy != NULL
2259 1.1 skrll && strcmp (S_GET_NAME (fixP->fx_addsy), GOT_NAME) == 0)
2260 1.1 skrll code = BFD_RELOC_M32R_GOTPC_LO;
2261 1.1 skrll else
2262 1.1 skrll code = BFD_RELOC_M32R_GOT16_LO;
2263 1.1 skrll break;
2264 1.1 skrll
2265 1.1.1.4 christos default:
2266 1.1 skrll break;
2267 1.1 skrll }
2268 1.1 skrll #ifdef DEBUG_PIC
2269 1.1 skrll printf(" => %s",bfd_get_reloc_code_name(code));
2270 1.1 skrll #endif
2271 1.1 skrll }
2272 1.1 skrll
2273 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2274 1.1 skrll
2275 1.1 skrll #ifdef DEBUG_PIC
2276 1.1 skrll printf(" => %s\n",reloc->howto->name);
2277 1.1 skrll #endif
2278 1.1 skrll
2279 1.1.1.4 christos if (reloc->howto == (reloc_howto_type *) NULL)
2280 1.1 skrll {
2281 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
2282 1.1 skrll _("internal error: can't export reloc type %d (`%s')"),
2283 1.1 skrll fixP->fx_r_type, bfd_get_reloc_code_name (code));
2284 1.1 skrll return NULL;
2285 1.1 skrll }
2286 1.1 skrll
2287 1.1 skrll /* Use fx_offset for these cases. */
2288 1.1 skrll if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
2289 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2290 1.1 skrll || fixP->fx_r_type == BFD_RELOC_32_PCREL)
2291 1.1 skrll reloc->addend = fixP->fx_offset;
2292 1.1 skrll else if ((!pic_code
2293 1.1.1.6 christos && code != BFD_RELOC_M32R_26_PLTREL)
2294 1.1 skrll && fixP->fx_pcrel
2295 1.1 skrll && fixP->fx_addsy != NULL
2296 1.1 skrll && (S_GET_SEGMENT(fixP->fx_addsy) != section)
2297 1.1.1.4 christos && S_IS_DEFINED (fixP->fx_addsy)
2298 1.1 skrll && ! S_IS_EXTERNAL(fixP->fx_addsy)
2299 1.1 skrll && ! S_IS_WEAK(fixP->fx_addsy))
2300 1.1 skrll /* Already used fx_offset in the opcode field itself. */
2301 1.1 skrll reloc->addend = fixP->fx_offset;
2302 1.1.1.5 christos else
2303 1.1 skrll reloc->addend = fixP->fx_addnumber;
2304 1.1 skrll
2305 1.1 skrll return reloc;
2306 1.1 skrll }
2307 1.1 skrll
2308 1.1 skrll inline static char *
2309 1.1 skrll m32r_end_of_match (char *cont, const char *what)
2310 1.1 skrll {
2311 1.1 skrll int len = strlen (what);
2312 1.1 skrll
2313 1.1 skrll if (strncasecmp (cont, what, strlen (what)) == 0
2314 1.1 skrll && ! is_part_of_name (cont[len]))
2315 1.1 skrll return cont + len;
2316 1.1 skrll
2317 1.1 skrll return NULL;
2318 1.1 skrll }
2319 1.1 skrll
2320 1.1 skrll int
2321 1.1 skrll m32r_parse_name (char const *name,
2322 1.1 skrll expressionS *exprP,
2323 1.1 skrll enum expr_mode mode,
2324 1.1 skrll char *nextcharP)
2325 1.1 skrll {
2326 1.1 skrll char *next = input_line_pointer;
2327 1.1 skrll char *next_end;
2328 1.1 skrll int reloc_type;
2329 1.1 skrll operatorT op_type;
2330 1.1 skrll segT segment;
2331 1.1 skrll
2332 1.1 skrll exprP->X_op_symbol = NULL;
2333 1.1 skrll exprP->X_md = BFD_RELOC_UNUSED;
2334 1.1 skrll
2335 1.1 skrll if (strcmp (name, GOT_NAME) == 0)
2336 1.1 skrll {
2337 1.1 skrll if (! GOT_symbol)
2338 1.1 skrll GOT_symbol = symbol_find_or_make (name);
2339 1.1 skrll
2340 1.1 skrll exprP->X_add_symbol = GOT_symbol;
2341 1.1 skrll no_suffix:
2342 1.1 skrll /* If we have an absolute symbol or a
2343 1.1 skrll reg, then we know its value now. */
2344 1.1 skrll segment = S_GET_SEGMENT (exprP->X_add_symbol);
2345 1.1 skrll if (mode != expr_defer && segment == absolute_section)
2346 1.1 skrll {
2347 1.1 skrll exprP->X_op = O_constant;
2348 1.1 skrll exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2349 1.1 skrll exprP->X_add_symbol = NULL;
2350 1.1 skrll }
2351 1.1 skrll else if (mode != expr_defer && segment == reg_section)
2352 1.1 skrll {
2353 1.1 skrll exprP->X_op = O_register;
2354 1.1 skrll exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
2355 1.1 skrll exprP->X_add_symbol = NULL;
2356 1.1 skrll }
2357 1.1 skrll else
2358 1.1 skrll {
2359 1.1 skrll exprP->X_op = O_symbol;
2360 1.1 skrll exprP->X_add_number = 0;
2361 1.1 skrll }
2362 1.1 skrll
2363 1.1 skrll return 1;
2364 1.1 skrll }
2365 1.1 skrll
2366 1.1 skrll exprP->X_add_symbol = symbol_find_or_make (name);
2367 1.1 skrll
2368 1.1 skrll if (*nextcharP != '@')
2369 1.1 skrll goto no_suffix;
2370 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "GOTOFF")))
2371 1.1 skrll {
2372 1.1 skrll reloc_type = BFD_RELOC_M32R_GOTOFF;
2373 1.1 skrll op_type = O_PIC_reloc;
2374 1.1 skrll }
2375 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "GOT")))
2376 1.1 skrll {
2377 1.1 skrll reloc_type = BFD_RELOC_M32R_GOT24;
2378 1.1 skrll op_type = O_PIC_reloc;
2379 1.1 skrll }
2380 1.1 skrll else if ((next_end = m32r_end_of_match (next + 1, "PLT")))
2381 1.1 skrll {
2382 1.1 skrll reloc_type = BFD_RELOC_M32R_26_PLTREL;
2383 1.1 skrll op_type = O_PIC_reloc;
2384 1.1 skrll }
2385 1.1 skrll else
2386 1.1 skrll goto no_suffix;
2387 1.1 skrll
2388 1.1 skrll *input_line_pointer = *nextcharP;
2389 1.1 skrll input_line_pointer = next_end;
2390 1.1 skrll *nextcharP = *input_line_pointer;
2391 1.1 skrll *input_line_pointer = '\0';
2392 1.1 skrll
2393 1.1 skrll exprP->X_op = op_type;
2394 1.1 skrll exprP->X_add_number = 0;
2395 1.1 skrll exprP->X_md = reloc_type;
2396 1.1 skrll
2397 1.1 skrll return 1;
2398 1.1 skrll }
2399 1.1 skrll
2400 1.1 skrll int
2401 1.1 skrll m32r_cgen_parse_fix_exp(int opinfo, expressionS *exp)
2402 1.1 skrll {
2403 1.1 skrll if (exp->X_op == O_PIC_reloc
2404 1.1 skrll && exp->X_md == BFD_RELOC_M32R_26_PLTREL)
2405 {
2406 exp->X_op = O_symbol;
2407 opinfo = exp->X_md;
2408 }
2409
2410 return opinfo;
2411 }
2412