* Makefile.am (EXPECT): Set to expect.
[binutils.git] / bfd / elf32-v850.c
blob47d87d21b4e32726bf243d61e7f2ca65d2e1f35a
1 /* V850-specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
21 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
22 dependencies. As is the gas & simulator code for the v850. */
24 #include "bfd.h"
25 #include "sysdep.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "elf-bfd.h"
29 #include "elf/v850.h"
30 #include "libiberty.h"
32 /* Sign-extend a 24-bit number. */
33 #define SEXT24(x) ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
35 static reloc_howto_type *v850_elf_reloc_type_lookup
36 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
37 static void v850_elf_info_to_howto_rel
38 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
39 static void v850_elf_info_to_howto_rela
40 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
41 static bfd_reloc_status_type v850_elf_reloc
42 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43 static bfd_boolean v850_elf_is_local_label_name
44 PARAMS ((bfd *, const char *));
45 static bfd_boolean v850_elf_relocate_section
46 PARAMS((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
47 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
48 static bfd_reloc_status_type v850_elf_perform_relocation
49 PARAMS ((bfd *, unsigned int, bfd_vma, bfd_byte *));
50 static bfd_boolean v850_elf_check_relocs
51 PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
52 static void remember_hi16s_reloc
53 PARAMS ((bfd *, bfd_vma, bfd_byte *));
54 static bfd_byte * find_remembered_hi16s_reloc
55 PARAMS ((bfd_vma, bfd_boolean *));
56 static bfd_reloc_status_type v850_elf_final_link_relocate
57 PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma,
58 bfd_vma, bfd_vma, struct bfd_link_info *, asection *, int));
59 static bfd_boolean v850_elf_object_p
60 PARAMS ((bfd *));
61 static bfd_boolean v850_elf_fake_sections
62 PARAMS ((bfd *, Elf_Internal_Shdr *, asection *));
63 static void v850_elf_final_write_processing
64 PARAMS ((bfd *, bfd_boolean));
65 static bfd_boolean v850_elf_set_private_flags
66 PARAMS ((bfd *, flagword));
67 static bfd_boolean v850_elf_merge_private_bfd_data
68 PARAMS ((bfd *, bfd *));
69 static bfd_boolean v850_elf_print_private_bfd_data
70 PARAMS ((bfd *, PTR));
71 static bfd_boolean v850_elf_section_from_bfd_section
72 PARAMS ((bfd *, asection *, int *));
73 static void v850_elf_symbol_processing
74 PARAMS ((bfd *, asymbol *));
75 static bfd_boolean v850_elf_add_symbol_hook
76 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Sym *,
77 const char **, flagword *, asection **, bfd_vma *));
78 static bfd_boolean v850_elf_link_output_symbol_hook
79 PARAMS ((struct bfd_link_info *, const char *, Elf_Internal_Sym *,
80 asection *, struct elf_link_hash_entry *));
81 static bfd_boolean v850_elf_gc_sweep_hook
82 PARAMS ((bfd *, struct bfd_link_info *, asection *,
83 const Elf_Internal_Rela *));
84 static asection * v850_elf_gc_mark_hook
85 PARAMS ((asection *, struct bfd_link_info *,
86 Elf_Internal_Rela *, struct elf_link_hash_entry *,
87 Elf_Internal_Sym *));
88 static bfd_reloc_status_type v850_elf_ignore_reloc
89 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
90 static bfd_boolean v850_elf_relax_delete_bytes
91 PARAMS ((bfd *, asection *, bfd_vma, bfd_vma, int));
92 static bfd_boolean v850_elf_relax_section
93 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
95 /* Note: It is REQUIRED that the 'type' value of each entry
96 in this array match the index of the entry in the array. */
97 static reloc_howto_type v850_elf_howto_table[] =
99 /* This reloc does nothing. */
100 HOWTO (R_V850_NONE, /* type */
101 0, /* rightshift */
102 2, /* size (0 = byte, 1 = short, 2 = long) */
103 32, /* bitsize */
104 FALSE, /* pc_relative */
105 0, /* bitpos */
106 complain_overflow_bitfield, /* complain_on_overflow */
107 bfd_elf_generic_reloc, /* special_function */
108 "R_V850_NONE", /* name */
109 FALSE, /* partial_inplace */
110 0, /* src_mask */
111 0, /* dst_mask */
112 FALSE), /* pcrel_offset */
114 /* A PC relative 9 bit branch. */
115 HOWTO (R_V850_9_PCREL, /* type */
116 2, /* rightshift */
117 2, /* size (0 = byte, 1 = short, 2 = long) */
118 26, /* bitsize */
119 TRUE, /* pc_relative */
120 0, /* bitpos */
121 complain_overflow_bitfield, /* complain_on_overflow */
122 v850_elf_reloc, /* special_function */
123 "R_V850_9_PCREL", /* name */
124 FALSE, /* partial_inplace */
125 0x00ffffff, /* src_mask */
126 0x00ffffff, /* dst_mask */
127 TRUE), /* pcrel_offset */
129 /* A PC relative 22 bit branch. */
130 HOWTO (R_V850_22_PCREL, /* type */
131 2, /* rightshift */
132 2, /* size (0 = byte, 1 = short, 2 = long) */
133 22, /* bitsize */
134 TRUE, /* pc_relative */
135 7, /* bitpos */
136 complain_overflow_signed, /* complain_on_overflow */
137 v850_elf_reloc, /* special_function */
138 "R_V850_22_PCREL", /* name */
139 FALSE, /* partial_inplace */
140 0x07ffff80, /* src_mask */
141 0x07ffff80, /* dst_mask */
142 TRUE), /* pcrel_offset */
144 /* High 16 bits of symbol value. */
145 HOWTO (R_V850_HI16_S, /* type */
146 0, /* rightshift */
147 1, /* size (0 = byte, 1 = short, 2 = long) */
148 16, /* bitsize */
149 FALSE, /* pc_relative */
150 0, /* bitpos */
151 complain_overflow_dont, /* complain_on_overflow */
152 v850_elf_reloc, /* special_function */
153 "R_V850_HI16_S", /* name */
154 FALSE, /* partial_inplace */
155 0xffff, /* src_mask */
156 0xffff, /* dst_mask */
157 FALSE), /* pcrel_offset */
159 /* High 16 bits of symbol value. */
160 HOWTO (R_V850_HI16, /* type */
161 0, /* rightshift */
162 1, /* size (0 = byte, 1 = short, 2 = long) */
163 16, /* bitsize */
164 FALSE, /* pc_relative */
165 0, /* bitpos */
166 complain_overflow_dont, /* complain_on_overflow */
167 v850_elf_reloc, /* special_function */
168 "R_V850_HI16", /* name */
169 FALSE, /* partial_inplace */
170 0xffff, /* src_mask */
171 0xffff, /* dst_mask */
172 FALSE), /* pcrel_offset */
174 /* Low 16 bits of symbol value. */
175 HOWTO (R_V850_LO16, /* type */
176 0, /* rightshift */
177 1, /* size (0 = byte, 1 = short, 2 = long) */
178 16, /* bitsize */
179 FALSE, /* pc_relative */
180 0, /* bitpos */
181 complain_overflow_dont, /* complain_on_overflow */
182 v850_elf_reloc, /* special_function */
183 "R_V850_LO16", /* name */
184 FALSE, /* partial_inplace */
185 0xffff, /* src_mask */
186 0xffff, /* dst_mask */
187 FALSE), /* pcrel_offset */
189 /* Simple 32bit reloc. */
190 HOWTO (R_V850_ABS32, /* type */
191 0, /* rightshift */
192 2, /* size (0 = byte, 1 = short, 2 = long) */
193 32, /* bitsize */
194 FALSE, /* pc_relative */
195 0, /* bitpos */
196 complain_overflow_dont, /* complain_on_overflow */
197 v850_elf_reloc, /* special_function */
198 "R_V850_ABS32", /* name */
199 FALSE, /* partial_inplace */
200 0xffffffff, /* src_mask */
201 0xffffffff, /* dst_mask */
202 FALSE), /* pcrel_offset */
204 /* Simple 16bit reloc. */
205 HOWTO (R_V850_16, /* type */
206 0, /* rightshift */
207 1, /* size (0 = byte, 1 = short, 2 = long) */
208 16, /* bitsize */
209 FALSE, /* pc_relative */
210 0, /* bitpos */
211 complain_overflow_dont, /* complain_on_overflow */
212 bfd_elf_generic_reloc, /* special_function */
213 "R_V850_16", /* name */
214 FALSE, /* partial_inplace */
215 0xffff, /* src_mask */
216 0xffff, /* dst_mask */
217 FALSE), /* pcrel_offset */
219 /* Simple 8bit reloc. */
220 HOWTO (R_V850_8, /* type */
221 0, /* rightshift */
222 0, /* size (0 = byte, 1 = short, 2 = long) */
223 8, /* bitsize */
224 FALSE, /* pc_relative */
225 0, /* bitpos */
226 complain_overflow_dont, /* complain_on_overflow */
227 bfd_elf_generic_reloc, /* special_function */
228 "R_V850_8", /* name */
229 FALSE, /* partial_inplace */
230 0xff, /* src_mask */
231 0xff, /* dst_mask */
232 FALSE), /* pcrel_offset */
234 /* 16 bit offset from the short data area pointer. */
235 HOWTO (R_V850_SDA_16_16_OFFSET, /* type */
236 0, /* rightshift */
237 1, /* size (0 = byte, 1 = short, 2 = long) */
238 16, /* bitsize */
239 FALSE, /* pc_relative */
240 0, /* bitpos */
241 complain_overflow_dont, /* complain_on_overflow */
242 v850_elf_reloc, /* special_function */
243 "R_V850_SDA_16_16_OFFSET", /* name */
244 FALSE, /* partial_inplace */
245 0xffff, /* src_mask */
246 0xffff, /* dst_mask */
247 FALSE), /* pcrel_offset */
249 /* 15 bit offset from the short data area pointer. */
250 HOWTO (R_V850_SDA_15_16_OFFSET, /* type */
251 1, /* rightshift */
252 1, /* size (0 = byte, 1 = short, 2 = long) */
253 16, /* bitsize */
254 FALSE, /* pc_relative */
255 1, /* bitpos */
256 complain_overflow_dont, /* complain_on_overflow */
257 v850_elf_reloc, /* special_function */
258 "R_V850_SDA_15_16_OFFSET", /* name */
259 FALSE, /* partial_inplace */
260 0xfffe, /* src_mask */
261 0xfffe, /* dst_mask */
262 FALSE), /* pcrel_offset */
264 /* 16 bit offset from the zero data area pointer. */
265 HOWTO (R_V850_ZDA_16_16_OFFSET, /* type */
266 0, /* rightshift */
267 1, /* size (0 = byte, 1 = short, 2 = long) */
268 16, /* bitsize */
269 FALSE, /* pc_relative */
270 0, /* bitpos */
271 complain_overflow_dont, /* complain_on_overflow */
272 v850_elf_reloc, /* special_function */
273 "R_V850_ZDA_16_16_OFFSET", /* name */
274 FALSE, /* partial_inplace */
275 0xffff, /* src_mask */
276 0xffff, /* dst_mask */
277 FALSE), /* pcrel_offset */
279 /* 15 bit offset from the zero data area pointer. */
280 HOWTO (R_V850_ZDA_15_16_OFFSET, /* type */
281 1, /* rightshift */
282 1, /* size (0 = byte, 1 = short, 2 = long) */
283 16, /* bitsize */
284 FALSE, /* pc_relative */
285 1, /* bitpos */
286 complain_overflow_dont, /* complain_on_overflow */
287 v850_elf_reloc, /* special_function */
288 "R_V850_ZDA_15_16_OFFSET", /* name */
289 FALSE, /* partial_inplace */
290 0xfffe, /* src_mask */
291 0xfffe, /* dst_mask */
292 FALSE), /* pcrel_offset */
294 /* 6 bit offset from the tiny data area pointer. */
295 HOWTO (R_V850_TDA_6_8_OFFSET, /* type */
296 2, /* rightshift */
297 1, /* size (0 = byte, 1 = short, 2 = long) */
298 8, /* bitsize */
299 FALSE, /* pc_relative */
300 1, /* bitpos */
301 complain_overflow_dont, /* complain_on_overflow */
302 v850_elf_reloc, /* special_function */
303 "R_V850_TDA_6_8_OFFSET", /* name */
304 FALSE, /* partial_inplace */
305 0x7e, /* src_mask */
306 0x7e, /* dst_mask */
307 FALSE), /* pcrel_offset */
309 /* 8 bit offset from the tiny data area pointer. */
310 HOWTO (R_V850_TDA_7_8_OFFSET, /* type */
311 1, /* rightshift */
312 1, /* size (0 = byte, 1 = short, 2 = long) */
313 8, /* bitsize */
314 FALSE, /* pc_relative */
315 0, /* bitpos */
316 complain_overflow_dont, /* complain_on_overflow */
317 v850_elf_reloc, /* special_function */
318 "R_V850_TDA_7_8_OFFSET", /* name */
319 FALSE, /* partial_inplace */
320 0x7f, /* src_mask */
321 0x7f, /* dst_mask */
322 FALSE), /* pcrel_offset */
324 /* 7 bit offset from the tiny data area pointer. */
325 HOWTO (R_V850_TDA_7_7_OFFSET, /* type */
326 0, /* rightshift */
327 1, /* size (0 = byte, 1 = short, 2 = long) */
328 7, /* bitsize */
329 FALSE, /* pc_relative */
330 0, /* bitpos */
331 complain_overflow_dont, /* complain_on_overflow */
332 v850_elf_reloc, /* special_function */
333 "R_V850_TDA_7_7_OFFSET", /* name */
334 FALSE, /* partial_inplace */
335 0x7f, /* src_mask */
336 0x7f, /* dst_mask */
337 FALSE), /* pcrel_offset */
339 /* 16 bit offset from the tiny data area pointer! */
340 HOWTO (R_V850_TDA_16_16_OFFSET, /* type */
341 0, /* rightshift */
342 1, /* size (0 = byte, 1 = short, 2 = long) */
343 16, /* bitsize */
344 FALSE, /* pc_relative */
345 0, /* bitpos */
346 complain_overflow_dont, /* complain_on_overflow */
347 v850_elf_reloc, /* special_function */
348 "R_V850_TDA_16_16_OFFSET", /* name */
349 FALSE, /* partial_inplace */
350 0xffff, /* src_mask */
351 0xfff, /* dst_mask */
352 FALSE), /* pcrel_offset */
354 /* 5 bit offset from the tiny data area pointer. */
355 HOWTO (R_V850_TDA_4_5_OFFSET, /* type */
356 1, /* rightshift */
357 1, /* size (0 = byte, 1 = short, 2 = long) */
358 5, /* bitsize */
359 FALSE, /* pc_relative */
360 0, /* bitpos */
361 complain_overflow_dont, /* complain_on_overflow */
362 v850_elf_reloc, /* special_function */
363 "R_V850_TDA_4_5_OFFSET", /* name */
364 FALSE, /* partial_inplace */
365 0x0f, /* src_mask */
366 0x0f, /* dst_mask */
367 FALSE), /* pcrel_offset */
369 /* 4 bit offset from the tiny data area pointer. */
370 HOWTO (R_V850_TDA_4_4_OFFSET, /* type */
371 0, /* rightshift */
372 1, /* size (0 = byte, 1 = short, 2 = long) */
373 4, /* bitsize */
374 FALSE, /* pc_relative */
375 0, /* bitpos */
376 complain_overflow_dont, /* complain_on_overflow */
377 v850_elf_reloc, /* special_function */
378 "R_V850_TDA_4_4_OFFSET", /* name */
379 FALSE, /* partial_inplace */
380 0x0f, /* src_mask */
381 0x0f, /* dst_mask */
382 FALSE), /* pcrel_offset */
384 /* 16 bit offset from the short data area pointer. */
385 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* type */
386 0, /* rightshift */
387 2, /* size (0 = byte, 1 = short, 2 = long) */
388 16, /* bitsize */
389 FALSE, /* pc_relative */
390 0, /* bitpos */
391 complain_overflow_dont, /* complain_on_overflow */
392 v850_elf_reloc, /* special_function */
393 "R_V850_SDA_16_16_SPLIT_OFFSET",/* name */
394 FALSE, /* partial_inplace */
395 0xfffe0020, /* src_mask */
396 0xfffe0020, /* dst_mask */
397 FALSE), /* pcrel_offset */
399 /* 16 bit offset from the zero data area pointer. */
400 HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* type */
401 0, /* rightshift */
402 2, /* size (0 = byte, 1 = short, 2 = long) */
403 16, /* bitsize */
404 FALSE, /* pc_relative */
405 0, /* bitpos */
406 complain_overflow_dont, /* complain_on_overflow */
407 v850_elf_reloc, /* special_function */
408 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */
409 FALSE, /* partial_inplace */
410 0xfffe0020, /* src_mask */
411 0xfffe0020, /* dst_mask */
412 FALSE), /* pcrel_offset */
414 /* 6 bit offset from the call table base pointer. */
415 HOWTO (R_V850_CALLT_6_7_OFFSET, /* type */
416 0, /* rightshift */
417 1, /* size (0 = byte, 1 = short, 2 = long) */
418 7, /* bitsize */
419 FALSE, /* pc_relative */
420 0, /* bitpos */
421 complain_overflow_dont, /* complain_on_overflow */
422 v850_elf_reloc, /* special_function */
423 "R_V850_CALLT_6_7_OFFSET", /* name */
424 FALSE, /* partial_inplace */
425 0x3f, /* src_mask */
426 0x3f, /* dst_mask */
427 FALSE), /* pcrel_offset */
429 /* 16 bit offset from the call table base pointer. */
430 HOWTO (R_V850_CALLT_16_16_OFFSET, /* type */
431 0, /* rightshift */
432 1, /* size (0 = byte, 1 = short, 2 = long) */
433 16, /* bitsize */
434 FALSE, /* pc_relative */
435 0, /* bitpos */
436 complain_overflow_dont, /* complain_on_overflow */
437 v850_elf_reloc, /* special_function */
438 "R_V850_CALLT_16_16_OFFSET", /* name */
439 FALSE, /* partial_inplace */
440 0xffff, /* src_mask */
441 0xffff, /* dst_mask */
442 FALSE), /* pcrel_offset */
444 /* GNU extension to record C++ vtable hierarchy */
445 HOWTO (R_V850_GNU_VTINHERIT, /* type */
446 0, /* rightshift */
447 2, /* size (0 = byte, 1 = short, 2 = long) */
448 0, /* bitsize */
449 FALSE, /* pc_relative */
450 0, /* bitpos */
451 complain_overflow_dont, /* complain_on_overflow */
452 NULL, /* special_function */
453 "R_V850_GNU_VTINHERIT", /* name */
454 FALSE, /* partial_inplace */
455 0, /* src_mask */
456 0, /* dst_mask */
457 FALSE), /* pcrel_offset */
459 /* GNU extension to record C++ vtable member usage */
460 HOWTO (R_V850_GNU_VTENTRY, /* type */
461 0, /* rightshift */
462 2, /* size (0 = byte, 1 = short, 2 = long) */
463 0, /* bitsize */
464 FALSE, /* pc_relative */
465 0, /* bitpos */
466 complain_overflow_dont, /* complain_on_overflow */
467 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
468 "R_V850_GNU_VTENTRY", /* name */
469 FALSE, /* partial_inplace */
470 0, /* src_mask */
471 0, /* dst_mask */
472 FALSE), /* pcrel_offset */
474 /* Indicates a .longcall pseudo-op. The compiler will generate a .longcall
475 pseudo-op when it finds a function call which can be relaxed. */
476 HOWTO (R_V850_LONGCALL, /* type */
477 0, /* rightshift */
478 2, /* size (0 = byte, 1 = short, 2 = long) */
479 32, /* bitsize */
480 TRUE, /* pc_relative */
481 0, /* bitpos */
482 complain_overflow_signed, /* complain_on_overflow */
483 v850_elf_ignore_reloc, /* special_function */
484 "R_V850_LONGCALL", /* name */
485 FALSE, /* partial_inplace */
486 0, /* src_mask */
487 0, /* dst_mask */
488 TRUE), /* pcrel_offset */
490 /* Indicates a .longjump pseudo-op. The compiler will generate a
491 .longjump pseudo-op when it finds a branch which can be relaxed. */
492 HOWTO (R_V850_LONGJUMP, /* type */
493 0, /* rightshift */
494 2, /* size (0 = byte, 1 = short, 2 = long) */
495 32, /* bitsize */
496 TRUE, /* pc_relative */
497 0, /* bitpos */
498 complain_overflow_signed, /* complain_on_overflow */
499 v850_elf_ignore_reloc, /* special_function */
500 "R_V850_LONGJUMP", /* name */
501 FALSE, /* partial_inplace */
502 0, /* src_mask */
503 0, /* dst_mask */
504 TRUE), /* pcrel_offset */
506 HOWTO (R_V850_ALIGN, /* type */
507 0, /* rightshift */
508 1, /* size (0 = byte, 1 = short, 2 = long) */
509 0, /* bitsize */
510 FALSE, /* pc_relative */
511 0, /* bitpos */
512 complain_overflow_unsigned, /* complain_on_overflow */
513 v850_elf_ignore_reloc, /* special_function */
514 "R_V850_ALIGN", /* name */
515 FALSE, /* partial_inplace */
516 0, /* src_mask */
517 0, /* dst_mask */
518 TRUE), /* pcrel_offset */
520 /* Simple pc-relative 32bit reloc. */
521 HOWTO (R_V850_REL32, /* type */
522 0, /* rightshift */
523 2, /* size (0 = byte, 1 = short, 2 = long) */
524 32, /* bitsize */
525 TRUE, /* pc_relative */
526 0, /* bitpos */
527 complain_overflow_dont, /* complain_on_overflow */
528 v850_elf_reloc, /* special_function */
529 "R_V850_REL32", /* name */
530 FALSE, /* partial_inplace */
531 0xffffffff, /* src_mask */
532 0xffffffff, /* dst_mask */
533 FALSE), /* pcrel_offset */
535 /* An ld.bu version of R_V850_LO16. */
536 HOWTO (R_V850_LO16_SPLIT_OFFSET, /* type */
537 0, /* rightshift */
538 2, /* size (0 = byte, 1 = short, 2 = long) */
539 16, /* bitsize */
540 FALSE, /* pc_relative */
541 0, /* bitpos */
542 complain_overflow_dont, /* complain_on_overflow */
543 v850_elf_reloc, /* special_function */
544 "R_V850_LO16_SPLIT_OFFSET", /* name */
545 FALSE, /* partial_inplace */
546 0xfffe0020, /* src_mask */
547 0xfffe0020, /* dst_mask */
548 FALSE), /* pcrel_offset */
551 /* Map BFD reloc types to V850 ELF reloc types. */
553 struct v850_elf_reloc_map
555 /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
556 unsigned char. */
557 bfd_reloc_code_real_type bfd_reloc_val;
558 unsigned int elf_reloc_val;
561 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
563 { BFD_RELOC_NONE, R_V850_NONE },
564 { BFD_RELOC_V850_9_PCREL, R_V850_9_PCREL },
565 { BFD_RELOC_V850_22_PCREL, R_V850_22_PCREL },
566 { BFD_RELOC_HI16_S, R_V850_HI16_S },
567 { BFD_RELOC_HI16, R_V850_HI16 },
568 { BFD_RELOC_LO16, R_V850_LO16 },
569 { BFD_RELOC_32, R_V850_ABS32 },
570 { BFD_RELOC_32_PCREL, R_V850_REL32 },
571 { BFD_RELOC_16, R_V850_16 },
572 { BFD_RELOC_8, R_V850_8 },
573 { BFD_RELOC_V850_SDA_16_16_OFFSET, R_V850_SDA_16_16_OFFSET },
574 { BFD_RELOC_V850_SDA_15_16_OFFSET, R_V850_SDA_15_16_OFFSET },
575 { BFD_RELOC_V850_ZDA_16_16_OFFSET, R_V850_ZDA_16_16_OFFSET },
576 { BFD_RELOC_V850_ZDA_15_16_OFFSET, R_V850_ZDA_15_16_OFFSET },
577 { BFD_RELOC_V850_TDA_6_8_OFFSET, R_V850_TDA_6_8_OFFSET },
578 { BFD_RELOC_V850_TDA_7_8_OFFSET, R_V850_TDA_7_8_OFFSET },
579 { BFD_RELOC_V850_TDA_7_7_OFFSET, R_V850_TDA_7_7_OFFSET },
580 { BFD_RELOC_V850_TDA_16_16_OFFSET, R_V850_TDA_16_16_OFFSET },
581 { BFD_RELOC_V850_TDA_4_5_OFFSET, R_V850_TDA_4_5_OFFSET },
582 { BFD_RELOC_V850_TDA_4_4_OFFSET, R_V850_TDA_4_4_OFFSET },
583 { BFD_RELOC_V850_LO16_SPLIT_OFFSET, R_V850_LO16_SPLIT_OFFSET },
584 { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
585 { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
586 { BFD_RELOC_V850_CALLT_6_7_OFFSET, R_V850_CALLT_6_7_OFFSET },
587 { BFD_RELOC_V850_CALLT_16_16_OFFSET, R_V850_CALLT_16_16_OFFSET },
588 { BFD_RELOC_VTABLE_INHERIT, R_V850_GNU_VTINHERIT },
589 { BFD_RELOC_VTABLE_ENTRY, R_V850_GNU_VTENTRY },
590 { BFD_RELOC_V850_LONGCALL, R_V850_LONGCALL },
591 { BFD_RELOC_V850_LONGJUMP, R_V850_LONGJUMP },
592 { BFD_RELOC_V850_ALIGN, R_V850_ALIGN },
596 /* Map a bfd relocation into the appropriate howto structure. */
598 static reloc_howto_type *
599 v850_elf_reloc_type_lookup (abfd, code)
600 bfd *abfd ATTRIBUTE_UNUSED;
601 bfd_reloc_code_real_type code;
603 unsigned int i;
605 for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
606 if (v850_elf_reloc_map[i].bfd_reloc_val == code)
608 unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
610 BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
612 return v850_elf_howto_table + elf_reloc_val;
615 return NULL;
618 /* Set the howto pointer for an V850 ELF reloc. */
620 static void
621 v850_elf_info_to_howto_rel (abfd, cache_ptr, dst)
622 bfd *abfd ATTRIBUTE_UNUSED;
623 arelent *cache_ptr;
624 Elf_Internal_Rela *dst;
626 unsigned int r_type;
628 r_type = ELF32_R_TYPE (dst->r_info);
629 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
630 cache_ptr->howto = &v850_elf_howto_table[r_type];
633 /* Set the howto pointer for a V850 ELF reloc (type RELA). */
634 static void
635 v850_elf_info_to_howto_rela (abfd, cache_ptr, dst)
636 bfd *abfd ATTRIBUTE_UNUSED;
637 arelent * cache_ptr;
638 Elf_Internal_Rela *dst;
640 unsigned int r_type;
642 r_type = ELF32_R_TYPE (dst->r_info);
643 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
644 cache_ptr->howto = &v850_elf_howto_table[r_type];
647 /* Look through the relocs for a section during the first phase, and
648 allocate space in the global offset table or procedure linkage
649 table. */
651 static bfd_boolean
652 v850_elf_check_relocs (abfd, info, sec, relocs)
653 bfd *abfd;
654 struct bfd_link_info *info;
655 asection *sec;
656 const Elf_Internal_Rela *relocs;
658 bfd_boolean ret = TRUE;
659 bfd *dynobj;
660 Elf_Internal_Shdr *symtab_hdr;
661 struct elf_link_hash_entry **sym_hashes;
662 const Elf_Internal_Rela *rel;
663 const Elf_Internal_Rela *rel_end;
664 asection *sreloc;
665 enum v850_reloc_type r_type;
666 int other = 0;
667 const char *common = (const char *)0;
669 if (info->relocatable)
670 return TRUE;
672 #ifdef DEBUG
673 _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
674 sec, abfd);
675 #endif
677 dynobj = elf_hash_table (info)->dynobj;
678 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
679 sym_hashes = elf_sym_hashes (abfd);
680 sreloc = NULL;
682 rel_end = relocs + sec->reloc_count;
683 for (rel = relocs; rel < rel_end; rel++)
685 unsigned long r_symndx;
686 struct elf_link_hash_entry *h;
688 r_symndx = ELF32_R_SYM (rel->r_info);
689 if (r_symndx < symtab_hdr->sh_info)
690 h = NULL;
691 else
693 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
694 while (h->root.type == bfd_link_hash_indirect
695 || h->root.type == bfd_link_hash_warning)
696 h = (struct elf_link_hash_entry *) h->root.u.i.link;
699 r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
700 switch (r_type)
702 default:
703 case R_V850_NONE:
704 case R_V850_9_PCREL:
705 case R_V850_22_PCREL:
706 case R_V850_HI16_S:
707 case R_V850_HI16:
708 case R_V850_LO16:
709 case R_V850_LO16_SPLIT_OFFSET:
710 case R_V850_ABS32:
711 case R_V850_REL32:
712 case R_V850_16:
713 case R_V850_8:
714 case R_V850_CALLT_6_7_OFFSET:
715 case R_V850_CALLT_16_16_OFFSET:
716 break;
718 /* This relocation describes the C++ object vtable hierarchy.
719 Reconstruct it for later use during GC. */
720 case R_V850_GNU_VTINHERIT:
721 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
722 return FALSE;
723 break;
725 /* This relocation describes which C++ vtable entries
726 are actually used. Record for later use during GC. */
727 case R_V850_GNU_VTENTRY:
728 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
729 return FALSE;
730 break;
732 case R_V850_SDA_16_16_SPLIT_OFFSET:
733 case R_V850_SDA_16_16_OFFSET:
734 case R_V850_SDA_15_16_OFFSET:
735 other = V850_OTHER_SDA;
736 common = ".scommon";
737 goto small_data_common;
739 case R_V850_ZDA_16_16_SPLIT_OFFSET:
740 case R_V850_ZDA_16_16_OFFSET:
741 case R_V850_ZDA_15_16_OFFSET:
742 other = V850_OTHER_ZDA;
743 common = ".zcommon";
744 goto small_data_common;
746 case R_V850_TDA_4_5_OFFSET:
747 case R_V850_TDA_4_4_OFFSET:
748 case R_V850_TDA_6_8_OFFSET:
749 case R_V850_TDA_7_8_OFFSET:
750 case R_V850_TDA_7_7_OFFSET:
751 case R_V850_TDA_16_16_OFFSET:
752 other = V850_OTHER_TDA;
753 common = ".tcommon";
754 /* fall through */
756 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
758 small_data_common:
759 if (h)
761 /* Flag which type of relocation was used. */
762 h->other |= other;
763 if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
764 && (h->other & V850_OTHER_ERROR) == 0)
766 const char * msg;
767 static char buff[200]; /* XXX */
769 switch (h->other & V850_OTHER_MASK)
771 default:
772 msg = _("Variable `%s' cannot occupy in multiple small data regions");
773 break;
774 case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
775 msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
776 break;
777 case V850_OTHER_SDA | V850_OTHER_ZDA:
778 msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
779 break;
780 case V850_OTHER_SDA | V850_OTHER_TDA:
781 msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
782 break;
783 case V850_OTHER_ZDA | V850_OTHER_TDA:
784 msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
785 break;
788 sprintf (buff, msg, h->root.root.string);
789 info->callbacks->warning (info, buff, h->root.root.string,
790 abfd, h->root.u.def.section,
791 (bfd_vma) 0);
793 bfd_set_error (bfd_error_bad_value);
794 h->other |= V850_OTHER_ERROR;
795 ret = FALSE;
799 if (h && h->root.type == bfd_link_hash_common
800 && h->root.u.c.p
801 && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
803 asection * section;
805 section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
806 section->flags |= SEC_IS_COMMON;
809 #ifdef DEBUG
810 fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
811 v850_elf_howto_table[ (int)r_type ].name,
812 (h && h->root.root.string) ? h->root.root.string : "<unknown>",
813 (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
814 #endif
815 break;
819 return ret;
822 /* In the old version, when an entry was checked out from the table,
823 it was deleted. This produced an error if the entry was needed
824 more than once, as the second attempted retry failed.
826 In the current version, the entry is not deleted, instead we set
827 the field 'found' to TRUE. If a second lookup matches the same
828 entry, then we know that the hi16s reloc has already been updated
829 and does not need to be updated a second time.
831 TODO - TOFIX: If it is possible that we need to restore 2 different
832 addresses from the same table entry, where the first generates an
833 overflow, whilst the second do not, then this code will fail. */
835 typedef struct hi16s_location
837 bfd_vma addend;
838 bfd_byte *address;
839 unsigned long counter;
840 bfd_boolean found;
841 struct hi16s_location *next;
843 hi16s_location;
845 static hi16s_location *previous_hi16s;
846 static hi16s_location *free_hi16s;
847 static unsigned long hi16s_counter;
849 static void
850 remember_hi16s_reloc (abfd, addend, address)
851 bfd *abfd;
852 bfd_vma addend;
853 bfd_byte *address;
855 hi16s_location * entry = NULL;
856 bfd_size_type amt = sizeof (* free_hi16s);
858 /* Find a free structure. */
859 if (free_hi16s == NULL)
860 free_hi16s = (hi16s_location *) bfd_zalloc (abfd, amt);
862 entry = free_hi16s;
863 free_hi16s = free_hi16s->next;
865 entry->addend = addend;
866 entry->address = address;
867 entry->counter = hi16s_counter ++;
868 entry->found = FALSE;
869 entry->next = previous_hi16s;
870 previous_hi16s = entry;
872 /* Cope with wrap around of our counter. */
873 if (hi16s_counter == 0)
875 /* XXX - Assume that all counter entries differ only in their low 16 bits. */
876 for (entry = previous_hi16s; entry != NULL; entry = entry->next)
877 entry->counter &= 0xffff;
879 hi16s_counter = 0x10000;
882 return;
885 static bfd_byte *
886 find_remembered_hi16s_reloc (addend, already_found)
887 bfd_vma addend;
888 bfd_boolean *already_found;
890 hi16s_location *match = NULL;
891 hi16s_location *entry;
892 hi16s_location *previous = NULL;
893 hi16s_location *prev;
894 bfd_byte *addr;
896 /* Search the table. Record the most recent entry that matches. */
897 for (entry = previous_hi16s; entry; entry = entry->next)
899 if (entry->addend == addend
900 && (match == NULL || match->counter < entry->counter))
902 previous = prev;
903 match = entry;
906 prev = entry;
909 if (match == NULL)
910 return NULL;
912 /* Extract the address. */
913 addr = match->address;
915 /* Remember if this entry has already been used before. */
916 if (already_found)
917 * already_found = match->found;
919 /* Note that this entry has now been used. */
920 match->found = TRUE;
922 return addr;
925 /* Calculate the final operand value for a R_V850_LO16 or
926 R_V850_LO16_SPLIT_OFFSET. *INSN is the current operand value and
927 ADDEND is the sum of the relocation symbol and offset. Store the
928 operand value in *INSN and return true on success.
930 The assembler has already done some of this: If the value stored in
931 the instruction has its 15th bit set, (counting from zero) then the
932 assembler will have added 1 to the value stored in the associated
933 HI16S reloc. So for example, these relocations:
935 movhi hi( fred ), r0, r1
936 movea lo( fred ), r1, r1
938 will store 0 in the value fields for the MOVHI and MOVEA instructions
939 and addend will be the address of fred, but for these instructions:
941 movhi hi( fred + 0x123456), r0, r1
942 movea lo( fred + 0x123456), r1, r1
944 the value stored in the MOVHI instruction will be 0x12 and the value
945 stored in the MOVEA instruction will be 0x3456. If however the
946 instructions were:
948 movhi hi( fred + 0x10ffff), r0, r1
949 movea lo( fred + 0x10ffff), r1, r1
951 then the value stored in the MOVHI instruction would be 0x11 (not
952 0x10) and the value stored in the MOVEA instruction would be 0xffff.
953 Thus (assuming for the moment that the addend is 0), at run time the
954 MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
955 adds 0xffffffff (sign extension!) producing 0x10ffff. Similarly if
956 the instructions were:
958 movhi hi( fred - 1), r0, r1
959 movea lo( fred - 1), r1, r1
961 then 0 is stored in the MOVHI instruction and -1 is stored in the
962 MOVEA instruction.
964 Overflow can occur if the addition of the value stored in the
965 instruction plus the addend sets the 15th bit when before it was clear.
966 This is because the 15th bit will be sign extended into the high part,
967 thus reducing its value by one, but since the 15th bit was originally
968 clear, the assembler will not have added 1 to the previous HI16S reloc
969 to compensate for this effect. For example:
971 movhi hi( fred + 0x123456), r0, r1
972 movea lo( fred + 0x123456), r1, r1
974 The value stored in HI16S reloc is 0x12, the value stored in the LO16
975 reloc is 0x3456. If we assume that the address of fred is 0x00007000
976 then the relocations become:
978 HI16S: 0x0012 + (0x00007000 >> 16) = 0x12
979 LO16: 0x3456 + (0x00007000 & 0xffff) = 0xa456
981 but when the instructions are executed, the MOVEA instruction's value
982 is signed extended, so the sum becomes:
984 0x00120000
985 + 0xffffa456
986 ------------
987 0x0011a456 but 'fred + 0x123456' = 0x0012a456
989 Note that if the 15th bit was set in the value stored in the LO16
990 reloc, then we do not have to do anything:
992 movhi hi( fred + 0x10ffff), r0, r1
993 movea lo( fred + 0x10ffff), r1, r1
995 HI16S: 0x0011 + (0x00007000 >> 16) = 0x11
996 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff
998 0x00110000
999 + 0x00006fff
1000 ------------
1001 0x00116fff = fred + 0x10ffff = 0x7000 + 0x10ffff
1003 Overflow can also occur if the computation carries into the 16th bit
1004 and it also results in the 15th bit having the same value as the 15th
1005 bit of the original value. What happens is that the HI16S reloc
1006 will have already examined the 15th bit of the original value and
1007 added 1 to the high part if the bit is set. This compensates for the
1008 sign extension of 15th bit of the result of the computation. But now
1009 there is a carry into the 16th bit, and this has not been allowed for.
1011 So, for example if fred is at address 0xf000:
1013 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
1014 movea lo( fred + 0xffff), r1, r1
1016 HI16S: 0x0001 + (0x0000f000 >> 16) = 0x0001
1017 LO16: 0xffff + (0x0000f000 & 0xffff) = 0xefff (carry into bit 16 is lost)
1019 0x00010000
1020 + 0xffffefff
1021 ------------
1022 0x0000efff but 'fred + 0xffff' = 0x0001efff
1024 Similarly, if the 15th bit remains clear, but overflow occurs into
1025 the 16th bit then (assuming the address of fred is 0xf000):
1027 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
1028 movea lo( fred + 0x7000), r1, r1
1030 HI16S: 0x0000 + (0x0000f000 >> 16) = 0x0000
1031 LO16: 0x7000 + (0x0000f000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1033 0x00000000
1034 + 0x00006fff
1035 ------------
1036 0x00006fff but 'fred + 0x7000' = 0x00016fff
1038 Note - there is no need to change anything if a carry occurs, and the
1039 15th bit changes its value from being set to being clear, as the HI16S
1040 reloc will have already added in 1 to the high part for us:
1042 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
1043 movea lo( fred + 0xffff), r1, r1
1045 HI16S: 0x0001 + (0x00007000 >> 16)
1046 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1048 0x00010000
1049 + 0x00006fff (bit 15 not set, so the top half is zero)
1050 ------------
1051 0x00016fff which is right (assuming that fred is at 0x7000)
1053 but if the 15th bit goes from being clear to being set, then we must
1054 once again handle overflow:
1056 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
1057 movea lo( fred + 0x7000), r1, r1
1059 HI16S: 0x0000 + (0x0000ffff >> 16)
1060 LO16: 0x7000 + (0x0000ffff & 0xffff) = 0x6fff (carry into bit 16)
1062 0x00000000
1063 + 0x00006fff (bit 15 not set, so the top half is zero)
1064 ------------
1065 0x00006fff which is wrong (assuming that fred is at 0xffff). */
1067 static bfd_boolean
1068 v850_elf_perform_lo16_relocation (bfd *abfd, unsigned long *insn,
1069 unsigned long addend)
1071 #define BIT15_SET(x) ((x) & 0x8000)
1072 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
1073 if ((BIT15_SET (*insn + addend) && ! BIT15_SET (addend))
1074 || (OVERFLOWS (addend, *insn)
1075 && ((! BIT15_SET (*insn)) || (BIT15_SET (addend)))))
1077 bfd_boolean already_updated;
1078 bfd_byte *hi16s_address = find_remembered_hi16s_reloc
1079 (addend, & already_updated);
1081 /* Amend the matching HI16_S relocation. */
1082 if (hi16s_address != NULL)
1084 if (! already_updated)
1086 unsigned long hi_insn = bfd_get_16 (abfd, hi16s_address);
1087 hi_insn += 1;
1088 bfd_put_16 (abfd, hi_insn, hi16s_address);
1091 else
1093 fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
1094 return FALSE;
1097 #undef OVERFLOWS
1098 #undef BIT15_SET
1100 /* Do not complain if value has top bit set, as this has been
1101 anticipated. */
1102 *insn = (*insn + addend) & 0xffff;
1103 return TRUE;
1106 /* FIXME: The code here probably ought to be removed and the code in reloc.c
1107 allowed to do its stuff instead. At least for most of the relocs, anyway. */
1109 static bfd_reloc_status_type
1110 v850_elf_perform_relocation (abfd, r_type, addend, address)
1111 bfd *abfd;
1112 unsigned int r_type;
1113 bfd_vma addend;
1114 bfd_byte *address;
1116 unsigned long insn;
1117 unsigned long result;
1118 bfd_signed_vma saddend = (bfd_signed_vma) addend;
1120 switch (r_type)
1122 default:
1123 /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
1124 return bfd_reloc_notsupported;
1126 case R_V850_REL32:
1127 case R_V850_ABS32:
1128 bfd_put_32 (abfd, addend, address);
1129 return bfd_reloc_ok;
1131 case R_V850_22_PCREL:
1132 if (saddend > 0x1fffff || saddend < -0x200000)
1133 return bfd_reloc_overflow;
1135 if ((addend % 2) != 0)
1136 return bfd_reloc_dangerous;
1138 insn = bfd_get_32 (abfd, address);
1139 insn &= ~0xfffe003f;
1140 insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
1141 bfd_put_32 (abfd, (bfd_vma) insn, address);
1142 return bfd_reloc_ok;
1144 case R_V850_9_PCREL:
1145 if (saddend > 0xff || saddend < -0x100)
1146 return bfd_reloc_overflow;
1148 if ((addend % 2) != 0)
1149 return bfd_reloc_dangerous;
1151 insn = bfd_get_16 (abfd, address);
1152 insn &= ~ 0xf870;
1153 insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
1154 break;
1156 case R_V850_HI16:
1157 addend += (bfd_get_16 (abfd, address) << 16);
1158 addend = (addend >> 16);
1159 insn = addend;
1160 break;
1162 case R_V850_HI16_S:
1163 /* Remember where this relocation took place. */
1164 remember_hi16s_reloc (abfd, addend, address);
1166 addend += (bfd_get_16 (abfd, address) << 16);
1167 addend = (addend >> 16) + ((addend & 0x8000) != 0);
1169 /* This relocation cannot overflow. */
1170 if (addend > 0x7fff)
1171 addend = 0;
1173 insn = addend;
1174 break;
1176 case R_V850_LO16:
1177 insn = bfd_get_16 (abfd, address);
1178 if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
1179 return bfd_reloc_overflow;
1180 break;
1182 case R_V850_8:
1183 addend += (char) bfd_get_8 (abfd, address);
1185 saddend = (bfd_signed_vma) addend;
1187 if (saddend > 0x7f || saddend < -0x80)
1188 return bfd_reloc_overflow;
1190 bfd_put_8 (abfd, addend, address);
1191 return bfd_reloc_ok;
1193 case R_V850_CALLT_16_16_OFFSET:
1194 addend += bfd_get_16 (abfd, address);
1196 saddend = (bfd_signed_vma) addend;
1198 if (saddend > 0xffff || saddend < 0)
1199 return bfd_reloc_overflow;
1201 insn = addend;
1202 break;
1204 case R_V850_16:
1206 /* drop through */
1207 case R_V850_SDA_16_16_OFFSET:
1208 case R_V850_ZDA_16_16_OFFSET:
1209 case R_V850_TDA_16_16_OFFSET:
1210 addend += bfd_get_16 (abfd, address);
1212 saddend = (bfd_signed_vma) addend;
1214 if (saddend > 0x7fff || saddend < -0x8000)
1215 return bfd_reloc_overflow;
1217 insn = addend;
1218 break;
1220 case R_V850_SDA_15_16_OFFSET:
1221 case R_V850_ZDA_15_16_OFFSET:
1222 insn = bfd_get_16 (abfd, address);
1223 addend += (insn & 0xfffe);
1225 saddend = (bfd_signed_vma) addend;
1227 if (saddend > 0x7ffe || saddend < -0x8000)
1228 return bfd_reloc_overflow;
1230 if (addend & 1)
1231 return bfd_reloc_dangerous;
1233 insn = (addend &~ (bfd_vma) 1) | (insn & 1);
1234 break;
1236 case R_V850_TDA_6_8_OFFSET:
1237 insn = bfd_get_16 (abfd, address);
1238 addend += ((insn & 0x7e) << 1);
1240 saddend = (bfd_signed_vma) addend;
1242 if (saddend > 0xfc || saddend < 0)
1243 return bfd_reloc_overflow;
1245 if (addend & 3)
1246 return bfd_reloc_dangerous;
1248 insn &= 0xff81;
1249 insn |= (addend >> 1);
1250 break;
1252 case R_V850_TDA_7_8_OFFSET:
1253 insn = bfd_get_16 (abfd, address);
1254 addend += ((insn & 0x7f) << 1);
1256 saddend = (bfd_signed_vma) addend;
1258 if (saddend > 0xfe || saddend < 0)
1259 return bfd_reloc_overflow;
1261 if (addend & 1)
1262 return bfd_reloc_dangerous;
1264 insn &= 0xff80;
1265 insn |= (addend >> 1);
1266 break;
1268 case R_V850_TDA_7_7_OFFSET:
1269 insn = bfd_get_16 (abfd, address);
1270 addend += insn & 0x7f;
1272 saddend = (bfd_signed_vma) addend;
1274 if (saddend > 0x7f || saddend < 0)
1275 return bfd_reloc_overflow;
1277 insn &= 0xff80;
1278 insn |= addend;
1279 break;
1281 case R_V850_TDA_4_5_OFFSET:
1282 insn = bfd_get_16 (abfd, address);
1283 addend += ((insn & 0xf) << 1);
1285 saddend = (bfd_signed_vma) addend;
1287 if (saddend > 0x1e || saddend < 0)
1288 return bfd_reloc_overflow;
1290 if (addend & 1)
1291 return bfd_reloc_dangerous;
1293 insn &= 0xfff0;
1294 insn |= (addend >> 1);
1295 break;
1297 case R_V850_TDA_4_4_OFFSET:
1298 insn = bfd_get_16 (abfd, address);
1299 addend += insn & 0xf;
1301 saddend = (bfd_signed_vma) addend;
1303 if (saddend > 0xf || saddend < 0)
1304 return bfd_reloc_overflow;
1306 insn &= 0xfff0;
1307 insn |= addend;
1308 break;
1310 case R_V850_LO16_SPLIT_OFFSET:
1311 insn = bfd_get_32 (abfd, address);
1312 result = ((insn & 0xfffe0000) >> 16) | ((insn & 0x20) >> 5);
1313 if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
1314 return bfd_reloc_overflow;
1315 insn = (((result << 16) & 0xfffe0000)
1316 | ((result << 5) & 0x20)
1317 | (insn & ~0xfffe0020));
1318 bfd_put_32 (abfd, insn, address);
1319 return bfd_reloc_ok;
1321 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1322 case R_V850_SDA_16_16_SPLIT_OFFSET:
1323 insn = bfd_get_32 (abfd, address);
1324 addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
1326 saddend = (bfd_signed_vma) addend;
1328 if (saddend > 0x7fff || saddend < -0x8000)
1329 return bfd_reloc_overflow;
1331 insn &= 0x0001ffdf;
1332 insn |= (addend & 1) << 5;
1333 insn |= (addend &~ (bfd_vma) 1) << 16;
1335 bfd_put_32 (abfd, (bfd_vma) insn, address);
1336 return bfd_reloc_ok;
1338 case R_V850_CALLT_6_7_OFFSET:
1339 insn = bfd_get_16 (abfd, address);
1340 addend += ((insn & 0x3f) << 1);
1342 saddend = (bfd_signed_vma) addend;
1344 if (saddend > 0x7e || saddend < 0)
1345 return bfd_reloc_overflow;
1347 if (addend & 1)
1348 return bfd_reloc_dangerous;
1350 insn &= 0xff80;
1351 insn |= (addend >> 1);
1352 break;
1354 case R_V850_GNU_VTINHERIT:
1355 case R_V850_GNU_VTENTRY:
1356 return bfd_reloc_ok;
1360 bfd_put_16 (abfd, (bfd_vma) insn, address);
1361 return bfd_reloc_ok;
1364 /* Insert the addend into the instruction. */
1366 static bfd_reloc_status_type
1367 v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
1368 bfd *abfd ATTRIBUTE_UNUSED;
1369 arelent *reloc;
1370 asymbol *symbol;
1371 PTR data ATTRIBUTE_UNUSED;
1372 asection *isection;
1373 bfd *obfd;
1374 char **err ATTRIBUTE_UNUSED;
1376 long relocation;
1378 /* If there is an output BFD,
1379 and the symbol is not a section name (which is only defined at final link time),
1380 and either we are not putting the addend into the instruction
1381 or the addend is zero, so there is nothing to add into the instruction
1382 then just fixup the address and return. */
1383 if (obfd != (bfd *) NULL
1384 && (symbol->flags & BSF_SECTION_SYM) == 0
1385 && (! reloc->howto->partial_inplace
1386 || reloc->addend == 0))
1388 reloc->address += isection->output_offset;
1389 return bfd_reloc_ok;
1392 /* Catch relocs involving undefined symbols. */
1393 if (bfd_is_und_section (symbol->section)
1394 && (symbol->flags & BSF_WEAK) == 0
1395 && obfd == NULL)
1396 return bfd_reloc_undefined;
1398 /* We handle final linking of some relocs ourselves. */
1400 /* Is the address of the relocation really within the section? */
1401 if (reloc->address > bfd_get_section_limit (abfd, isection))
1402 return bfd_reloc_outofrange;
1404 /* Work out which section the relocation is targeted at and the
1405 initial relocation command value. */
1407 if (reloc->howto->pc_relative)
1408 return bfd_reloc_ok;
1410 /* Get symbol value. (Common symbols are special.) */
1411 if (bfd_is_com_section (symbol->section))
1412 relocation = 0;
1413 else
1414 relocation = symbol->value;
1416 /* Convert input-section-relative symbol value to absolute + addend. */
1417 relocation += symbol->section->output_section->vma;
1418 relocation += symbol->section->output_offset;
1419 relocation += reloc->addend;
1421 reloc->addend = relocation;
1422 return bfd_reloc_ok;
1425 /* This function is used for relocs which are only used
1426 for relaxing, which the linker should otherwise ignore. */
1428 static bfd_reloc_status_type
1429 v850_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
1430 output_bfd, error_message)
1431 bfd *abfd ATTRIBUTE_UNUSED;
1432 arelent *reloc_entry;
1433 asymbol *symbol ATTRIBUTE_UNUSED;
1434 PTR data ATTRIBUTE_UNUSED;
1435 asection *input_section;
1436 bfd *output_bfd;
1437 char **error_message ATTRIBUTE_UNUSED;
1439 if (output_bfd != NULL)
1440 reloc_entry->address += input_section->output_offset;
1442 return bfd_reloc_ok;
1445 static bfd_boolean
1446 v850_elf_is_local_label_name (abfd, name)
1447 bfd *abfd ATTRIBUTE_UNUSED;
1448 const char *name;
1450 return ( (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1451 || (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1454 /* We overload some of the bfd_reloc error codes for own purposes. */
1455 #define bfd_reloc_gp_not_found bfd_reloc_other
1456 #define bfd_reloc_ep_not_found bfd_reloc_continue
1457 #define bfd_reloc_ctbp_not_found (bfd_reloc_dangerous + 1)
1459 /* Perform a relocation as part of a final link. */
1461 static bfd_reloc_status_type
1462 v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1463 input_section, contents, offset, value,
1464 addend, info, sym_sec, is_local)
1465 reloc_howto_type *howto;
1466 bfd *input_bfd;
1467 bfd *output_bfd ATTRIBUTE_UNUSED;
1468 asection *input_section;
1469 bfd_byte *contents;
1470 bfd_vma offset;
1471 bfd_vma value;
1472 bfd_vma addend;
1473 struct bfd_link_info *info;
1474 asection *sym_sec;
1475 int is_local ATTRIBUTE_UNUSED;
1477 unsigned int r_type = howto->type;
1478 bfd_byte *hit_data = contents + offset;
1480 /* Adjust the value according to the relocation. */
1481 switch (r_type)
1483 case R_V850_9_PCREL:
1484 value -= (input_section->output_section->vma
1485 + input_section->output_offset);
1486 value -= offset;
1487 break;
1489 case R_V850_22_PCREL:
1490 value -= (input_section->output_section->vma
1491 + input_section->output_offset
1492 + offset);
1494 /* If the sign extension will corrupt the value then we have overflowed. */
1495 if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1496 return bfd_reloc_overflow;
1498 /* Only the bottom 24 bits of the PC are valid */
1499 value = SEXT24 (value);
1500 break;
1502 case R_V850_REL32:
1503 value -= (input_section->output_section->vma
1504 + input_section->output_offset
1505 + offset);
1506 break;
1508 case R_V850_HI16_S:
1509 case R_V850_HI16:
1510 case R_V850_LO16:
1511 case R_V850_LO16_SPLIT_OFFSET:
1512 case R_V850_16:
1513 case R_V850_ABS32:
1514 case R_V850_8:
1515 break;
1517 case R_V850_ZDA_15_16_OFFSET:
1518 case R_V850_ZDA_16_16_OFFSET:
1519 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1520 if (sym_sec == NULL)
1521 return bfd_reloc_undefined;
1523 value -= sym_sec->output_section->vma;
1524 break;
1526 case R_V850_SDA_15_16_OFFSET:
1527 case R_V850_SDA_16_16_OFFSET:
1528 case R_V850_SDA_16_16_SPLIT_OFFSET:
1530 unsigned long gp;
1531 struct bfd_link_hash_entry * h;
1533 if (sym_sec == NULL)
1534 return bfd_reloc_undefined;
1536 /* Get the value of __gp. */
1537 h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
1538 if (h == (struct bfd_link_hash_entry *) NULL
1539 || h->type != bfd_link_hash_defined)
1540 return bfd_reloc_gp_not_found;
1542 gp = (h->u.def.value
1543 + h->u.def.section->output_section->vma
1544 + h->u.def.section->output_offset);
1546 value -= sym_sec->output_section->vma;
1547 value -= (gp - sym_sec->output_section->vma);
1549 break;
1551 case R_V850_TDA_4_4_OFFSET:
1552 case R_V850_TDA_4_5_OFFSET:
1553 case R_V850_TDA_16_16_OFFSET:
1554 case R_V850_TDA_7_7_OFFSET:
1555 case R_V850_TDA_7_8_OFFSET:
1556 case R_V850_TDA_6_8_OFFSET:
1558 unsigned long ep;
1559 struct bfd_link_hash_entry * h;
1561 /* Get the value of __ep. */
1562 h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
1563 if (h == (struct bfd_link_hash_entry *) NULL
1564 || h->type != bfd_link_hash_defined)
1565 return bfd_reloc_ep_not_found;
1567 ep = (h->u.def.value
1568 + h->u.def.section->output_section->vma
1569 + h->u.def.section->output_offset);
1571 value -= ep;
1573 break;
1575 case R_V850_CALLT_6_7_OFFSET:
1577 unsigned long ctbp;
1578 struct bfd_link_hash_entry * h;
1580 /* Get the value of __ctbp. */
1581 h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1582 if (h == (struct bfd_link_hash_entry *) NULL
1583 || h->type != bfd_link_hash_defined)
1584 return bfd_reloc_ctbp_not_found;
1586 ctbp = (h->u.def.value
1587 + h->u.def.section->output_section->vma
1588 + h->u.def.section->output_offset);
1589 value -= ctbp;
1591 break;
1593 case R_V850_CALLT_16_16_OFFSET:
1595 unsigned long ctbp;
1596 struct bfd_link_hash_entry * h;
1598 if (sym_sec == NULL)
1599 return bfd_reloc_undefined;
1601 /* Get the value of __ctbp. */
1602 h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1603 if (h == (struct bfd_link_hash_entry *) NULL
1604 || h->type != bfd_link_hash_defined)
1605 return bfd_reloc_ctbp_not_found;
1607 ctbp = (h->u.def.value
1608 + h->u.def.section->output_section->vma
1609 + h->u.def.section->output_offset);
1611 value -= sym_sec->output_section->vma;
1612 value -= (ctbp - sym_sec->output_section->vma);
1614 break;
1616 case R_V850_NONE:
1617 case R_V850_GNU_VTINHERIT:
1618 case R_V850_GNU_VTENTRY:
1619 case R_V850_LONGCALL:
1620 case R_V850_LONGJUMP:
1621 case R_V850_ALIGN:
1622 return bfd_reloc_ok;
1624 default:
1625 return bfd_reloc_notsupported;
1628 /* Perform the relocation. */
1629 return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1632 /* Relocate an V850 ELF section. */
1634 static bfd_boolean
1635 v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1636 contents, relocs, local_syms, local_sections)
1637 bfd *output_bfd;
1638 struct bfd_link_info *info;
1639 bfd *input_bfd;
1640 asection *input_section;
1641 bfd_byte *contents;
1642 Elf_Internal_Rela *relocs;
1643 Elf_Internal_Sym *local_syms;
1644 asection **local_sections;
1646 Elf_Internal_Shdr *symtab_hdr;
1647 struct elf_link_hash_entry **sym_hashes;
1648 Elf_Internal_Rela *rel;
1649 Elf_Internal_Rela *relend;
1651 if (info->relocatable)
1652 return TRUE;
1654 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1655 sym_hashes = elf_sym_hashes (input_bfd);
1657 /* Reset the list of remembered HI16S relocs to empty. */
1658 free_hi16s = previous_hi16s;
1659 previous_hi16s = NULL;
1660 hi16s_counter = 0;
1662 rel = relocs;
1663 relend = relocs + input_section->reloc_count;
1664 for (; rel < relend; rel++)
1666 int r_type;
1667 reloc_howto_type *howto;
1668 unsigned long r_symndx;
1669 Elf_Internal_Sym *sym;
1670 asection *sec;
1671 struct elf_link_hash_entry *h;
1672 bfd_vma relocation;
1673 bfd_reloc_status_type r;
1675 r_symndx = ELF32_R_SYM (rel->r_info);
1676 r_type = ELF32_R_TYPE (rel->r_info);
1678 if (r_type == R_V850_GNU_VTENTRY
1679 || r_type == R_V850_GNU_VTINHERIT)
1680 continue;
1682 /* This is a final link. */
1683 howto = v850_elf_howto_table + r_type;
1684 h = NULL;
1685 sym = NULL;
1686 sec = NULL;
1687 if (r_symndx < symtab_hdr->sh_info)
1689 sym = local_syms + r_symndx;
1690 sec = local_sections[r_symndx];
1691 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1693 else
1695 bfd_boolean unresolved_reloc, warned;
1697 /* Note - this check is delayed until now as it is possible and valid
1698 to have a file without any symbols but with relocs that can be
1699 processed. */
1700 if (sym_hashes == NULL)
1702 info->callbacks->warning
1703 (info, "no hash table available",
1704 NULL, input_bfd, input_section, (bfd_vma) 0);
1706 return FALSE;
1709 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1710 r_symndx, symtab_hdr, sym_hashes,
1711 h, sec, relocation,
1712 unresolved_reloc, warned);
1715 /* FIXME: We should use the addend, but the COFF relocations don't. */
1716 r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1717 input_section,
1718 contents, rel->r_offset,
1719 relocation, rel->r_addend,
1720 info, sec, h == NULL);
1722 if (r != bfd_reloc_ok)
1724 const char * name;
1725 const char * msg = (const char *)0;
1727 if (h != NULL)
1728 name = h->root.root.string;
1729 else
1731 name = (bfd_elf_string_from_elf_section
1732 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1733 if (name == NULL || *name == '\0')
1734 name = bfd_section_name (input_bfd, sec);
1737 switch (r)
1739 case bfd_reloc_overflow:
1740 if (! ((*info->callbacks->reloc_overflow)
1741 (info, (h ? &h->root : NULL), name, howto->name,
1742 (bfd_vma) 0, input_bfd, input_section,
1743 rel->r_offset)))
1744 return FALSE;
1745 break;
1747 case bfd_reloc_undefined:
1748 if (! ((*info->callbacks->undefined_symbol)
1749 (info, name, input_bfd, input_section,
1750 rel->r_offset, TRUE)))
1751 return FALSE;
1752 break;
1754 case bfd_reloc_outofrange:
1755 msg = _("internal error: out of range error");
1756 goto common_error;
1758 case bfd_reloc_notsupported:
1759 msg = _("internal error: unsupported relocation error");
1760 goto common_error;
1762 case bfd_reloc_dangerous:
1763 msg = _("internal error: dangerous relocation");
1764 goto common_error;
1766 case bfd_reloc_gp_not_found:
1767 msg = _("could not locate special linker symbol __gp");
1768 goto common_error;
1770 case bfd_reloc_ep_not_found:
1771 msg = _("could not locate special linker symbol __ep");
1772 goto common_error;
1774 case bfd_reloc_ctbp_not_found:
1775 msg = _("could not locate special linker symbol __ctbp");
1776 goto common_error;
1778 default:
1779 msg = _("internal error: unknown error");
1780 /* fall through */
1782 common_error:
1783 if (!((*info->callbacks->warning)
1784 (info, msg, name, input_bfd, input_section,
1785 rel->r_offset)))
1786 return FALSE;
1787 break;
1792 return TRUE;
1795 static bfd_boolean
1796 v850_elf_gc_sweep_hook (abfd, info, sec, relocs)
1797 bfd *abfd ATTRIBUTE_UNUSED;
1798 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1799 asection *sec ATTRIBUTE_UNUSED;
1800 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
1802 /* No got and plt entries for v850-elf. */
1803 return TRUE;
1806 static asection *
1807 v850_elf_gc_mark_hook (sec, info, rel, h, sym)
1808 asection *sec;
1809 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1810 Elf_Internal_Rela *rel;
1811 struct elf_link_hash_entry *h;
1812 Elf_Internal_Sym *sym;
1814 if (h != NULL)
1816 switch (ELF32_R_TYPE (rel->r_info))
1818 case R_V850_GNU_VTINHERIT:
1819 case R_V850_GNU_VTENTRY:
1820 break;
1822 default:
1823 switch (h->root.type)
1825 case bfd_link_hash_defined:
1826 case bfd_link_hash_defweak:
1827 return h->root.u.def.section;
1829 case bfd_link_hash_common:
1830 return h->root.u.c.p->section;
1832 default:
1833 break;
1837 else
1838 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1840 return NULL;
1843 /* Set the right machine number. */
1845 static bfd_boolean
1846 v850_elf_object_p (abfd)
1847 bfd *abfd;
1849 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1851 default:
1852 case E_V850_ARCH:
1853 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850);
1854 break;
1855 case E_V850E_ARCH:
1856 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
1857 break;
1858 case E_V850E1_ARCH:
1859 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
1860 break;
1862 return TRUE;
1865 /* Store the machine number in the flags field. */
1867 static void
1868 v850_elf_final_write_processing (abfd, linker)
1869 bfd *abfd;
1870 bfd_boolean linker ATTRIBUTE_UNUSED;
1872 unsigned long val;
1874 switch (bfd_get_mach (abfd))
1876 default:
1877 case bfd_mach_v850: val = E_V850_ARCH; break;
1878 case bfd_mach_v850e: val = E_V850E_ARCH; break;
1879 case bfd_mach_v850e1: val = E_V850E1_ARCH; break;
1882 elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1883 elf_elfheader (abfd)->e_flags |= val;
1886 /* Function to keep V850 specific file flags. */
1888 static bfd_boolean
1889 v850_elf_set_private_flags (abfd, flags)
1890 bfd *abfd;
1891 flagword flags;
1893 BFD_ASSERT (!elf_flags_init (abfd)
1894 || elf_elfheader (abfd)->e_flags == flags);
1896 elf_elfheader (abfd)->e_flags = flags;
1897 elf_flags_init (abfd) = TRUE;
1898 return TRUE;
1901 /* Merge backend specific data from an object file
1902 to the output object file when linking. */
1903 static bfd_boolean
1904 v850_elf_merge_private_bfd_data (ibfd, obfd)
1905 bfd *ibfd;
1906 bfd *obfd;
1908 flagword out_flags;
1909 flagword in_flags;
1911 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1912 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1913 return TRUE;
1915 in_flags = elf_elfheader (ibfd)->e_flags;
1916 out_flags = elf_elfheader (obfd)->e_flags;
1918 if (! elf_flags_init (obfd))
1920 /* If the input is the default architecture then do not
1921 bother setting the flags for the output architecture,
1922 instead allow future merges to do this. If no future
1923 merges ever set these flags then they will retain their
1924 unitialised values, which surprise surprise, correspond
1925 to the default values. */
1926 if (bfd_get_arch_info (ibfd)->the_default)
1927 return TRUE;
1929 elf_flags_init (obfd) = TRUE;
1930 elf_elfheader (obfd)->e_flags = in_flags;
1932 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1933 && bfd_get_arch_info (obfd)->the_default)
1934 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1936 return TRUE;
1939 /* Check flag compatibility. */
1940 if (in_flags == out_flags)
1941 return TRUE;
1943 if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1944 && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1946 /* Allow v850e1 binaries to be linked with v850e binaries.
1947 Set the output binary to v850e. */
1948 if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
1949 && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
1950 return TRUE;
1952 if ((in_flags & EF_V850_ARCH) == E_V850E_ARCH
1953 && (out_flags & EF_V850_ARCH) == E_V850E1_ARCH)
1955 elf_elfheader (obfd)->e_flags =
1956 ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
1957 return TRUE;
1960 _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1961 ibfd);
1964 return TRUE;
1967 /* Display the flags field. */
1969 static bfd_boolean
1970 v850_elf_print_private_bfd_data (abfd, ptr)
1971 bfd *abfd;
1972 PTR ptr;
1974 FILE * file = (FILE *) ptr;
1976 BFD_ASSERT (abfd != NULL && ptr != NULL);
1978 _bfd_elf_print_private_bfd_data (abfd, ptr);
1980 /* xgettext:c-format */
1981 fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1983 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1985 default:
1986 case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1987 case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
1988 case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
1991 fputc ('\n', file);
1993 return TRUE;
1996 /* V850 ELF uses four common sections. One is the usual one, and the
1997 others are for (small) objects in one of the special data areas:
1998 small, tiny and zero. All the objects are kept together, and then
1999 referenced via the gp register, the ep register or the r0 register
2000 respectively, which yields smaller, faster assembler code. This
2001 approach is copied from elf32-mips.c. */
2003 static asection v850_elf_scom_section;
2004 static asymbol v850_elf_scom_symbol;
2005 static asymbol * v850_elf_scom_symbol_ptr;
2006 static asection v850_elf_tcom_section;
2007 static asymbol v850_elf_tcom_symbol;
2008 static asymbol * v850_elf_tcom_symbol_ptr;
2009 static asection v850_elf_zcom_section;
2010 static asymbol v850_elf_zcom_symbol;
2011 static asymbol * v850_elf_zcom_symbol_ptr;
2013 /* Given a BFD section, try to locate the
2014 corresponding ELF section index. */
2016 static bfd_boolean
2017 v850_elf_section_from_bfd_section (abfd, sec, retval)
2018 bfd *abfd ATTRIBUTE_UNUSED;
2019 asection *sec;
2020 int *retval;
2022 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
2023 *retval = SHN_V850_SCOMMON;
2024 else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
2025 *retval = SHN_V850_TCOMMON;
2026 else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
2027 *retval = SHN_V850_ZCOMMON;
2028 else
2029 return FALSE;
2031 return TRUE;
2034 /* Handle the special V850 section numbers that a symbol may use. */
2036 static void
2037 v850_elf_symbol_processing (abfd, asym)
2038 bfd *abfd;
2039 asymbol *asym;
2041 elf_symbol_type * elfsym = (elf_symbol_type *) asym;
2042 unsigned int indx;
2044 indx = elfsym->internal_elf_sym.st_shndx;
2046 /* If the section index is an "ordinary" index, then it may
2047 refer to a v850 specific section created by the assembler.
2048 Check the section's type and change the index it matches.
2050 FIXME: Should we alter the st_shndx field as well ? */
2052 if (indx < elf_numsections (abfd))
2053 switch (elf_elfsections(abfd)[indx]->sh_type)
2055 case SHT_V850_SCOMMON:
2056 indx = SHN_V850_SCOMMON;
2057 break;
2059 case SHT_V850_TCOMMON:
2060 indx = SHN_V850_TCOMMON;
2061 break;
2063 case SHT_V850_ZCOMMON:
2064 indx = SHN_V850_ZCOMMON;
2065 break;
2067 default:
2068 break;
2071 switch (indx)
2073 case SHN_V850_SCOMMON:
2074 if (v850_elf_scom_section.name == NULL)
2076 /* Initialize the small common section. */
2077 v850_elf_scom_section.name = ".scommon";
2078 v850_elf_scom_section.flags = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
2079 v850_elf_scom_section.output_section = & v850_elf_scom_section;
2080 v850_elf_scom_section.symbol = & v850_elf_scom_symbol;
2081 v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
2082 v850_elf_scom_symbol.name = ".scommon";
2083 v850_elf_scom_symbol.flags = BSF_SECTION_SYM;
2084 v850_elf_scom_symbol.section = & v850_elf_scom_section;
2085 v850_elf_scom_symbol_ptr = & v850_elf_scom_symbol;
2087 asym->section = & v850_elf_scom_section;
2088 asym->value = elfsym->internal_elf_sym.st_size;
2089 break;
2091 case SHN_V850_TCOMMON:
2092 if (v850_elf_tcom_section.name == NULL)
2094 /* Initialize the tcommon section. */
2095 v850_elf_tcom_section.name = ".tcommon";
2096 v850_elf_tcom_section.flags = SEC_IS_COMMON;
2097 v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2098 v850_elf_tcom_section.symbol = & v850_elf_tcom_symbol;
2099 v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2100 v850_elf_tcom_symbol.name = ".tcommon";
2101 v850_elf_tcom_symbol.flags = BSF_SECTION_SYM;
2102 v850_elf_tcom_symbol.section = & v850_elf_tcom_section;
2103 v850_elf_tcom_symbol_ptr = & v850_elf_tcom_symbol;
2105 asym->section = & v850_elf_tcom_section;
2106 asym->value = elfsym->internal_elf_sym.st_size;
2107 break;
2109 case SHN_V850_ZCOMMON:
2110 if (v850_elf_zcom_section.name == NULL)
2112 /* Initialize the zcommon section. */
2113 v850_elf_zcom_section.name = ".zcommon";
2114 v850_elf_zcom_section.flags = SEC_IS_COMMON;
2115 v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2116 v850_elf_zcom_section.symbol = & v850_elf_zcom_symbol;
2117 v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2118 v850_elf_zcom_symbol.name = ".zcommon";
2119 v850_elf_zcom_symbol.flags = BSF_SECTION_SYM;
2120 v850_elf_zcom_symbol.section = & v850_elf_zcom_section;
2121 v850_elf_zcom_symbol_ptr = & v850_elf_zcom_symbol;
2123 asym->section = & v850_elf_zcom_section;
2124 asym->value = elfsym->internal_elf_sym.st_size;
2125 break;
2129 /* Hook called by the linker routine which adds symbols from an object
2130 file. We must handle the special v850 section numbers here. */
2132 static bfd_boolean
2133 v850_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2134 bfd *abfd;
2135 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2136 Elf_Internal_Sym *sym;
2137 const char **namep ATTRIBUTE_UNUSED;
2138 flagword *flagsp ATTRIBUTE_UNUSED;
2139 asection **secp;
2140 bfd_vma *valp;
2142 unsigned int indx = sym->st_shndx;
2144 /* If the section index is an "ordinary" index, then it may
2145 refer to a v850 specific section created by the assembler.
2146 Check the section's type and change the index it matches.
2148 FIXME: Should we alter the st_shndx field as well ? */
2150 if (indx < elf_numsections (abfd))
2151 switch (elf_elfsections(abfd)[indx]->sh_type)
2153 case SHT_V850_SCOMMON:
2154 indx = SHN_V850_SCOMMON;
2155 break;
2157 case SHT_V850_TCOMMON:
2158 indx = SHN_V850_TCOMMON;
2159 break;
2161 case SHT_V850_ZCOMMON:
2162 indx = SHN_V850_ZCOMMON;
2163 break;
2165 default:
2166 break;
2169 switch (indx)
2171 case SHN_V850_SCOMMON:
2172 *secp = bfd_make_section_old_way (abfd, ".scommon");
2173 (*secp)->flags |= SEC_IS_COMMON;
2174 *valp = sym->st_size;
2175 break;
2177 case SHN_V850_TCOMMON:
2178 *secp = bfd_make_section_old_way (abfd, ".tcommon");
2179 (*secp)->flags |= SEC_IS_COMMON;
2180 *valp = sym->st_size;
2181 break;
2183 case SHN_V850_ZCOMMON:
2184 *secp = bfd_make_section_old_way (abfd, ".zcommon");
2185 (*secp)->flags |= SEC_IS_COMMON;
2186 *valp = sym->st_size;
2187 break;
2190 return TRUE;
2193 static bfd_boolean
2194 v850_elf_link_output_symbol_hook (info, name, sym, input_sec, h)
2195 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2196 const char *name ATTRIBUTE_UNUSED;
2197 Elf_Internal_Sym *sym;
2198 asection *input_sec;
2199 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED;
2201 /* If we see a common symbol, which implies a relocatable link, then
2202 if a symbol was in a special common section in an input file, mark
2203 it as a special common in the output file. */
2205 if (sym->st_shndx == SHN_COMMON)
2207 if (strcmp (input_sec->name, ".scommon") == 0)
2208 sym->st_shndx = SHN_V850_SCOMMON;
2209 else if (strcmp (input_sec->name, ".tcommon") == 0)
2210 sym->st_shndx = SHN_V850_TCOMMON;
2211 else if (strcmp (input_sec->name, ".zcommon") == 0)
2212 sym->st_shndx = SHN_V850_ZCOMMON;
2215 return TRUE;
2218 static bfd_boolean
2219 v850_elf_section_from_shdr (bfd *abfd,
2220 Elf_Internal_Shdr *hdr,
2221 const char *name,
2222 int shindex)
2224 /* There ought to be a place to keep ELF backend specific flags, but
2225 at the moment there isn't one. We just keep track of the
2226 sections by their name, instead. */
2228 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2229 return FALSE;
2231 switch (hdr->sh_type)
2233 case SHT_V850_SCOMMON:
2234 case SHT_V850_TCOMMON:
2235 case SHT_V850_ZCOMMON:
2236 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2237 (bfd_get_section_flags (abfd,
2238 hdr->bfd_section)
2239 | SEC_IS_COMMON)))
2240 return FALSE;
2243 return TRUE;
2246 /* Set the correct type for a V850 ELF section. We do this
2247 by the section name, which is a hack, but ought to work. */
2249 static bfd_boolean
2250 v850_elf_fake_sections (abfd, hdr, sec)
2251 bfd *abfd ATTRIBUTE_UNUSED;
2252 Elf_Internal_Shdr *hdr;
2253 asection *sec;
2255 register const char * name;
2257 name = bfd_get_section_name (abfd, sec);
2259 if (strcmp (name, ".scommon") == 0)
2261 hdr->sh_type = SHT_V850_SCOMMON;
2263 else if (strcmp (name, ".tcommon") == 0)
2265 hdr->sh_type = SHT_V850_TCOMMON;
2267 else if (strcmp (name, ".zcommon") == 0)
2268 hdr->sh_type = SHT_V850_ZCOMMON;
2270 return TRUE;
2273 /* Delete some bytes from a section while relaxing. */
2275 static bfd_boolean
2276 v850_elf_relax_delete_bytes (abfd, sec, addr, toaddr, count)
2277 bfd *abfd;
2278 asection *sec;
2279 bfd_vma addr;
2280 bfd_vma toaddr;
2281 int count;
2283 Elf_Internal_Shdr *symtab_hdr;
2284 Elf32_External_Sym *extsyms;
2285 Elf32_External_Sym *esym;
2286 Elf32_External_Sym *esymend;
2287 int index;
2288 unsigned int sec_shndx;
2289 bfd_byte *contents;
2290 Elf_Internal_Rela *irel;
2291 Elf_Internal_Rela *irelend;
2292 struct elf_link_hash_entry *sym_hash;
2293 Elf_Internal_Shdr *shndx_hdr;
2294 Elf_External_Sym_Shndx *shndx;
2296 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2297 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2299 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2301 contents = elf_section_data (sec)->this_hdr.contents;
2303 /* The deletion must stop at the next ALIGN reloc for an alignment
2304 power larger than the number of bytes we are deleting. */
2306 /* Actually delete the bytes. */
2307 #if (DEBUG_RELAX & 2)
2308 fprintf (stderr, "relax_delete: contents: sec: %s %p .. %p %x\n",
2309 sec->name, addr, toaddr, count );
2310 #endif
2311 memmove (contents + addr, contents + addr + count,
2312 toaddr - addr - count);
2313 memset (contents + toaddr-count, 0, count);
2315 /* Adjust all the relocs. */
2316 irel = elf_section_data (sec)->relocs;
2317 irelend = irel + sec->reloc_count;
2318 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
2319 shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2321 for (; irel < irelend; irel++)
2323 bfd_vma raddr, paddr, symval;
2324 Elf_Internal_Sym isym;
2326 /* Get the new reloc address. */
2327 raddr = irel->r_offset;
2328 if ((raddr >= (addr + count) && raddr < toaddr))
2329 irel->r_offset -= count;
2331 if (raddr >= addr && raddr < addr + count)
2333 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2334 (int) R_V850_NONE);
2335 continue;
2338 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
2339 continue;
2341 bfd_elf32_swap_symbol_in (abfd,
2342 extsyms + ELF32_R_SYM (irel->r_info),
2343 shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
2344 & isym);
2346 if (isym.st_shndx != sec_shndx)
2347 continue;
2349 /* Get the value of the symbol referred to by the reloc. */
2350 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2352 symval = isym.st_value;
2353 #if (DEBUG_RELAX & 2)
2355 char * name = bfd_elf_string_from_elf_section
2356 (abfd, symtab_hdr->sh_link, isym.st_name);
2357 fprintf (stderr,
2358 "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2359 sec->name, name, isym.st_name,
2360 sec->output_section->vma, sec->output_offset,
2361 isym.st_value, irel->r_addend);
2363 #endif
2365 else
2367 unsigned long indx;
2368 struct elf_link_hash_entry * h;
2370 /* An external symbol. */
2371 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2373 h = elf_sym_hashes (abfd) [indx];
2374 BFD_ASSERT (h != NULL);
2376 symval = h->root.u.def.value;
2377 #if (DEBUG_RELAX & 2)
2378 fprintf (stderr,
2379 "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2380 sec->name, h->root.root.string, h->root.u.def.value,
2381 sec->output_section->vma, sec->output_offset, irel->r_addend);
2382 #endif
2385 paddr = symval + irel->r_addend;
2387 if ( (symval >= addr + count && symval < toaddr)
2388 && (paddr < addr + count || paddr >= toaddr))
2389 irel->r_addend += count;
2390 else if ( (symval < addr + count || symval >= toaddr)
2391 && (paddr >= addr + count && paddr < toaddr))
2392 irel->r_addend -= count;
2395 /* Adjust the local symbols defined in this section. */
2396 esym = extsyms;
2397 esymend = esym + symtab_hdr->sh_info;
2399 for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
2401 Elf_Internal_Sym isym;
2403 bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2405 if (isym.st_shndx == sec_shndx
2406 && isym.st_value >= addr + count
2407 && isym.st_value < toaddr)
2409 isym.st_value -= count;
2411 if (isym.st_value + isym.st_size >= toaddr)
2412 isym.st_size += count;
2414 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2416 else if (isym.st_shndx == sec_shndx
2417 && isym.st_value < addr + count)
2419 if (isym.st_value+isym.st_size >= addr + count
2420 && isym.st_value+isym.st_size < toaddr)
2421 isym.st_size -= count;
2423 if (isym.st_value >= addr
2424 && isym.st_value < addr + count)
2425 isym.st_value = addr;
2427 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2431 /* Now adjust the global symbols defined in this section. */
2432 esym = extsyms + symtab_hdr->sh_info;
2433 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2435 for (index = 0; esym < esymend; esym ++, index ++)
2437 Elf_Internal_Sym isym;
2439 bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2440 sym_hash = elf_sym_hashes (abfd) [index];
2442 if (isym.st_shndx == sec_shndx
2443 && ((sym_hash)->root.type == bfd_link_hash_defined
2444 || (sym_hash)->root.type == bfd_link_hash_defweak)
2445 && (sym_hash)->root.u.def.section == sec
2446 && (sym_hash)->root.u.def.value >= addr + count
2447 && (sym_hash)->root.u.def.value < toaddr)
2449 if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
2451 isym.st_size += count;
2452 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2455 (sym_hash)->root.u.def.value -= count;
2457 else if (isym.st_shndx == sec_shndx
2458 && ((sym_hash)->root.type == bfd_link_hash_defined
2459 || (sym_hash)->root.type == bfd_link_hash_defweak)
2460 && (sym_hash)->root.u.def.section == sec
2461 && (sym_hash)->root.u.def.value < addr + count)
2463 if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
2464 && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
2465 isym.st_size -= count;
2467 if ((sym_hash)->root.u.def.value >= addr
2468 && (sym_hash)->root.u.def.value < addr + count)
2469 (sym_hash)->root.u.def.value = addr;
2471 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2474 if (shndx)
2475 ++ shndx;
2478 return TRUE;
2481 #define NOP_OPCODE (0x0000)
2482 #define MOVHI 0x0640 /* 4byte */
2483 #define MOVHI_MASK 0x07e0
2484 #define MOVHI_R1(insn) ((insn) & 0x1f) /* 4byte */
2485 #define MOVHI_R2(insn) ((insn) >> 11)
2486 #define MOVEA 0x0620 /* 2byte */
2487 #define MOVEA_MASK 0x07e0
2488 #define MOVEA_R1(insn) ((insn) & 0x1f)
2489 #define MOVEA_R2(insn) ((insn) >> 11)
2490 #define JARL_4 0x00040780 /* 4byte */
2491 #define JARL_4_MASK 0xFFFF07FF
2492 #define JARL_R2(insn) (int)(((insn) & (~JARL_4_MASK)) >> 11)
2493 #define ADD_I 0x0240 /* 2byte */
2494 #define ADD_I_MASK 0x07e0
2495 #define ADD_I5(insn) ((((insn) & 0x001f) << 11) >> 11) /* 2byte */
2496 #define ADD_R2(insn) ((insn) >> 11)
2497 #define JMP_R 0x0060 /* 2byte */
2498 #define JMP_R_MASK 0xFFE0
2499 #define JMP_R1(insn) ((insn) & 0x1f)
2501 static bfd_boolean
2502 v850_elf_relax_section (abfd, sec, link_info, again)
2503 bfd *abfd;
2504 asection *sec;
2505 struct bfd_link_info *link_info;
2506 bfd_boolean *again;
2508 Elf_Internal_Shdr *symtab_hdr;
2509 Elf_Internal_Rela *internal_relocs;
2510 Elf_Internal_Rela *irel;
2511 Elf_Internal_Rela *irelend;
2512 Elf_Internal_Rela *irelalign = NULL;
2513 Elf_Internal_Sym *isymbuf = NULL;
2514 bfd_byte *contents = NULL;
2515 bfd_vma addr = 0;
2516 bfd_vma toaddr;
2517 int align_pad_size = 0;
2518 bfd_boolean result = TRUE;
2520 *again = FALSE;
2522 if (link_info->relocatable
2523 || (sec->flags & SEC_RELOC) == 0
2524 || sec->reloc_count == 0)
2525 return TRUE;
2527 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2529 internal_relocs = (_bfd_elf_link_read_relocs
2530 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
2531 link_info->keep_memory));
2532 if (internal_relocs == NULL)
2533 goto error_return;
2535 irelend = internal_relocs + sec->reloc_count;
2537 while (addr < sec->size)
2539 toaddr = sec->size;
2541 for (irel = internal_relocs; irel < irelend; irel ++)
2542 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2543 && irel->r_offset > addr
2544 && irel->r_offset < toaddr)
2545 toaddr = irel->r_offset;
2547 #ifdef DEBUG_RELAX
2548 fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
2549 addr, toaddr, align_pad_size);
2550 #endif
2551 if (irelalign)
2553 bfd_vma alignto;
2554 bfd_vma alignmoveto;
2556 alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
2557 alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
2559 if (alignmoveto < alignto)
2561 unsigned int i;
2563 align_pad_size = alignto - alignmoveto;
2564 #ifdef DEBUG_RELAX
2565 fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2566 alignmoveto, toaddr, align_pad_size);
2567 #endif
2568 if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
2569 toaddr, align_pad_size))
2570 goto error_return;
2572 for (i = BFD_ALIGN (toaddr - align_pad_size, 1);
2573 (i + 1) < toaddr; i += 2)
2574 bfd_put_16 (abfd, NOP_OPCODE, contents + i);
2576 addr = alignmoveto;
2578 else
2579 align_pad_size = 0;
2582 for (irel = internal_relocs; irel < irelend; irel++)
2584 bfd_vma laddr;
2585 bfd_vma addend;
2586 bfd_vma symval;
2587 int insn[5];
2588 int no_match = -1;
2589 Elf_Internal_Rela *hi_irelfn;
2590 Elf_Internal_Rela *lo_irelfn;
2591 Elf_Internal_Rela *irelcall;
2592 bfd_signed_vma foff;
2594 if (! (irel->r_offset >= addr && irel->r_offset < toaddr
2595 && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
2596 || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
2597 continue;
2599 #ifdef DEBUG_RELAX
2600 fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
2601 irel->r_info,
2602 irel->r_offset,
2603 irel->r_addend );
2604 #endif
2606 /* Get the section contents. */
2607 if (contents == NULL)
2609 if (elf_section_data (sec)->this_hdr.contents != NULL)
2610 contents = elf_section_data (sec)->this_hdr.contents;
2611 else
2613 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2614 goto error_return;
2618 /* Read this BFD's local symbols if we haven't done so already. */
2619 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2621 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2622 if (isymbuf == NULL)
2623 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2624 symtab_hdr->sh_info, 0,
2625 NULL, NULL, NULL);
2626 if (isymbuf == NULL)
2627 goto error_return;
2630 laddr = irel->r_offset;
2632 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
2634 /* Check code for -mlong-calls output. */
2635 if (laddr + 16 <= (bfd_vma) sec->size)
2637 insn[0] = bfd_get_16 (abfd, contents + laddr);
2638 insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2639 insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
2640 insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
2641 insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
2643 if ((insn[0] & MOVHI_MASK) != MOVHI
2644 || MOVHI_R1 (insn[0]) != 0)
2645 no_match = 0;
2647 if (no_match < 0
2648 && ((insn[1] & MOVEA_MASK) != MOVEA
2649 || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2650 no_match = 1;
2652 if (no_match < 0
2653 && (insn[2] & JARL_4_MASK) != JARL_4)
2654 no_match = 2;
2656 if (no_match < 0
2657 && ((insn[3] & ADD_I_MASK) != ADD_I
2658 || ADD_I5 (insn[3]) != 4
2659 || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
2660 no_match = 3;
2662 if (no_match < 0
2663 && ((insn[4] & JMP_R_MASK) != JMP_R
2664 || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
2665 no_match = 4;
2667 else
2669 ((*_bfd_error_handler)
2670 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
2671 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2673 continue;
2676 if (no_match >= 0)
2678 ((*_bfd_error_handler)
2679 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
2680 bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2682 continue;
2685 /* Get the reloc for the address from which the register is
2686 being loaded. This reloc will tell us which function is
2687 actually being called. */
2688 for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2689 if (hi_irelfn->r_offset == laddr + 2
2690 && ELF32_R_TYPE (hi_irelfn->r_info)
2691 == (int) R_V850_HI16_S)
2692 break;
2694 for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2695 if (lo_irelfn->r_offset == laddr + 6
2696 && ELF32_R_TYPE (lo_irelfn->r_info)
2697 == (int) R_V850_LO16)
2698 break;
2700 for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
2701 if (irelcall->r_offset == laddr + 8
2702 && ELF32_R_TYPE (irelcall->r_info)
2703 == (int) R_V850_22_PCREL)
2704 break;
2706 if ( hi_irelfn == irelend
2707 || lo_irelfn == irelend
2708 || irelcall == irelend)
2710 ((*_bfd_error_handler)
2711 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
2712 bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2714 continue;
2717 if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
2719 Elf_Internal_Sym * isym;
2721 /* A local symbol. */
2722 isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
2724 symval = isym->st_value;
2726 else
2728 unsigned long indx;
2729 struct elf_link_hash_entry * h;
2731 /* An external symbol. */
2732 indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
2733 h = elf_sym_hashes (abfd)[indx];
2734 BFD_ASSERT (h != NULL);
2736 if ( h->root.type != bfd_link_hash_defined
2737 && h->root.type != bfd_link_hash_defweak)
2738 /* This appears to be a reference to an undefined
2739 symbol. Just ignore it--it will be caught by the
2740 regular reloc processing. */
2741 continue;
2743 symval = h->root.u.def.value;
2746 if (symval + irelcall->r_addend != irelcall->r_offset + 4)
2748 ((*_bfd_error_handler)
2749 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
2750 bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
2752 continue;
2755 /* Get the value of the symbol referred to by the reloc. */
2756 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2758 Elf_Internal_Sym *isym;
2759 asection *sym_sec;
2761 /* A local symbol. */
2762 isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2764 if (isym->st_shndx == SHN_UNDEF)
2765 sym_sec = bfd_und_section_ptr;
2766 else if (isym->st_shndx == SHN_ABS)
2767 sym_sec = bfd_abs_section_ptr;
2768 else if (isym->st_shndx == SHN_COMMON)
2769 sym_sec = bfd_com_section_ptr;
2770 else
2771 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2772 symval = (isym->st_value
2773 + sym_sec->output_section->vma
2774 + sym_sec->output_offset);
2776 else
2778 unsigned long indx;
2779 struct elf_link_hash_entry *h;
2781 /* An external symbol. */
2782 indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
2783 h = elf_sym_hashes (abfd)[indx];
2784 BFD_ASSERT (h != NULL);
2786 if ( h->root.type != bfd_link_hash_defined
2787 && h->root.type != bfd_link_hash_defweak)
2788 /* This appears to be a reference to an undefined
2789 symbol. Just ignore it--it will be caught by the
2790 regular reloc processing. */
2791 continue;
2793 symval = (h->root.u.def.value
2794 + h->root.u.def.section->output_section->vma
2795 + h->root.u.def.section->output_offset);
2798 addend = irel->r_addend;
2800 foff = (symval + addend
2801 - (irel->r_offset
2802 + sec->output_section->vma
2803 + sec->output_offset
2804 + 4));
2805 #ifdef DEBUG_RELAX
2806 fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2807 irel->r_offset,
2808 (irel->r_offset
2809 + sec->output_section->vma
2810 + sec->output_offset),
2811 symval, addend, foff);
2812 #endif
2814 if (foff < -0x100000 || foff >= 0x100000)
2815 /* After all that work, we can't shorten this function call. */
2816 continue;
2818 /* For simplicity of coding, we are going to modify the section
2819 contents, the section relocs, and the BFD symbol table. We
2820 must tell the rest of the code not to free up this
2821 information. It would be possible to instead create a table
2822 of changes which have to be made, as is done in coff-mips.c;
2823 that would be more work, but would require less memory when
2824 the linker is run. */
2825 elf_section_data (sec)->relocs = internal_relocs;
2826 elf_section_data (sec)->this_hdr.contents = contents;
2827 symtab_hdr->contents = (bfd_byte *) isymbuf;
2829 /* Replace the long call with a jarl. */
2830 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
2832 addend = 0;
2834 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2835 /* If this needs to be changed because of future relaxing,
2836 it will be handled here like other internal IND12W
2837 relocs. */
2838 bfd_put_32 (abfd,
2839 0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
2840 contents + irel->r_offset);
2841 else
2842 /* We can't fully resolve this yet, because the external
2843 symbol value may be changed by future relaxing.
2844 We let the final link phase handle it. */
2845 bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
2846 contents + irel->r_offset);
2848 hi_irelfn->r_info =
2849 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2850 lo_irelfn->r_info =
2851 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2852 irelcall->r_info =
2853 ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
2855 if (! v850_elf_relax_delete_bytes (abfd, sec,
2856 irel->r_offset + 4, toaddr, 12))
2857 goto error_return;
2859 align_pad_size += 12;
2861 else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
2863 /* Check code for -mlong-jumps output. */
2864 if (laddr + 10 <= (bfd_vma) sec->size)
2866 insn[0] = bfd_get_16 (abfd, contents + laddr);
2867 insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2868 insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
2870 if ((insn[0] & MOVHI_MASK) != MOVHI
2871 || MOVHI_R1 (insn[0]) != 0)
2872 no_match = 0;
2874 if (no_match < 0
2875 && ((insn[1] & MOVEA_MASK) != MOVEA
2876 || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2877 no_match = 1;
2879 if (no_match < 0
2880 && ((insn[2] & JMP_R_MASK) != JMP_R
2881 || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
2882 no_match = 4;
2884 else
2886 ((*_bfd_error_handler)
2887 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
2888 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2890 continue;
2893 if (no_match >= 0)
2895 ((*_bfd_error_handler)
2896 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
2897 bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2899 continue;
2902 /* Get the reloc for the address from which the register is
2903 being loaded. This reloc will tell us which function is
2904 actually being called. */
2905 for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2906 if (hi_irelfn->r_offset == laddr + 2
2907 && ELF32_R_TYPE (hi_irelfn->r_info) == (int) R_V850_HI16_S)
2908 break;
2910 for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2911 if (lo_irelfn->r_offset == laddr + 6
2912 && ELF32_R_TYPE (lo_irelfn->r_info) == (int) R_V850_LO16)
2913 break;
2915 if ( hi_irelfn == irelend
2916 || lo_irelfn == irelend)
2918 ((*_bfd_error_handler)
2919 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
2920 bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2922 continue;
2925 /* Get the value of the symbol referred to by the reloc. */
2926 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2928 Elf_Internal_Sym * isym;
2929 asection * sym_sec;
2931 /* A local symbol. */
2932 isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2934 if (isym->st_shndx == SHN_UNDEF)
2935 sym_sec = bfd_und_section_ptr;
2936 else if (isym->st_shndx == SHN_ABS)
2937 sym_sec = bfd_abs_section_ptr;
2938 else if (isym->st_shndx == SHN_COMMON)
2939 sym_sec = bfd_com_section_ptr;
2940 else
2941 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2942 symval = (isym->st_value
2943 + sym_sec->output_section->vma
2944 + sym_sec->output_offset);
2945 #ifdef DEBUG_RELAX
2947 char * name = bfd_elf_string_from_elf_section
2948 (abfd, symtab_hdr->sh_link, isym->st_name);
2950 fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2951 sym_sec->name, name, isym->st_name,
2952 sym_sec->output_section->vma,
2953 sym_sec->output_offset,
2954 isym->st_value, irel->r_addend);
2956 #endif
2958 else
2960 unsigned long indx;
2961 struct elf_link_hash_entry * h;
2963 /* An external symbol. */
2964 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2965 h = elf_sym_hashes (abfd)[indx];
2966 BFD_ASSERT (h != NULL);
2968 if ( h->root.type != bfd_link_hash_defined
2969 && h->root.type != bfd_link_hash_defweak)
2970 /* This appears to be a reference to an undefined
2971 symbol. Just ignore it--it will be caught by the
2972 regular reloc processing. */
2973 continue;
2975 symval = (h->root.u.def.value
2976 + h->root.u.def.section->output_section->vma
2977 + h->root.u.def.section->output_offset);
2978 #ifdef DEBUG_RELAX
2979 fprintf (stderr,
2980 "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2981 sec->name, h->root.root.string, h->root.u.def.value,
2982 sec->output_section->vma, sec->output_offset, irel->r_addend);
2983 #endif
2986 addend = irel->r_addend;
2988 foff = (symval + addend
2989 - (irel->r_offset
2990 + sec->output_section->vma
2991 + sec->output_offset
2992 + 4));
2993 #ifdef DEBUG_RELAX
2994 fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2995 irel->r_offset,
2996 (irel->r_offset
2997 + sec->output_section->vma
2998 + sec->output_offset),
2999 symval, addend, foff);
3000 #endif
3001 if (foff < -0x100000 || foff >= 0x100000)
3002 /* After all that work, we can't shorten this function call. */
3003 continue;
3005 /* For simplicity of coding, we are going to modify the section
3006 contents, the section relocs, and the BFD symbol table. We
3007 must tell the rest of the code not to free up this
3008 information. It would be possible to instead create a table
3009 of changes which have to be made, as is done in coff-mips.c;
3010 that would be more work, but would require less memory when
3011 the linker is run. */
3012 elf_section_data (sec)->relocs = internal_relocs;
3013 elf_section_data (sec)->this_hdr.contents = contents;
3014 symtab_hdr->contents = (bfd_byte *) isymbuf;
3016 if (foff < -0x100 || foff >= 0x100)
3018 /* Replace the long jump with a jr. */
3020 irel->r_info =
3021 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
3023 irel->r_addend = addend;
3024 addend = 0;
3026 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3027 /* If this needs to be changed because of future relaxing,
3028 it will be handled here like other internal IND12W
3029 relocs. */
3030 bfd_put_32 (abfd,
3031 0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
3032 contents + irel->r_offset);
3033 else
3034 /* We can't fully resolve this yet, because the external
3035 symbol value may be changed by future relaxing.
3036 We let the final link phase handle it. */
3037 bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
3039 hi_irelfn->r_info =
3040 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
3041 lo_irelfn->r_info =
3042 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
3043 if (!v850_elf_relax_delete_bytes (abfd, sec,
3044 irel->r_offset + 4, toaddr, 6))
3045 goto error_return;
3047 align_pad_size += 6;
3049 else
3051 /* Replace the long jump with a br. */
3053 irel->r_info =
3054 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
3056 irel->r_addend = addend;
3057 addend = 0;
3059 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
3060 /* If this needs to be changed because of future relaxing,
3061 it will be handled here like other internal IND12W
3062 relocs. */
3063 bfd_put_16 (abfd,
3064 0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
3065 contents + irel->r_offset);
3066 else
3067 /* We can't fully resolve this yet, because the external
3068 symbol value may be changed by future relaxing.
3069 We let the final link phase handle it. */
3070 bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
3072 hi_irelfn->r_info =
3073 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
3074 lo_irelfn->r_info =
3075 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
3076 if (!v850_elf_relax_delete_bytes (abfd, sec,
3077 irel->r_offset + 2, toaddr, 8))
3078 goto error_return;
3080 align_pad_size += 8;
3085 irelalign = NULL;
3086 for (irel = internal_relocs; irel < irelend; irel++)
3088 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
3089 && irel->r_offset == toaddr)
3091 irel->r_offset -= align_pad_size;
3093 if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
3094 irelalign = irel;
3098 addr = toaddr;
3101 if (!irelalign)
3103 #ifdef DEBUG_RELAX
3104 fprintf (stderr, "relax pad %d shorten %d -> %d\n",
3105 align_pad_size,
3106 sec->size,
3107 sec->size - align_pad_size);
3108 #endif
3109 sec->size -= align_pad_size;
3112 finish:
3113 if (internal_relocs != NULL
3114 && elf_section_data (sec)->relocs != internal_relocs)
3115 free (internal_relocs);
3117 if (contents != NULL
3118 && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
3119 free (contents);
3121 if (isymbuf != NULL
3122 && symtab_hdr->contents != (bfd_byte *) isymbuf)
3123 free (isymbuf);
3125 return result;
3127 error_return:
3128 result = FALSE;
3129 goto finish;
3132 static struct bfd_elf_special_section const
3133 v850_special_sections_c[]=
3135 { ".call_table_data", 16, 0, SHT_PROGBITS, (SHF_ALLOC
3136 + SHF_WRITE) },
3137 { ".call_table_text", 16, 0, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3138 + SHF_EXECINSTR) },
3139 { NULL, 0, 0, 0, 0 }
3142 static struct bfd_elf_special_section const
3143 v850_special_sections_r[]=
3145 { ".rosdata", 8, -2, SHT_PROGBITS, (SHF_ALLOC
3146 + SHF_V850_GPREL) },
3147 { ".rozdata", 8, -2, SHT_PROGBITS, (SHF_ALLOC
3148 + SHF_V850_R0REL) },
3149 { NULL, 0, 0, 0, 0 }
3152 static struct bfd_elf_special_section const
3153 v850_special_sections_s[]=
3155 { ".sdata", 6, -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3156 + SHF_V850_GPREL) },
3157 { ".sbss", 5, -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3158 + SHF_V850_GPREL) },
3159 { ".scommon", 8, -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
3160 + SHF_V850_GPREL) },
3161 { NULL, 0, 0, 0, 0 }
3164 static struct bfd_elf_special_section const
3165 v850_special_sections_t[]=
3167 { ".tdata", 6, -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3168 + SHF_V850_EPREL) },
3169 { ".tbss", 5, -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3170 + SHF_V850_EPREL) },
3171 { ".tcommon", 8, -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
3172 + SHF_V850_R0REL) },
3173 { NULL, 0, 0, 0, 0 }
3176 static struct bfd_elf_special_section const
3177 v850_special_sections_z[]=
3179 { ".zdata", 6, -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3180 + SHF_V850_R0REL) },
3181 { ".zbss", 5, -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3182 + SHF_V850_R0REL) },
3183 { ".zcommon", 8, -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
3184 + SHF_V850_R0REL) },
3185 { NULL, 0, 0, 0, 0 }
3188 static struct bfd_elf_special_section const *
3189 v850_elf_special_sections[27] =
3191 NULL, /* 'a' */
3192 NULL, /* 'b' */
3193 v850_special_sections_c, /* 'c' */
3194 NULL, /* 'd' */
3195 NULL, /* 'e' */
3196 NULL, /* 'f' */
3197 NULL, /* 'g' */
3198 NULL, /* 'h' */
3199 NULL, /* 'i' */
3200 NULL, /* 'j' */
3201 NULL, /* 'k' */
3202 NULL, /* 'l' */
3203 NULL, /* 'm' */
3204 NULL, /* 'n' */
3205 NULL, /* 'o' */
3206 NULL, /* 'p' */
3207 NULL, /* 'q' */
3208 v850_special_sections_r, /* 'r' */
3209 v850_special_sections_s, /* 's' */
3210 v850_special_sections_t, /* 't' */
3211 NULL, /* 'u' */
3212 NULL, /* 'v' */
3213 NULL, /* 'w' */
3214 NULL, /* 'x' */
3215 NULL, /* 'y' */
3216 v850_special_sections_z, /* 'z' */
3217 NULL /* other */
3220 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
3221 #define TARGET_LITTLE_NAME "elf32-v850"
3222 #define ELF_ARCH bfd_arch_v850
3223 #define ELF_MACHINE_CODE EM_V850
3224 #define ELF_MACHINE_ALT1 EM_CYGNUS_V850
3225 #define ELF_MACHINE_ALT2 EM_V800 /* This is the value used by the GreenHills toolchain. */
3226 #define ELF_MAXPAGESIZE 0x1000
3228 #define elf_info_to_howto v850_elf_info_to_howto_rela
3229 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
3231 #define elf_backend_check_relocs v850_elf_check_relocs
3232 #define elf_backend_relocate_section v850_elf_relocate_section
3233 #define elf_backend_object_p v850_elf_object_p
3234 #define elf_backend_final_write_processing v850_elf_final_write_processing
3235 #define elf_backend_section_from_bfd_section v850_elf_section_from_bfd_section
3236 #define elf_backend_symbol_processing v850_elf_symbol_processing
3237 #define elf_backend_add_symbol_hook v850_elf_add_symbol_hook
3238 #define elf_backend_link_output_symbol_hook v850_elf_link_output_symbol_hook
3239 #define elf_backend_section_from_shdr v850_elf_section_from_shdr
3240 #define elf_backend_fake_sections v850_elf_fake_sections
3241 #define elf_backend_gc_mark_hook v850_elf_gc_mark_hook
3242 #define elf_backend_gc_sweep_hook v850_elf_gc_sweep_hook
3243 #define elf_backend_special_sections v850_elf_special_sections
3245 #define elf_backend_can_gc_sections 1
3246 #define elf_backend_rela_normal 1
3248 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
3249 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
3250 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
3251 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
3252 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
3253 #define bfd_elf32_bfd_relax_section v850_elf_relax_section
3255 #define elf_symbol_leading_char '_'
3257 #include "elf32-target.h"