Touches most files in bfd/, so likely will be blamed for everything..
[deliverable/binutils-gdb.git] / bfd / elf32-v850.c
CommitLineData
252b5132 1/* V850-specific support for 32-bit ELF
7898deda
NC
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
252b5132
RH
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
252b5132
RH
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
252b5132
RH
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"
e12dd2ea 30#include "libiberty.h"
252b5132 31
e12dd2ea 32/* Sign-extend a 24-bit number. */
dc810e39 33#define SEXT24(x) ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
435b1e90 34
252b5132
RH
35static reloc_howto_type *v850_elf_reloc_type_lookup
36 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
37static void v850_elf_info_to_howto_rel
38 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
39static void v850_elf_info_to_howto_rela
40 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
41static bfd_reloc_status_type v850_elf_reloc
42 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43static boolean v850_elf_is_local_label_name
44 PARAMS ((bfd *, const char *));
45static boolean v850_elf_relocate_section
46 PARAMS((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
47 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
48static bfd_reloc_status_type v850_elf_perform_relocation
dc810e39 49 PARAMS ((bfd *, unsigned int, bfd_vma, bfd_byte *));
252b5132
RH
50static boolean v850_elf_check_relocs
51 PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
52static void remember_hi16s_reloc
53 PARAMS ((bfd *, bfd_vma, bfd_byte *));
54static bfd_byte * find_remembered_hi16s_reloc
55 PARAMS ((bfd_vma, boolean *));
56static 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));
59static boolean v850_elf_object_p
60 PARAMS ((bfd *));
61static boolean v850_elf_fake_sections
62 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
63static void v850_elf_final_write_processing
64 PARAMS ((bfd *, boolean));
65static boolean v850_elf_set_private_flags
66 PARAMS ((bfd *, flagword));
67static boolean v850_elf_copy_private_bfd_data
68 PARAMS ((bfd *, bfd *));
69static boolean v850_elf_merge_private_bfd_data
70 PARAMS ((bfd *, bfd *));
71static boolean v850_elf_print_private_bfd_data
72 PARAMS ((bfd *, PTR));
73static boolean v850_elf_section_from_bfd_section
74 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
75static void v850_elf_symbol_processing
76 PARAMS ((bfd *, asymbol *));
77static boolean v850_elf_add_symbol_hook
78 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
79 const char **, flagword *, asection **, bfd_vma *));
80static boolean v850_elf_link_output_symbol_hook
81 PARAMS ((bfd *, struct bfd_link_info *, const char *,
82 Elf_Internal_Sym *, asection *));
83static boolean v850_elf_section_from_shdr
84 PARAMS ((bfd *, Elf_Internal_Shdr *, char *));
e12dd2ea
NC
85static boolean v850_elf_gc_sweep_hook
86 PARAMS ((bfd *, struct bfd_link_info *, asection *,
87 const Elf_Internal_Rela *));
88static 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. */
252b5132
RH
95static 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
435b1e90 112 /* A PC relative 9 bit branch. */
252b5132
RH
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
435b1e90 127 /* A PC relative 22 bit branch. */
252b5132
RH
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 */
5c746d90 152 false, /* partial_inplace */
252b5132
RH
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 */
5c746d90 167 false, /* partial_inplace */
252b5132
RH
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 */
5c746d90 182 false, /* partial_inplace */
252b5132
RH
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 */
5c746d90 197 false, /* partial_inplace */
252b5132
RH
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 */
5c746d90 212 false, /* partial_inplace */
252b5132
RH
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 */
5c746d90 227 false, /* partial_inplace */
252b5132
RH
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 */
435b1e90 321
252b5132
RH
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 */
435b1e90 471
252b5132
RH
472};
473
474/* Map BFD reloc types to V850 ELF reloc types. */
475
476struct 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;
917583ad 481 unsigned int elf_reloc_val;
252b5132
RH
482};
483
484static 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};
252b5132 513\f
e12dd2ea
NC
514/* Map a bfd relocation into the appropriate howto structure. */
515
252b5132
RH
516static reloc_howto_type *
517v850_elf_reloc_type_lookup (abfd, code)
5f771d47 518 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
519 bfd_reloc_code_real_type code;
520{
521 unsigned int i;
522
e12dd2ea
NC
523 for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
524 if (v850_elf_reloc_map[i].bfd_reloc_val == code)
525 {
917583ad 526 unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
dc810e39 527
fbad9a25 528 BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
435b1e90 529
fbad9a25 530 return v850_elf_howto_table + elf_reloc_val;
e12dd2ea 531 }
252b5132
RH
532
533 return NULL;
534}
252b5132
RH
535\f
536/* Set the howto pointer for an V850 ELF reloc. */
e12dd2ea 537
252b5132
RH
538static void
539v850_elf_info_to_howto_rel (abfd, cache_ptr, dst)
5f771d47 540 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
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
435b1e90 551/* Set the howto pointer for a V850 ELF reloc (type RELA). */
252b5132
RH
552static void
553v850_elf_info_to_howto_rela (abfd, cache_ptr, dst)
5f771d47 554 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
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}
252b5132
RH
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
569static boolean
570v850_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
e12dd2ea
NC
637 /* This relocation describes which C++ vtable entries
638 are actually used. Record for later use during GC. */
252b5132
RH
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;
435b1e90 650
252b5132
RH
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;
435b1e90 657
252b5132
RH
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 {
e12dd2ea
NC
673 /* Flag which type of relocation was used. */
674 h->other |= other;
252b5132
RH
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,
dc810e39
AM
702 abfd, h->root.u.def.section,
703 (bfd_vma) 0);
252b5132
RH
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 {
e12dd2ea
NC
715 asection * section;
716
717 section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
252b5132
RH
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
e12dd2ea
NC
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. */
252b5132
RH
746
747typedef 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}
755hi16s_location;
756
757static hi16s_location * previous_hi16s;
758static hi16s_location * free_hi16s;
759static unsigned long hi16s_counter;
760
761static void
762remember_hi16s_reloc (abfd, addend, address)
763 bfd * abfd;
764 bfd_vma addend;
765 bfd_byte * address;
766{
767 hi16s_location * entry = NULL;
dc810e39 768 bfd_size_type amt = sizeof (* free_hi16s);
435b1e90 769
252b5132
RH
770 /* Find a free structure. */
771 if (free_hi16s == NULL)
dc810e39 772 free_hi16s = (hi16s_location *) bfd_zalloc (abfd, amt);
252b5132
RH
773
774 entry = free_hi16s;
775 free_hi16s = free_hi16s->next;
435b1e90 776
252b5132
RH
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;
435b1e90 783
252b5132
RH
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 }
435b1e90 793
252b5132
RH
794 return;
795}
796
797static bfd_byte *
798find_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;
252b5132 806 bfd_byte * addr;
435b1e90 807
252b5132
RH
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 }
435b1e90 817
252b5132
RH
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;
435b1e90 833
252b5132 834 return addr;
435b1e90 835}
252b5132
RH
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. */
e12dd2ea 839
252b5132
RH
840static bfd_reloc_status_type
841v850_elf_perform_relocation (abfd, r_type, addend, address)
dc810e39
AM
842 bfd *abfd;
843 unsigned int r_type;
844 bfd_vma addend;
845 bfd_byte *address;
252b5132
RH
846{
847 unsigned long insn;
848 bfd_signed_vma saddend = (bfd_signed_vma) addend;
435b1e90 849
252b5132
RH
850 switch (r_type)
851 {
852 default:
853 /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
854 return bfd_reloc_notsupported;
435b1e90 855
252b5132
RH
856 case R_V850_32:
857 bfd_put_32 (abfd, addend, address);
858 return bfd_reloc_ok;
435b1e90 859
252b5132
RH
860 case R_V850_22_PCREL:
861 if (saddend > 0x1fffff || saddend < -0x200000)
862 return bfd_reloc_overflow;
435b1e90 863
252b5132
RH
864 if ((addend % 2) != 0)
865 return bfd_reloc_dangerous;
435b1e90 866
252b5132
RH
867 insn = bfd_get_32 (abfd, address);
868 insn &= ~0xfffe003f;
869 insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
dc810e39 870 bfd_put_32 (abfd, (bfd_vma) insn, address);
252b5132 871 return bfd_reloc_ok;
435b1e90 872
252b5132
RH
873 case R_V850_9_PCREL:
874 if (saddend > 0xff || saddend < -0x100)
875 return bfd_reloc_overflow;
435b1e90 876
252b5132
RH
877 if ((addend % 2) != 0)
878 return bfd_reloc_dangerous;
435b1e90 879
252b5132
RH
880 insn = bfd_get_16 (abfd, address);
881 insn &= ~ 0xf870;
882 insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
883 break;
435b1e90 884
252b5132
RH
885 case R_V850_HI16:
886 addend += (bfd_get_16 (abfd, address) << 16);
887 addend = (addend >> 16);
888 insn = addend;
889 break;
435b1e90 890
252b5132
RH
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);
435b1e90
KH
897
898 /* This relocation cannot overflow. */
252b5132
RH
899 if (addend > 0x7fff)
900 addend = 0;
435b1e90 901
252b5132
RH
902 insn = addend;
903 break;
435b1e90 904
252b5132
RH
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
252b5132
RH
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
435b1e90 1016
252b5132
RH
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 ------------
e12dd2ea 1044 0x00006fff which is wrong (assuming that fred is at 0xffff). */
252b5132
RH
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)
435b1e90 1053
252b5132
RH
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);
435b1e90 1061
252b5132
RH
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;
dc810e39 1069 bfd_put_16 (abfd, (bfd_vma) insn, hi16s_address);
252b5132
RH
1070 }
1071 }
1072 else
1073 {
1074 fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
1075 return bfd_reloc_overflow;
1076 }
1077 }
435b1e90 1078
252b5132
RH
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;
435b1e90 1088
252b5132
RH
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);
435b1e90 1097
252b5132 1098 saddend = (bfd_signed_vma) addend;
435b1e90 1099
252b5132
RH
1100 if (saddend > 0xffff || saddend < 0)
1101 return bfd_reloc_overflow;
1102
1103 insn = addend;
1104 break;
435b1e90 1105
252b5132
RH
1106 case R_V850_16:
1107
435b1e90 1108 /* drop through */
252b5132
RH
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);
435b1e90 1113
252b5132 1114 saddend = (bfd_signed_vma) addend;
435b1e90 1115
252b5132
RH
1116 if (saddend > 0x7fff || saddend < -0x8000)
1117 return bfd_reloc_overflow;
1118
1119 insn = addend;
1120 break;
435b1e90 1121
252b5132
RH
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);
435b1e90 1126
252b5132 1127 saddend = (bfd_signed_vma) addend;
435b1e90 1128
252b5132
RH
1129 if (saddend > 0x7ffe || saddend < -0x8000)
1130 return bfd_reloc_overflow;
435b1e90 1131
252b5132
RH
1132 if (addend & 1)
1133 return bfd_reloc_dangerous;
435b1e90 1134
dc810e39 1135 insn = (addend &~ (bfd_vma) 1) | (insn & 1);
252b5132 1136 break;
435b1e90 1137
252b5132
RH
1138 case R_V850_TDA_6_8_OFFSET:
1139 insn = bfd_get_16 (abfd, address);
1140 addend += ((insn & 0x7e) << 1);
435b1e90 1141
252b5132 1142 saddend = (bfd_signed_vma) addend;
435b1e90 1143
252b5132
RH
1144 if (saddend > 0xfc || saddend < 0)
1145 return bfd_reloc_overflow;
435b1e90 1146
252b5132
RH
1147 if (addend & 3)
1148 return bfd_reloc_dangerous;
435b1e90 1149
252b5132
RH
1150 insn &= 0xff81;
1151 insn |= (addend >> 1);
1152 break;
435b1e90 1153
252b5132
RH
1154 case R_V850_TDA_7_8_OFFSET:
1155 insn = bfd_get_16 (abfd, address);
1156 addend += ((insn & 0x7f) << 1);
435b1e90 1157
252b5132 1158 saddend = (bfd_signed_vma) addend;
435b1e90 1159
252b5132
RH
1160 if (saddend > 0xfe || saddend < 0)
1161 return bfd_reloc_overflow;
435b1e90 1162
252b5132
RH
1163 if (addend & 1)
1164 return bfd_reloc_dangerous;
435b1e90 1165
252b5132
RH
1166 insn &= 0xff80;
1167 insn |= (addend >> 1);
1168 break;
435b1e90 1169
252b5132
RH
1170 case R_V850_TDA_7_7_OFFSET:
1171 insn = bfd_get_16 (abfd, address);
1172 addend += insn & 0x7f;
435b1e90 1173
252b5132 1174 saddend = (bfd_signed_vma) addend;
435b1e90 1175
252b5132
RH
1176 if (saddend > 0x7f || saddend < 0)
1177 return bfd_reloc_overflow;
435b1e90 1178
252b5132
RH
1179 insn &= 0xff80;
1180 insn |= addend;
1181 break;
435b1e90 1182
252b5132
RH
1183 case R_V850_TDA_4_5_OFFSET:
1184 insn = bfd_get_16 (abfd, address);
1185 addend += ((insn & 0xf) << 1);
435b1e90 1186
252b5132 1187 saddend = (bfd_signed_vma) addend;
435b1e90 1188
252b5132
RH
1189 if (saddend > 0x1e || saddend < 0)
1190 return bfd_reloc_overflow;
435b1e90 1191
252b5132
RH
1192 if (addend & 1)
1193 return bfd_reloc_dangerous;
435b1e90 1194
252b5132
RH
1195 insn &= 0xfff0;
1196 insn |= (addend >> 1);
1197 break;
435b1e90 1198
252b5132
RH
1199 case R_V850_TDA_4_4_OFFSET:
1200 insn = bfd_get_16 (abfd, address);
1201 addend += insn & 0xf;
435b1e90 1202
252b5132 1203 saddend = (bfd_signed_vma) addend;
435b1e90 1204
252b5132
RH
1205 if (saddend > 0xf || saddend < 0)
1206 return bfd_reloc_overflow;
435b1e90 1207
252b5132
RH
1208 insn &= 0xfff0;
1209 insn |= addend;
1210 break;
435b1e90 1211
252b5132
RH
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);
435b1e90 1216
252b5132 1217 saddend = (bfd_signed_vma) addend;
435b1e90 1218
252b5132
RH
1219 if (saddend > 0x7fff || saddend < -0x8000)
1220 return bfd_reloc_overflow;
435b1e90 1221
252b5132
RH
1222 insn &= 0x0001ffdf;
1223 insn |= (addend & 1) << 5;
dc810e39 1224 insn |= (addend &~ (bfd_vma) 1) << 16;
435b1e90 1225
dc810e39 1226 bfd_put_32 (abfd, (bfd_vma) insn, address);
252b5132 1227 return bfd_reloc_ok;
435b1e90 1228
252b5132
RH
1229 case R_V850_CALLT_6_7_OFFSET:
1230 insn = bfd_get_16 (abfd, address);
1231 addend += ((insn & 0x3f) << 1);
435b1e90 1232
252b5132 1233 saddend = (bfd_signed_vma) addend;
435b1e90 1234
252b5132
RH
1235 if (saddend > 0x7e || saddend < 0)
1236 return bfd_reloc_overflow;
435b1e90 1237
252b5132
RH
1238 if (addend & 1)
1239 return bfd_reloc_dangerous;
435b1e90 1240
252b5132
RH
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
dc810e39 1251 bfd_put_16 (abfd, (bfd_vma) insn, address);
252b5132
RH
1252 return bfd_reloc_ok;
1253}
252b5132
RH
1254\f
1255/* Insert the addend into the instruction. */
e12dd2ea 1256
252b5132
RH
1257static bfd_reloc_status_type
1258v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
5f771d47 1259 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
1260 arelent * reloc;
1261 asymbol * symbol;
5f771d47 1262 PTR data ATTRIBUTE_UNUSED;
252b5132
RH
1263 asection * isection;
1264 bfd * obfd;
5f771d47 1265 char ** err ATTRIBUTE_UNUSED;
252b5132
RH
1266{
1267 long relocation;
435b1e90 1268
252b5132
RH
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
e12dd2ea 1272 or the addend is zero, so there is nothing to add into the instruction
252b5132
RH
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 }
435b1e90 1282#if 0
252b5132 1283 else if (obfd != NULL)
e12dd2ea 1284 return bfd_reloc_continue;
252b5132 1285#endif
435b1e90 1286
252b5132
RH
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;
435b1e90 1298
252b5132
RH
1299 /* Work out which section the relocation is targetted at and the
1300 initial relocation command value. */
435b1e90 1301
252b5132
RH
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;
435b1e90 1307
252b5132
RH
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;
435b1e90 1312
a0f2e916
NC
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
dc810e39 1320 _start:
a0f2e916
NC
1321 jr foo
1322
1323 .section ".foo","ax"
1324 nop
1325 foo:
e12dd2ea 1326 nop */
252b5132
RH
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;
435b1e90 1332
e12dd2ea 1333 /* Deal with pcrel_offset. */
252b5132
RH
1334 relocation -= reloc->address;
1335 }
a0f2e916 1336#endif
435b1e90 1337 reloc->addend = relocation;
252b5132
RH
1338 return bfd_reloc_ok;
1339}
252b5132 1340\f
252b5132
RH
1341static boolean
1342v850_elf_is_local_label_name (abfd, name)
5f771d47 1343 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
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}
252b5132
RH
1349\f
1350/* Perform a relocation as part of a final link. */
e12dd2ea 1351
252b5132
RH
1352static bfd_reloc_status_type
1353v850_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;
5f771d47 1358 bfd * output_bfd ATTRIBUTE_UNUSED;
252b5132
RH
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;
5f771d47 1366 int is_local ATTRIBUTE_UNUSED;
252b5132 1367{
dc810e39 1368 unsigned int r_type = howto->type;
252b5132
RH
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;
435b1e90 1379
252b5132
RH
1380 case R_V850_22_PCREL:
1381 value -= (input_section->output_section->vma
1382 + input_section->output_offset
1383 + offset);
1384
232fb1a3
NC
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;
435b1e90 1388
e12dd2ea
NC
1389 /* Only the bottom 24 bits of the PC are valid */
1390 value = SEXT24 (value);
252b5132 1391 break;
435b1e90 1392
252b5132
RH
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
435b1e90 1401 case R_V850_ZDA_15_16_OFFSET:
252b5132
RH
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;
435b1e90 1406
252b5132
RH
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;
435b1e90 1419
252b5132
RH
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;
435b1e90 1444
252b5132
RH
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)
e12dd2ea
NC
1449 /* Actually this indicates that __ep could not be found. */
1450 return bfd_reloc_continue;
252b5132
RH
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;
435b1e90 1459
252b5132
RH
1460 case R_V850_CALLT_6_7_OFFSET:
1461 {
1462 unsigned long ctbp;
1463 struct bfd_link_hash_entry * h;
435b1e90 1464
252b5132
RH
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)
e12dd2ea
NC
1469 /* Actually this indicates that __ctbp could not be found. */
1470 return bfd_reloc_dangerous + 1;
252b5132
RH
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;
435b1e90 1478
252b5132
RH
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;
435b1e90 1486
252b5132
RH
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;
435b1e90 1501
252b5132
RH
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. */
435b1e90 1512 return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
252b5132 1513}
252b5132
RH
1514\f
1515/* Relocate an V850 ELF section. */
e12dd2ea 1516
252b5132
RH
1517static boolean
1518v850_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
dc810e39
AM
1540 (info, "no hash table available",
1541 NULL, input_bfd, input_section, (bfd_vma) 0);
252b5132
RH
1542
1543 return false;
1544 }
435b1e90 1545
252b5132
RH
1546 /* Reset the list of remembered HI16S relocs to empty. */
1547 free_hi16s = previous_hi16s;
1548 previous_hi16s = NULL;
1549 hi16s_counter = 0;
435b1e90 1550
252b5132
RH
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;
e12dd2ea 1606
252b5132
RH
1607 name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name);
1608 name = (name == NULL) ? "<none>" : name;
e12dd2ea
NC
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);
252b5132
RH
1612 }
1613#endif
1614 }
1615 else
1616 {
1617 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
435b1e90 1618
252b5132
RH
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;
435b1e90 1622
252b5132
RH
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
e12dd2ea
NC
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);
252b5132
RH
1633#endif
1634 }
1635 else if (h->root.type == bfd_link_hash_undefweak)
1636 {
1637#if 0
e12dd2ea
NC
1638 fprintf (stderr, "undefined: sec: %s, name: %s\n",
1639 sec->name, h->root.root.string);
252b5132
RH
1640#endif
1641 relocation = 0;
1642 }
1643 else
1644 {
1645 if (! ((*info->callbacks->undefined_symbol)
1646 (info, h->root.root.string, input_bfd,
5cc7c785 1647 input_section, rel->r_offset, true)))
252b5132
RH
1648 return false;
1649#if 0
e12dd2ea 1650 fprintf (stderr, "unknown: name: %s\n", h->root.root.string);
252b5132
RH
1651#endif
1652 relocation = 0;
1653 }
1654 }
1655
e12dd2ea 1656 /* FIXME: We should use the addend, but the COFF relocations don't. */
252b5132
RH
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,
5cc7c785 1690 rel->r_offset, true)))
252b5132
RH
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;
435b1e90 1717
252b5132
RH
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
1735static boolean
1736v850_elf_gc_sweep_hook (abfd, info, sec, relocs)
5f771d47
ILT
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;
252b5132 1741{
e12dd2ea 1742 /* No got and plt entries for v850-elf. */
252b5132
RH
1743 return true;
1744}
1745
1746static asection *
1747v850_elf_gc_mark_hook (abfd, info, rel, h, sym)
1748 bfd *abfd;
5f771d47 1749 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
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;
e049a0de
ILT
1771
1772 default:
1773 break;
252b5132
RH
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}
e12dd2ea 1789
252b5132 1790/* Set the right machine number. */
e12dd2ea 1791
252b5132
RH
1792static boolean
1793v850_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. */
e12dd2ea 1807
252b5132
RH
1808static void
1809v850_elf_final_write_processing (abfd, linker)
1810 bfd * abfd;
5f771d47 1811 boolean linker ATTRIBUTE_UNUSED;
252b5132
RH
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
435b1e90 1827/* Function to keep V850 specific file flags. */
e12dd2ea 1828
252b5132
RH
1829static boolean
1830v850_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
e12dd2ea
NC
1842/* Copy backend specific data from one object module to another. */
1843
252b5132
RH
1844static boolean
1845v850_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;
e12dd2ea 1860
252b5132
RH
1861 return true;
1862}
1863
e12dd2ea
NC
1864/* Merge backend specific data from an object file
1865 to the output object file when linking. */
252b5132
RH
1866static boolean
1867v850_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;
435b1e90 1891
252b5132
RH
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)
e12dd2ea 1897 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
252b5132
RH
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}
e12dd2ea
NC
1913
1914/* Display the flags field. */
252b5132
RH
1915
1916static boolean
1917v850_elf_print_private_bfd_data (abfd, ptr)
1918 bfd * abfd;
1919 PTR ptr;
1920{
1921 FILE * file = (FILE *) ptr;
435b1e90 1922
252b5132 1923 BFD_ASSERT (abfd != NULL && ptr != NULL);
435b1e90 1924
252b5132 1925 _bfd_elf_print_private_bfd_data (abfd, ptr);
435b1e90 1926
252b5132
RH
1927 /* xgettext:c-format */
1928 fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
435b1e90 1929
252b5132
RH
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 }
435b1e90 1937
252b5132 1938 fputc ('\n', file);
435b1e90 1939
252b5132
RH
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
1950static asection v850_elf_scom_section;
1951static asymbol v850_elf_scom_symbol;
1952static asymbol * v850_elf_scom_symbol_ptr;
1953static asection v850_elf_tcom_section;
1954static asymbol v850_elf_tcom_symbol;
1955static asymbol * v850_elf_tcom_symbol_ptr;
1956static asection v850_elf_zcom_section;
1957static asymbol v850_elf_zcom_symbol;
1958static asymbol * v850_elf_zcom_symbol_ptr;
1959
e12dd2ea
NC
1960/* Given a BFD section, try to locate the
1961 corresponding ELF section index. */
252b5132
RH
1962
1963static boolean
1964v850_elf_section_from_bfd_section (abfd, hdr, sec, retval)
5f771d47
ILT
1965 bfd * abfd ATTRIBUTE_UNUSED;
1966 Elf32_Internal_Shdr * hdr ATTRIBUTE_UNUSED;
252b5132
RH
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;
435b1e90 1978
252b5132
RH
1979 return true;
1980}
1981
1982/* Handle the special V850 section numbers that a symbol may use. */
1983
1984static void
1985v850_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;
435b1e90 1991
252b5132
RH
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.
435b1e90 1997
252b5132 1998 FIXME: Should we alter the st_shndx field as well ? */
435b1e90 1999
252b5132
RH
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;
435b1e90 2006
252b5132
RH
2007 case SHT_V850_TCOMMON:
2008 index = SHN_V850_TCOMMON;
2009 break;
435b1e90 2010
252b5132
RH
2011 case SHT_V850_ZCOMMON:
2012 index = SHN_V850_ZCOMMON;
2013 break;
435b1e90 2014
252b5132
RH
2015 default:
2016 break;
2017 }
435b1e90 2018
252b5132
RH
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;
435b1e90 2038
252b5132
RH
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
252b5132
RH
2080static boolean
2081v850_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2082 bfd * abfd;
5f771d47 2083 struct bfd_link_info * info ATTRIBUTE_UNUSED;
252b5132 2084 const Elf_Internal_Sym * sym;
5f771d47
ILT
2085 const char ** namep ATTRIBUTE_UNUSED;
2086 flagword * flagsp ATTRIBUTE_UNUSED;
252b5132
RH
2087 asection ** secp;
2088 bfd_vma * valp;
2089{
2090 int index = sym->st_shndx;
435b1e90 2091
252b5132
RH
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.
435b1e90 2095
252b5132 2096 FIXME: Should we alter the st_shndx field as well ? */
435b1e90 2097
252b5132
RH
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;
435b1e90 2104
252b5132
RH
2105 case SHT_V850_TCOMMON:
2106 index = SHN_V850_TCOMMON;
2107 break;
435b1e90 2108
252b5132
RH
2109 case SHT_V850_ZCOMMON:
2110 index = SHN_V850_ZCOMMON;
2111 break;
435b1e90 2112
252b5132
RH
2113 default:
2114 break;
2115 }
435b1e90 2116
252b5132
RH
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;
435b1e90 2124
252b5132
RH
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;
435b1e90 2130
252b5132
RH
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
252b5132
RH
2141static boolean
2142v850_elf_link_output_symbol_hook (abfd, info, name, sym, input_sec)
5f771d47
ILT
2143 bfd * abfd ATTRIBUTE_UNUSED;
2144 struct bfd_link_info * info ATTRIBUTE_UNUSED;
2145 const char * name ATTRIBUTE_UNUSED;
252b5132
RH
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. */
435b1e90 2152
252b5132
RH
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
2166static boolean
2167v850_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
e12dd2ea
NC
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
252b5132
RH
2197static boolean
2198v850_elf_fake_sections (abfd, hdr, sec)
5f771d47 2199 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
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;
435b1e90 2217
252b5132
RH
2218 return true;
2219}
252b5132
RH
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
aa4f99bb
AO
2224#define ELF_MACHINE_CODE EM_V850
2225#define ELF_MACHINE_ALT1 EM_CYGNUS_V850
252b5132 2226#define ELF_MAXPAGESIZE 0x1000
435b1e90 2227
252b5132
RH
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
252b5132
RH
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.291219 seconds and 4 git commands to generate.