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. */
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
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
*,
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 */
102 2, /* size (0 = byte, 1 = short, 2 = long) */
104 FALSE
, /* pc_relative */
106 complain_overflow_bitfield
, /* complain_on_overflow */
107 bfd_elf_generic_reloc
, /* special_function */
108 "R_V850_NONE", /* name */
109 FALSE
, /* partial_inplace */
112 FALSE
), /* pcrel_offset */
114 /* A PC relative 9 bit branch. */
115 HOWTO (R_V850_9_PCREL
, /* type */
117 2, /* size (0 = byte, 1 = short, 2 = long) */
119 TRUE
, /* pc_relative */
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 */
132 2, /* size (0 = byte, 1 = short, 2 = long) */
134 TRUE
, /* pc_relative */
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 */
147 1, /* size (0 = byte, 1 = short, 2 = long) */
149 FALSE
, /* pc_relative */
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 */
162 1, /* size (0 = byte, 1 = short, 2 = long) */
164 FALSE
, /* pc_relative */
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 */
177 1, /* size (0 = byte, 1 = short, 2 = long) */
179 FALSE
, /* pc_relative */
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 */
192 2, /* size (0 = byte, 1 = short, 2 = long) */
194 FALSE
, /* pc_relative */
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 */
207 1, /* size (0 = byte, 1 = short, 2 = long) */
209 FALSE
, /* pc_relative */
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 */
222 0, /* size (0 = byte, 1 = short, 2 = long) */
224 FALSE
, /* pc_relative */
226 complain_overflow_dont
, /* complain_on_overflow */
227 bfd_elf_generic_reloc
, /* special_function */
228 "R_V850_8", /* name */
229 FALSE
, /* partial_inplace */
232 FALSE
), /* pcrel_offset */
234 /* 16 bit offset from the short data area pointer. */
235 HOWTO (R_V850_SDA_16_16_OFFSET
, /* type */
237 1, /* size (0 = byte, 1 = short, 2 = long) */
239 FALSE
, /* pc_relative */
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 */
252 1, /* size (0 = byte, 1 = short, 2 = long) */
254 FALSE
, /* pc_relative */
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 */
267 1, /* size (0 = byte, 1 = short, 2 = long) */
269 FALSE
, /* pc_relative */
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 */
282 1, /* size (0 = byte, 1 = short, 2 = long) */
284 FALSE
, /* pc_relative */
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 */
297 1, /* size (0 = byte, 1 = short, 2 = long) */
299 FALSE
, /* pc_relative */
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 */
307 FALSE
), /* pcrel_offset */
309 /* 8 bit offset from the tiny data area pointer. */
310 HOWTO (R_V850_TDA_7_8_OFFSET
, /* type */
312 1, /* size (0 = byte, 1 = short, 2 = long) */
314 FALSE
, /* pc_relative */
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 */
322 FALSE
), /* pcrel_offset */
324 /* 7 bit offset from the tiny data area pointer. */
325 HOWTO (R_V850_TDA_7_7_OFFSET
, /* type */
327 1, /* size (0 = byte, 1 = short, 2 = long) */
329 FALSE
, /* pc_relative */
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 */
337 FALSE
), /* pcrel_offset */
339 /* 16 bit offset from the tiny data area pointer! */
340 HOWTO (R_V850_TDA_16_16_OFFSET
, /* type */
342 1, /* size (0 = byte, 1 = short, 2 = long) */
344 FALSE
, /* pc_relative */
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 */
357 1, /* size (0 = byte, 1 = short, 2 = long) */
359 FALSE
, /* pc_relative */
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 */
367 FALSE
), /* pcrel_offset */
369 /* 4 bit offset from the tiny data area pointer. */
370 HOWTO (R_V850_TDA_4_4_OFFSET
, /* type */
372 1, /* size (0 = byte, 1 = short, 2 = long) */
374 FALSE
, /* pc_relative */
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 */
382 FALSE
), /* pcrel_offset */
384 /* 16 bit offset from the short data area pointer. */
385 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET
, /* type */
387 2, /* size (0 = byte, 1 = short, 2 = long) */
389 FALSE
, /* pc_relative */
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 */
402 2, /* size (0 = byte, 1 = short, 2 = long) */
404 FALSE
, /* pc_relative */
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 */
417 1, /* size (0 = byte, 1 = short, 2 = long) */
419 FALSE
, /* pc_relative */
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 */
427 FALSE
), /* pcrel_offset */
429 /* 16 bit offset from the call table base pointer. */
430 HOWTO (R_V850_CALLT_16_16_OFFSET
, /* type */
432 1, /* size (0 = byte, 1 = short, 2 = long) */
434 FALSE
, /* pc_relative */
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 */
447 2, /* size (0 = byte, 1 = short, 2 = long) */
449 FALSE
, /* pc_relative */
451 complain_overflow_dont
, /* complain_on_overflow */
452 NULL
, /* special_function */
453 "R_V850_GNU_VTINHERIT", /* name */
454 FALSE
, /* partial_inplace */
457 FALSE
), /* pcrel_offset */
459 /* GNU extension to record C++ vtable member usage */
460 HOWTO (R_V850_GNU_VTENTRY
, /* type */
462 2, /* size (0 = byte, 1 = short, 2 = long) */
464 FALSE
, /* pc_relative */
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 */
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 */
478 2, /* size (0 = byte, 1 = short, 2 = long) */
480 TRUE
, /* pc_relative */
482 complain_overflow_signed
, /* complain_on_overflow */
483 v850_elf_ignore_reloc
, /* special_function */
484 "R_V850_LONGCALL", /* name */
485 FALSE
, /* partial_inplace */
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 */
494 2, /* size (0 = byte, 1 = short, 2 = long) */
496 TRUE
, /* pc_relative */
498 complain_overflow_signed
, /* complain_on_overflow */
499 v850_elf_ignore_reloc
, /* special_function */
500 "R_V850_LONGJUMP", /* name */
501 FALSE
, /* partial_inplace */
504 TRUE
), /* pcrel_offset */
506 HOWTO (R_V850_ALIGN
, /* type */
508 1, /* size (0 = byte, 1 = short, 2 = long) */
510 FALSE
, /* pc_relative */
512 complain_overflow_unsigned
, /* complain_on_overflow */
513 v850_elf_ignore_reloc
, /* special_function */
514 "R_V850_ALIGN", /* name */
515 FALSE
, /* partial_inplace */
518 TRUE
), /* pcrel_offset */
520 /* Simple pc-relative 32bit reloc. */
521 HOWTO (R_V850_REL32
, /* type */
523 2, /* size (0 = byte, 1 = short, 2 = long) */
525 TRUE
, /* pc_relative */
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 */
538 2, /* size (0 = byte, 1 = short, 2 = long) */
540 FALSE
, /* pc_relative */
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
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
;
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
;
618 /* Set the howto pointer for an V850 ELF reloc. */
621 v850_elf_info_to_howto_rel (abfd
, cache_ptr
, dst
)
622 bfd
*abfd ATTRIBUTE_UNUSED
;
624 Elf_Internal_Rela
*dst
;
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). */
635 v850_elf_info_to_howto_rela (abfd
, cache_ptr
, dst
)
636 bfd
*abfd ATTRIBUTE_UNUSED
;
638 Elf_Internal_Rela
*dst
;
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
652 v850_elf_check_relocs (abfd
, info
, sec
, relocs
)
654 struct bfd_link_info
*info
;
656 const Elf_Internal_Rela
*relocs
;
658 bfd_boolean ret
= TRUE
;
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
;
665 enum v850_reloc_type r_type
;
667 const char *common
= (const char *)0;
669 if (info
->relocatable
)
673 _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
677 dynobj
= elf_hash_table (info
)->dynobj
;
678 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
679 sym_hashes
= elf_sym_hashes (abfd
);
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
)
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
);
705 case R_V850_22_PCREL
:
709 case R_V850_LO16_SPLIT_OFFSET
:
714 case R_V850_CALLT_6_7_OFFSET
:
715 case R_V850_CALLT_16_16_OFFSET
:
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
))
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
))
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
;
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
;
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
;
756 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
761 /* Flag which type of relocation was used. */
763 if ((h
->other
& V850_OTHER_MASK
) != (other
& V850_OTHER_MASK
)
764 && (h
->other
& V850_OTHER_ERROR
) == 0)
767 static char buff
[200]; /* XXX */
769 switch (h
->other
& V850_OTHER_MASK
)
772 msg
= _("Variable `%s' cannot occupy in multiple small data regions");
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");
777 case V850_OTHER_SDA
| V850_OTHER_ZDA
:
778 msg
= _("Variable `%s' cannot be in both small and zero data regions simultaneously");
780 case V850_OTHER_SDA
| V850_OTHER_TDA
:
781 msg
= _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
783 case V850_OTHER_ZDA
| V850_OTHER_TDA
:
784 msg
= _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
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
,
793 bfd_set_error (bfd_error_bad_value
);
794 h
->other
|= V850_OTHER_ERROR
;
799 if (h
&& h
->root
.type
== bfd_link_hash_common
801 && !strcmp (bfd_get_section_name (abfd
, h
->root
.u
.c
.p
->section
), "COMMON"))
805 section
= h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
, common
);
806 section
->flags
|= SEC_IS_COMMON
;
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" : "");
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
839 unsigned long counter
;
841 struct hi16s_location
*next
;
845 static hi16s_location
*previous_hi16s
;
846 static hi16s_location
*free_hi16s
;
847 static unsigned long hi16s_counter
;
850 remember_hi16s_reloc (abfd
, addend
, 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
);
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;
886 find_remembered_hi16s_reloc (addend
, already_found
)
888 bfd_boolean
*already_found
;
890 hi16s_location
*match
= NULL
;
891 hi16s_location
*entry
;
892 hi16s_location
*previous
= NULL
;
893 hi16s_location
*prev
;
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
))
912 /* Extract the address. */
913 addr
= match
->address
;
915 /* Remember if this entry has already been used before. */
917 * already_found
= match
->found
;
919 /* Note that this entry has now been used. */
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
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
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:
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
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)
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)
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)
1049 + 0x00006fff (bit 15 not set, so the top half is zero)
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)
1063 + 0x00006fff (bit 15 not set, so the top half is zero)
1065 0x00006fff which is wrong (assuming that fred is at 0xffff). */
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
);
1088 bfd_put_16 (abfd
, hi_insn
, hi16s_address
);
1093 fprintf (stderr
, _("FAILED to find previous HI16 reloc\n"));
1100 /* Do not complain if value has top bit set, as this has been
1102 *insn
= (*insn
+ addend
) & 0xffff;
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
)
1112 unsigned int r_type
;
1117 unsigned long result
;
1118 bfd_signed_vma saddend
= (bfd_signed_vma
) addend
;
1123 /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
1124 return bfd_reloc_notsupported
;
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
);
1153 insn
|= ((addend
& 0x1f0) << 7) | ((addend
& 0x0e) << 3);
1157 addend
+= (bfd_get_16 (abfd
, address
) << 16);
1158 addend
= (addend
>> 16);
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)
1177 insn
= bfd_get_16 (abfd
, address
);
1178 if (! v850_elf_perform_lo16_relocation (abfd
, &insn
, addend
))
1179 return bfd_reloc_overflow
;
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
;
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
;
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
;
1231 return bfd_reloc_dangerous
;
1233 insn
= (addend
&~ (bfd_vma
) 1) | (insn
& 1);
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
;
1246 return bfd_reloc_dangerous
;
1249 insn
|= (addend
>> 1);
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
;
1262 return bfd_reloc_dangerous
;
1265 insn
|= (addend
>> 1);
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
;
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
;
1291 return bfd_reloc_dangerous
;
1294 insn
|= (addend
>> 1);
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
;
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
;
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
;
1348 return bfd_reloc_dangerous
;
1351 insn
|= (addend
>> 1);
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
;
1371 PTR data ATTRIBUTE_UNUSED
;
1374 char **err ATTRIBUTE_UNUSED
;
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
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
))
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
;
1437 char **error_message ATTRIBUTE_UNUSED
;
1439 if (output_bfd
!= NULL
)
1440 reloc_entry
->address
+= input_section
->output_offset
;
1442 return bfd_reloc_ok
;
1446 v850_elf_is_local_label_name (abfd
, name
)
1447 bfd
*abfd ATTRIBUTE_UNUSED
;
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
;
1467 bfd
*output_bfd ATTRIBUTE_UNUSED
;
1468 asection
*input_section
;
1473 struct bfd_link_info
*info
;
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. */
1483 case R_V850_9_PCREL
:
1484 value
-= (input_section
->output_section
->vma
1485 + input_section
->output_offset
);
1489 case R_V850_22_PCREL
:
1490 value
-= (input_section
->output_section
->vma
1491 + input_section
->output_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
);
1503 value
-= (input_section
->output_section
->vma
1504 + input_section
->output_offset
1511 case R_V850_LO16_SPLIT_OFFSET
:
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
;
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
:
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
);
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
:
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
);
1575 case R_V850_CALLT_6_7_OFFSET
:
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
);
1593 case R_V850_CALLT_16_16_OFFSET
:
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
);
1617 case R_V850_GNU_VTINHERIT
:
1618 case R_V850_GNU_VTENTRY
:
1619 case R_V850_LONGCALL
:
1620 case R_V850_LONGJUMP
:
1622 return bfd_reloc_ok
;
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. */
1635 v850_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
1636 contents
, relocs
, local_syms
, local_sections
)
1638 struct bfd_link_info
*info
;
1640 asection
*input_section
;
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
)
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
;
1663 relend
= relocs
+ input_section
->reloc_count
;
1664 for (; rel
< relend
; rel
++)
1667 reloc_howto_type
*howto
;
1668 unsigned long r_symndx
;
1669 Elf_Internal_Sym
*sym
;
1671 struct elf_link_hash_entry
*h
;
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
)
1682 /* This is a final link. */
1683 howto
= v850_elf_howto_table
+ r_type
;
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
);
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
1700 if (sym_hashes
== NULL
)
1702 info
->callbacks
->warning
1703 (info
, "no hash table available",
1704 NULL
, input_bfd
, input_section
, (bfd_vma
) 0);
1709 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1710 r_symndx
, symtab_hdr
, sym_hashes
,
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
,
1718 contents
, rel
->r_offset
,
1719 relocation
, rel
->r_addend
,
1720 info
, sec
, h
== NULL
);
1722 if (r
!= bfd_reloc_ok
)
1725 const char * msg
= (const char *)0;
1728 name
= h
->root
.root
.string
;
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
);
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
,
1747 case bfd_reloc_undefined
:
1748 if (! ((*info
->callbacks
->undefined_symbol
)
1749 (info
, name
, input_bfd
, input_section
,
1750 rel
->r_offset
, TRUE
)))
1754 case bfd_reloc_outofrange
:
1755 msg
= _("internal error: out of range error");
1758 case bfd_reloc_notsupported
:
1759 msg
= _("internal error: unsupported relocation error");
1762 case bfd_reloc_dangerous
:
1763 msg
= _("internal error: dangerous relocation");
1766 case bfd_reloc_gp_not_found
:
1767 msg
= _("could not locate special linker symbol __gp");
1770 case bfd_reloc_ep_not_found
:
1771 msg
= _("could not locate special linker symbol __ep");
1774 case bfd_reloc_ctbp_not_found
:
1775 msg
= _("could not locate special linker symbol __ctbp");
1779 msg
= _("internal error: unknown error");
1783 if (!((*info
->callbacks
->warning
)
1784 (info
, msg
, name
, input_bfd
, input_section
,
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. */
1807 v850_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
)
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
;
1816 switch (ELF32_R_TYPE (rel
->r_info
))
1818 case R_V850_GNU_VTINHERIT
:
1819 case R_V850_GNU_VTENTRY
:
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
;
1838 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
1843 /* Set the right machine number. */
1846 v850_elf_object_p (abfd
)
1849 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1853 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850
);
1856 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e
);
1859 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e1
);
1865 /* Store the machine number in the flags field. */
1868 v850_elf_final_write_processing (abfd
, linker
)
1870 bfd_boolean linker ATTRIBUTE_UNUSED
;
1874 switch (bfd_get_mach (abfd
))
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. */
1889 v850_elf_set_private_flags (abfd
, 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
;
1901 /* Merge backend specific data from an object file
1902 to the output object file when linking. */
1904 v850_elf_merge_private_bfd_data (ibfd
, obfd
)
1911 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1912 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
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
)
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
));
1939 /* Check flag compatibility. */
1940 if (in_flags
== out_flags
)
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
)
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
);
1960 _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1967 /* Display the flags field. */
1970 v850_elf_print_private_bfd_data (abfd
, 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
)
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;
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. */
2017 v850_elf_section_from_bfd_section (abfd
, sec
, retval
)
2018 bfd
*abfd ATTRIBUTE_UNUSED
;
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
;
2034 /* Handle the special V850 section numbers that a symbol may use. */
2037 v850_elf_symbol_processing (abfd
, asym
)
2041 elf_symbol_type
* elfsym
= (elf_symbol_type
*) asym
;
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
;
2059 case SHT_V850_TCOMMON
:
2060 indx
= SHN_V850_TCOMMON
;
2063 case SHT_V850_ZCOMMON
:
2064 indx
= SHN_V850_ZCOMMON
;
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
;
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
;
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
;
2129 /* Hook called by the linker routine which adds symbols from an object
2130 file. We must handle the special v850 section numbers here. */
2133 v850_elf_add_symbol_hook (abfd
, info
, sym
, namep
, flagsp
, secp
, valp
)
2135 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2136 Elf_Internal_Sym
*sym
;
2137 const char **namep ATTRIBUTE_UNUSED
;
2138 flagword
*flagsp ATTRIBUTE_UNUSED
;
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
;
2157 case SHT_V850_TCOMMON
:
2158 indx
= SHN_V850_TCOMMON
;
2161 case SHT_V850_ZCOMMON
:
2162 indx
= SHN_V850_ZCOMMON
;
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
;
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
;
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
;
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
;
2219 v850_elf_section_from_shdr (bfd
*abfd
,
2220 Elf_Internal_Shdr
*hdr
,
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
))
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
,
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. */
2250 v850_elf_fake_sections (abfd
, hdr
, sec
)
2251 bfd
*abfd ATTRIBUTE_UNUSED
;
2252 Elf_Internal_Shdr
*hdr
;
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
;
2273 /* Delete some bytes from a section while relaxing. */
2276 v850_elf_relax_delete_bytes (abfd
, sec
, addr
, toaddr
, count
)
2283 Elf_Internal_Shdr
*symtab_hdr
;
2284 Elf32_External_Sym
*extsyms
;
2285 Elf32_External_Sym
*esym
;
2286 Elf32_External_Sym
*esymend
;
2288 unsigned int sec_shndx
;
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
);
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
),
2338 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_ALIGN
)
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
,
2346 if (isym
.st_shndx
!= sec_shndx
)
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
);
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
);
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)
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
);
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. */
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
);
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)
2502 v850_elf_relax_section (abfd
, sec
, link_info
, again
)
2505 struct bfd_link_info
*link_info
;
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
;
2517 int align_pad_size
= 0;
2518 bfd_boolean result
= TRUE
;
2522 if (link_info
->relocatable
2523 || (sec
->flags
& SEC_RELOC
) == 0
2524 || sec
->reloc_count
== 0)
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
)
2535 irelend
= internal_relocs
+ sec
->reloc_count
;
2537 while (addr
< 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
;
2548 fprintf (stderr
, "relax region 0x%x to 0x%x align pad %d\n",
2549 addr
, toaddr
, align_pad_size
);
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
)
2563 align_pad_size
= alignto
- alignmoveto
;
2565 fprintf (stderr
, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2566 alignmoveto
, toaddr
, align_pad_size
);
2568 if (!v850_elf_relax_delete_bytes (abfd
, sec
, alignmoveto
,
2569 toaddr
, align_pad_size
))
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
);
2582 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
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
)))
2600 fprintf (stderr
, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
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
;
2613 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
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,
2626 if (isymbuf
== NULL
)
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)
2648 && ((insn
[1] & MOVEA_MASK
) != MOVEA
2649 || MOVHI_R2 (insn
[0]) != MOVEA_R1 (insn
[1])))
2653 && (insn
[2] & JARL_4_MASK
) != JARL_4
)
2657 && ((insn
[3] & ADD_I_MASK
) != ADD_I
2658 || ADD_I5 (insn
[3]) != 4
2659 || JARL_R2 (insn
[2]) != ADD_R2 (insn
[3])))
2663 && ((insn
[4] & JMP_R_MASK
) != JMP_R
2664 || MOVEA_R2 (insn
[1]) != JMP_R1 (insn
[4])))
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
));
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
]));
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
)
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
)
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
)
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
));
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
;
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. */
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
));
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
;
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
;
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
);
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. */
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
2802 + sec
->output_section
->vma
2803 + sec
->output_offset
2806 fprintf (stderr
, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2809 + sec
->output_section
->vma
2810 + sec
->output_offset
),
2811 symval
, addend
, foff
);
2814 if (foff
< -0x100000 || foff
>= 0x100000)
2815 /* After all that work, we can't shorten this function call. */
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
);
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
2839 0x00000780 | (JARL_R2 (insn
[2])<<11) | ((addend
<< 16) & 0xffff) | ((addend
>> 16) & 0xf),
2840 contents
+ irel
->r_offset
);
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
);
2849 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
2851 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_V850_NONE
);
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))
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)
2875 && ((insn
[1] & MOVEA_MASK
) != MOVEA
2876 || MOVHI_R2 (insn
[0]) != MOVEA_R1 (insn
[1])))
2880 && ((insn
[2] & JMP_R_MASK
) != JMP_R
2881 || MOVEA_R2 (insn
[1]) != JMP_R1 (insn
[2])))
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
));
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
]));
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
)
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
)
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
));
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
;
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
;
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
);
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
);
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. */
2975 symval
= (h
->root
.u
.def
.value
2976 + h
->root
.u
.def
.section
->output_section
->vma
2977 + h
->root
.u
.def
.section
->output_offset
);
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
);
2986 addend
= irel
->r_addend
;
2988 foff
= (symval
+ addend
2990 + sec
->output_section
->vma
2991 + sec
->output_offset
2994 fprintf (stderr
, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2997 + sec
->output_section
->vma
2998 + sec
->output_offset
),
2999 symval
, addend
, foff
);
3001 if (foff
< -0x100000 || foff
>= 0x100000)
3002 /* After all that work, we can't shorten this function call. */
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. */
3021 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_V850_22_PCREL
);
3023 irel
->r_addend
= addend
;
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
3031 0x00000780 | ((addend
<< 15) & 0xffff0000) | ((addend
>> 17) & 0xf),
3032 contents
+ irel
->r_offset
);
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
);
3040 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
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))
3047 align_pad_size
+= 6;
3051 /* Replace the long jump with a br. */
3054 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_V850_9_PCREL
);
3056 irel
->r_addend
= addend
;
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
3064 0x0585 | ((addend
<< 10) & 0xf800) | ((addend
<< 3) & 0x0070),
3065 contents
+ irel
->r_offset
);
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
);
3073 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
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))
3080 align_pad_size
+= 8;
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
)
3104 fprintf (stderr
, "relax pad %d shorten %d -> %d\n",
3107 sec
->size
- align_pad_size
);
3109 sec
->size
-= align_pad_size
;
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
)
3122 && symtab_hdr
->contents
!= (bfd_byte
*) isymbuf
)
3132 static struct bfd_elf_special_section
const
3133 v850_special_sections_c
[]=
3135 { ".call_table_data", 16, 0, SHT_PROGBITS
, (SHF_ALLOC
3137 { ".call_table_text", 16, 0, SHT_PROGBITS
, (SHF_ALLOC
+ SHF_WRITE
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] =
3193 v850_special_sections_c
, /* 'c' */
3208 v850_special_sections_r
, /* 'r' */
3209 v850_special_sections_s
, /* 's' */
3210 v850_special_sections_t
, /* 't' */
3216 v850_special_sections_z
, /* 'z' */
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"