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