Touches most files in bfd/, so likely will be blamed for everything..
[deliverable/binutils-gdb.git] / bfd / elf32-v850.c
1 /* V850-specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
22 dependencies. As is the gas & simulator code or the v850. */
23
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"
31
32 /* Sign-extend a 24-bit number. */
33 #define SEXT24(x) ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
34
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 *, Elf32_Internal_Rel *));
39 static void v850_elf_info_to_howto_rela
40 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
41 static bfd_reloc_status_type v850_elf_reloc
42 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43 static boolean v850_elf_is_local_label_name
44 PARAMS ((bfd *, const char *));
45 static 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 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, 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 boolean v850_elf_object_p
60 PARAMS ((bfd *));
61 static boolean v850_elf_fake_sections
62 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
63 static void v850_elf_final_write_processing
64 PARAMS ((bfd *, boolean));
65 static boolean v850_elf_set_private_flags
66 PARAMS ((bfd *, flagword));
67 static boolean v850_elf_copy_private_bfd_data
68 PARAMS ((bfd *, bfd *));
69 static boolean v850_elf_merge_private_bfd_data
70 PARAMS ((bfd *, bfd *));
71 static boolean v850_elf_print_private_bfd_data
72 PARAMS ((bfd *, PTR));
73 static boolean v850_elf_section_from_bfd_section
74 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
75 static void v850_elf_symbol_processing
76 PARAMS ((bfd *, asymbol *));
77 static boolean v850_elf_add_symbol_hook
78 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
79 const char **, flagword *, asection **, bfd_vma *));
80 static boolean v850_elf_link_output_symbol_hook
81 PARAMS ((bfd *, struct bfd_link_info *, const char *,
82 Elf_Internal_Sym *, asection *));
83 static boolean v850_elf_section_from_shdr
84 PARAMS ((bfd *, Elf_Internal_Shdr *, char *));
85 static boolean v850_elf_gc_sweep_hook
86 PARAMS ((bfd *, struct bfd_link_info *, asection *,
87 const Elf_Internal_Rela *));
88 static asection * v850_elf_gc_mark_hook
89 PARAMS ((bfd *, struct bfd_link_info *,
90 Elf_Internal_Rela *, struct elf_link_hash_entry *,
91 Elf_Internal_Sym *));
92
93 /* Note: It is REQUIRED that the 'type' value of each entry
94 in this array match the index of the entry in the array. */
95 static reloc_howto_type v850_elf_howto_table[] =
96 {
97 /* This reloc does nothing. */
98 HOWTO (R_V850_NONE, /* type */
99 0, /* rightshift */
100 2, /* size (0 = byte, 1 = short, 2 = long) */
101 32, /* bitsize */
102 false, /* pc_relative */
103 0, /* bitpos */
104 complain_overflow_bitfield, /* complain_on_overflow */
105 bfd_elf_generic_reloc, /* special_function */
106 "R_V850_NONE", /* name */
107 false, /* partial_inplace */
108 0, /* src_mask */
109 0, /* dst_mask */
110 false), /* pcrel_offset */
111
112 /* A PC relative 9 bit branch. */
113 HOWTO (R_V850_9_PCREL, /* type */
114 2, /* rightshift */
115 2, /* size (0 = byte, 1 = short, 2 = long) */
116 26, /* bitsize */
117 true, /* pc_relative */
118 0, /* bitpos */
119 complain_overflow_bitfield, /* complain_on_overflow */
120 v850_elf_reloc, /* special_function */
121 "R_V850_9_PCREL", /* name */
122 false, /* partial_inplace */
123 0x00ffffff, /* src_mask */
124 0x00ffffff, /* dst_mask */
125 true), /* pcrel_offset */
126
127 /* A PC relative 22 bit branch. */
128 HOWTO (R_V850_22_PCREL, /* type */
129 2, /* rightshift */
130 2, /* size (0 = byte, 1 = short, 2 = long) */
131 22, /* bitsize */
132 true, /* pc_relative */
133 7, /* bitpos */
134 complain_overflow_signed, /* complain_on_overflow */
135 v850_elf_reloc, /* special_function */
136 "R_V850_22_PCREL", /* name */
137 false, /* partial_inplace */
138 0x07ffff80, /* src_mask */
139 0x07ffff80, /* dst_mask */
140 true), /* pcrel_offset */
141
142 /* High 16 bits of symbol value. */
143 HOWTO (R_V850_HI16_S, /* type */
144 0, /* rightshift */
145 1, /* size (0 = byte, 1 = short, 2 = long) */
146 16, /* bitsize */
147 false, /* pc_relative */
148 0, /* bitpos */
149 complain_overflow_dont, /* complain_on_overflow */
150 v850_elf_reloc, /* special_function */
151 "R_V850_HI16_S", /* name */
152 false, /* partial_inplace */
153 0xffff, /* src_mask */
154 0xffff, /* dst_mask */
155 false), /* pcrel_offset */
156
157 /* High 16 bits of symbol value. */
158 HOWTO (R_V850_HI16, /* type */
159 0, /* rightshift */
160 1, /* size (0 = byte, 1 = short, 2 = long) */
161 16, /* bitsize */
162 false, /* pc_relative */
163 0, /* bitpos */
164 complain_overflow_dont, /* complain_on_overflow */
165 v850_elf_reloc, /* special_function */
166 "R_V850_HI16", /* name */
167 false, /* partial_inplace */
168 0xffff, /* src_mask */
169 0xffff, /* dst_mask */
170 false), /* pcrel_offset */
171
172 /* Low 16 bits of symbol value. */
173 HOWTO (R_V850_LO16, /* type */
174 0, /* rightshift */
175 1, /* size (0 = byte, 1 = short, 2 = long) */
176 16, /* bitsize */
177 false, /* pc_relative */
178 0, /* bitpos */
179 complain_overflow_dont, /* complain_on_overflow */
180 v850_elf_reloc, /* special_function */
181 "R_V850_LO16", /* name */
182 false, /* partial_inplace */
183 0xffff, /* src_mask */
184 0xffff, /* dst_mask */
185 false), /* pcrel_offset */
186
187 /* Simple 32bit reloc. */
188 HOWTO (R_V850_32, /* type */
189 0, /* rightshift */
190 2, /* size (0 = byte, 1 = short, 2 = long) */
191 32, /* bitsize */
192 false, /* pc_relative */
193 0, /* bitpos */
194 complain_overflow_dont, /* complain_on_overflow */
195 v850_elf_reloc, /* special_function */
196 "R_V850_32", /* name */
197 false, /* partial_inplace */
198 0xffffffff, /* src_mask */
199 0xffffffff, /* dst_mask */
200 false), /* pcrel_offset */
201
202 /* Simple 16bit reloc. */
203 HOWTO (R_V850_16, /* type */
204 0, /* rightshift */
205 1, /* size (0 = byte, 1 = short, 2 = long) */
206 16, /* bitsize */
207 false, /* pc_relative */
208 0, /* bitpos */
209 complain_overflow_dont, /* complain_on_overflow */
210 bfd_elf_generic_reloc, /* special_function */
211 "R_V850_16", /* name */
212 false, /* partial_inplace */
213 0xffff, /* src_mask */
214 0xffff, /* dst_mask */
215 false), /* pcrel_offset */
216
217 /* Simple 8bit reloc. */
218 HOWTO (R_V850_8, /* type */
219 0, /* rightshift */
220 0, /* size (0 = byte, 1 = short, 2 = long) */
221 8, /* bitsize */
222 false, /* pc_relative */
223 0, /* bitpos */
224 complain_overflow_dont, /* complain_on_overflow */
225 bfd_elf_generic_reloc, /* special_function */
226 "R_V850_8", /* name */
227 false, /* partial_inplace */
228 0xff, /* src_mask */
229 0xff, /* dst_mask */
230 false), /* pcrel_offset */
231
232 /* 16 bit offset from the short data area pointer. */
233 HOWTO (R_V850_SDA_16_16_OFFSET, /* type */
234 0, /* rightshift */
235 1, /* size (0 = byte, 1 = short, 2 = long) */
236 16, /* bitsize */
237 false, /* pc_relative */
238 0, /* bitpos */
239 complain_overflow_dont, /* complain_on_overflow */
240 v850_elf_reloc, /* special_function */
241 "R_V850_SDA_16_16_OFFSET", /* name */
242 false, /* partial_inplace */
243 0xffff, /* src_mask */
244 0xffff, /* dst_mask */
245 false), /* pcrel_offset */
246
247 /* 15 bit offset from the short data area pointer. */
248 HOWTO (R_V850_SDA_15_16_OFFSET, /* type */
249 1, /* rightshift */
250 1, /* size (0 = byte, 1 = short, 2 = long) */
251 16, /* bitsize */
252 false, /* pc_relative */
253 1, /* bitpos */
254 complain_overflow_dont, /* complain_on_overflow */
255 v850_elf_reloc, /* special_function */
256 "R_V850_SDA_15_16_OFFSET", /* name */
257 false, /* partial_inplace */
258 0xfffe, /* src_mask */
259 0xfffe, /* dst_mask */
260 false), /* pcrel_offset */
261
262 /* 16 bit offset from the zero data area pointer. */
263 HOWTO (R_V850_ZDA_16_16_OFFSET, /* type */
264 0, /* rightshift */
265 1, /* size (0 = byte, 1 = short, 2 = long) */
266 16, /* bitsize */
267 false, /* pc_relative */
268 0, /* bitpos */
269 complain_overflow_dont, /* complain_on_overflow */
270 v850_elf_reloc, /* special_function */
271 "R_V850_ZDA_16_16_OFFSET", /* name */
272 false, /* partial_inplace */
273 0xffff, /* src_mask */
274 0xffff, /* dst_mask */
275 false), /* pcrel_offset */
276
277 /* 15 bit offset from the zero data area pointer. */
278 HOWTO (R_V850_ZDA_15_16_OFFSET, /* type */
279 1, /* rightshift */
280 1, /* size (0 = byte, 1 = short, 2 = long) */
281 16, /* bitsize */
282 false, /* pc_relative */
283 1, /* bitpos */
284 complain_overflow_dont, /* complain_on_overflow */
285 v850_elf_reloc, /* special_function */
286 "R_V850_ZDA_15_16_OFFSET", /* name */
287 false, /* partial_inplace */
288 0xfffe, /* src_mask */
289 0xfffe, /* dst_mask */
290 false), /* pcrel_offset */
291
292 /* 6 bit offset from the tiny data area pointer. */
293 HOWTO (R_V850_TDA_6_8_OFFSET, /* type */
294 2, /* rightshift */
295 1, /* size (0 = byte, 1 = short, 2 = long) */
296 8, /* bitsize */
297 false, /* pc_relative */
298 1, /* bitpos */
299 complain_overflow_dont, /* complain_on_overflow */
300 v850_elf_reloc, /* special_function */
301 "R_V850_TDA_6_8_OFFSET", /* name */
302 false, /* partial_inplace */
303 0x7e, /* src_mask */
304 0x7e, /* dst_mask */
305 false), /* pcrel_offset */
306
307 /* 8 bit offset from the tiny data area pointer. */
308 HOWTO (R_V850_TDA_7_8_OFFSET, /* type */
309 1, /* rightshift */
310 1, /* size (0 = byte, 1 = short, 2 = long) */
311 8, /* bitsize */
312 false, /* pc_relative */
313 0, /* bitpos */
314 complain_overflow_dont, /* complain_on_overflow */
315 v850_elf_reloc, /* special_function */
316 "R_V850_TDA_7_8_OFFSET", /* name */
317 false, /* partial_inplace */
318 0x7f, /* src_mask */
319 0x7f, /* dst_mask */
320 false), /* pcrel_offset */
321
322 /* 7 bit offset from the tiny data area pointer. */
323 HOWTO (R_V850_TDA_7_7_OFFSET, /* type */
324 0, /* rightshift */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
326 7, /* bitsize */
327 false, /* pc_relative */
328 0, /* bitpos */
329 complain_overflow_dont, /* complain_on_overflow */
330 v850_elf_reloc, /* special_function */
331 "R_V850_TDA_7_7_OFFSET", /* name */
332 false, /* partial_inplace */
333 0x7f, /* src_mask */
334 0x7f, /* dst_mask */
335 false), /* pcrel_offset */
336
337 /* 16 bit offset from the tiny data area pointer! */
338 HOWTO (R_V850_TDA_16_16_OFFSET, /* type */
339 0, /* rightshift */
340 1, /* size (0 = byte, 1 = short, 2 = long) */
341 16, /* bitsize */
342 false, /* pc_relative */
343 0, /* bitpos */
344 complain_overflow_dont, /* complain_on_overflow */
345 v850_elf_reloc, /* special_function */
346 "R_V850_TDA_16_16_OFFSET", /* name */
347 false, /* partial_inplace */
348 0xffff, /* src_mask */
349 0xfff, /* dst_mask */
350 false), /* pcrel_offset */
351
352 /* 5 bit offset from the tiny data area pointer. */
353 HOWTO (R_V850_TDA_4_5_OFFSET, /* type */
354 1, /* rightshift */
355 1, /* size (0 = byte, 1 = short, 2 = long) */
356 5, /* bitsize */
357 false, /* pc_relative */
358 0, /* bitpos */
359 complain_overflow_dont, /* complain_on_overflow */
360 v850_elf_reloc, /* special_function */
361 "R_V850_TDA_4_5_OFFSET", /* name */
362 false, /* partial_inplace */
363 0x0f, /* src_mask */
364 0x0f, /* dst_mask */
365 false), /* pcrel_offset */
366
367 /* 4 bit offset from the tiny data area pointer. */
368 HOWTO (R_V850_TDA_4_4_OFFSET, /* type */
369 0, /* rightshift */
370 1, /* size (0 = byte, 1 = short, 2 = long) */
371 4, /* bitsize */
372 false, /* pc_relative */
373 0, /* bitpos */
374 complain_overflow_dont, /* complain_on_overflow */
375 v850_elf_reloc, /* special_function */
376 "R_V850_TDA_4_4_OFFSET", /* name */
377 false, /* partial_inplace */
378 0x0f, /* src_mask */
379 0x0f, /* dst_mask */
380 false), /* pcrel_offset */
381
382 /* 16 bit offset from the short data area pointer. */
383 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* type */
384 0, /* rightshift */
385 2, /* size (0 = byte, 1 = short, 2 = long) */
386 16, /* bitsize */
387 false, /* pc_relative */
388 0, /* bitpos */
389 complain_overflow_dont, /* complain_on_overflow */
390 v850_elf_reloc, /* special_function */
391 "R_V850_SDA_16_16_SPLIT_OFFSET",/* name */
392 false, /* partial_inplace */
393 0xfffe0020, /* src_mask */
394 0xfffe0020, /* dst_mask */
395 false), /* pcrel_offset */
396
397 /* 16 bit offset from the zero data area pointer. */
398 HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* type */
399 0, /* rightshift */
400 2, /* size (0 = byte, 1 = short, 2 = long) */
401 16, /* bitsize */
402 false, /* pc_relative */
403 0, /* bitpos */
404 complain_overflow_dont, /* complain_on_overflow */
405 v850_elf_reloc, /* special_function */
406 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */
407 false, /* partial_inplace */
408 0xfffe0020, /* src_mask */
409 0xfffe0020, /* dst_mask */
410 false), /* pcrel_offset */
411
412 /* 6 bit offset from the call table base pointer. */
413 HOWTO (R_V850_CALLT_6_7_OFFSET, /* type */
414 0, /* rightshift */
415 1, /* size (0 = byte, 1 = short, 2 = long) */
416 7, /* bitsize */
417 false, /* pc_relative */
418 0, /* bitpos */
419 complain_overflow_dont, /* complain_on_overflow */
420 v850_elf_reloc, /* special_function */
421 "R_V850_CALLT_6_7_OFFSET", /* name */
422 false, /* partial_inplace */
423 0x3f, /* src_mask */
424 0x3f, /* dst_mask */
425 false), /* pcrel_offset */
426
427 /* 16 bit offset from the call table base pointer. */
428 HOWTO (R_V850_CALLT_16_16_OFFSET, /* type */
429 0, /* rightshift */
430 1, /* size (0 = byte, 1 = short, 2 = long) */
431 16, /* bitsize */
432 false, /* pc_relative */
433 0, /* bitpos */
434 complain_overflow_dont, /* complain_on_overflow */
435 v850_elf_reloc, /* special_function */
436 "R_V850_CALLT_16_16_OFFSET", /* name */
437 false, /* partial_inplace */
438 0xffff, /* src_mask */
439 0xffff, /* dst_mask */
440 false), /* pcrel_offset */
441
442 /* GNU extension to record C++ vtable hierarchy */
443 HOWTO (R_V850_GNU_VTINHERIT, /* type */
444 0, /* rightshift */
445 2, /* size (0 = byte, 1 = short, 2 = long) */
446 0, /* bitsize */
447 false, /* pc_relative */
448 0, /* bitpos */
449 complain_overflow_dont, /* complain_on_overflow */
450 NULL, /* special_function */
451 "R_V850_GNU_VTINHERIT", /* name */
452 false, /* partial_inplace */
453 0, /* src_mask */
454 0, /* dst_mask */
455 false), /* pcrel_offset */
456
457 /* GNU extension to record C++ vtable member usage */
458 HOWTO (R_V850_GNU_VTENTRY, /* type */
459 0, /* rightshift */
460 2, /* size (0 = byte, 1 = short, 2 = long) */
461 0, /* bitsize */
462 false, /* pc_relative */
463 0, /* bitpos */
464 complain_overflow_dont, /* complain_on_overflow */
465 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
466 "R_V850_GNU_VTENTRY", /* name */
467 false, /* partial_inplace */
468 0, /* src_mask */
469 0, /* dst_mask */
470 false), /* pcrel_offset */
471
472 };
473
474 /* Map BFD reloc types to V850 ELF reloc types. */
475
476 struct v850_elf_reloc_map
477 {
478 /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
479 unsigned char. */
480 bfd_reloc_code_real_type bfd_reloc_val;
481 unsigned int elf_reloc_val;
482 };
483
484 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
485 {
486 { BFD_RELOC_NONE, R_V850_NONE },
487 { BFD_RELOC_V850_9_PCREL, R_V850_9_PCREL },
488 { BFD_RELOC_V850_22_PCREL, R_V850_22_PCREL },
489 { BFD_RELOC_HI16_S, R_V850_HI16_S },
490 { BFD_RELOC_HI16, R_V850_HI16 },
491 { BFD_RELOC_LO16, R_V850_LO16 },
492 { BFD_RELOC_32, R_V850_32 },
493 { BFD_RELOC_16, R_V850_16 },
494 { BFD_RELOC_8, R_V850_8 },
495 { BFD_RELOC_V850_SDA_16_16_OFFSET, R_V850_SDA_16_16_OFFSET },
496 { BFD_RELOC_V850_SDA_15_16_OFFSET, R_V850_SDA_15_16_OFFSET },
497 { BFD_RELOC_V850_ZDA_16_16_OFFSET, R_V850_ZDA_16_16_OFFSET },
498 { BFD_RELOC_V850_ZDA_15_16_OFFSET, R_V850_ZDA_15_16_OFFSET },
499 { BFD_RELOC_V850_TDA_6_8_OFFSET, R_V850_TDA_6_8_OFFSET },
500 { BFD_RELOC_V850_TDA_7_8_OFFSET, R_V850_TDA_7_8_OFFSET },
501 { BFD_RELOC_V850_TDA_7_7_OFFSET, R_V850_TDA_7_7_OFFSET },
502 { BFD_RELOC_V850_TDA_16_16_OFFSET, R_V850_TDA_16_16_OFFSET },
503 { BFD_RELOC_V850_TDA_4_5_OFFSET, R_V850_TDA_4_5_OFFSET },
504 { BFD_RELOC_V850_TDA_4_4_OFFSET, R_V850_TDA_4_4_OFFSET },
505 { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
506 { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
507 { BFD_RELOC_V850_CALLT_6_7_OFFSET, R_V850_CALLT_6_7_OFFSET },
508 { BFD_RELOC_V850_CALLT_16_16_OFFSET, R_V850_CALLT_16_16_OFFSET },
509 { BFD_RELOC_VTABLE_INHERIT, R_V850_GNU_VTINHERIT },
510 { BFD_RELOC_VTABLE_ENTRY, R_V850_GNU_VTENTRY },
511
512 };
513 \f
514 /* Map a bfd relocation into the appropriate howto structure. */
515
516 static reloc_howto_type *
517 v850_elf_reloc_type_lookup (abfd, code)
518 bfd * abfd ATTRIBUTE_UNUSED;
519 bfd_reloc_code_real_type code;
520 {
521 unsigned int i;
522
523 for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
524 if (v850_elf_reloc_map[i].bfd_reloc_val == code)
525 {
526 unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
527
528 BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
529
530 return v850_elf_howto_table + elf_reloc_val;
531 }
532
533 return NULL;
534 }
535 \f
536 /* Set the howto pointer for an V850 ELF reloc. */
537
538 static void
539 v850_elf_info_to_howto_rel (abfd, cache_ptr, dst)
540 bfd * abfd ATTRIBUTE_UNUSED;
541 arelent * cache_ptr;
542 Elf32_Internal_Rel * dst;
543 {
544 unsigned int r_type;
545
546 r_type = ELF32_R_TYPE (dst->r_info);
547 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
548 cache_ptr->howto = &v850_elf_howto_table[r_type];
549 }
550
551 /* Set the howto pointer for a V850 ELF reloc (type RELA). */
552 static void
553 v850_elf_info_to_howto_rela (abfd, cache_ptr, dst)
554 bfd * abfd ATTRIBUTE_UNUSED;
555 arelent * cache_ptr;
556 Elf32_Internal_Rela *dst;
557 {
558 unsigned int r_type;
559
560 r_type = ELF32_R_TYPE (dst->r_info);
561 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
562 cache_ptr->howto = &v850_elf_howto_table[r_type];
563 }
564 \f
565 /* Look through the relocs for a section during the first phase, and
566 allocate space in the global offset table or procedure linkage
567 table. */
568
569 static boolean
570 v850_elf_check_relocs (abfd, info, sec, relocs)
571 bfd * abfd;
572 struct bfd_link_info * info;
573 asection * sec;
574 const Elf_Internal_Rela * relocs;
575 {
576 boolean ret = true;
577 bfd *dynobj;
578 Elf_Internal_Shdr *symtab_hdr;
579 struct elf_link_hash_entry **sym_hashes;
580 const Elf_Internal_Rela *rel;
581 const Elf_Internal_Rela *rel_end;
582 asection *sreloc;
583 enum v850_reloc_type r_type;
584 int other = 0;
585 const char *common = (const char *)0;
586
587 if (info->relocateable)
588 return true;
589
590 #ifdef DEBUG
591 fprintf (stderr, "v850_elf_check_relocs called for section %s in %s\n",
592 bfd_get_section_name (abfd, sec),
593 bfd_get_filename (abfd));
594 #endif
595
596 dynobj = elf_hash_table (info)->dynobj;
597 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
598 sym_hashes = elf_sym_hashes (abfd);
599 sreloc = NULL;
600
601 rel_end = relocs + sec->reloc_count;
602 for (rel = relocs; rel < rel_end; rel++)
603 {
604 unsigned long r_symndx;
605 struct elf_link_hash_entry *h;
606
607 r_symndx = ELF32_R_SYM (rel->r_info);
608 if (r_symndx < symtab_hdr->sh_info)
609 h = NULL;
610 else
611 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
612
613 r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
614 switch (r_type)
615 {
616 default:
617 case R_V850_NONE:
618 case R_V850_9_PCREL:
619 case R_V850_22_PCREL:
620 case R_V850_HI16_S:
621 case R_V850_HI16:
622 case R_V850_LO16:
623 case R_V850_32:
624 case R_V850_16:
625 case R_V850_8:
626 case R_V850_CALLT_6_7_OFFSET:
627 case R_V850_CALLT_16_16_OFFSET:
628 break;
629
630 /* This relocation describes the C++ object vtable hierarchy.
631 Reconstruct it for later use during GC. */
632 case R_V850_GNU_VTINHERIT:
633 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
634 return false;
635 break;
636
637 /* This relocation describes which C++ vtable entries
638 are actually used. Record for later use during GC. */
639 case R_V850_GNU_VTENTRY:
640 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
641 return false;
642 break;
643
644 case R_V850_SDA_16_16_SPLIT_OFFSET:
645 case R_V850_SDA_16_16_OFFSET:
646 case R_V850_SDA_15_16_OFFSET:
647 other = V850_OTHER_SDA;
648 common = ".scommon";
649 goto small_data_common;
650
651 case R_V850_ZDA_16_16_SPLIT_OFFSET:
652 case R_V850_ZDA_16_16_OFFSET:
653 case R_V850_ZDA_15_16_OFFSET:
654 other = V850_OTHER_ZDA;
655 common = ".zcommon";
656 goto small_data_common;
657
658 case R_V850_TDA_4_5_OFFSET:
659 case R_V850_TDA_4_4_OFFSET:
660 case R_V850_TDA_6_8_OFFSET:
661 case R_V850_TDA_7_8_OFFSET:
662 case R_V850_TDA_7_7_OFFSET:
663 case R_V850_TDA_16_16_OFFSET:
664 other = V850_OTHER_TDA;
665 common = ".tcommon";
666 /* fall through */
667
668 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
669
670 small_data_common:
671 if (h)
672 {
673 /* Flag which type of relocation was used. */
674 h->other |= other;
675 if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
676 && (h->other & V850_OTHER_ERROR) == 0)
677 {
678 const char * msg;
679 static char buff[200]; /* XXX */
680
681 switch (h->other & V850_OTHER_MASK)
682 {
683 default:
684 msg = _("Variable `%s' cannot occupy in multiple small data regions");
685 break;
686 case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
687 msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
688 break;
689 case V850_OTHER_SDA | V850_OTHER_ZDA:
690 msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
691 break;
692 case V850_OTHER_SDA | V850_OTHER_TDA:
693 msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
694 break;
695 case V850_OTHER_ZDA | V850_OTHER_TDA:
696 msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
697 break;
698 }
699
700 sprintf (buff, msg, h->root.root.string);
701 info->callbacks->warning (info, buff, h->root.root.string,
702 abfd, h->root.u.def.section,
703 (bfd_vma) 0);
704
705 bfd_set_error (bfd_error_bad_value);
706 h->other |= V850_OTHER_ERROR;
707 ret = false;
708 }
709 }
710
711 if (h && h->root.type == bfd_link_hash_common
712 && h->root.u.c.p
713 && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
714 {
715 asection * section;
716
717 section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
718 section->flags |= SEC_IS_COMMON;
719 }
720
721 #ifdef DEBUG
722 fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
723 v850_elf_howto_table[ (int)r_type ].name,
724 (h && h->root.root.string) ? h->root.root.string : "<unknown>",
725 (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
726 #endif
727 break;
728 }
729 }
730
731 return ret;
732 }
733
734 /* In the old version, when an entry was checked out from the table,
735 it was deleted. This produced an error if the entry was needed
736 more than once, as the second attempted retry failed.
737
738 In the current version, the entry is not deleted, instead we set
739 the field 'found' to true. If a second lookup matches the same
740 entry, then we know that the hi16s reloc has already been updated
741 and does not need to be updated a second time.
742
743 TODO - TOFIX: If it is possible that we need to restore 2 different
744 addresses from the same table entry, where the first generates an
745 overflow, whilst the second do not, then this code will fail. */
746
747 typedef struct hi16s_location
748 {
749 bfd_vma addend;
750 bfd_byte * address;
751 unsigned long counter;
752 boolean found;
753 struct hi16s_location * next;
754 }
755 hi16s_location;
756
757 static hi16s_location * previous_hi16s;
758 static hi16s_location * free_hi16s;
759 static unsigned long hi16s_counter;
760
761 static void
762 remember_hi16s_reloc (abfd, addend, address)
763 bfd * abfd;
764 bfd_vma addend;
765 bfd_byte * address;
766 {
767 hi16s_location * entry = NULL;
768 bfd_size_type amt = sizeof (* free_hi16s);
769
770 /* Find a free structure. */
771 if (free_hi16s == NULL)
772 free_hi16s = (hi16s_location *) bfd_zalloc (abfd, amt);
773
774 entry = free_hi16s;
775 free_hi16s = free_hi16s->next;
776
777 entry->addend = addend;
778 entry->address = address;
779 entry->counter = hi16s_counter ++;
780 entry->found = false;
781 entry->next = previous_hi16s;
782 previous_hi16s = entry;
783
784 /* Cope with wrap around of our counter. */
785 if (hi16s_counter == 0)
786 {
787 /* XXX - Assume that all counter entries differ only in their low 16 bits. */
788 for (entry = previous_hi16s; entry != NULL; entry = entry->next)
789 entry->counter &= 0xffff;
790
791 hi16s_counter = 0x10000;
792 }
793
794 return;
795 }
796
797 static bfd_byte *
798 find_remembered_hi16s_reloc (addend, already_found)
799 bfd_vma addend;
800 boolean * already_found;
801 {
802 hi16s_location * match = NULL;
803 hi16s_location * entry;
804 hi16s_location * previous = NULL;
805 hi16s_location * prev;
806 bfd_byte * addr;
807
808 /* Search the table. Record the most recent entry that matches. */
809 for (entry = previous_hi16s; entry; entry = entry->next)
810 {
811 if (entry->addend == addend
812 && (match == NULL || match->counter < entry->counter))
813 {
814 previous = prev;
815 match = entry;
816 }
817
818 prev = entry;
819 }
820
821 if (match == NULL)
822 return NULL;
823
824 /* Extract the address. */
825 addr = match->address;
826
827 /* Remeber if this entry has already been used before. */
828 if (already_found)
829 * already_found = match->found;
830
831 /* Note that this entry has now been used. */
832 match->found = true;
833
834 return addr;
835 }
836
837 /* FIXME: The code here probably ought to be removed and the code in reloc.c
838 allowed to do its stuff instead. At least for most of the relocs, anwyay. */
839
840 static bfd_reloc_status_type
841 v850_elf_perform_relocation (abfd, r_type, addend, address)
842 bfd *abfd;
843 unsigned int r_type;
844 bfd_vma addend;
845 bfd_byte *address;
846 {
847 unsigned long insn;
848 bfd_signed_vma saddend = (bfd_signed_vma) addend;
849
850 switch (r_type)
851 {
852 default:
853 /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
854 return bfd_reloc_notsupported;
855
856 case R_V850_32:
857 bfd_put_32 (abfd, addend, address);
858 return bfd_reloc_ok;
859
860 case R_V850_22_PCREL:
861 if (saddend > 0x1fffff || saddend < -0x200000)
862 return bfd_reloc_overflow;
863
864 if ((addend % 2) != 0)
865 return bfd_reloc_dangerous;
866
867 insn = bfd_get_32 (abfd, address);
868 insn &= ~0xfffe003f;
869 insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
870 bfd_put_32 (abfd, (bfd_vma) insn, address);
871 return bfd_reloc_ok;
872
873 case R_V850_9_PCREL:
874 if (saddend > 0xff || saddend < -0x100)
875 return bfd_reloc_overflow;
876
877 if ((addend % 2) != 0)
878 return bfd_reloc_dangerous;
879
880 insn = bfd_get_16 (abfd, address);
881 insn &= ~ 0xf870;
882 insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
883 break;
884
885 case R_V850_HI16:
886 addend += (bfd_get_16 (abfd, address) << 16);
887 addend = (addend >> 16);
888 insn = addend;
889 break;
890
891 case R_V850_HI16_S:
892 /* Remember where this relocation took place. */
893 remember_hi16s_reloc (abfd, addend, address);
894
895 addend += (bfd_get_16 (abfd, address) << 16);
896 addend = (addend >> 16) + ((addend & 0x8000) != 0);
897
898 /* This relocation cannot overflow. */
899 if (addend > 0x7fff)
900 addend = 0;
901
902 insn = addend;
903 break;
904
905 case R_V850_LO16:
906 /* Calculate the sum of the value stored in the instruction and the
907 addend and check for overflow from the low 16 bits into the high
908 16 bits. The assembler has already done some of this: If the
909 value stored in the instruction has its 15th bit set, (counting
910 from zero) then the assembler will have added 1 to the value
911 stored in the associated HI16S reloc. So for example, these
912 relocations:
913
914 movhi hi( fred ), r0, r1
915 movea lo( fred ), r1, r1
916
917 will store 0 in the value fields for the MOVHI and MOVEA instructions
918 and addend will be the address of fred, but for these instructions:
919
920 movhi hi( fred + 0x123456), r0, r1
921 movea lo( fred + 0x123456), r1, r1
922
923 the value stored in the MOVHI instruction will be 0x12 and the value
924 stored in the MOVEA instruction will be 0x3456. If however the
925 instructions were:
926
927 movhi hi( fred + 0x10ffff), r0, r1
928 movea lo( fred + 0x10ffff), r1, r1
929
930 then the value stored in the MOVHI instruction would be 0x11 (not
931 0x10) and the value stored in the MOVEA instruction would be 0xffff.
932 Thus (assuming for the moment that the addend is 0), at run time the
933 MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
934 adds 0xffffffff (sign extension!) producing 0x10ffff. Similarly if
935 the instructions were:
936
937 movhi hi( fred - 1), r0, r1
938 movea lo( fred - 1), r1, r1
939
940 then 0 is stored in the MOVHI instruction and -1 is stored in the
941 MOVEA instruction.
942
943 Overflow can occur if the addition of the value stored in the
944 instruction plus the addend sets the 15th bit when before it was clear.
945 This is because the 15th bit will be sign extended into the high part,
946 thus reducing its value by one, but since the 15th bit was originally
947 clear, the assembler will not have added 1 to the previous HI16S reloc
948 to compensate for this effect. For example:
949
950 movhi hi( fred + 0x123456), r0, r1
951 movea lo( fred + 0x123456), r1, r1
952
953 The value stored in HI16S reloc is 0x12, the value stored in the LO16
954 reloc is 0x3456. If we assume that the address of fred is 0x00007000
955 then the relocations become:
956
957 HI16S: 0x0012 + (0x00007000 >> 16) = 0x12
958 LO16: 0x3456 + (0x00007000 & 0xffff) = 0xa456
959
960 but when the instructions are executed, the MOVEA instruction's value
961 is signed extended, so the sum becomes:
962
963 0x00120000
964 + 0xffffa456
965 ------------
966 0x0011a456 but 'fred + 0x123456' = 0x0012a456
967
968 Note that if the 15th bit was set in the value stored in the LO16
969 reloc, then we do not have to do anything:
970
971 movhi hi( fred + 0x10ffff), r0, r1
972 movea lo( fred + 0x10ffff), r1, r1
973
974 HI16S: 0x0011 + (0x00007000 >> 16) = 0x11
975 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff
976
977 0x00110000
978 + 0x00006fff
979 ------------
980 0x00116fff = fred + 0x10ffff = 0x7000 + 0x10ffff
981
982 Overflow can also occur if the computation carries into the 16th bit
983 and it also results in the 15th bit having the same value as the 15th
984 bit of the original value. What happens is that the HI16S reloc
985 will have already examined the 15th bit of the original value and
986 added 1 to the high part if the bit is set. This compensates for the
987 sign extension of 15th bit of the result of the computation. But now
988 there is a carry into the 16th bit, and this has not been allowed for.
989
990 So, for example if fred is at address 0xf000:
991
992 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
993 movea lo( fred + 0xffff), r1, r1
994
995 HI16S: 0x0001 + (0x0000f000 >> 16) = 0x0001
996 LO16: 0xffff + (0x0000f000 & 0xffff) = 0xefff (carry into bit 16 is lost)
997
998 0x00010000
999 + 0xffffefff
1000 ------------
1001 0x0000efff but 'fred + 0xffff' = 0x0001efff
1002
1003 Similarly, if the 15th bit remains clear, but overflow occurs into
1004 the 16th bit then (assuming the address of fred is 0xf000):
1005
1006 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
1007 movea lo( fred + 0x7000), r1, r1
1008
1009 HI16S: 0x0000 + (0x0000f000 >> 16) = 0x0000
1010 LO16: 0x7000 + (0x0000f000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1011
1012 0x00000000
1013 + 0x00006fff
1014 ------------
1015 0x00006fff but 'fred + 0x7000' = 0x00016fff
1016
1017 Note - there is no need to change anything if a carry occurs, and the
1018 15th bit changes its value from being set to being clear, as the HI16S
1019 reloc will have already added in 1 to the high part for us:
1020
1021 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
1022 movea lo( fred + 0xffff), r1, r1
1023
1024 HI16S: 0x0001 + (0x00007000 >> 16)
1025 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1026
1027 0x00010000
1028 + 0x00006fff (bit 15 not set, so the top half is zero)
1029 ------------
1030 0x00016fff which is right (assuming that fred is at 0x7000)
1031
1032 but if the 15th bit goes from being clear to being set, then we must
1033 once again handle overflow:
1034
1035 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
1036 movea lo( fred + 0x7000), r1, r1
1037
1038 HI16S: 0x0000 + (0x0000ffff >> 16)
1039 LO16: 0x7000 + (0x0000ffff & 0xffff) = 0x6fff (carry into bit 16)
1040
1041 0x00000000
1042 + 0x00006fff (bit 15 not set, so the top half is zero)
1043 ------------
1044 0x00006fff which is wrong (assuming that fred is at 0xffff). */
1045 {
1046 long result;
1047
1048 insn = bfd_get_16 (abfd, address);
1049 result = insn + addend;
1050
1051 #define BIT15_SET(x) ((x) & 0x8000)
1052 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
1053
1054 if ((BIT15_SET (result) && ! BIT15_SET (addend))
1055 || (OVERFLOWS (addend, insn)
1056 && ((! BIT15_SET (insn)) || (BIT15_SET (addend)))))
1057 {
1058 boolean already_updated;
1059 bfd_byte * hi16s_address = find_remembered_hi16s_reloc
1060 (addend, & already_updated);
1061
1062 /* Amend the matching HI16_S relocation. */
1063 if (hi16s_address != NULL)
1064 {
1065 if (! already_updated)
1066 {
1067 insn = bfd_get_16 (abfd, hi16s_address);
1068 insn += 1;
1069 bfd_put_16 (abfd, (bfd_vma) insn, hi16s_address);
1070 }
1071 }
1072 else
1073 {
1074 fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
1075 return bfd_reloc_overflow;
1076 }
1077 }
1078
1079 /* Do not complain if value has top bit set, as this has been anticipated. */
1080 insn = result & 0xffff;
1081 break;
1082 }
1083
1084 case R_V850_8:
1085 addend += (char) bfd_get_8 (abfd, address);
1086
1087 saddend = (bfd_signed_vma) addend;
1088
1089 if (saddend > 0x7f || saddend < -0x80)
1090 return bfd_reloc_overflow;
1091
1092 bfd_put_8 (abfd, addend, address);
1093 return bfd_reloc_ok;
1094
1095 case R_V850_CALLT_16_16_OFFSET:
1096 addend += bfd_get_16 (abfd, address);
1097
1098 saddend = (bfd_signed_vma) addend;
1099
1100 if (saddend > 0xffff || saddend < 0)
1101 return bfd_reloc_overflow;
1102
1103 insn = addend;
1104 break;
1105
1106 case R_V850_16:
1107
1108 /* drop through */
1109 case R_V850_SDA_16_16_OFFSET:
1110 case R_V850_ZDA_16_16_OFFSET:
1111 case R_V850_TDA_16_16_OFFSET:
1112 addend += bfd_get_16 (abfd, address);
1113
1114 saddend = (bfd_signed_vma) addend;
1115
1116 if (saddend > 0x7fff || saddend < -0x8000)
1117 return bfd_reloc_overflow;
1118
1119 insn = addend;
1120 break;
1121
1122 case R_V850_SDA_15_16_OFFSET:
1123 case R_V850_ZDA_15_16_OFFSET:
1124 insn = bfd_get_16 (abfd, address);
1125 addend += (insn & 0xfffe);
1126
1127 saddend = (bfd_signed_vma) addend;
1128
1129 if (saddend > 0x7ffe || saddend < -0x8000)
1130 return bfd_reloc_overflow;
1131
1132 if (addend & 1)
1133 return bfd_reloc_dangerous;
1134
1135 insn = (addend &~ (bfd_vma) 1) | (insn & 1);
1136 break;
1137
1138 case R_V850_TDA_6_8_OFFSET:
1139 insn = bfd_get_16 (abfd, address);
1140 addend += ((insn & 0x7e) << 1);
1141
1142 saddend = (bfd_signed_vma) addend;
1143
1144 if (saddend > 0xfc || saddend < 0)
1145 return bfd_reloc_overflow;
1146
1147 if (addend & 3)
1148 return bfd_reloc_dangerous;
1149
1150 insn &= 0xff81;
1151 insn |= (addend >> 1);
1152 break;
1153
1154 case R_V850_TDA_7_8_OFFSET:
1155 insn = bfd_get_16 (abfd, address);
1156 addend += ((insn & 0x7f) << 1);
1157
1158 saddend = (bfd_signed_vma) addend;
1159
1160 if (saddend > 0xfe || saddend < 0)
1161 return bfd_reloc_overflow;
1162
1163 if (addend & 1)
1164 return bfd_reloc_dangerous;
1165
1166 insn &= 0xff80;
1167 insn |= (addend >> 1);
1168 break;
1169
1170 case R_V850_TDA_7_7_OFFSET:
1171 insn = bfd_get_16 (abfd, address);
1172 addend += insn & 0x7f;
1173
1174 saddend = (bfd_signed_vma) addend;
1175
1176 if (saddend > 0x7f || saddend < 0)
1177 return bfd_reloc_overflow;
1178
1179 insn &= 0xff80;
1180 insn |= addend;
1181 break;
1182
1183 case R_V850_TDA_4_5_OFFSET:
1184 insn = bfd_get_16 (abfd, address);
1185 addend += ((insn & 0xf) << 1);
1186
1187 saddend = (bfd_signed_vma) addend;
1188
1189 if (saddend > 0x1e || saddend < 0)
1190 return bfd_reloc_overflow;
1191
1192 if (addend & 1)
1193 return bfd_reloc_dangerous;
1194
1195 insn &= 0xfff0;
1196 insn |= (addend >> 1);
1197 break;
1198
1199 case R_V850_TDA_4_4_OFFSET:
1200 insn = bfd_get_16 (abfd, address);
1201 addend += insn & 0xf;
1202
1203 saddend = (bfd_signed_vma) addend;
1204
1205 if (saddend > 0xf || saddend < 0)
1206 return bfd_reloc_overflow;
1207
1208 insn &= 0xfff0;
1209 insn |= addend;
1210 break;
1211
1212 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1213 case R_V850_SDA_16_16_SPLIT_OFFSET:
1214 insn = bfd_get_32 (abfd, address);
1215 addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
1216
1217 saddend = (bfd_signed_vma) addend;
1218
1219 if (saddend > 0x7fff || saddend < -0x8000)
1220 return bfd_reloc_overflow;
1221
1222 insn &= 0x0001ffdf;
1223 insn |= (addend & 1) << 5;
1224 insn |= (addend &~ (bfd_vma) 1) << 16;
1225
1226 bfd_put_32 (abfd, (bfd_vma) insn, address);
1227 return bfd_reloc_ok;
1228
1229 case R_V850_CALLT_6_7_OFFSET:
1230 insn = bfd_get_16 (abfd, address);
1231 addend += ((insn & 0x3f) << 1);
1232
1233 saddend = (bfd_signed_vma) addend;
1234
1235 if (saddend > 0x7e || saddend < 0)
1236 return bfd_reloc_overflow;
1237
1238 if (addend & 1)
1239 return bfd_reloc_dangerous;
1240
1241 insn &= 0xff80;
1242 insn |= (addend >> 1);
1243 break;
1244
1245 case R_V850_GNU_VTINHERIT:
1246 case R_V850_GNU_VTENTRY:
1247 return bfd_reloc_ok;
1248
1249 }
1250
1251 bfd_put_16 (abfd, (bfd_vma) insn, address);
1252 return bfd_reloc_ok;
1253 }
1254 \f
1255 /* Insert the addend into the instruction. */
1256
1257 static bfd_reloc_status_type
1258 v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
1259 bfd * abfd ATTRIBUTE_UNUSED;
1260 arelent * reloc;
1261 asymbol * symbol;
1262 PTR data ATTRIBUTE_UNUSED;
1263 asection * isection;
1264 bfd * obfd;
1265 char ** err ATTRIBUTE_UNUSED;
1266 {
1267 long relocation;
1268
1269 /* If there is an output BFD,
1270 and the symbol is not a section name (which is only defined at final link time),
1271 and either we are not putting the addend into the instruction
1272 or the addend is zero, so there is nothing to add into the instruction
1273 then just fixup the address and return. */
1274 if (obfd != (bfd *) NULL
1275 && (symbol->flags & BSF_SECTION_SYM) == 0
1276 && (! reloc->howto->partial_inplace
1277 || reloc->addend == 0))
1278 {
1279 reloc->address += isection->output_offset;
1280 return bfd_reloc_ok;
1281 }
1282 #if 0
1283 else if (obfd != NULL)
1284 return bfd_reloc_continue;
1285 #endif
1286
1287 /* Catch relocs involving undefined symbols. */
1288 if (bfd_is_und_section (symbol->section)
1289 && (symbol->flags & BSF_WEAK) == 0
1290 && obfd == NULL)
1291 return bfd_reloc_undefined;
1292
1293 /* We handle final linking of some relocs ourselves. */
1294
1295 /* Is the address of the relocation really within the section? */
1296 if (reloc->address > isection->_cooked_size)
1297 return bfd_reloc_outofrange;
1298
1299 /* Work out which section the relocation is targetted at and the
1300 initial relocation command value. */
1301
1302 /* Get symbol value. (Common symbols are special.) */
1303 if (bfd_is_com_section (symbol->section))
1304 relocation = 0;
1305 else
1306 relocation = symbol->value;
1307
1308 /* Convert input-section-relative symbol value to absolute + addend. */
1309 relocation += symbol->section->output_section->vma;
1310 relocation += symbol->section->output_offset;
1311 relocation += reloc->addend;
1312
1313 #if 0 /* Since this reloc is going to be processed later on, we should
1314 not make it pc-relative here. To test this, try assembling and
1315 linking this program:
1316
1317 .text
1318 .globl _start
1319 nop
1320 _start:
1321 jr foo
1322
1323 .section ".foo","ax"
1324 nop
1325 foo:
1326 nop */
1327 if (reloc->howto->pc_relative == true)
1328 {
1329 /* Here the variable relocation holds the final address of the
1330 symbol we are relocating against, plus any addend. */
1331 relocation -= isection->output_section->vma + isection->output_offset;
1332
1333 /* Deal with pcrel_offset. */
1334 relocation -= reloc->address;
1335 }
1336 #endif
1337 reloc->addend = relocation;
1338 return bfd_reloc_ok;
1339 }
1340 \f
1341 static boolean
1342 v850_elf_is_local_label_name (abfd, name)
1343 bfd * abfd ATTRIBUTE_UNUSED;
1344 const char * name;
1345 {
1346 return ( (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1347 || (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1348 }
1349 \f
1350 /* Perform a relocation as part of a final link. */
1351
1352 static bfd_reloc_status_type
1353 v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1354 input_section, contents, offset, value,
1355 addend, info, sym_sec, is_local)
1356 reloc_howto_type * howto;
1357 bfd * input_bfd;
1358 bfd * output_bfd ATTRIBUTE_UNUSED;
1359 asection * input_section;
1360 bfd_byte * contents;
1361 bfd_vma offset;
1362 bfd_vma value;
1363 bfd_vma addend;
1364 struct bfd_link_info * info;
1365 asection * sym_sec;
1366 int is_local ATTRIBUTE_UNUSED;
1367 {
1368 unsigned int r_type = howto->type;
1369 bfd_byte * hit_data = contents + offset;
1370
1371 /* Adjust the value according to the relocation. */
1372 switch (r_type)
1373 {
1374 case R_V850_9_PCREL:
1375 value -= (input_section->output_section->vma
1376 + input_section->output_offset);
1377 value -= offset;
1378 break;
1379
1380 case R_V850_22_PCREL:
1381 value -= (input_section->output_section->vma
1382 + input_section->output_offset
1383 + offset);
1384
1385 /* If the sign extension will corrupt the value then we have overflowed. */
1386 if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1387 return bfd_reloc_overflow;
1388
1389 /* Only the bottom 24 bits of the PC are valid */
1390 value = SEXT24 (value);
1391 break;
1392
1393 case R_V850_HI16_S:
1394 case R_V850_HI16:
1395 case R_V850_LO16:
1396 case R_V850_16:
1397 case R_V850_32:
1398 case R_V850_8:
1399 break;
1400
1401 case R_V850_ZDA_15_16_OFFSET:
1402 case R_V850_ZDA_16_16_OFFSET:
1403 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1404 if (sym_sec == NULL)
1405 return bfd_reloc_undefined;
1406
1407 value -= sym_sec->output_section->vma;
1408 break;
1409
1410 case R_V850_SDA_15_16_OFFSET:
1411 case R_V850_SDA_16_16_OFFSET:
1412 case R_V850_SDA_16_16_SPLIT_OFFSET:
1413 {
1414 unsigned long gp;
1415 struct bfd_link_hash_entry * h;
1416
1417 if (sym_sec == NULL)
1418 return bfd_reloc_undefined;
1419
1420 /* Get the value of __gp. */
1421 h = bfd_link_hash_lookup (info->hash, "__gp", false, false, true);
1422 if (h == (struct bfd_link_hash_entry *) NULL
1423 || h->type != bfd_link_hash_defined)
1424 return bfd_reloc_other;
1425
1426 gp = (h->u.def.value
1427 + h->u.def.section->output_section->vma
1428 + h->u.def.section->output_offset);
1429
1430 value -= sym_sec->output_section->vma;
1431 value -= (gp - sym_sec->output_section->vma);
1432 }
1433 break;
1434
1435 case R_V850_TDA_4_4_OFFSET:
1436 case R_V850_TDA_4_5_OFFSET:
1437 case R_V850_TDA_16_16_OFFSET:
1438 case R_V850_TDA_7_7_OFFSET:
1439 case R_V850_TDA_7_8_OFFSET:
1440 case R_V850_TDA_6_8_OFFSET:
1441 {
1442 unsigned long ep;
1443 struct bfd_link_hash_entry * h;
1444
1445 /* Get the value of __ep. */
1446 h = bfd_link_hash_lookup (info->hash, "__ep", false, false, true);
1447 if (h == (struct bfd_link_hash_entry *) NULL
1448 || h->type != bfd_link_hash_defined)
1449 /* Actually this indicates that __ep could not be found. */
1450 return bfd_reloc_continue;
1451
1452 ep = (h->u.def.value
1453 + h->u.def.section->output_section->vma
1454 + h->u.def.section->output_offset);
1455
1456 value -= ep;
1457 }
1458 break;
1459
1460 case R_V850_CALLT_6_7_OFFSET:
1461 {
1462 unsigned long ctbp;
1463 struct bfd_link_hash_entry * h;
1464
1465 /* Get the value of __ctbp. */
1466 h = bfd_link_hash_lookup (info->hash, "__ctbp", false, false, true);
1467 if (h == (struct bfd_link_hash_entry *) NULL
1468 || h->type != bfd_link_hash_defined)
1469 /* Actually this indicates that __ctbp could not be found. */
1470 return bfd_reloc_dangerous + 1;
1471
1472 ctbp = (h->u.def.value
1473 + h->u.def.section->output_section->vma
1474 + h->u.def.section->output_offset);
1475 value -= ctbp;
1476 }
1477 break;
1478
1479 case R_V850_CALLT_16_16_OFFSET:
1480 {
1481 unsigned long ctbp;
1482 struct bfd_link_hash_entry * h;
1483
1484 if (sym_sec == NULL)
1485 return bfd_reloc_undefined;
1486
1487 /* Get the value of __ctbp. */
1488 h = bfd_link_hash_lookup (info->hash, "__ctbp", false, false, true);
1489 if (h == (struct bfd_link_hash_entry *) NULL
1490 || h->type != bfd_link_hash_defined)
1491 return (bfd_reloc_dangerous + 1);
1492
1493 ctbp = (h->u.def.value
1494 + h->u.def.section->output_section->vma
1495 + h->u.def.section->output_offset);
1496
1497 value -= sym_sec->output_section->vma;
1498 value -= (ctbp - sym_sec->output_section->vma);
1499 }
1500 break;
1501
1502 case R_V850_NONE:
1503 case R_V850_GNU_VTINHERIT:
1504 case R_V850_GNU_VTENTRY:
1505 return bfd_reloc_ok;
1506
1507 default:
1508 return bfd_reloc_notsupported;
1509 }
1510
1511 /* Perform the relocation. */
1512 return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1513 }
1514 \f
1515 /* Relocate an V850 ELF section. */
1516
1517 static boolean
1518 v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1519 contents, relocs, local_syms, local_sections)
1520 bfd * output_bfd;
1521 struct bfd_link_info * info;
1522 bfd * input_bfd;
1523 asection * input_section;
1524 bfd_byte * contents;
1525 Elf_Internal_Rela * relocs;
1526 Elf_Internal_Sym * local_syms;
1527 asection ** local_sections;
1528 {
1529 Elf_Internal_Shdr * symtab_hdr;
1530 struct elf_link_hash_entry ** sym_hashes;
1531 Elf_Internal_Rela * rel;
1532 Elf_Internal_Rela * relend;
1533
1534 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1535 sym_hashes = elf_sym_hashes (input_bfd);
1536
1537 if (sym_hashes == NULL)
1538 {
1539 info->callbacks->warning
1540 (info, "no hash table available",
1541 NULL, input_bfd, input_section, (bfd_vma) 0);
1542
1543 return false;
1544 }
1545
1546 /* Reset the list of remembered HI16S relocs to empty. */
1547 free_hi16s = previous_hi16s;
1548 previous_hi16s = NULL;
1549 hi16s_counter = 0;
1550
1551 rel = relocs;
1552 relend = relocs + input_section->reloc_count;
1553 for (; rel < relend; rel++)
1554 {
1555 int r_type;
1556 reloc_howto_type * howto;
1557 unsigned long r_symndx;
1558 Elf_Internal_Sym * sym;
1559 asection * sec;
1560 struct elf_link_hash_entry * h;
1561 bfd_vma relocation;
1562 bfd_reloc_status_type r;
1563
1564 r_symndx = ELF32_R_SYM (rel->r_info);
1565 r_type = ELF32_R_TYPE (rel->r_info);
1566
1567 if (r_type == R_V850_GNU_VTENTRY
1568 || r_type == R_V850_GNU_VTINHERIT)
1569 continue;
1570
1571 howto = v850_elf_howto_table + r_type;
1572
1573 if (info->relocateable)
1574 {
1575 /* This is a relocateable link. We don't have to change
1576 anything, unless the reloc is against a section symbol,
1577 in which case we have to adjust according to where the
1578 section symbol winds up in the output section. */
1579 if (r_symndx < symtab_hdr->sh_info)
1580 {
1581 sym = local_syms + r_symndx;
1582 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1583 {
1584 sec = local_sections[r_symndx];
1585 rel->r_addend += sec->output_offset + sym->st_value;
1586 }
1587 }
1588
1589 continue;
1590 }
1591
1592 /* This is a final link. */
1593 h = NULL;
1594 sym = NULL;
1595 sec = NULL;
1596 if (r_symndx < symtab_hdr->sh_info)
1597 {
1598 sym = local_syms + r_symndx;
1599 sec = local_sections[r_symndx];
1600 relocation = (sec->output_section->vma
1601 + sec->output_offset
1602 + sym->st_value);
1603 #if 0
1604 {
1605 char * name;
1606
1607 name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name);
1608 name = (name == NULL) ? "<none>" : name;
1609 fprintf (stderr, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
1610 sec->name, name, sym->st_name,
1611 sec->output_section->vma, sec->output_offset, sym->st_value, rel->r_addend);
1612 }
1613 #endif
1614 }
1615 else
1616 {
1617 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1618
1619 while (h->root.type == bfd_link_hash_indirect
1620 || h->root.type == bfd_link_hash_warning)
1621 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1622
1623 if (h->root.type == bfd_link_hash_defined
1624 || h->root.type == bfd_link_hash_defweak)
1625 {
1626 sec = h->root.u.def.section;
1627 relocation = (h->root.u.def.value
1628 + sec->output_section->vma
1629 + sec->output_offset);
1630 #if 0
1631 fprintf (stderr, "defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",
1632 sec->name, h->root.root.string, h->root.u.def.value, sec->output_section->vma, sec->output_offset, relocation);
1633 #endif
1634 }
1635 else if (h->root.type == bfd_link_hash_undefweak)
1636 {
1637 #if 0
1638 fprintf (stderr, "undefined: sec: %s, name: %s\n",
1639 sec->name, h->root.root.string);
1640 #endif
1641 relocation = 0;
1642 }
1643 else
1644 {
1645 if (! ((*info->callbacks->undefined_symbol)
1646 (info, h->root.root.string, input_bfd,
1647 input_section, rel->r_offset, true)))
1648 return false;
1649 #if 0
1650 fprintf (stderr, "unknown: name: %s\n", h->root.root.string);
1651 #endif
1652 relocation = 0;
1653 }
1654 }
1655
1656 /* FIXME: We should use the addend, but the COFF relocations don't. */
1657 r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1658 input_section,
1659 contents, rel->r_offset,
1660 relocation, rel->r_addend,
1661 info, sec, h == NULL);
1662
1663 if (r != bfd_reloc_ok)
1664 {
1665 const char * name;
1666 const char * msg = (const char *)0;
1667
1668 if (h != NULL)
1669 name = h->root.root.string;
1670 else
1671 {
1672 name = (bfd_elf_string_from_elf_section
1673 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1674 if (name == NULL || *name == '\0')
1675 name = bfd_section_name (input_bfd, sec);
1676 }
1677
1678 switch (r)
1679 {
1680 case bfd_reloc_overflow:
1681 if (! ((*info->callbacks->reloc_overflow)
1682 (info, name, howto->name, (bfd_vma) 0,
1683 input_bfd, input_section, rel->r_offset)))
1684 return false;
1685 break;
1686
1687 case bfd_reloc_undefined:
1688 if (! ((*info->callbacks->undefined_symbol)
1689 (info, name, input_bfd, input_section,
1690 rel->r_offset, true)))
1691 return false;
1692 break;
1693
1694 case bfd_reloc_outofrange:
1695 msg = _("internal error: out of range error");
1696 goto common_error;
1697
1698 case bfd_reloc_notsupported:
1699 msg = _("internal error: unsupported relocation error");
1700 goto common_error;
1701
1702 case bfd_reloc_dangerous:
1703 msg = _("internal error: dangerous relocation");
1704 goto common_error;
1705
1706 case bfd_reloc_other:
1707 msg = _("could not locate special linker symbol __gp");
1708 goto common_error;
1709
1710 case bfd_reloc_continue:
1711 msg = _("could not locate special linker symbol __ep");
1712 goto common_error;
1713
1714 case (bfd_reloc_dangerous + 1):
1715 msg = _("could not locate special linker symbol __ctbp");
1716 goto common_error;
1717
1718 default:
1719 msg = _("internal error: unknown error");
1720 /* fall through */
1721
1722 common_error:
1723 if (!((*info->callbacks->warning)
1724 (info, msg, name, input_bfd, input_section,
1725 rel->r_offset)))
1726 return false;
1727 break;
1728 }
1729 }
1730 }
1731
1732 return true;
1733 }
1734
1735 static boolean
1736 v850_elf_gc_sweep_hook (abfd, info, sec, relocs)
1737 bfd *abfd ATTRIBUTE_UNUSED;
1738 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1739 asection *sec ATTRIBUTE_UNUSED;
1740 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
1741 {
1742 /* No got and plt entries for v850-elf. */
1743 return true;
1744 }
1745
1746 static asection *
1747 v850_elf_gc_mark_hook (abfd, info, rel, h, sym)
1748 bfd *abfd;
1749 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1750 Elf_Internal_Rela *rel;
1751 struct elf_link_hash_entry *h;
1752 Elf_Internal_Sym *sym;
1753 {
1754 if (h != NULL)
1755 {
1756 switch (ELF32_R_TYPE (rel->r_info))
1757 {
1758 case R_V850_GNU_VTINHERIT:
1759 case R_V850_GNU_VTENTRY:
1760 break;
1761
1762 default:
1763 switch (h->root.type)
1764 {
1765 case bfd_link_hash_defined:
1766 case bfd_link_hash_defweak:
1767 return h->root.u.def.section;
1768
1769 case bfd_link_hash_common:
1770 return h->root.u.c.p->section;
1771
1772 default:
1773 break;
1774 }
1775 }
1776 }
1777 else
1778 {
1779 if (!(elf_bad_symtab (abfd)
1780 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1781 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1782 && sym->st_shndx != SHN_COMMON))
1783 {
1784 return bfd_section_from_elf_index (abfd, sym->st_shndx);
1785 }
1786 }
1787 return NULL;
1788 }
1789
1790 /* Set the right machine number. */
1791
1792 static boolean
1793 v850_elf_object_p (abfd)
1794 bfd *abfd;
1795 {
1796 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1797 {
1798 default:
1799 case E_V850_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, 0); break;
1800 case E_V850E_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e); break;
1801 case E_V850EA_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850ea); break;
1802 }
1803 return true;
1804 }
1805
1806 /* Store the machine number in the flags field. */
1807
1808 static void
1809 v850_elf_final_write_processing (abfd, linker)
1810 bfd * abfd;
1811 boolean linker ATTRIBUTE_UNUSED;
1812 {
1813 unsigned long val;
1814
1815 switch (bfd_get_mach (abfd))
1816 {
1817 default:
1818 case 0: val = E_V850_ARCH; break;
1819 case bfd_mach_v850e: val = E_V850E_ARCH; break;
1820 case bfd_mach_v850ea: val = E_V850EA_ARCH; break;
1821 }
1822
1823 elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1824 elf_elfheader (abfd)->e_flags |= val;
1825 }
1826
1827 /* Function to keep V850 specific file flags. */
1828
1829 static boolean
1830 v850_elf_set_private_flags (abfd, flags)
1831 bfd * abfd;
1832 flagword flags;
1833 {
1834 BFD_ASSERT (!elf_flags_init (abfd)
1835 || elf_elfheader (abfd)->e_flags == flags);
1836
1837 elf_elfheader (abfd)->e_flags = flags;
1838 elf_flags_init (abfd) = true;
1839 return true;
1840 }
1841
1842 /* Copy backend specific data from one object module to another. */
1843
1844 static boolean
1845 v850_elf_copy_private_bfd_data (ibfd, obfd)
1846 bfd * ibfd;
1847 bfd * obfd;
1848 {
1849 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1850 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1851 return true;
1852
1853 BFD_ASSERT (!elf_flags_init (obfd)
1854 || (elf_elfheader (obfd)->e_flags
1855 == elf_elfheader (ibfd)->e_flags));
1856
1857 elf_gp (obfd) = elf_gp (ibfd);
1858 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1859 elf_flags_init (obfd) = true;
1860
1861 return true;
1862 }
1863
1864 /* Merge backend specific data from an object file
1865 to the output object file when linking. */
1866 static boolean
1867 v850_elf_merge_private_bfd_data (ibfd, obfd)
1868 bfd * ibfd;
1869 bfd * obfd;
1870 {
1871 flagword out_flags;
1872 flagword in_flags;
1873
1874 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1875 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1876 return true;
1877
1878 in_flags = elf_elfheader (ibfd)->e_flags;
1879 out_flags = elf_elfheader (obfd)->e_flags;
1880
1881 if (! elf_flags_init (obfd))
1882 {
1883 /* If the input is the default architecture then do not
1884 bother setting the flags for the output architecture,
1885 instead allow future merges to do this. If no future
1886 merges ever set these flags then they will retain their
1887 unitialised values, which surprise surprise, correspond
1888 to the default values. */
1889 if (bfd_get_arch_info (ibfd)->the_default)
1890 return true;
1891
1892 elf_flags_init (obfd) = true;
1893 elf_elfheader (obfd)->e_flags = in_flags;
1894
1895 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1896 && bfd_get_arch_info (obfd)->the_default)
1897 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1898
1899 return true;
1900 }
1901
1902 /* Check flag compatibility. */
1903 if (in_flags == out_flags)
1904 return true;
1905
1906 if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1907 && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1908 _bfd_error_handler (_("%s: Architecture mismatch with previous modules"),
1909 bfd_get_filename (ibfd));
1910
1911 return true;
1912 }
1913
1914 /* Display the flags field. */
1915
1916 static boolean
1917 v850_elf_print_private_bfd_data (abfd, ptr)
1918 bfd * abfd;
1919 PTR ptr;
1920 {
1921 FILE * file = (FILE *) ptr;
1922
1923 BFD_ASSERT (abfd != NULL && ptr != NULL);
1924
1925 _bfd_elf_print_private_bfd_data (abfd, ptr);
1926
1927 /* xgettext:c-format */
1928 fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1929
1930 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1931 {
1932 default:
1933 case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1934 case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
1935 case E_V850EA_ARCH: fprintf (file, _("v850ea architecture")); break;
1936 }
1937
1938 fputc ('\n', file);
1939
1940 return true;
1941 }
1942
1943 /* V850 ELF uses four common sections. One is the usual one, and the
1944 others are for (small) objects in one of the special data areas:
1945 small, tiny and zero. All the objects are kept together, and then
1946 referenced via the gp register, the ep register or the r0 register
1947 respectively, which yields smaller, faster assembler code. This
1948 approach is copied from elf32-mips.c. */
1949
1950 static asection v850_elf_scom_section;
1951 static asymbol v850_elf_scom_symbol;
1952 static asymbol * v850_elf_scom_symbol_ptr;
1953 static asection v850_elf_tcom_section;
1954 static asymbol v850_elf_tcom_symbol;
1955 static asymbol * v850_elf_tcom_symbol_ptr;
1956 static asection v850_elf_zcom_section;
1957 static asymbol v850_elf_zcom_symbol;
1958 static asymbol * v850_elf_zcom_symbol_ptr;
1959
1960 /* Given a BFD section, try to locate the
1961 corresponding ELF section index. */
1962
1963 static boolean
1964 v850_elf_section_from_bfd_section (abfd, hdr, sec, retval)
1965 bfd * abfd ATTRIBUTE_UNUSED;
1966 Elf32_Internal_Shdr * hdr ATTRIBUTE_UNUSED;
1967 asection * sec;
1968 int * retval;
1969 {
1970 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1971 *retval = SHN_V850_SCOMMON;
1972 else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
1973 *retval = SHN_V850_TCOMMON;
1974 else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
1975 *retval = SHN_V850_ZCOMMON;
1976 else
1977 return false;
1978
1979 return true;
1980 }
1981
1982 /* Handle the special V850 section numbers that a symbol may use. */
1983
1984 static void
1985 v850_elf_symbol_processing (abfd, asym)
1986 bfd * abfd;
1987 asymbol * asym;
1988 {
1989 elf_symbol_type * elfsym = (elf_symbol_type *) asym;
1990 unsigned short index;
1991
1992 index = elfsym->internal_elf_sym.st_shndx;
1993
1994 /* If the section index is an "ordinary" index, then it may
1995 refer to a v850 specific section created by the assembler.
1996 Check the section's type and change the index it matches.
1997
1998 FIXME: Should we alter the st_shndx field as well ? */
1999
2000 if (index < elf_elfheader(abfd)[0].e_shnum)
2001 switch (elf_elfsections(abfd)[index]->sh_type)
2002 {
2003 case SHT_V850_SCOMMON:
2004 index = SHN_V850_SCOMMON;
2005 break;
2006
2007 case SHT_V850_TCOMMON:
2008 index = SHN_V850_TCOMMON;
2009 break;
2010
2011 case SHT_V850_ZCOMMON:
2012 index = SHN_V850_ZCOMMON;
2013 break;
2014
2015 default:
2016 break;
2017 }
2018
2019 switch (index)
2020 {
2021 case SHN_V850_SCOMMON:
2022 if (v850_elf_scom_section.name == NULL)
2023 {
2024 /* Initialize the small common section. */
2025 v850_elf_scom_section.name = ".scommon";
2026 v850_elf_scom_section.flags = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
2027 v850_elf_scom_section.output_section = & v850_elf_scom_section;
2028 v850_elf_scom_section.symbol = & v850_elf_scom_symbol;
2029 v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
2030 v850_elf_scom_symbol.name = ".scommon";
2031 v850_elf_scom_symbol.flags = BSF_SECTION_SYM;
2032 v850_elf_scom_symbol.section = & v850_elf_scom_section;
2033 v850_elf_scom_symbol_ptr = & v850_elf_scom_symbol;
2034 }
2035 asym->section = & v850_elf_scom_section;
2036 asym->value = elfsym->internal_elf_sym.st_size;
2037 break;
2038
2039 case SHN_V850_TCOMMON:
2040 if (v850_elf_tcom_section.name == NULL)
2041 {
2042 /* Initialize the tcommon section. */
2043 v850_elf_tcom_section.name = ".tcommon";
2044 v850_elf_tcom_section.flags = SEC_IS_COMMON;
2045 v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2046 v850_elf_tcom_section.symbol = & v850_elf_tcom_symbol;
2047 v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2048 v850_elf_tcom_symbol.name = ".tcommon";
2049 v850_elf_tcom_symbol.flags = BSF_SECTION_SYM;
2050 v850_elf_tcom_symbol.section = & v850_elf_tcom_section;
2051 v850_elf_tcom_symbol_ptr = & v850_elf_tcom_symbol;
2052 }
2053 asym->section = & v850_elf_tcom_section;
2054 asym->value = elfsym->internal_elf_sym.st_size;
2055 break;
2056
2057 case SHN_V850_ZCOMMON:
2058 if (v850_elf_zcom_section.name == NULL)
2059 {
2060 /* Initialize the zcommon section. */
2061 v850_elf_zcom_section.name = ".zcommon";
2062 v850_elf_zcom_section.flags = SEC_IS_COMMON;
2063 v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2064 v850_elf_zcom_section.symbol = & v850_elf_zcom_symbol;
2065 v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2066 v850_elf_zcom_symbol.name = ".zcommon";
2067 v850_elf_zcom_symbol.flags = BSF_SECTION_SYM;
2068 v850_elf_zcom_symbol.section = & v850_elf_zcom_section;
2069 v850_elf_zcom_symbol_ptr = & v850_elf_zcom_symbol;
2070 }
2071 asym->section = & v850_elf_zcom_section;
2072 asym->value = elfsym->internal_elf_sym.st_size;
2073 break;
2074 }
2075 }
2076
2077 /* Hook called by the linker routine which adds symbols from an object
2078 file. We must handle the special v850 section numbers here. */
2079
2080 static boolean
2081 v850_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2082 bfd * abfd;
2083 struct bfd_link_info * info ATTRIBUTE_UNUSED;
2084 const Elf_Internal_Sym * sym;
2085 const char ** namep ATTRIBUTE_UNUSED;
2086 flagword * flagsp ATTRIBUTE_UNUSED;
2087 asection ** secp;
2088 bfd_vma * valp;
2089 {
2090 int index = sym->st_shndx;
2091
2092 /* If the section index is an "ordinary" index, then it may
2093 refer to a v850 specific section created by the assembler.
2094 Check the section's type and change the index it matches.
2095
2096 FIXME: Should we alter the st_shndx field as well ? */
2097
2098 if (index < elf_elfheader(abfd)[0].e_shnum)
2099 switch (elf_elfsections(abfd)[index]->sh_type)
2100 {
2101 case SHT_V850_SCOMMON:
2102 index = SHN_V850_SCOMMON;
2103 break;
2104
2105 case SHT_V850_TCOMMON:
2106 index = SHN_V850_TCOMMON;
2107 break;
2108
2109 case SHT_V850_ZCOMMON:
2110 index = SHN_V850_ZCOMMON;
2111 break;
2112
2113 default:
2114 break;
2115 }
2116
2117 switch (index)
2118 {
2119 case SHN_V850_SCOMMON:
2120 *secp = bfd_make_section_old_way (abfd, ".scommon");
2121 (*secp)->flags |= SEC_IS_COMMON;
2122 *valp = sym->st_size;
2123 break;
2124
2125 case SHN_V850_TCOMMON:
2126 *secp = bfd_make_section_old_way (abfd, ".tcommon");
2127 (*secp)->flags |= SEC_IS_COMMON;
2128 *valp = sym->st_size;
2129 break;
2130
2131 case SHN_V850_ZCOMMON:
2132 *secp = bfd_make_section_old_way (abfd, ".zcommon");
2133 (*secp)->flags |= SEC_IS_COMMON;
2134 *valp = sym->st_size;
2135 break;
2136 }
2137
2138 return true;
2139 }
2140
2141 static boolean
2142 v850_elf_link_output_symbol_hook (abfd, info, name, sym, input_sec)
2143 bfd * abfd ATTRIBUTE_UNUSED;
2144 struct bfd_link_info * info ATTRIBUTE_UNUSED;
2145 const char * name ATTRIBUTE_UNUSED;
2146 Elf_Internal_Sym * sym;
2147 asection * input_sec;
2148 {
2149 /* If we see a common symbol, which implies a relocatable link, then
2150 if a symbol was in a special common section in an input file, mark
2151 it as a special common in the output file. */
2152
2153 if (sym->st_shndx == SHN_COMMON)
2154 {
2155 if (strcmp (input_sec->name, ".scommon") == 0)
2156 sym->st_shndx = SHN_V850_SCOMMON;
2157 else if (strcmp (input_sec->name, ".tcommon") == 0)
2158 sym->st_shndx = SHN_V850_TCOMMON;
2159 else if (strcmp (input_sec->name, ".zcommon") == 0)
2160 sym->st_shndx = SHN_V850_ZCOMMON;
2161 }
2162
2163 return true;
2164 }
2165
2166 static boolean
2167 v850_elf_section_from_shdr (abfd, hdr, name)
2168 bfd * abfd;
2169 Elf_Internal_Shdr * hdr;
2170 char * name;
2171 {
2172 /* There ought to be a place to keep ELF backend specific flags, but
2173 at the moment there isn't one. We just keep track of the
2174 sections by their name, instead. */
2175
2176 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
2177 return false;
2178
2179 switch (hdr->sh_type)
2180 {
2181 case SHT_V850_SCOMMON:
2182 case SHT_V850_TCOMMON:
2183 case SHT_V850_ZCOMMON:
2184 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2185 (bfd_get_section_flags (abfd,
2186 hdr->bfd_section)
2187 | SEC_IS_COMMON)))
2188 return false;
2189 }
2190
2191 return true;
2192 }
2193
2194 /* Set the correct type for a V850 ELF section. We do this
2195 by the section name, which is a hack, but ought to work. */
2196
2197 static boolean
2198 v850_elf_fake_sections (abfd, hdr, sec)
2199 bfd * abfd ATTRIBUTE_UNUSED;
2200 Elf32_Internal_Shdr * hdr;
2201 asection * sec;
2202 {
2203 register const char * name;
2204
2205 name = bfd_get_section_name (abfd, sec);
2206
2207 if (strcmp (name, ".scommon") == 0)
2208 {
2209 hdr->sh_type = SHT_V850_SCOMMON;
2210 }
2211 else if (strcmp (name, ".tcommon") == 0)
2212 {
2213 hdr->sh_type = SHT_V850_TCOMMON;
2214 }
2215 else if (strcmp (name, ".zcommon") == 0)
2216 hdr->sh_type = SHT_V850_ZCOMMON;
2217
2218 return true;
2219 }
2220 \f
2221 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
2222 #define TARGET_LITTLE_NAME "elf32-v850"
2223 #define ELF_ARCH bfd_arch_v850
2224 #define ELF_MACHINE_CODE EM_V850
2225 #define ELF_MACHINE_ALT1 EM_CYGNUS_V850
2226 #define ELF_MAXPAGESIZE 0x1000
2227
2228 #define elf_info_to_howto v850_elf_info_to_howto_rela
2229 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
2230
2231 #define elf_backend_check_relocs v850_elf_check_relocs
2232 #define elf_backend_relocate_section v850_elf_relocate_section
2233 #define elf_backend_object_p v850_elf_object_p
2234 #define elf_backend_final_write_processing v850_elf_final_write_processing
2235 #define elf_backend_section_from_bfd_section v850_elf_section_from_bfd_section
2236 #define elf_backend_symbol_processing v850_elf_symbol_processing
2237 #define elf_backend_add_symbol_hook v850_elf_add_symbol_hook
2238 #define elf_backend_link_output_symbol_hook v850_elf_link_output_symbol_hook
2239 #define elf_backend_section_from_shdr v850_elf_section_from_shdr
2240 #define elf_backend_fake_sections v850_elf_fake_sections
2241 #define elf_backend_gc_mark_hook v850_elf_gc_mark_hook
2242 #define elf_backend_gc_sweep_hook v850_elf_gc_sweep_hook
2243
2244 #define elf_backend_can_gc_sections 1
2245
2246 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
2247 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
2248 #define bfd_elf32_bfd_copy_private_bfd_data v850_elf_copy_private_bfd_data
2249 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
2250 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
2251 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
2252
2253 #define elf_symbol_leading_char '_'
2254
2255 #include "elf32-target.h"
This page took 0.150296 seconds and 4 git commands to generate.