daily update
[binutils.git] / bfd / elf32-v850.c
blob8f9eda409319e8eed13fd6f47dea97dfbdb7fe4b
1 /* V850-specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2008 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
23 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
24 dependencies. As is the gas & simulator code for the v850. */
26 #include "sysdep.h"
27 #include "bfd.h"
28 #include "bfdlink.h"
29 #include "libbfd.h"
30 #include "elf-bfd.h"
31 #include "elf/v850.h"
32 #include "libiberty.h"
34 /* Sign-extend a 24-bit number. */
35 #define SEXT24(x) ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
37 static reloc_howto_type v850_elf_howto_table[];
39 /* Look through the relocs for a section during the first phase, and
40 allocate space in the global offset table or procedure linkage
41 table. */
43 static bfd_boolean
44 v850_elf_check_relocs (bfd *abfd,
45 struct bfd_link_info *info,
46 asection *sec,
47 const Elf_Internal_Rela *relocs)
49 bfd_boolean ret = TRUE;
50 bfd *dynobj;
51 Elf_Internal_Shdr *symtab_hdr;
52 struct elf_link_hash_entry **sym_hashes;
53 const Elf_Internal_Rela *rel;
54 const Elf_Internal_Rela *rel_end;
55 enum v850_reloc_type r_type;
56 int other = 0;
57 const char *common = NULL;
59 if (info->relocatable)
60 return TRUE;
62 #ifdef DEBUG
63 _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
64 sec, abfd);
65 #endif
67 dynobj = elf_hash_table (info)->dynobj;
68 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
69 sym_hashes = elf_sym_hashes (abfd);
71 rel_end = relocs + sec->reloc_count;
72 for (rel = relocs; rel < rel_end; rel++)
74 unsigned long r_symndx;
75 struct elf_link_hash_entry *h;
77 r_symndx = ELF32_R_SYM (rel->r_info);
78 if (r_symndx < symtab_hdr->sh_info)
79 h = NULL;
80 else
82 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
83 while (h->root.type == bfd_link_hash_indirect
84 || h->root.type == bfd_link_hash_warning)
85 h = (struct elf_link_hash_entry *) h->root.u.i.link;
88 r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
89 switch (r_type)
91 default:
92 case R_V850_NONE:
93 case R_V850_9_PCREL:
94 case R_V850_22_PCREL:
95 case R_V850_HI16_S:
96 case R_V850_HI16:
97 case R_V850_LO16:
98 case R_V850_LO16_SPLIT_OFFSET:
99 case R_V850_ABS32:
100 case R_V850_REL32:
101 case R_V850_16:
102 case R_V850_8:
103 case R_V850_CALLT_6_7_OFFSET:
104 case R_V850_CALLT_16_16_OFFSET:
105 break;
107 /* This relocation describes the C++ object vtable hierarchy.
108 Reconstruct it for later use during GC. */
109 case R_V850_GNU_VTINHERIT:
110 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
111 return FALSE;
112 break;
114 /* This relocation describes which C++ vtable entries
115 are actually used. Record for later use during GC. */
116 case R_V850_GNU_VTENTRY:
117 BFD_ASSERT (h != NULL);
118 if (h != NULL
119 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
120 return FALSE;
121 break;
123 case R_V850_SDA_16_16_SPLIT_OFFSET:
124 case R_V850_SDA_16_16_OFFSET:
125 case R_V850_SDA_15_16_OFFSET:
126 other = V850_OTHER_SDA;
127 common = ".scommon";
128 goto small_data_common;
130 case R_V850_ZDA_16_16_SPLIT_OFFSET:
131 case R_V850_ZDA_16_16_OFFSET:
132 case R_V850_ZDA_15_16_OFFSET:
133 other = V850_OTHER_ZDA;
134 common = ".zcommon";
135 goto small_data_common;
137 case R_V850_TDA_4_5_OFFSET:
138 case R_V850_TDA_4_4_OFFSET:
139 case R_V850_TDA_6_8_OFFSET:
140 case R_V850_TDA_7_8_OFFSET:
141 case R_V850_TDA_7_7_OFFSET:
142 case R_V850_TDA_16_16_OFFSET:
143 other = V850_OTHER_TDA;
144 common = ".tcommon";
145 /* fall through */
147 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
149 small_data_common:
150 if (h)
152 /* Flag which type of relocation was used. */
153 h->other |= other;
154 if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
155 && (h->other & V850_OTHER_ERROR) == 0)
157 const char * msg;
158 static char buff[200]; /* XXX */
160 switch (h->other & V850_OTHER_MASK)
162 default:
163 msg = _("Variable `%s' cannot occupy in multiple small data regions");
164 break;
165 case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
166 msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
167 break;
168 case V850_OTHER_SDA | V850_OTHER_ZDA:
169 msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
170 break;
171 case V850_OTHER_SDA | V850_OTHER_TDA:
172 msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
173 break;
174 case V850_OTHER_ZDA | V850_OTHER_TDA:
175 msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
176 break;
179 sprintf (buff, msg, h->root.root.string);
180 info->callbacks->warning (info, buff, h->root.root.string,
181 abfd, h->root.u.def.section,
182 (bfd_vma) 0);
184 bfd_set_error (bfd_error_bad_value);
185 h->other |= V850_OTHER_ERROR;
186 ret = FALSE;
190 if (h && h->root.type == bfd_link_hash_common
191 && h->root.u.c.p
192 && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
194 asection * section;
196 section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
197 section->flags |= SEC_IS_COMMON;
200 #ifdef DEBUG
201 fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
202 v850_elf_howto_table[ (int)r_type ].name,
203 (h && h->root.root.string) ? h->root.root.string : "<unknown>",
204 (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
205 #endif
206 break;
210 return ret;
213 /* In the old version, when an entry was checked out from the table,
214 it was deleted. This produced an error if the entry was needed
215 more than once, as the second attempted retry failed.
217 In the current version, the entry is not deleted, instead we set
218 the field 'found' to TRUE. If a second lookup matches the same
219 entry, then we know that the hi16s reloc has already been updated
220 and does not need to be updated a second time.
222 TODO - TOFIX: If it is possible that we need to restore 2 different
223 addresses from the same table entry, where the first generates an
224 overflow, whilst the second do not, then this code will fail. */
226 typedef struct hi16s_location
228 bfd_vma addend;
229 bfd_byte * address;
230 unsigned long counter;
231 bfd_boolean found;
232 struct hi16s_location * next;
234 hi16s_location;
236 static hi16s_location * previous_hi16s;
237 static hi16s_location * free_hi16s;
238 static unsigned long hi16s_counter;
240 static void
241 remember_hi16s_reloc (bfd *abfd, bfd_vma addend, bfd_byte *address)
243 hi16s_location * entry = NULL;
244 bfd_size_type amt = sizeof (* free_hi16s);
246 /* Find a free structure. */
247 if (free_hi16s == NULL)
248 free_hi16s = bfd_zalloc (abfd, amt);
250 entry = free_hi16s;
251 free_hi16s = free_hi16s->next;
253 entry->addend = addend;
254 entry->address = address;
255 entry->counter = hi16s_counter ++;
256 entry->found = FALSE;
257 entry->next = previous_hi16s;
258 previous_hi16s = entry;
260 /* Cope with wrap around of our counter. */
261 if (hi16s_counter == 0)
263 /* XXX: Assume that all counter entries differ only in their low 16 bits. */
264 for (entry = previous_hi16s; entry != NULL; entry = entry->next)
265 entry->counter &= 0xffff;
267 hi16s_counter = 0x10000;
271 static bfd_byte *
272 find_remembered_hi16s_reloc (bfd_vma addend, bfd_boolean *already_found)
274 hi16s_location *match = NULL;
275 hi16s_location *entry;
276 hi16s_location *previous = NULL;
277 hi16s_location *prev;
278 bfd_byte *addr;
280 /* Search the table. Record the most recent entry that matches. */
281 for (entry = previous_hi16s; entry; entry = entry->next)
283 if (entry->addend == addend
284 && (match == NULL || match->counter < entry->counter))
286 previous = prev;
287 match = entry;
290 prev = entry;
293 if (match == NULL)
294 return NULL;
296 /* Extract the address. */
297 addr = match->address;
299 /* Remember if this entry has already been used before. */
300 if (already_found)
301 * already_found = match->found;
303 /* Note that this entry has now been used. */
304 match->found = TRUE;
306 return addr;
309 /* Calculate the final operand value for a R_V850_LO16 or
310 R_V850_LO16_SPLIT_OFFSET. *INSN is the current operand value and
311 ADDEND is the sum of the relocation symbol and offset. Store the
312 operand value in *INSN and return true on success.
314 The assembler has already done some of this: If the value stored in
315 the instruction has its 15th bit set, (counting from zero) then the
316 assembler will have added 1 to the value stored in the associated
317 HI16S reloc. So for example, these relocations:
319 movhi hi( fred ), r0, r1
320 movea lo( fred ), r1, r1
322 will store 0 in the value fields for the MOVHI and MOVEA instructions
323 and addend will be the address of fred, but for these instructions:
325 movhi hi( fred + 0x123456), r0, r1
326 movea lo( fred + 0x123456), r1, r1
328 the value stored in the MOVHI instruction will be 0x12 and the value
329 stored in the MOVEA instruction will be 0x3456. If however the
330 instructions were:
332 movhi hi( fred + 0x10ffff), r0, r1
333 movea lo( fred + 0x10ffff), r1, r1
335 then the value stored in the MOVHI instruction would be 0x11 (not
336 0x10) and the value stored in the MOVEA instruction would be 0xffff.
337 Thus (assuming for the moment that the addend is 0), at run time the
338 MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
339 adds 0xffffffff (sign extension!) producing 0x10ffff. Similarly if
340 the instructions were:
342 movhi hi( fred - 1), r0, r1
343 movea lo( fred - 1), r1, r1
345 then 0 is stored in the MOVHI instruction and -1 is stored in the
346 MOVEA instruction.
348 Overflow can occur if the addition of the value stored in the
349 instruction plus the addend sets the 15th bit when before it was clear.
350 This is because the 15th bit will be sign extended into the high part,
351 thus reducing its value by one, but since the 15th bit was originally
352 clear, the assembler will not have added 1 to the previous HI16S reloc
353 to compensate for this effect. For example:
355 movhi hi( fred + 0x123456), r0, r1
356 movea lo( fred + 0x123456), r1, r1
358 The value stored in HI16S reloc is 0x12, the value stored in the LO16
359 reloc is 0x3456. If we assume that the address of fred is 0x00007000
360 then the relocations become:
362 HI16S: 0x0012 + (0x00007000 >> 16) = 0x12
363 LO16: 0x3456 + (0x00007000 & 0xffff) = 0xa456
365 but when the instructions are executed, the MOVEA instruction's value
366 is signed extended, so the sum becomes:
368 0x00120000
369 + 0xffffa456
370 ------------
371 0x0011a456 but 'fred + 0x123456' = 0x0012a456
373 Note that if the 15th bit was set in the value stored in the LO16
374 reloc, then we do not have to do anything:
376 movhi hi( fred + 0x10ffff), r0, r1
377 movea lo( fred + 0x10ffff), r1, r1
379 HI16S: 0x0011 + (0x00007000 >> 16) = 0x11
380 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff
382 0x00110000
383 + 0x00006fff
384 ------------
385 0x00116fff = fred + 0x10ffff = 0x7000 + 0x10ffff
387 Overflow can also occur if the computation carries into the 16th bit
388 and it also results in the 15th bit having the same value as the 15th
389 bit of the original value. What happens is that the HI16S reloc
390 will have already examined the 15th bit of the original value and
391 added 1 to the high part if the bit is set. This compensates for the
392 sign extension of 15th bit of the result of the computation. But now
393 there is a carry into the 16th bit, and this has not been allowed for.
395 So, for example if fred is at address 0xf000:
397 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
398 movea lo( fred + 0xffff), r1, r1
400 HI16S: 0x0001 + (0x0000f000 >> 16) = 0x0001
401 LO16: 0xffff + (0x0000f000 & 0xffff) = 0xefff (carry into bit 16 is lost)
403 0x00010000
404 + 0xffffefff
405 ------------
406 0x0000efff but 'fred + 0xffff' = 0x0001efff
408 Similarly, if the 15th bit remains clear, but overflow occurs into
409 the 16th bit then (assuming the address of fred is 0xf000):
411 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
412 movea lo( fred + 0x7000), r1, r1
414 HI16S: 0x0000 + (0x0000f000 >> 16) = 0x0000
415 LO16: 0x7000 + (0x0000f000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
417 0x00000000
418 + 0x00006fff
419 ------------
420 0x00006fff but 'fred + 0x7000' = 0x00016fff
422 Note - there is no need to change anything if a carry occurs, and the
423 15th bit changes its value from being set to being clear, as the HI16S
424 reloc will have already added in 1 to the high part for us:
426 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
427 movea lo( fred + 0xffff), r1, r1
429 HI16S: 0x0001 + (0x00007000 >> 16)
430 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
432 0x00010000
433 + 0x00006fff (bit 15 not set, so the top half is zero)
434 ------------
435 0x00016fff which is right (assuming that fred is at 0x7000)
437 but if the 15th bit goes from being clear to being set, then we must
438 once again handle overflow:
440 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
441 movea lo( fred + 0x7000), r1, r1
443 HI16S: 0x0000 + (0x0000ffff >> 16)
444 LO16: 0x7000 + (0x0000ffff & 0xffff) = 0x6fff (carry into bit 16)
446 0x00000000
447 + 0x00006fff (bit 15 not set, so the top half is zero)
448 ------------
449 0x00006fff which is wrong (assuming that fred is at 0xffff). */
451 static bfd_boolean
452 v850_elf_perform_lo16_relocation (bfd *abfd, unsigned long *insn,
453 unsigned long addend)
455 #define BIT15_SET(x) ((x) & 0x8000)
456 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
458 if ((BIT15_SET (*insn + addend) && ! BIT15_SET (addend))
459 || (OVERFLOWS (addend, *insn)
460 && ((! BIT15_SET (*insn)) || (BIT15_SET (addend)))))
462 bfd_boolean already_updated;
463 bfd_byte *hi16s_address = find_remembered_hi16s_reloc
464 (addend, & already_updated);
466 /* Amend the matching HI16_S relocation. */
467 if (hi16s_address != NULL)
469 if (! already_updated)
471 unsigned long hi_insn = bfd_get_16 (abfd, hi16s_address);
472 hi_insn += 1;
473 bfd_put_16 (abfd, hi_insn, hi16s_address);
476 else
478 fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
479 return FALSE;
482 #undef OVERFLOWS
483 #undef BIT15_SET
485 /* Do not complain if value has top bit set, as this has been
486 anticipated. */
487 *insn = (*insn + addend) & 0xffff;
488 return TRUE;
491 /* FIXME: The code here probably ought to be removed and the code in reloc.c
492 allowed to do its stuff instead. At least for most of the relocs, anyway. */
494 static bfd_reloc_status_type
495 v850_elf_perform_relocation (bfd *abfd,
496 unsigned int r_type,
497 bfd_vma addend,
498 bfd_byte *address)
500 unsigned long insn;
501 unsigned long result;
502 bfd_signed_vma saddend = (bfd_signed_vma) addend;
504 switch (r_type)
506 default:
507 return bfd_reloc_notsupported;
509 case R_V850_REL32:
510 case R_V850_ABS32:
511 bfd_put_32 (abfd, addend, address);
512 return bfd_reloc_ok;
514 case R_V850_22_PCREL:
515 if (saddend > 0x1fffff || saddend < -0x200000)
516 return bfd_reloc_overflow;
518 if ((addend % 2) != 0)
519 return bfd_reloc_dangerous;
521 insn = bfd_get_32 (abfd, address);
522 insn &= ~0xfffe003f;
523 insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
524 bfd_put_32 (abfd, (bfd_vma) insn, address);
525 return bfd_reloc_ok;
527 case R_V850_9_PCREL:
528 if (saddend > 0xff || saddend < -0x100)
529 return bfd_reloc_overflow;
531 if ((addend % 2) != 0)
532 return bfd_reloc_dangerous;
534 insn = bfd_get_16 (abfd, address);
535 insn &= ~ 0xf870;
536 insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
537 break;
539 case R_V850_HI16:
540 addend += (bfd_get_16 (abfd, address) << 16);
541 addend = (addend >> 16);
542 insn = addend;
543 break;
545 case R_V850_HI16_S:
546 /* Remember where this relocation took place. */
547 remember_hi16s_reloc (abfd, addend, address);
549 addend += (bfd_get_16 (abfd, address) << 16);
550 addend = (addend >> 16) + ((addend & 0x8000) != 0);
552 /* This relocation cannot overflow. */
553 if (addend > 0x7fff)
554 addend = 0;
556 insn = addend;
557 break;
559 case R_V850_LO16:
560 insn = bfd_get_16 (abfd, address);
561 if (! v850_elf_perform_lo16_relocation (abfd, &insn, addend))
562 return bfd_reloc_overflow;
563 break;
565 case R_V850_8:
566 addend += (char) bfd_get_8 (abfd, address);
568 saddend = (bfd_signed_vma) addend;
570 if (saddend > 0x7f || saddend < -0x80)
571 return bfd_reloc_overflow;
573 bfd_put_8 (abfd, addend, address);
574 return bfd_reloc_ok;
576 case R_V850_CALLT_16_16_OFFSET:
577 addend += bfd_get_16 (abfd, address);
579 saddend = (bfd_signed_vma) addend;
581 if (saddend > 0xffff || saddend < 0)
582 return bfd_reloc_overflow;
584 insn = addend;
585 break;
587 case R_V850_16:
588 case R_V850_SDA_16_16_OFFSET:
589 case R_V850_ZDA_16_16_OFFSET:
590 case R_V850_TDA_16_16_OFFSET:
591 addend += bfd_get_16 (abfd, address);
593 saddend = (bfd_signed_vma) addend;
595 if (saddend > 0x7fff || saddend < -0x8000)
596 return bfd_reloc_overflow;
598 insn = addend;
599 break;
601 case R_V850_SDA_15_16_OFFSET:
602 case R_V850_ZDA_15_16_OFFSET:
603 insn = bfd_get_16 (abfd, address);
604 addend += (insn & 0xfffe);
606 saddend = (bfd_signed_vma) addend;
608 if (saddend > 0x7ffe || saddend < -0x8000)
609 return bfd_reloc_overflow;
611 if (addend & 1)
612 return bfd_reloc_dangerous;
614 insn = (addend &~ (bfd_vma) 1) | (insn & 1);
615 break;
617 case R_V850_TDA_6_8_OFFSET:
618 insn = bfd_get_16 (abfd, address);
619 addend += ((insn & 0x7e) << 1);
621 saddend = (bfd_signed_vma) addend;
623 if (saddend > 0xfc || saddend < 0)
624 return bfd_reloc_overflow;
626 if (addend & 3)
627 return bfd_reloc_dangerous;
629 insn &= 0xff81;
630 insn |= (addend >> 1);
631 break;
633 case R_V850_TDA_7_8_OFFSET:
634 insn = bfd_get_16 (abfd, address);
635 addend += ((insn & 0x7f) << 1);
637 saddend = (bfd_signed_vma) addend;
639 if (saddend > 0xfe || saddend < 0)
640 return bfd_reloc_overflow;
642 if (addend & 1)
643 return bfd_reloc_dangerous;
645 insn &= 0xff80;
646 insn |= (addend >> 1);
647 break;
649 case R_V850_TDA_7_7_OFFSET:
650 insn = bfd_get_16 (abfd, address);
651 addend += insn & 0x7f;
653 saddend = (bfd_signed_vma) addend;
655 if (saddend > 0x7f || saddend < 0)
656 return bfd_reloc_overflow;
658 insn &= 0xff80;
659 insn |= addend;
660 break;
662 case R_V850_TDA_4_5_OFFSET:
663 insn = bfd_get_16 (abfd, address);
664 addend += ((insn & 0xf) << 1);
666 saddend = (bfd_signed_vma) addend;
668 if (saddend > 0x1e || saddend < 0)
669 return bfd_reloc_overflow;
671 if (addend & 1)
672 return bfd_reloc_dangerous;
674 insn &= 0xfff0;
675 insn |= (addend >> 1);
676 break;
678 case R_V850_TDA_4_4_OFFSET:
679 insn = bfd_get_16 (abfd, address);
680 addend += insn & 0xf;
682 saddend = (bfd_signed_vma) addend;
684 if (saddend > 0xf || saddend < 0)
685 return bfd_reloc_overflow;
687 insn &= 0xfff0;
688 insn |= addend;
689 break;
691 case R_V850_LO16_SPLIT_OFFSET:
692 insn = bfd_get_32 (abfd, address);
693 result = ((insn & 0xfffe0000) >> 16) | ((insn & 0x20) >> 5);
694 if (! v850_elf_perform_lo16_relocation (abfd, &result, addend))
695 return bfd_reloc_overflow;
696 insn = (((result << 16) & 0xfffe0000)
697 | ((result << 5) & 0x20)
698 | (insn & ~0xfffe0020));
699 bfd_put_32 (abfd, insn, address);
700 return bfd_reloc_ok;
702 case R_V850_ZDA_16_16_SPLIT_OFFSET:
703 case R_V850_SDA_16_16_SPLIT_OFFSET:
704 insn = bfd_get_32 (abfd, address);
705 addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
707 saddend = (bfd_signed_vma) addend;
709 if (saddend > 0x7fff || saddend < -0x8000)
710 return bfd_reloc_overflow;
712 insn &= 0x0001ffdf;
713 insn |= (addend & 1) << 5;
714 insn |= (addend &~ (bfd_vma) 1) << 16;
716 bfd_put_32 (abfd, (bfd_vma) insn, address);
717 return bfd_reloc_ok;
719 case R_V850_CALLT_6_7_OFFSET:
720 insn = bfd_get_16 (abfd, address);
721 addend += ((insn & 0x3f) << 1);
723 saddend = (bfd_signed_vma) addend;
725 if (saddend > 0x7e || saddend < 0)
726 return bfd_reloc_overflow;
728 if (addend & 1)
729 return bfd_reloc_dangerous;
731 insn &= 0xff80;
732 insn |= (addend >> 1);
733 break;
735 case R_V850_GNU_VTINHERIT:
736 case R_V850_GNU_VTENTRY:
737 return bfd_reloc_ok;
741 bfd_put_16 (abfd, (bfd_vma) insn, address);
742 return bfd_reloc_ok;
745 /* Insert the addend into the instruction. */
747 static bfd_reloc_status_type
748 v850_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED,
749 arelent *reloc,
750 asymbol *symbol,
751 void * data ATTRIBUTE_UNUSED,
752 asection *isection,
753 bfd *obfd,
754 char **err ATTRIBUTE_UNUSED)
756 long relocation;
758 /* If there is an output BFD,
759 and the symbol is not a section name (which is only defined at final link time),
760 and either we are not putting the addend into the instruction
761 or the addend is zero, so there is nothing to add into the instruction
762 then just fixup the address and return. */
763 if (obfd != NULL
764 && (symbol->flags & BSF_SECTION_SYM) == 0
765 && (! reloc->howto->partial_inplace
766 || reloc->addend == 0))
768 reloc->address += isection->output_offset;
769 return bfd_reloc_ok;
772 /* Catch relocs involving undefined symbols. */
773 if (bfd_is_und_section (symbol->section)
774 && (symbol->flags & BSF_WEAK) == 0
775 && obfd == NULL)
776 return bfd_reloc_undefined;
778 /* We handle final linking of some relocs ourselves. */
780 /* Is the address of the relocation really within the section? */
781 if (reloc->address > bfd_get_section_limit (abfd, isection))
782 return bfd_reloc_outofrange;
784 /* Work out which section the relocation is targeted at and the
785 initial relocation command value. */
787 if (reloc->howto->pc_relative)
788 return bfd_reloc_ok;
790 /* Get symbol value. (Common symbols are special.) */
791 if (bfd_is_com_section (symbol->section))
792 relocation = 0;
793 else
794 relocation = symbol->value;
796 /* Convert input-section-relative symbol value to absolute + addend. */
797 relocation += symbol->section->output_section->vma;
798 relocation += symbol->section->output_offset;
799 relocation += reloc->addend;
801 reloc->addend = relocation;
802 return bfd_reloc_ok;
805 /* This function is used for relocs which are only used
806 for relaxing, which the linker should otherwise ignore. */
808 static bfd_reloc_status_type
809 v850_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
810 arelent *reloc_entry,
811 asymbol *symbol ATTRIBUTE_UNUSED,
812 void * data ATTRIBUTE_UNUSED,
813 asection *input_section,
814 bfd *output_bfd,
815 char **error_message ATTRIBUTE_UNUSED)
817 if (output_bfd != NULL)
818 reloc_entry->address += input_section->output_offset;
820 return bfd_reloc_ok;
822 /* Note: It is REQUIRED that the 'type' value of each entry
823 in this array match the index of the entry in the array. */
824 static reloc_howto_type v850_elf_howto_table[] =
826 /* This reloc does nothing. */
827 HOWTO (R_V850_NONE, /* Type. */
828 0, /* Rightshift. */
829 2, /* Size (0 = byte, 1 = short, 2 = long). */
830 32, /* Bitsize. */
831 FALSE, /* PC_relative. */
832 0, /* Bitpos. */
833 complain_overflow_bitfield, /* Complain_on_overflow. */
834 bfd_elf_generic_reloc, /* Special_function. */
835 "R_V850_NONE", /* Name. */
836 FALSE, /* Partial_inplace. */
837 0, /* Src_mask. */
838 0, /* Dst_mask. */
839 FALSE), /* PCrel_offset. */
841 /* A PC relative 9 bit branch. */
842 HOWTO (R_V850_9_PCREL, /* Type. */
843 2, /* Rightshift. */
844 2, /* Size (0 = byte, 1 = short, 2 = long). */
845 26, /* Bitsize. */
846 TRUE, /* PC_relative. */
847 0, /* Bitpos. */
848 complain_overflow_bitfield, /* Complain_on_overflow. */
849 v850_elf_reloc, /* Special_function. */
850 "R_V850_9_PCREL", /* Name. */
851 FALSE, /* Partial_inplace. */
852 0x00ffffff, /* Src_mask. */
853 0x00ffffff, /* Dst_mask. */
854 TRUE), /* PCrel_offset. */
856 /* A PC relative 22 bit branch. */
857 HOWTO (R_V850_22_PCREL, /* Type. */
858 2, /* Rightshift. */
859 2, /* Size (0 = byte, 1 = short, 2 = long). */
860 22, /* Bitsize. */
861 TRUE, /* PC_relative. */
862 7, /* Bitpos. */
863 complain_overflow_signed, /* Complain_on_overflow. */
864 v850_elf_reloc, /* Special_function. */
865 "R_V850_22_PCREL", /* Name. */
866 FALSE, /* Partial_inplace. */
867 0x07ffff80, /* Src_mask. */
868 0x07ffff80, /* Dst_mask. */
869 TRUE), /* PCrel_offset. */
871 /* High 16 bits of symbol value. */
872 HOWTO (R_V850_HI16_S, /* Type. */
873 0, /* Rightshift. */
874 1, /* Size (0 = byte, 1 = short, 2 = long). */
875 16, /* Bitsize. */
876 FALSE, /* PC_relative. */
877 0, /* Bitpos. */
878 complain_overflow_dont, /* Complain_on_overflow. */
879 v850_elf_reloc, /* Special_function. */
880 "R_V850_HI16_S", /* Name. */
881 FALSE, /* Partial_inplace. */
882 0xffff, /* Src_mask. */
883 0xffff, /* Dst_mask. */
884 FALSE), /* PCrel_offset. */
886 /* High 16 bits of symbol value. */
887 HOWTO (R_V850_HI16, /* Type. */
888 0, /* Rightshift. */
889 1, /* Size (0 = byte, 1 = short, 2 = long). */
890 16, /* Bitsize. */
891 FALSE, /* PC_relative. */
892 0, /* Bitpos. */
893 complain_overflow_dont, /* Complain_on_overflow. */
894 v850_elf_reloc, /* Special_function. */
895 "R_V850_HI16", /* Name. */
896 FALSE, /* Partial_inplace. */
897 0xffff, /* Src_mask. */
898 0xffff, /* Dst_mask. */
899 FALSE), /* PCrel_offset. */
901 /* Low 16 bits of symbol value. */
902 HOWTO (R_V850_LO16, /* Type. */
903 0, /* Rightshift. */
904 1, /* Size (0 = byte, 1 = short, 2 = long). */
905 16, /* Bitsize. */
906 FALSE, /* PC_relative. */
907 0, /* Bitpos. */
908 complain_overflow_dont, /* Complain_on_overflow. */
909 v850_elf_reloc, /* Special_function. */
910 "R_V850_LO16", /* Name. */
911 FALSE, /* Partial_inplace. */
912 0xffff, /* Src_mask. */
913 0xffff, /* Dst_mask. */
914 FALSE), /* PCrel_offset. */
916 /* Simple 32bit reloc. */
917 HOWTO (R_V850_ABS32, /* Type. */
918 0, /* Rightshift. */
919 2, /* Size (0 = byte, 1 = short, 2 = long). */
920 32, /* Bitsize. */
921 FALSE, /* PC_relative. */
922 0, /* Bitpos. */
923 complain_overflow_dont, /* Complain_on_overflow. */
924 v850_elf_reloc, /* Special_function. */
925 "R_V850_ABS32", /* Name. */
926 FALSE, /* Partial_inplace. */
927 0xffffffff, /* Src_mask. */
928 0xffffffff, /* Dst_mask. */
929 FALSE), /* PCrel_offset. */
931 /* Simple 16bit reloc. */
932 HOWTO (R_V850_16, /* Type. */
933 0, /* Rightshift. */
934 1, /* Size (0 = byte, 1 = short, 2 = long). */
935 16, /* Bitsize. */
936 FALSE, /* PC_relative. */
937 0, /* Bitpos. */
938 complain_overflow_dont, /* Complain_on_overflow. */
939 bfd_elf_generic_reloc, /* Special_function. */
940 "R_V850_16", /* Name. */
941 FALSE, /* Partial_inplace. */
942 0xffff, /* Src_mask. */
943 0xffff, /* Dst_mask. */
944 FALSE), /* PCrel_offset. */
946 /* Simple 8bit reloc. */
947 HOWTO (R_V850_8, /* Type. */
948 0, /* Rightshift. */
949 0, /* Size (0 = byte, 1 = short, 2 = long). */
950 8, /* Bitsize. */
951 FALSE, /* PC_relative. */
952 0, /* Bitpos. */
953 complain_overflow_dont, /* Complain_on_overflow. */
954 bfd_elf_generic_reloc, /* Special_function. */
955 "R_V850_8", /* Name. */
956 FALSE, /* Partial_inplace. */
957 0xff, /* Src_mask. */
958 0xff, /* Dst_mask. */
959 FALSE), /* PCrel_offset. */
961 /* 16 bit offset from the short data area pointer. */
962 HOWTO (R_V850_SDA_16_16_OFFSET, /* Type. */
963 0, /* Rightshift. */
964 1, /* Size (0 = byte, 1 = short, 2 = long). */
965 16, /* Bitsize. */
966 FALSE, /* PC_relative. */
967 0, /* Bitpos. */
968 complain_overflow_dont, /* Complain_on_overflow. */
969 v850_elf_reloc, /* Special_function. */
970 "R_V850_SDA_16_16_OFFSET", /* Name. */
971 FALSE, /* Partial_inplace. */
972 0xffff, /* Src_mask. */
973 0xffff, /* Dst_mask. */
974 FALSE), /* PCrel_offset. */
976 /* 15 bit offset from the short data area pointer. */
977 HOWTO (R_V850_SDA_15_16_OFFSET, /* Type. */
978 1, /* Rightshift. */
979 1, /* Size (0 = byte, 1 = short, 2 = long). */
980 16, /* Bitsize. */
981 FALSE, /* PC_relative. */
982 1, /* Bitpos. */
983 complain_overflow_dont, /* Complain_on_overflow. */
984 v850_elf_reloc, /* Special_function. */
985 "R_V850_SDA_15_16_OFFSET", /* Name. */
986 FALSE, /* Partial_inplace. */
987 0xfffe, /* Src_mask. */
988 0xfffe, /* Dst_mask. */
989 FALSE), /* PCrel_offset. */
991 /* 16 bit offset from the zero data area pointer. */
992 HOWTO (R_V850_ZDA_16_16_OFFSET, /* Type. */
993 0, /* Rightshift. */
994 1, /* Size (0 = byte, 1 = short, 2 = long). */
995 16, /* Bitsize. */
996 FALSE, /* PC_relative. */
997 0, /* Bitpos. */
998 complain_overflow_dont, /* Complain_on_overflow. */
999 v850_elf_reloc, /* Special_function. */
1000 "R_V850_ZDA_16_16_OFFSET", /* Name. */
1001 FALSE, /* Partial_inplace. */
1002 0xffff, /* Src_mask. */
1003 0xffff, /* Dst_mask. */
1004 FALSE), /* PCrel_offset. */
1006 /* 15 bit offset from the zero data area pointer. */
1007 HOWTO (R_V850_ZDA_15_16_OFFSET, /* Type. */
1008 1, /* Rightshift. */
1009 1, /* Size (0 = byte, 1 = short, 2 = long). */
1010 16, /* Bitsize. */
1011 FALSE, /* PC_relative. */
1012 1, /* Bitpos. */
1013 complain_overflow_dont, /* Complain_on_overflow. */
1014 v850_elf_reloc, /* Special_function. */
1015 "R_V850_ZDA_15_16_OFFSET", /* Name. */
1016 FALSE, /* Partial_inplace. */
1017 0xfffe, /* Src_mask. */
1018 0xfffe, /* Dst_mask. */
1019 FALSE), /* PCrel_offset. */
1021 /* 6 bit offset from the tiny data area pointer. */
1022 HOWTO (R_V850_TDA_6_8_OFFSET, /* Type. */
1023 2, /* Rightshift. */
1024 1, /* Size (0 = byte, 1 = short, 2 = long). */
1025 8, /* Bitsize. */
1026 FALSE, /* PC_relative. */
1027 1, /* Bitpos. */
1028 complain_overflow_dont, /* Complain_on_overflow. */
1029 v850_elf_reloc, /* Special_function. */
1030 "R_V850_TDA_6_8_OFFSET", /* Name. */
1031 FALSE, /* Partial_inplace. */
1032 0x7e, /* Src_mask. */
1033 0x7e, /* Dst_mask. */
1034 FALSE), /* PCrel_offset. */
1036 /* 8 bit offset from the tiny data area pointer. */
1037 HOWTO (R_V850_TDA_7_8_OFFSET, /* Type. */
1038 1, /* Rightshift. */
1039 1, /* Size (0 = byte, 1 = short, 2 = long). */
1040 8, /* Bitsize. */
1041 FALSE, /* PC_relative. */
1042 0, /* Bitpos. */
1043 complain_overflow_dont, /* Complain_on_overflow. */
1044 v850_elf_reloc, /* Special_function. */
1045 "R_V850_TDA_7_8_OFFSET", /* Name. */
1046 FALSE, /* Partial_inplace. */
1047 0x7f, /* Src_mask. */
1048 0x7f, /* Dst_mask. */
1049 FALSE), /* PCrel_offset. */
1051 /* 7 bit offset from the tiny data area pointer. */
1052 HOWTO (R_V850_TDA_7_7_OFFSET, /* Type. */
1053 0, /* Rightshift. */
1054 1, /* Size (0 = byte, 1 = short, 2 = long). */
1055 7, /* Bitsize. */
1056 FALSE, /* PC_relative. */
1057 0, /* Bitpos. */
1058 complain_overflow_dont, /* Complain_on_overflow. */
1059 v850_elf_reloc, /* Special_function. */
1060 "R_V850_TDA_7_7_OFFSET", /* Name. */
1061 FALSE, /* Partial_inplace. */
1062 0x7f, /* Src_mask. */
1063 0x7f, /* Dst_mask. */
1064 FALSE), /* PCrel_offset. */
1066 /* 16 bit offset from the tiny data area pointer! */
1067 HOWTO (R_V850_TDA_16_16_OFFSET, /* Type. */
1068 0, /* Rightshift. */
1069 1, /* Size (0 = byte, 1 = short, 2 = long). */
1070 16, /* Bitsize. */
1071 FALSE, /* PC_relative. */
1072 0, /* Bitpos. */
1073 complain_overflow_dont, /* Complain_on_overflow. */
1074 v850_elf_reloc, /* Special_function. */
1075 "R_V850_TDA_16_16_OFFSET", /* Name. */
1076 FALSE, /* Partial_inplace. */
1077 0xffff, /* Src_mask. */
1078 0xfff, /* Dst_mask. */
1079 FALSE), /* PCrel_offset. */
1081 /* 5 bit offset from the tiny data area pointer. */
1082 HOWTO (R_V850_TDA_4_5_OFFSET, /* Type. */
1083 1, /* Rightshift. */
1084 1, /* Size (0 = byte, 1 = short, 2 = long). */
1085 5, /* Bitsize. */
1086 FALSE, /* PC_relative. */
1087 0, /* Bitpos. */
1088 complain_overflow_dont, /* Complain_on_overflow. */
1089 v850_elf_reloc, /* Special_function. */
1090 "R_V850_TDA_4_5_OFFSET", /* Name. */
1091 FALSE, /* Partial_inplace. */
1092 0x0f, /* Src_mask. */
1093 0x0f, /* Dst_mask. */
1094 FALSE), /* PCrel_offset. */
1096 /* 4 bit offset from the tiny data area pointer. */
1097 HOWTO (R_V850_TDA_4_4_OFFSET, /* Type. */
1098 0, /* Rightshift. */
1099 1, /* Size (0 = byte, 1 = short, 2 = long). */
1100 4, /* Bitsize. */
1101 FALSE, /* PC_relative. */
1102 0, /* Bitpos. */
1103 complain_overflow_dont, /* Complain_on_overflow. */
1104 v850_elf_reloc, /* Special_function. */
1105 "R_V850_TDA_4_4_OFFSET", /* Name. */
1106 FALSE, /* Partial_inplace. */
1107 0x0f, /* Src_mask. */
1108 0x0f, /* Dst_mask. */
1109 FALSE), /* PCrel_offset. */
1111 /* 16 bit offset from the short data area pointer. */
1112 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* Type. */
1113 0, /* Rightshift. */
1114 2, /* Size (0 = byte, 1 = short, 2 = long). */
1115 16, /* Bitsize. */
1116 FALSE, /* PC_relative. */
1117 0, /* Bitpos. */
1118 complain_overflow_dont, /* Complain_on_overflow. */
1119 v850_elf_reloc, /* Special_function. */
1120 "R_V850_SDA_16_16_SPLIT_OFFSET",/* Name. */
1121 FALSE, /* Partial_inplace. */
1122 0xfffe0020, /* Src_mask. */
1123 0xfffe0020, /* Dst_mask. */
1124 FALSE), /* PCrel_offset. */
1126 /* 16 bit offset from the zero data area pointer. */
1127 HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* Type. */
1128 0, /* Rightshift. */
1129 2, /* Size (0 = byte, 1 = short, 2 = long). */
1130 16, /* Bitsize. */
1131 FALSE, /* PC_relative. */
1132 0, /* Bitpos. */
1133 complain_overflow_dont, /* Complain_on_overflow. */
1134 v850_elf_reloc, /* Special_function. */
1135 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* Name. */
1136 FALSE, /* Partial_inplace. */
1137 0xfffe0020, /* Src_mask. */
1138 0xfffe0020, /* Dst_mask. */
1139 FALSE), /* PCrel_offset. */
1141 /* 6 bit offset from the call table base pointer. */
1142 HOWTO (R_V850_CALLT_6_7_OFFSET, /* Type. */
1143 0, /* Rightshift. */
1144 1, /* Size (0 = byte, 1 = short, 2 = long). */
1145 7, /* Bitsize. */
1146 FALSE, /* PC_relative. */
1147 0, /* Bitpos. */
1148 complain_overflow_dont, /* Complain_on_overflow. */
1149 v850_elf_reloc, /* Special_function. */
1150 "R_V850_CALLT_6_7_OFFSET", /* Name. */
1151 FALSE, /* Partial_inplace. */
1152 0x3f, /* Src_mask. */
1153 0x3f, /* Dst_mask. */
1154 FALSE), /* PCrel_offset. */
1156 /* 16 bit offset from the call table base pointer. */
1157 HOWTO (R_V850_CALLT_16_16_OFFSET, /* Type. */
1158 0, /* Rightshift. */
1159 1, /* Size (0 = byte, 1 = short, 2 = long). */
1160 16, /* Bitsize. */
1161 FALSE, /* PC_relative. */
1162 0, /* Bitpos. */
1163 complain_overflow_dont, /* Complain_on_overflow. */
1164 v850_elf_reloc, /* Special_function. */
1165 "R_V850_CALLT_16_16_OFFSET", /* Name. */
1166 FALSE, /* Partial_inplace. */
1167 0xffff, /* Src_mask. */
1168 0xffff, /* Dst_mask. */
1169 FALSE), /* PCrel_offset. */
1171 /* GNU extension to record C++ vtable hierarchy */
1172 HOWTO (R_V850_GNU_VTINHERIT, /* Type. */
1173 0, /* Rightshift. */
1174 2, /* Size (0 = byte, 1 = short, 2 = long). */
1175 0, /* Bitsize. */
1176 FALSE, /* PC_relative. */
1177 0, /* Bitpos. */
1178 complain_overflow_dont, /* Complain_on_overflow. */
1179 NULL, /* Special_function. */
1180 "R_V850_GNU_VTINHERIT", /* Name. */
1181 FALSE, /* Partial_inplace. */
1182 0, /* Src_mask. */
1183 0, /* Dst_mask. */
1184 FALSE), /* PCrel_offset. */
1186 /* GNU extension to record C++ vtable member usage */
1187 HOWTO (R_V850_GNU_VTENTRY, /* Type. */
1188 0, /* Rightshift. */
1189 2, /* Size (0 = byte, 1 = short, 2 = long). */
1190 0, /* Bitsize. */
1191 FALSE, /* PC_relative. */
1192 0, /* Bitpos. */
1193 complain_overflow_dont, /* Complain_on_overflow. */
1194 _bfd_elf_rel_vtable_reloc_fn, /* Special_function. */
1195 "R_V850_GNU_VTENTRY", /* Name. */
1196 FALSE, /* Partial_inplace. */
1197 0, /* Src_mask. */
1198 0, /* Dst_mask. */
1199 FALSE), /* PCrel_offset. */
1201 /* Indicates a .longcall pseudo-op. The compiler will generate a .longcall
1202 pseudo-op when it finds a function call which can be relaxed. */
1203 HOWTO (R_V850_LONGCALL, /* Type. */
1204 0, /* Rightshift. */
1205 2, /* Size (0 = byte, 1 = short, 2 = long). */
1206 32, /* Bitsize. */
1207 TRUE, /* PC_relative. */
1208 0, /* Bitpos. */
1209 complain_overflow_signed, /* Complain_on_overflow. */
1210 v850_elf_ignore_reloc, /* Special_function. */
1211 "R_V850_LONGCALL", /* Name. */
1212 FALSE, /* Partial_inplace. */
1213 0, /* Src_mask. */
1214 0, /* Dst_mask. */
1215 TRUE), /* PCrel_offset. */
1217 /* Indicates a .longjump pseudo-op. The compiler will generate a
1218 .longjump pseudo-op when it finds a branch which can be relaxed. */
1219 HOWTO (R_V850_LONGJUMP, /* Type. */
1220 0, /* Rightshift. */
1221 2, /* Size (0 = byte, 1 = short, 2 = long). */
1222 32, /* Bitsize. */
1223 TRUE, /* PC_relative. */
1224 0, /* Bitpos. */
1225 complain_overflow_signed, /* Complain_on_overflow. */
1226 v850_elf_ignore_reloc, /* Special_function. */
1227 "R_V850_LONGJUMP", /* Name. */
1228 FALSE, /* Partial_inplace. */
1229 0, /* Src_mask. */
1230 0, /* Dst_mask. */
1231 TRUE), /* PCrel_offset. */
1233 HOWTO (R_V850_ALIGN, /* Type. */
1234 0, /* Rightshift. */
1235 1, /* Size (0 = byte, 1 = short, 2 = long). */
1236 0, /* Bitsize. */
1237 FALSE, /* PC_relative. */
1238 0, /* Bitpos. */
1239 complain_overflow_unsigned, /* Complain_on_overflow. */
1240 v850_elf_ignore_reloc, /* Special_function. */
1241 "R_V850_ALIGN", /* Name. */
1242 FALSE, /* Partial_inplace. */
1243 0, /* Src_mask. */
1244 0, /* Dst_mask. */
1245 TRUE), /* PCrel_offset. */
1247 /* Simple pc-relative 32bit reloc. */
1248 HOWTO (R_V850_REL32, /* Type. */
1249 0, /* Rightshift. */
1250 2, /* Size (0 = byte, 1 = short, 2 = long). */
1251 32, /* Bitsize. */
1252 TRUE, /* PC_relative. */
1253 0, /* Bitpos. */
1254 complain_overflow_dont, /* Complain_on_overflow. */
1255 v850_elf_reloc, /* Special_function. */
1256 "R_V850_REL32", /* Name. */
1257 FALSE, /* Partial_inplace. */
1258 0xffffffff, /* Src_mask. */
1259 0xffffffff, /* Dst_mask. */
1260 FALSE), /* PCrel_offset. */
1262 /* An ld.bu version of R_V850_LO16. */
1263 HOWTO (R_V850_LO16_SPLIT_OFFSET, /* Type. */
1264 0, /* Rightshift. */
1265 2, /* Size (0 = byte, 1 = short, 2 = long). */
1266 16, /* Bitsize. */
1267 FALSE, /* PC_relative. */
1268 0, /* Bitpos. */
1269 complain_overflow_dont, /* Complain_on_overflow. */
1270 v850_elf_reloc, /* Special_function. */
1271 "R_V850_LO16_SPLIT_OFFSET", /* Name. */
1272 FALSE, /* Partial_inplace. */
1273 0xfffe0020, /* Src_mask. */
1274 0xfffe0020, /* Dst_mask. */
1275 FALSE), /* PCrel_offset. */
1278 /* Map BFD reloc types to V850 ELF reloc types. */
1280 struct v850_elf_reloc_map
1282 /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
1283 unsigned char. */
1284 bfd_reloc_code_real_type bfd_reloc_val;
1285 unsigned int elf_reloc_val;
1288 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
1290 { BFD_RELOC_NONE, R_V850_NONE },
1291 { BFD_RELOC_V850_9_PCREL, R_V850_9_PCREL },
1292 { BFD_RELOC_V850_22_PCREL, R_V850_22_PCREL },
1293 { BFD_RELOC_HI16_S, R_V850_HI16_S },
1294 { BFD_RELOC_HI16, R_V850_HI16 },
1295 { BFD_RELOC_LO16, R_V850_LO16 },
1296 { BFD_RELOC_32, R_V850_ABS32 },
1297 { BFD_RELOC_32_PCREL, R_V850_REL32 },
1298 { BFD_RELOC_16, R_V850_16 },
1299 { BFD_RELOC_8, R_V850_8 },
1300 { BFD_RELOC_V850_SDA_16_16_OFFSET, R_V850_SDA_16_16_OFFSET },
1301 { BFD_RELOC_V850_SDA_15_16_OFFSET, R_V850_SDA_15_16_OFFSET },
1302 { BFD_RELOC_V850_ZDA_16_16_OFFSET, R_V850_ZDA_16_16_OFFSET },
1303 { BFD_RELOC_V850_ZDA_15_16_OFFSET, R_V850_ZDA_15_16_OFFSET },
1304 { BFD_RELOC_V850_TDA_6_8_OFFSET, R_V850_TDA_6_8_OFFSET },
1305 { BFD_RELOC_V850_TDA_7_8_OFFSET, R_V850_TDA_7_8_OFFSET },
1306 { BFD_RELOC_V850_TDA_7_7_OFFSET, R_V850_TDA_7_7_OFFSET },
1307 { BFD_RELOC_V850_TDA_16_16_OFFSET, R_V850_TDA_16_16_OFFSET },
1308 { BFD_RELOC_V850_TDA_4_5_OFFSET, R_V850_TDA_4_5_OFFSET },
1309 { BFD_RELOC_V850_TDA_4_4_OFFSET, R_V850_TDA_4_4_OFFSET },
1310 { BFD_RELOC_V850_LO16_SPLIT_OFFSET, R_V850_LO16_SPLIT_OFFSET },
1311 { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
1312 { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
1313 { BFD_RELOC_V850_CALLT_6_7_OFFSET, R_V850_CALLT_6_7_OFFSET },
1314 { BFD_RELOC_V850_CALLT_16_16_OFFSET, R_V850_CALLT_16_16_OFFSET },
1315 { BFD_RELOC_VTABLE_INHERIT, R_V850_GNU_VTINHERIT },
1316 { BFD_RELOC_VTABLE_ENTRY, R_V850_GNU_VTENTRY },
1317 { BFD_RELOC_V850_LONGCALL, R_V850_LONGCALL },
1318 { BFD_RELOC_V850_LONGJUMP, R_V850_LONGJUMP },
1319 { BFD_RELOC_V850_ALIGN, R_V850_ALIGN },
1323 /* Map a bfd relocation into the appropriate howto structure. */
1325 static reloc_howto_type *
1326 v850_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1327 bfd_reloc_code_real_type code)
1329 unsigned int i;
1331 for (i = ARRAY_SIZE (v850_elf_reloc_map); i --;)
1332 if (v850_elf_reloc_map[i].bfd_reloc_val == code)
1334 unsigned int elf_reloc_val = v850_elf_reloc_map[i].elf_reloc_val;
1336 BFD_ASSERT (v850_elf_howto_table[elf_reloc_val].type == elf_reloc_val);
1338 return v850_elf_howto_table + elf_reloc_val;
1341 return NULL;
1344 static reloc_howto_type *
1345 v850_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1346 const char *r_name)
1348 unsigned int i;
1350 for (i = 0;
1351 i < sizeof (v850_elf_howto_table) / sizeof (v850_elf_howto_table[0]);
1352 i++)
1353 if (v850_elf_howto_table[i].name != NULL
1354 && strcasecmp (v850_elf_howto_table[i].name, r_name) == 0)
1355 return &v850_elf_howto_table[i];
1357 return NULL;
1360 /* Set the howto pointer for an V850 ELF reloc. */
1362 static void
1363 v850_elf_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
1364 arelent *cache_ptr,
1365 Elf_Internal_Rela *dst)
1367 unsigned int r_type;
1369 r_type = ELF32_R_TYPE (dst->r_info);
1370 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1371 cache_ptr->howto = &v850_elf_howto_table[r_type];
1374 /* Set the howto pointer for a V850 ELF reloc (type RELA). */
1376 static void
1377 v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
1378 arelent * cache_ptr,
1379 Elf_Internal_Rela *dst)
1381 unsigned int r_type;
1383 r_type = ELF32_R_TYPE (dst->r_info);
1384 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
1385 cache_ptr->howto = &v850_elf_howto_table[r_type];
1388 static bfd_boolean
1389 v850_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1391 return ( (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1392 || (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1395 /* We overload some of the bfd_reloc error codes for own purposes. */
1396 #define bfd_reloc_gp_not_found bfd_reloc_other
1397 #define bfd_reloc_ep_not_found bfd_reloc_continue
1398 #define bfd_reloc_ctbp_not_found (bfd_reloc_dangerous + 1)
1400 /* Perform a relocation as part of a final link. */
1402 static bfd_reloc_status_type
1403 v850_elf_final_link_relocate (reloc_howto_type *howto,
1404 bfd *input_bfd,
1405 bfd *output_bfd ATTRIBUTE_UNUSED,
1406 asection *input_section,
1407 bfd_byte *contents,
1408 bfd_vma offset,
1409 bfd_vma value,
1410 bfd_vma addend,
1411 struct bfd_link_info *info,
1412 asection *sym_sec,
1413 int is_local ATTRIBUTE_UNUSED)
1415 unsigned int r_type = howto->type;
1416 bfd_byte *hit_data = contents + offset;
1418 /* Adjust the value according to the relocation. */
1419 switch (r_type)
1421 case R_V850_9_PCREL:
1422 value -= (input_section->output_section->vma
1423 + input_section->output_offset);
1424 value -= offset;
1425 break;
1427 case R_V850_22_PCREL:
1428 value -= (input_section->output_section->vma
1429 + input_section->output_offset
1430 + offset);
1432 /* If the sign extension will corrupt the value then we have overflowed. */
1433 if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1434 return bfd_reloc_overflow;
1436 /* Only the bottom 24 bits of the PC are valid. */
1437 value = SEXT24 (value);
1438 break;
1440 case R_V850_REL32:
1441 value -= (input_section->output_section->vma
1442 + input_section->output_offset
1443 + offset);
1444 break;
1446 case R_V850_HI16_S:
1447 case R_V850_HI16:
1448 case R_V850_LO16:
1449 case R_V850_LO16_SPLIT_OFFSET:
1450 case R_V850_16:
1451 case R_V850_ABS32:
1452 case R_V850_8:
1453 break;
1455 case R_V850_ZDA_15_16_OFFSET:
1456 case R_V850_ZDA_16_16_OFFSET:
1457 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1458 if (sym_sec == NULL)
1459 return bfd_reloc_undefined;
1461 value -= sym_sec->output_section->vma;
1462 break;
1464 case R_V850_SDA_15_16_OFFSET:
1465 case R_V850_SDA_16_16_OFFSET:
1466 case R_V850_SDA_16_16_SPLIT_OFFSET:
1468 unsigned long gp;
1469 struct bfd_link_hash_entry * h;
1471 if (sym_sec == NULL)
1472 return bfd_reloc_undefined;
1474 /* Get the value of __gp. */
1475 h = bfd_link_hash_lookup (info->hash, "__gp", FALSE, FALSE, TRUE);
1476 if (h == NULL
1477 || h->type != bfd_link_hash_defined)
1478 return bfd_reloc_gp_not_found;
1480 gp = (h->u.def.value
1481 + h->u.def.section->output_section->vma
1482 + h->u.def.section->output_offset);
1484 value -= sym_sec->output_section->vma;
1485 value -= (gp - sym_sec->output_section->vma);
1487 break;
1489 case R_V850_TDA_4_4_OFFSET:
1490 case R_V850_TDA_4_5_OFFSET:
1491 case R_V850_TDA_16_16_OFFSET:
1492 case R_V850_TDA_7_7_OFFSET:
1493 case R_V850_TDA_7_8_OFFSET:
1494 case R_V850_TDA_6_8_OFFSET:
1496 unsigned long ep;
1497 struct bfd_link_hash_entry * h;
1499 /* Get the value of __ep. */
1500 h = bfd_link_hash_lookup (info->hash, "__ep", FALSE, FALSE, TRUE);
1501 if (h == NULL
1502 || h->type != bfd_link_hash_defined)
1503 return bfd_reloc_ep_not_found;
1505 ep = (h->u.def.value
1506 + h->u.def.section->output_section->vma
1507 + h->u.def.section->output_offset);
1509 value -= ep;
1511 break;
1513 case R_V850_CALLT_6_7_OFFSET:
1515 unsigned long ctbp;
1516 struct bfd_link_hash_entry * h;
1518 /* Get the value of __ctbp. */
1519 h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1520 if (h == NULL
1521 || h->type != bfd_link_hash_defined)
1522 return bfd_reloc_ctbp_not_found;
1524 ctbp = (h->u.def.value
1525 + h->u.def.section->output_section->vma
1526 + h->u.def.section->output_offset);
1527 value -= ctbp;
1529 break;
1531 case R_V850_CALLT_16_16_OFFSET:
1533 unsigned long ctbp;
1534 struct bfd_link_hash_entry * h;
1536 if (sym_sec == NULL)
1537 return bfd_reloc_undefined;
1539 /* Get the value of __ctbp. */
1540 h = bfd_link_hash_lookup (info->hash, "__ctbp", FALSE, FALSE, TRUE);
1541 if (h == NULL
1542 || h->type != bfd_link_hash_defined)
1543 return bfd_reloc_ctbp_not_found;
1545 ctbp = (h->u.def.value
1546 + h->u.def.section->output_section->vma
1547 + h->u.def.section->output_offset);
1549 value -= sym_sec->output_section->vma;
1550 value -= (ctbp - sym_sec->output_section->vma);
1552 break;
1554 case R_V850_NONE:
1555 case R_V850_GNU_VTINHERIT:
1556 case R_V850_GNU_VTENTRY:
1557 case R_V850_LONGCALL:
1558 case R_V850_LONGJUMP:
1559 case R_V850_ALIGN:
1560 return bfd_reloc_ok;
1562 default:
1563 return bfd_reloc_notsupported;
1566 /* Perform the relocation. */
1567 return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1570 /* Relocate an V850 ELF section. */
1572 static bfd_boolean
1573 v850_elf_relocate_section (bfd *output_bfd,
1574 struct bfd_link_info *info,
1575 bfd *input_bfd,
1576 asection *input_section,
1577 bfd_byte *contents,
1578 Elf_Internal_Rela *relocs,
1579 Elf_Internal_Sym *local_syms,
1580 asection **local_sections)
1582 Elf_Internal_Shdr *symtab_hdr;
1583 struct elf_link_hash_entry **sym_hashes;
1584 Elf_Internal_Rela *rel;
1585 Elf_Internal_Rela *relend;
1587 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1588 sym_hashes = elf_sym_hashes (input_bfd);
1590 /* Reset the list of remembered HI16S relocs to empty. */
1591 free_hi16s = previous_hi16s;
1592 previous_hi16s = NULL;
1593 hi16s_counter = 0;
1595 rel = relocs;
1596 relend = relocs + input_section->reloc_count;
1597 for (; rel < relend; rel++)
1599 int r_type;
1600 reloc_howto_type *howto;
1601 unsigned long r_symndx;
1602 Elf_Internal_Sym *sym;
1603 asection *sec;
1604 struct elf_link_hash_entry *h;
1605 bfd_vma relocation;
1606 bfd_reloc_status_type r;
1608 r_symndx = ELF32_R_SYM (rel->r_info);
1609 r_type = ELF32_R_TYPE (rel->r_info);
1611 if (r_type == R_V850_GNU_VTENTRY
1612 || r_type == R_V850_GNU_VTINHERIT)
1613 continue;
1615 howto = v850_elf_howto_table + r_type;
1616 h = NULL;
1617 sym = NULL;
1618 sec = NULL;
1619 if (r_symndx < symtab_hdr->sh_info)
1621 sym = local_syms + r_symndx;
1622 sec = local_sections[r_symndx];
1623 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1625 else
1627 bfd_boolean unresolved_reloc, warned;
1629 /* Note - this check is delayed until now as it is possible and
1630 valid to have a file without any symbols but with relocs that
1631 can be processed. */
1632 if (sym_hashes == NULL)
1634 info->callbacks->warning
1635 (info, "no hash table available",
1636 NULL, input_bfd, input_section, (bfd_vma) 0);
1638 return FALSE;
1641 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1642 r_symndx, symtab_hdr, sym_hashes,
1643 h, sec, relocation,
1644 unresolved_reloc, warned);
1647 if (sec != NULL && elf_discarded_section (sec))
1649 /* For relocs against symbols from removed linkonce sections,
1650 or sections discarded by a linker script, we just want the
1651 section contents zeroed. Avoid any special processing. */
1652 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1653 rel->r_info = 0;
1654 rel->r_addend = 0;
1655 continue;
1658 if (info->relocatable)
1659 continue;
1661 /* FIXME: We should use the addend, but the COFF relocations don't. */
1662 r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1663 input_section,
1664 contents, rel->r_offset,
1665 relocation, rel->r_addend,
1666 info, sec, h == NULL);
1668 if (r != bfd_reloc_ok)
1670 const char * name;
1671 const char * msg = NULL;
1673 if (h != NULL)
1674 name = h->root.root.string;
1675 else
1677 name = (bfd_elf_string_from_elf_section
1678 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1679 if (name == NULL || *name == '\0')
1680 name = bfd_section_name (input_bfd, sec);
1683 switch (r)
1685 case bfd_reloc_overflow:
1686 if (! ((*info->callbacks->reloc_overflow)
1687 (info, (h ? &h->root : NULL), name, howto->name,
1688 (bfd_vma) 0, input_bfd, input_section,
1689 rel->r_offset)))
1690 return FALSE;
1691 break;
1693 case bfd_reloc_undefined:
1694 if (! ((*info->callbacks->undefined_symbol)
1695 (info, name, input_bfd, input_section,
1696 rel->r_offset, TRUE)))
1697 return FALSE;
1698 break;
1700 case bfd_reloc_outofrange:
1701 msg = _("internal error: out of range error");
1702 goto common_error;
1704 case bfd_reloc_notsupported:
1705 msg = _("internal error: unsupported relocation error");
1706 goto common_error;
1708 case bfd_reloc_dangerous:
1709 msg = _("internal error: dangerous relocation");
1710 goto common_error;
1712 case bfd_reloc_gp_not_found:
1713 msg = _("could not locate special linker symbol __gp");
1714 goto common_error;
1716 case bfd_reloc_ep_not_found:
1717 msg = _("could not locate special linker symbol __ep");
1718 goto common_error;
1720 case bfd_reloc_ctbp_not_found:
1721 msg = _("could not locate special linker symbol __ctbp");
1722 goto common_error;
1724 default:
1725 msg = _("internal error: unknown error");
1726 /* fall through */
1728 common_error:
1729 if (!((*info->callbacks->warning)
1730 (info, msg, name, input_bfd, input_section,
1731 rel->r_offset)))
1732 return FALSE;
1733 break;
1738 return TRUE;
1741 static asection *
1742 v850_elf_gc_mark_hook (asection *sec,
1743 struct bfd_link_info *info,
1744 Elf_Internal_Rela *rel,
1745 struct elf_link_hash_entry *h,
1746 Elf_Internal_Sym *sym)
1748 if (h != NULL)
1749 switch (ELF32_R_TYPE (rel->r_info))
1751 case R_V850_GNU_VTINHERIT:
1752 case R_V850_GNU_VTENTRY:
1753 return NULL;
1756 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1759 /* Set the right machine number. */
1761 static bfd_boolean
1762 v850_elf_object_p (bfd *abfd)
1764 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1766 default:
1767 case E_V850_ARCH:
1768 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850);
1769 break;
1770 case E_V850E_ARCH:
1771 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e);
1772 break;
1773 case E_V850E1_ARCH:
1774 bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e1);
1775 break;
1777 return TRUE;
1780 /* Store the machine number in the flags field. */
1782 static void
1783 v850_elf_final_write_processing (bfd *abfd,
1784 bfd_boolean linker ATTRIBUTE_UNUSED)
1786 unsigned long val;
1788 switch (bfd_get_mach (abfd))
1790 default:
1791 case bfd_mach_v850: val = E_V850_ARCH; break;
1792 case bfd_mach_v850e: val = E_V850E_ARCH; break;
1793 case bfd_mach_v850e1: val = E_V850E1_ARCH; break;
1796 elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1797 elf_elfheader (abfd)->e_flags |= val;
1800 /* Function to keep V850 specific file flags. */
1802 static bfd_boolean
1803 v850_elf_set_private_flags (bfd *abfd, flagword flags)
1805 BFD_ASSERT (!elf_flags_init (abfd)
1806 || elf_elfheader (abfd)->e_flags == flags);
1808 elf_elfheader (abfd)->e_flags = flags;
1809 elf_flags_init (abfd) = TRUE;
1810 return TRUE;
1813 /* Merge backend specific data from an object file
1814 to the output object file when linking. */
1816 static bfd_boolean
1817 v850_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
1819 flagword out_flags;
1820 flagword in_flags;
1822 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1823 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1824 return TRUE;
1826 in_flags = elf_elfheader (ibfd)->e_flags;
1827 out_flags = elf_elfheader (obfd)->e_flags;
1829 if (! elf_flags_init (obfd))
1831 /* If the input is the default architecture then do not
1832 bother setting the flags for the output architecture,
1833 instead allow future merges to do this. If no future
1834 merges ever set these flags then they will retain their
1835 unitialised values, which surprise surprise, correspond
1836 to the default values. */
1837 if (bfd_get_arch_info (ibfd)->the_default)
1838 return TRUE;
1840 elf_flags_init (obfd) = TRUE;
1841 elf_elfheader (obfd)->e_flags = in_flags;
1843 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1844 && bfd_get_arch_info (obfd)->the_default)
1845 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1847 return TRUE;
1850 /* Check flag compatibility. */
1851 if (in_flags == out_flags)
1852 return TRUE;
1854 if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1855 && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1857 /* Allow v850e1 binaries to be linked with v850e binaries.
1858 Set the output binary to v850e. */
1859 if ((in_flags & EF_V850_ARCH) == E_V850E1_ARCH
1860 && (out_flags & EF_V850_ARCH) == E_V850E_ARCH)
1861 return TRUE;
1863 if ((in_flags & EF_V850_ARCH) == E_V850E_ARCH
1864 && (out_flags & EF_V850_ARCH) == E_V850E1_ARCH)
1866 elf_elfheader (obfd)->e_flags =
1867 ((out_flags & ~ EF_V850_ARCH) | E_V850E_ARCH);
1868 return TRUE;
1871 _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1872 ibfd);
1875 return TRUE;
1878 /* Display the flags field. */
1880 static bfd_boolean
1881 v850_elf_print_private_bfd_data (bfd *abfd, void * ptr)
1883 FILE * file = (FILE *) ptr;
1885 BFD_ASSERT (abfd != NULL && ptr != NULL);
1887 _bfd_elf_print_private_bfd_data (abfd, ptr);
1889 /* xgettext:c-format */
1890 fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1892 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1894 default:
1895 case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1896 case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
1897 case E_V850E1_ARCH: fprintf (file, _("v850e1 architecture")); break;
1900 fputc ('\n', file);
1902 return TRUE;
1905 /* V850 ELF uses four common sections. One is the usual one, and the
1906 others are for (small) objects in one of the special data areas:
1907 small, tiny and zero. All the objects are kept together, and then
1908 referenced via the gp register, the ep register or the r0 register
1909 respectively, which yields smaller, faster assembler code. This
1910 approach is copied from elf32-mips.c. */
1912 static asection v850_elf_scom_section;
1913 static asymbol v850_elf_scom_symbol;
1914 static asymbol * v850_elf_scom_symbol_ptr;
1915 static asection v850_elf_tcom_section;
1916 static asymbol v850_elf_tcom_symbol;
1917 static asymbol * v850_elf_tcom_symbol_ptr;
1918 static asection v850_elf_zcom_section;
1919 static asymbol v850_elf_zcom_symbol;
1920 static asymbol * v850_elf_zcom_symbol_ptr;
1922 /* Given a BFD section, try to locate the
1923 corresponding ELF section index. */
1925 static bfd_boolean
1926 v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
1927 asection *sec,
1928 int *retval)
1930 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1931 *retval = SHN_V850_SCOMMON;
1932 else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
1933 *retval = SHN_V850_TCOMMON;
1934 else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
1935 *retval = SHN_V850_ZCOMMON;
1936 else
1937 return FALSE;
1939 return TRUE;
1942 /* Handle the special V850 section numbers that a symbol may use. */
1944 static void
1945 v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
1947 elf_symbol_type * elfsym = (elf_symbol_type *) asym;
1948 unsigned int indx;
1950 indx = elfsym->internal_elf_sym.st_shndx;
1952 /* If the section index is an "ordinary" index, then it may
1953 refer to a v850 specific section created by the assembler.
1954 Check the section's type and change the index it matches.
1956 FIXME: Should we alter the st_shndx field as well ? */
1958 if (indx < elf_numsections (abfd))
1959 switch (elf_elfsections(abfd)[indx]->sh_type)
1961 case SHT_V850_SCOMMON:
1962 indx = SHN_V850_SCOMMON;
1963 break;
1965 case SHT_V850_TCOMMON:
1966 indx = SHN_V850_TCOMMON;
1967 break;
1969 case SHT_V850_ZCOMMON:
1970 indx = SHN_V850_ZCOMMON;
1971 break;
1973 default:
1974 break;
1977 switch (indx)
1979 case SHN_V850_SCOMMON:
1980 if (v850_elf_scom_section.name == NULL)
1982 /* Initialize the small common section. */
1983 v850_elf_scom_section.name = ".scommon";
1984 v850_elf_scom_section.flags = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
1985 v850_elf_scom_section.output_section = & v850_elf_scom_section;
1986 v850_elf_scom_section.symbol = & v850_elf_scom_symbol;
1987 v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
1988 v850_elf_scom_symbol.name = ".scommon";
1989 v850_elf_scom_symbol.flags = BSF_SECTION_SYM;
1990 v850_elf_scom_symbol.section = & v850_elf_scom_section;
1991 v850_elf_scom_symbol_ptr = & v850_elf_scom_symbol;
1993 asym->section = & v850_elf_scom_section;
1994 asym->value = elfsym->internal_elf_sym.st_size;
1995 break;
1997 case SHN_V850_TCOMMON:
1998 if (v850_elf_tcom_section.name == NULL)
2000 /* Initialize the tcommon section. */
2001 v850_elf_tcom_section.name = ".tcommon";
2002 v850_elf_tcom_section.flags = SEC_IS_COMMON;
2003 v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2004 v850_elf_tcom_section.symbol = & v850_elf_tcom_symbol;
2005 v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2006 v850_elf_tcom_symbol.name = ".tcommon";
2007 v850_elf_tcom_symbol.flags = BSF_SECTION_SYM;
2008 v850_elf_tcom_symbol.section = & v850_elf_tcom_section;
2009 v850_elf_tcom_symbol_ptr = & v850_elf_tcom_symbol;
2011 asym->section = & v850_elf_tcom_section;
2012 asym->value = elfsym->internal_elf_sym.st_size;
2013 break;
2015 case SHN_V850_ZCOMMON:
2016 if (v850_elf_zcom_section.name == NULL)
2018 /* Initialize the zcommon section. */
2019 v850_elf_zcom_section.name = ".zcommon";
2020 v850_elf_zcom_section.flags = SEC_IS_COMMON;
2021 v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2022 v850_elf_zcom_section.symbol = & v850_elf_zcom_symbol;
2023 v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2024 v850_elf_zcom_symbol.name = ".zcommon";
2025 v850_elf_zcom_symbol.flags = BSF_SECTION_SYM;
2026 v850_elf_zcom_symbol.section = & v850_elf_zcom_section;
2027 v850_elf_zcom_symbol_ptr = & v850_elf_zcom_symbol;
2029 asym->section = & v850_elf_zcom_section;
2030 asym->value = elfsym->internal_elf_sym.st_size;
2031 break;
2035 /* Hook called by the linker routine which adds symbols from an object
2036 file. We must handle the special v850 section numbers here. */
2038 static bfd_boolean
2039 v850_elf_add_symbol_hook (bfd *abfd,
2040 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2041 Elf_Internal_Sym *sym,
2042 const char **namep ATTRIBUTE_UNUSED,
2043 flagword *flagsp ATTRIBUTE_UNUSED,
2044 asection **secp,
2045 bfd_vma *valp)
2047 unsigned int indx = sym->st_shndx;
2049 /* If the section index is an "ordinary" index, then it may
2050 refer to a v850 specific section created by the assembler.
2051 Check the section's type and change the index it matches.
2053 FIXME: Should we alter the st_shndx field as well ? */
2055 if (indx < elf_numsections (abfd))
2056 switch (elf_elfsections(abfd)[indx]->sh_type)
2058 case SHT_V850_SCOMMON:
2059 indx = SHN_V850_SCOMMON;
2060 break;
2062 case SHT_V850_TCOMMON:
2063 indx = SHN_V850_TCOMMON;
2064 break;
2066 case SHT_V850_ZCOMMON:
2067 indx = SHN_V850_ZCOMMON;
2068 break;
2070 default:
2071 break;
2074 switch (indx)
2076 case SHN_V850_SCOMMON:
2077 *secp = bfd_make_section_old_way (abfd, ".scommon");
2078 (*secp)->flags |= SEC_IS_COMMON;
2079 *valp = sym->st_size;
2080 break;
2082 case SHN_V850_TCOMMON:
2083 *secp = bfd_make_section_old_way (abfd, ".tcommon");
2084 (*secp)->flags |= SEC_IS_COMMON;
2085 *valp = sym->st_size;
2086 break;
2088 case SHN_V850_ZCOMMON:
2089 *secp = bfd_make_section_old_way (abfd, ".zcommon");
2090 (*secp)->flags |= SEC_IS_COMMON;
2091 *valp = sym->st_size;
2092 break;
2095 return TRUE;
2098 static bfd_boolean
2099 v850_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2100 const char *name ATTRIBUTE_UNUSED,
2101 Elf_Internal_Sym *sym,
2102 asection *input_sec,
2103 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2105 /* If we see a common symbol, which implies a relocatable link, then
2106 if a symbol was in a special common section in an input file, mark
2107 it as a special common in the output file. */
2109 if (sym->st_shndx == SHN_COMMON)
2111 if (strcmp (input_sec->name, ".scommon") == 0)
2112 sym->st_shndx = SHN_V850_SCOMMON;
2113 else if (strcmp (input_sec->name, ".tcommon") == 0)
2114 sym->st_shndx = SHN_V850_TCOMMON;
2115 else if (strcmp (input_sec->name, ".zcommon") == 0)
2116 sym->st_shndx = SHN_V850_ZCOMMON;
2119 /* The price we pay for using h->other unused bits as flags in the
2120 linker is cleaning up after ourselves. */
2122 sym->st_other &= ~(V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA
2123 | V850_OTHER_ERROR);
2125 return TRUE;
2128 static bfd_boolean
2129 v850_elf_section_from_shdr (bfd *abfd,
2130 Elf_Internal_Shdr *hdr,
2131 const char *name,
2132 int shindex)
2134 /* There ought to be a place to keep ELF backend specific flags, but
2135 at the moment there isn't one. We just keep track of the
2136 sections by their name, instead. */
2138 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2139 return FALSE;
2141 switch (hdr->sh_type)
2143 case SHT_V850_SCOMMON:
2144 case SHT_V850_TCOMMON:
2145 case SHT_V850_ZCOMMON:
2146 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2147 (bfd_get_section_flags (abfd,
2148 hdr->bfd_section)
2149 | SEC_IS_COMMON)))
2150 return FALSE;
2153 return TRUE;
2156 /* Set the correct type for a V850 ELF section. We do this
2157 by the section name, which is a hack, but ought to work. */
2159 static bfd_boolean
2160 v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2161 Elf_Internal_Shdr *hdr,
2162 asection *sec)
2164 const char * name;
2166 name = bfd_get_section_name (abfd, sec);
2168 if (strcmp (name, ".scommon") == 0)
2169 hdr->sh_type = SHT_V850_SCOMMON;
2170 else if (strcmp (name, ".tcommon") == 0)
2171 hdr->sh_type = SHT_V850_TCOMMON;
2172 else if (strcmp (name, ".zcommon") == 0)
2173 hdr->sh_type = SHT_V850_ZCOMMON;
2175 return TRUE;
2178 /* Delete some bytes from a section while relaxing. */
2180 static bfd_boolean
2181 v850_elf_relax_delete_bytes (bfd *abfd,
2182 asection *sec,
2183 bfd_vma addr,
2184 bfd_vma toaddr,
2185 int count)
2187 Elf_Internal_Shdr *symtab_hdr;
2188 Elf32_External_Sym *extsyms;
2189 Elf32_External_Sym *esym;
2190 Elf32_External_Sym *esymend;
2191 int index;
2192 unsigned int sec_shndx;
2193 bfd_byte *contents;
2194 Elf_Internal_Rela *irel;
2195 Elf_Internal_Rela *irelend;
2196 struct elf_link_hash_entry *sym_hash;
2197 Elf_Internal_Shdr *shndx_hdr;
2198 Elf_External_Sym_Shndx *shndx;
2200 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2201 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2203 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2205 contents = elf_section_data (sec)->this_hdr.contents;
2207 /* The deletion must stop at the next ALIGN reloc for an alignment
2208 power larger than the number of bytes we are deleting. */
2210 /* Actually delete the bytes. */
2211 #if (DEBUG_RELAX & 2)
2212 fprintf (stderr, "relax_delete: contents: sec: %s %p .. %p %x\n",
2213 sec->name, addr, toaddr, count );
2214 #endif
2215 memmove (contents + addr, contents + addr + count,
2216 toaddr - addr - count);
2217 memset (contents + toaddr-count, 0, count);
2219 /* Adjust all the relocs. */
2220 irel = elf_section_data (sec)->relocs;
2221 irelend = irel + sec->reloc_count;
2222 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
2223 shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2225 for (; irel < irelend; irel++)
2227 bfd_vma raddr, paddr, symval;
2228 Elf_Internal_Sym isym;
2230 /* Get the new reloc address. */
2231 raddr = irel->r_offset;
2232 if ((raddr >= (addr + count) && raddr < toaddr))
2233 irel->r_offset -= count;
2235 if (raddr >= addr && raddr < addr + count)
2237 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2238 (int) R_V850_NONE);
2239 continue;
2242 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN)
2243 continue;
2245 bfd_elf32_swap_symbol_in (abfd,
2246 extsyms + ELF32_R_SYM (irel->r_info),
2247 shndx ? shndx + ELF32_R_SYM (irel->r_info) : NULL,
2248 & isym);
2250 if (isym.st_shndx != sec_shndx)
2251 continue;
2253 /* Get the value of the symbol referred to by the reloc. */
2254 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2256 symval = isym.st_value;
2257 #if (DEBUG_RELAX & 2)
2259 char * name = bfd_elf_string_from_elf_section
2260 (abfd, symtab_hdr->sh_link, isym.st_name);
2261 fprintf (stderr,
2262 "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2263 sec->name, name, isym.st_name,
2264 sec->output_section->vma, sec->output_offset,
2265 isym.st_value, irel->r_addend);
2267 #endif
2269 else
2271 unsigned long indx;
2272 struct elf_link_hash_entry * h;
2274 /* An external symbol. */
2275 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2277 h = elf_sym_hashes (abfd) [indx];
2278 BFD_ASSERT (h != NULL);
2280 symval = h->root.u.def.value;
2281 #if (DEBUG_RELAX & 2)
2282 fprintf (stderr,
2283 "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2284 sec->name, h->root.root.string, h->root.u.def.value,
2285 sec->output_section->vma, sec->output_offset, irel->r_addend);
2286 #endif
2289 paddr = symval + irel->r_addend;
2291 if ( (symval >= addr + count && symval < toaddr)
2292 && (paddr < addr + count || paddr >= toaddr))
2293 irel->r_addend += count;
2294 else if ( (symval < addr + count || symval >= toaddr)
2295 && (paddr >= addr + count && paddr < toaddr))
2296 irel->r_addend -= count;
2299 /* Adjust the local symbols defined in this section. */
2300 esym = extsyms;
2301 esymend = esym + symtab_hdr->sh_info;
2303 for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
2305 Elf_Internal_Sym isym;
2307 bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2309 if (isym.st_shndx == sec_shndx
2310 && isym.st_value >= addr + count
2311 && isym.st_value < toaddr)
2313 isym.st_value -= count;
2315 if (isym.st_value + isym.st_size >= toaddr)
2316 isym.st_size += count;
2318 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2320 else if (isym.st_shndx == sec_shndx
2321 && isym.st_value < addr + count)
2323 if (isym.st_value+isym.st_size >= addr + count
2324 && isym.st_value+isym.st_size < toaddr)
2325 isym.st_size -= count;
2327 if (isym.st_value >= addr
2328 && isym.st_value < addr + count)
2329 isym.st_value = addr;
2331 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2335 /* Now adjust the global symbols defined in this section. */
2336 esym = extsyms + symtab_hdr->sh_info;
2337 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2339 for (index = 0; esym < esymend; esym ++, index ++)
2341 Elf_Internal_Sym isym;
2343 bfd_elf32_swap_symbol_in (abfd, esym, shndx, & isym);
2344 sym_hash = elf_sym_hashes (abfd) [index];
2346 if (isym.st_shndx == sec_shndx
2347 && ((sym_hash)->root.type == bfd_link_hash_defined
2348 || (sym_hash)->root.type == bfd_link_hash_defweak)
2349 && (sym_hash)->root.u.def.section == sec
2350 && (sym_hash)->root.u.def.value >= addr + count
2351 && (sym_hash)->root.u.def.value < toaddr)
2353 if ((sym_hash)->root.u.def.value + isym.st_size >= toaddr)
2355 isym.st_size += count;
2356 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2359 (sym_hash)->root.u.def.value -= count;
2361 else if (isym.st_shndx == sec_shndx
2362 && ((sym_hash)->root.type == bfd_link_hash_defined
2363 || (sym_hash)->root.type == bfd_link_hash_defweak)
2364 && (sym_hash)->root.u.def.section == sec
2365 && (sym_hash)->root.u.def.value < addr + count)
2367 if ((sym_hash)->root.u.def.value+isym.st_size >= addr + count
2368 && (sym_hash)->root.u.def.value+isym.st_size < toaddr)
2369 isym.st_size -= count;
2371 if ((sym_hash)->root.u.def.value >= addr
2372 && (sym_hash)->root.u.def.value < addr + count)
2373 (sym_hash)->root.u.def.value = addr;
2375 bfd_elf32_swap_symbol_out (abfd, & isym, esym, shndx);
2378 if (shndx)
2379 ++ shndx;
2382 return TRUE;
2385 #define NOP_OPCODE (0x0000)
2386 #define MOVHI 0x0640 /* 4byte */
2387 #define MOVHI_MASK 0x07e0
2388 #define MOVHI_R1(insn) ((insn) & 0x1f) /* 4byte */
2389 #define MOVHI_R2(insn) ((insn) >> 11)
2390 #define MOVEA 0x0620 /* 2byte */
2391 #define MOVEA_MASK 0x07e0
2392 #define MOVEA_R1(insn) ((insn) & 0x1f)
2393 #define MOVEA_R2(insn) ((insn) >> 11)
2394 #define JARL_4 0x00040780 /* 4byte */
2395 #define JARL_4_MASK 0xFFFF07FF
2396 #define JARL_R2(insn) (int)(((insn) & (~JARL_4_MASK)) >> 11)
2397 #define ADD_I 0x0240 /* 2byte */
2398 #define ADD_I_MASK 0x07e0
2399 #define ADD_I5(insn) ((((insn) & 0x001f) << 11) >> 11) /* 2byte */
2400 #define ADD_R2(insn) ((insn) >> 11)
2401 #define JMP_R 0x0060 /* 2byte */
2402 #define JMP_R_MASK 0xFFE0
2403 #define JMP_R1(insn) ((insn) & 0x1f)
2405 static bfd_boolean
2406 v850_elf_relax_section (bfd *abfd,
2407 asection *sec,
2408 struct bfd_link_info *link_info,
2409 bfd_boolean *again)
2411 Elf_Internal_Shdr *symtab_hdr;
2412 Elf_Internal_Rela *internal_relocs;
2413 Elf_Internal_Rela *irel;
2414 Elf_Internal_Rela *irelend;
2415 Elf_Internal_Rela *irelalign = NULL;
2416 Elf_Internal_Sym *isymbuf = NULL;
2417 bfd_byte *contents = NULL;
2418 bfd_vma addr = 0;
2419 bfd_vma toaddr;
2420 int align_pad_size = 0;
2421 bfd_boolean result = TRUE;
2423 *again = FALSE;
2425 if (link_info->relocatable
2426 || (sec->flags & SEC_RELOC) == 0
2427 || sec->reloc_count == 0)
2428 return TRUE;
2430 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2432 internal_relocs = (_bfd_elf_link_read_relocs
2433 (abfd, sec, NULL, NULL, link_info->keep_memory));
2434 if (internal_relocs == NULL)
2435 goto error_return;
2437 irelend = internal_relocs + sec->reloc_count;
2439 while (addr < sec->size)
2441 toaddr = sec->size;
2443 for (irel = internal_relocs; irel < irelend; irel ++)
2444 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2445 && irel->r_offset > addr
2446 && irel->r_offset < toaddr)
2447 toaddr = irel->r_offset;
2449 #ifdef DEBUG_RELAX
2450 fprintf (stderr, "relax region 0x%x to 0x%x align pad %d\n",
2451 addr, toaddr, align_pad_size);
2452 #endif
2453 if (irelalign)
2455 bfd_vma alignto;
2456 bfd_vma alignmoveto;
2458 alignmoveto = BFD_ALIGN (addr - align_pad_size, 1 << irelalign->r_addend);
2459 alignto = BFD_ALIGN (addr, 1 << irelalign->r_addend);
2461 if (alignmoveto < alignto)
2463 unsigned int i;
2465 align_pad_size = alignto - alignmoveto;
2466 #ifdef DEBUG_RELAX
2467 fprintf (stderr, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2468 alignmoveto, toaddr, align_pad_size);
2469 #endif
2470 if (!v850_elf_relax_delete_bytes (abfd, sec, alignmoveto,
2471 toaddr, align_pad_size))
2472 goto error_return;
2474 for (i = BFD_ALIGN (toaddr - align_pad_size, 1);
2475 (i + 1) < toaddr; i += 2)
2476 bfd_put_16 (abfd, NOP_OPCODE, contents + i);
2478 addr = alignmoveto;
2480 else
2481 align_pad_size = 0;
2484 for (irel = internal_relocs; irel < irelend; irel++)
2486 bfd_vma laddr;
2487 bfd_vma addend;
2488 bfd_vma symval;
2489 int insn[5];
2490 int no_match = -1;
2491 Elf_Internal_Rela *hi_irelfn;
2492 Elf_Internal_Rela *lo_irelfn;
2493 Elf_Internal_Rela *irelcall;
2494 bfd_signed_vma foff;
2496 if (! (irel->r_offset >= addr && irel->r_offset < toaddr
2497 && (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL
2498 || ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)))
2499 continue;
2501 #ifdef DEBUG_RELAX
2502 fprintf (stderr, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
2503 irel->r_info,
2504 irel->r_offset,
2505 irel->r_addend );
2506 #endif
2508 /* Get the section contents. */
2509 if (contents == NULL)
2511 if (elf_section_data (sec)->this_hdr.contents != NULL)
2512 contents = elf_section_data (sec)->this_hdr.contents;
2513 else
2515 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2516 goto error_return;
2520 /* Read this BFD's local symbols if we haven't done so already. */
2521 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2523 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2524 if (isymbuf == NULL)
2525 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2526 symtab_hdr->sh_info, 0,
2527 NULL, NULL, NULL);
2528 if (isymbuf == NULL)
2529 goto error_return;
2532 laddr = irel->r_offset;
2534 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGCALL)
2536 /* Check code for -mlong-calls output. */
2537 if (laddr + 16 <= (bfd_vma) sec->size)
2539 insn[0] = bfd_get_16 (abfd, contents + laddr);
2540 insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2541 insn[2] = bfd_get_32 (abfd, contents + laddr + 8);
2542 insn[3] = bfd_get_16 (abfd, contents + laddr + 12);
2543 insn[4] = bfd_get_16 (abfd, contents + laddr + 14);
2545 if ((insn[0] & MOVHI_MASK) != MOVHI
2546 || MOVHI_R1 (insn[0]) != 0)
2547 no_match = 0;
2549 if (no_match < 0
2550 && ((insn[1] & MOVEA_MASK) != MOVEA
2551 || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2552 no_match = 1;
2554 if (no_match < 0
2555 && (insn[2] & JARL_4_MASK) != JARL_4)
2556 no_match = 2;
2558 if (no_match < 0
2559 && ((insn[3] & ADD_I_MASK) != ADD_I
2560 || ADD_I5 (insn[3]) != 4
2561 || JARL_R2 (insn[2]) != ADD_R2 (insn[3])))
2562 no_match = 3;
2564 if (no_match < 0
2565 && ((insn[4] & JMP_R_MASK) != JMP_R
2566 || MOVEA_R2 (insn[1]) != JMP_R1 (insn[4])))
2567 no_match = 4;
2569 else
2571 ((*_bfd_error_handler)
2572 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
2573 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2575 continue;
2578 if (no_match >= 0)
2580 ((*_bfd_error_handler)
2581 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
2582 bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2584 continue;
2587 /* Get the reloc for the address from which the register is
2588 being loaded. This reloc will tell us which function is
2589 actually being called. */
2590 for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2591 if (hi_irelfn->r_offset == laddr + 2
2592 && ELF32_R_TYPE (hi_irelfn->r_info)
2593 == (int) R_V850_HI16_S)
2594 break;
2596 for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2597 if (lo_irelfn->r_offset == laddr + 6
2598 && ELF32_R_TYPE (lo_irelfn->r_info)
2599 == (int) R_V850_LO16)
2600 break;
2602 for (irelcall = internal_relocs; irelcall < irelend; irelcall ++)
2603 if (irelcall->r_offset == laddr + 8
2604 && ELF32_R_TYPE (irelcall->r_info)
2605 == (int) R_V850_22_PCREL)
2606 break;
2608 if ( hi_irelfn == irelend
2609 || lo_irelfn == irelend
2610 || irelcall == irelend)
2612 ((*_bfd_error_handler)
2613 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
2614 bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2616 continue;
2619 if (ELF32_R_SYM (irelcall->r_info) < symtab_hdr->sh_info)
2621 Elf_Internal_Sym * isym;
2623 /* A local symbol. */
2624 isym = isymbuf + ELF32_R_SYM (irelcall->r_info);
2626 symval = isym->st_value;
2628 else
2630 unsigned long indx;
2631 struct elf_link_hash_entry * h;
2633 /* An external symbol. */
2634 indx = ELF32_R_SYM (irelcall->r_info) - symtab_hdr->sh_info;
2635 h = elf_sym_hashes (abfd)[indx];
2636 BFD_ASSERT (h != NULL);
2638 if ( h->root.type != bfd_link_hash_defined
2639 && h->root.type != bfd_link_hash_defweak)
2640 /* This appears to be a reference to an undefined
2641 symbol. Just ignore it--it will be caught by the
2642 regular reloc processing. */
2643 continue;
2645 symval = h->root.u.def.value;
2648 if (symval + irelcall->r_addend != irelcall->r_offset + 4)
2650 ((*_bfd_error_handler)
2651 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
2652 bfd_get_filename (abfd), (unsigned long) irel->r_offset, irelcall->r_offset ));
2654 continue;
2657 /* Get the value of the symbol referred to by the reloc. */
2658 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2660 Elf_Internal_Sym *isym;
2661 asection *sym_sec;
2663 /* A local symbol. */
2664 isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2666 if (isym->st_shndx == SHN_UNDEF)
2667 sym_sec = bfd_und_section_ptr;
2668 else if (isym->st_shndx == SHN_ABS)
2669 sym_sec = bfd_abs_section_ptr;
2670 else if (isym->st_shndx == SHN_COMMON)
2671 sym_sec = bfd_com_section_ptr;
2672 else
2673 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2674 symval = (isym->st_value
2675 + sym_sec->output_section->vma
2676 + sym_sec->output_offset);
2678 else
2680 unsigned long indx;
2681 struct elf_link_hash_entry *h;
2683 /* An external symbol. */
2684 indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
2685 h = elf_sym_hashes (abfd)[indx];
2686 BFD_ASSERT (h != NULL);
2688 if ( h->root.type != bfd_link_hash_defined
2689 && h->root.type != bfd_link_hash_defweak)
2690 /* This appears to be a reference to an undefined
2691 symbol. Just ignore it--it will be caught by the
2692 regular reloc processing. */
2693 continue;
2695 symval = (h->root.u.def.value
2696 + h->root.u.def.section->output_section->vma
2697 + h->root.u.def.section->output_offset);
2700 addend = irel->r_addend;
2702 foff = (symval + addend
2703 - (irel->r_offset
2704 + sec->output_section->vma
2705 + sec->output_offset
2706 + 4));
2707 #ifdef DEBUG_RELAX
2708 fprintf (stderr, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2709 irel->r_offset,
2710 (irel->r_offset
2711 + sec->output_section->vma
2712 + sec->output_offset),
2713 symval, addend, foff);
2714 #endif
2716 if (foff < -0x100000 || foff >= 0x100000)
2717 /* After all that work, we can't shorten this function call. */
2718 continue;
2720 /* For simplicity of coding, we are going to modify the section
2721 contents, the section relocs, and the BFD symbol table. We
2722 must tell the rest of the code not to free up this
2723 information. It would be possible to instead create a table
2724 of changes which have to be made, as is done in coff-mips.c;
2725 that would be more work, but would require less memory when
2726 the linker is run. */
2727 elf_section_data (sec)->relocs = internal_relocs;
2728 elf_section_data (sec)->this_hdr.contents = contents;
2729 symtab_hdr->contents = (bfd_byte *) isymbuf;
2731 /* Replace the long call with a jarl. */
2732 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_22_PCREL);
2734 addend = 0;
2736 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2737 /* If this needs to be changed because of future relaxing,
2738 it will be handled here like other internal IND12W
2739 relocs. */
2740 bfd_put_32 (abfd,
2741 0x00000780 | (JARL_R2 (insn[2])<<11) | ((addend << 16) & 0xffff) | ((addend >> 16) & 0xf),
2742 contents + irel->r_offset);
2743 else
2744 /* We can't fully resolve this yet, because the external
2745 symbol value may be changed by future relaxing.
2746 We let the final link phase handle it. */
2747 bfd_put_32 (abfd, 0x00000780 | (JARL_R2 (insn[2])<<11),
2748 contents + irel->r_offset);
2750 hi_irelfn->r_info =
2751 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2752 lo_irelfn->r_info =
2753 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2754 irelcall->r_info =
2755 ELF32_R_INFO (ELF32_R_SYM (irelcall->r_info), R_V850_NONE);
2757 if (! v850_elf_relax_delete_bytes (abfd, sec,
2758 irel->r_offset + 4, toaddr, 12))
2759 goto error_return;
2761 align_pad_size += 12;
2763 else if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_LONGJUMP)
2765 /* Check code for -mlong-jumps output. */
2766 if (laddr + 10 <= (bfd_vma) sec->size)
2768 insn[0] = bfd_get_16 (abfd, contents + laddr);
2769 insn[1] = bfd_get_16 (abfd, contents + laddr + 4);
2770 insn[2] = bfd_get_16 (abfd, contents + laddr + 8);
2772 if ((insn[0] & MOVHI_MASK) != MOVHI
2773 || MOVHI_R1 (insn[0]) != 0)
2774 no_match = 0;
2776 if (no_match < 0
2777 && ((insn[1] & MOVEA_MASK) != MOVEA
2778 || MOVHI_R2 (insn[0]) != MOVEA_R1 (insn[1])))
2779 no_match = 1;
2781 if (no_match < 0
2782 && ((insn[2] & JMP_R_MASK) != JMP_R
2783 || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2])))
2784 no_match = 4;
2786 else
2788 ((*_bfd_error_handler)
2789 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
2790 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2792 continue;
2795 if (no_match >= 0)
2797 ((*_bfd_error_handler)
2798 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
2799 bfd_get_filename (abfd), (unsigned long) irel->r_offset+no_match, insn[no_match]));
2801 continue;
2804 /* Get the reloc for the address from which the register is
2805 being loaded. This reloc will tell us which function is
2806 actually being called. */
2807 for (hi_irelfn = internal_relocs; hi_irelfn < irelend; hi_irelfn ++)
2808 if (hi_irelfn->r_offset == laddr + 2
2809 && ELF32_R_TYPE (hi_irelfn->r_info) == (int) R_V850_HI16_S)
2810 break;
2812 for (lo_irelfn = internal_relocs; lo_irelfn < irelend; lo_irelfn ++)
2813 if (lo_irelfn->r_offset == laddr + 6
2814 && ELF32_R_TYPE (lo_irelfn->r_info) == (int) R_V850_LO16)
2815 break;
2817 if ( hi_irelfn == irelend
2818 || lo_irelfn == irelend)
2820 ((*_bfd_error_handler)
2821 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
2822 bfd_get_filename (abfd), (unsigned long) irel->r_offset ));
2824 continue;
2827 /* Get the value of the symbol referred to by the reloc. */
2828 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2830 Elf_Internal_Sym * isym;
2831 asection * sym_sec;
2833 /* A local symbol. */
2834 isym = isymbuf + ELF32_R_SYM (hi_irelfn->r_info);
2836 if (isym->st_shndx == SHN_UNDEF)
2837 sym_sec = bfd_und_section_ptr;
2838 else if (isym->st_shndx == SHN_ABS)
2839 sym_sec = bfd_abs_section_ptr;
2840 else if (isym->st_shndx == SHN_COMMON)
2841 sym_sec = bfd_com_section_ptr;
2842 else
2843 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2844 symval = (isym->st_value
2845 + sym_sec->output_section->vma
2846 + sym_sec->output_offset);
2847 #ifdef DEBUG_RELAX
2849 char * name = bfd_elf_string_from_elf_section
2850 (abfd, symtab_hdr->sh_link, isym->st_name);
2852 fprintf (stderr, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2853 sym_sec->name, name, isym->st_name,
2854 sym_sec->output_section->vma,
2855 sym_sec->output_offset,
2856 isym->st_value, irel->r_addend);
2858 #endif
2860 else
2862 unsigned long indx;
2863 struct elf_link_hash_entry * h;
2865 /* An external symbol. */
2866 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2867 h = elf_sym_hashes (abfd)[indx];
2868 BFD_ASSERT (h != NULL);
2870 if ( h->root.type != bfd_link_hash_defined
2871 && h->root.type != bfd_link_hash_defweak)
2872 /* This appears to be a reference to an undefined
2873 symbol. Just ignore it--it will be caught by the
2874 regular reloc processing. */
2875 continue;
2877 symval = (h->root.u.def.value
2878 + h->root.u.def.section->output_section->vma
2879 + h->root.u.def.section->output_offset);
2880 #ifdef DEBUG_RELAX
2881 fprintf (stderr,
2882 "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2883 sec->name, h->root.root.string, h->root.u.def.value,
2884 sec->output_section->vma, sec->output_offset, irel->r_addend);
2885 #endif
2888 addend = irel->r_addend;
2890 foff = (symval + addend
2891 - (irel->r_offset
2892 + sec->output_section->vma
2893 + sec->output_offset
2894 + 4));
2895 #ifdef DEBUG_RELAX
2896 fprintf (stderr, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2897 irel->r_offset,
2898 (irel->r_offset
2899 + sec->output_section->vma
2900 + sec->output_offset),
2901 symval, addend, foff);
2902 #endif
2903 if (foff < -0x100000 || foff >= 0x100000)
2904 /* After all that work, we can't shorten this function call. */
2905 continue;
2907 /* For simplicity of coding, we are going to modify the section
2908 contents, the section relocs, and the BFD symbol table. We
2909 must tell the rest of the code not to free up this
2910 information. It would be possible to instead create a table
2911 of changes which have to be made, as is done in coff-mips.c;
2912 that would be more work, but would require less memory when
2913 the linker is run. */
2914 elf_section_data (sec)->relocs = internal_relocs;
2915 elf_section_data (sec)->this_hdr.contents = contents;
2916 symtab_hdr->contents = (bfd_byte *) isymbuf;
2918 if (foff < -0x100 || foff >= 0x100)
2920 /* Replace the long jump with a jr. */
2922 irel->r_info =
2923 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_22_PCREL);
2925 irel->r_addend = addend;
2926 addend = 0;
2928 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2929 /* If this needs to be changed because of future relaxing,
2930 it will be handled here like other internal IND12W
2931 relocs. */
2932 bfd_put_32 (abfd,
2933 0x00000780 | ((addend << 15) & 0xffff0000) | ((addend >> 17) & 0xf),
2934 contents + irel->r_offset);
2935 else
2936 /* We can't fully resolve this yet, because the external
2937 symbol value may be changed by future relaxing.
2938 We let the final link phase handle it. */
2939 bfd_put_32 (abfd, 0x00000780, contents + irel->r_offset);
2941 hi_irelfn->r_info =
2942 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2943 lo_irelfn->r_info =
2944 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2945 if (!v850_elf_relax_delete_bytes (abfd, sec,
2946 irel->r_offset + 4, toaddr, 6))
2947 goto error_return;
2949 align_pad_size += 6;
2951 else
2953 /* Replace the long jump with a br. */
2955 irel->r_info =
2956 ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_V850_9_PCREL);
2958 irel->r_addend = addend;
2959 addend = 0;
2961 if (ELF32_R_SYM (hi_irelfn->r_info) < symtab_hdr->sh_info)
2962 /* If this needs to be changed because of future relaxing,
2963 it will be handled here like other internal IND12W
2964 relocs. */
2965 bfd_put_16 (abfd,
2966 0x0585 | ((addend << 10) & 0xf800) | ((addend << 3) & 0x0070),
2967 contents + irel->r_offset);
2968 else
2969 /* We can't fully resolve this yet, because the external
2970 symbol value may be changed by future relaxing.
2971 We let the final link phase handle it. */
2972 bfd_put_16 (abfd, 0x0585, contents + irel->r_offset);
2974 hi_irelfn->r_info =
2975 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_V850_NONE);
2976 lo_irelfn->r_info =
2977 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_V850_NONE);
2978 if (!v850_elf_relax_delete_bytes (abfd, sec,
2979 irel->r_offset + 2, toaddr, 8))
2980 goto error_return;
2982 align_pad_size += 8;
2987 irelalign = NULL;
2988 for (irel = internal_relocs; irel < irelend; irel++)
2990 if (ELF32_R_TYPE (irel->r_info) == (int) R_V850_ALIGN
2991 && irel->r_offset == toaddr)
2993 irel->r_offset -= align_pad_size;
2995 if (irelalign == NULL || irelalign->r_addend > irel->r_addend)
2996 irelalign = irel;
3000 addr = toaddr;
3003 if (!irelalign)
3005 #ifdef DEBUG_RELAX
3006 fprintf (stderr, "relax pad %d shorten %d -> %d\n",
3007 align_pad_size,
3008 sec->size,
3009 sec->size - align_pad_size);
3010 #endif
3011 sec->size -= align_pad_size;
3014 finish:
3015 if (internal_relocs != NULL
3016 && elf_section_data (sec)->relocs != internal_relocs)
3017 free (internal_relocs);
3019 if (contents != NULL
3020 && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents)
3021 free (contents);
3023 if (isymbuf != NULL
3024 && symtab_hdr->contents != (bfd_byte *) isymbuf)
3025 free (isymbuf);
3027 return result;
3029 error_return:
3030 result = FALSE;
3031 goto finish;
3034 static const struct bfd_elf_special_section v850_elf_special_sections[] =
3036 { STRING_COMMA_LEN (".call_table_data"), 0, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE) },
3037 { STRING_COMMA_LEN (".call_table_text"), 0, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3038 + SHF_EXECINSTR) },
3039 { STRING_COMMA_LEN (".rosdata"), -2, SHT_PROGBITS, (SHF_ALLOC
3040 + SHF_V850_GPREL) },
3041 { STRING_COMMA_LEN (".rozdata"), -2, SHT_PROGBITS, (SHF_ALLOC
3042 + SHF_V850_R0REL) },
3043 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3044 + SHF_V850_GPREL) },
3045 { STRING_COMMA_LEN (".scommon"), -2, SHT_V850_SCOMMON, (SHF_ALLOC + SHF_WRITE
3046 + SHF_V850_GPREL) },
3047 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3048 + SHF_V850_GPREL) },
3049 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3050 + SHF_V850_EPREL) },
3051 { STRING_COMMA_LEN (".tcommon"), -2, SHT_V850_TCOMMON, (SHF_ALLOC + SHF_WRITE
3052 + SHF_V850_R0REL) },
3053 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3054 + SHF_V850_EPREL) },
3055 { STRING_COMMA_LEN (".zbss"), -2, SHT_NOBITS, (SHF_ALLOC + SHF_WRITE
3056 + SHF_V850_R0REL) },
3057 { STRING_COMMA_LEN (".zcommon"), -2, SHT_V850_ZCOMMON, (SHF_ALLOC + SHF_WRITE
3058 + SHF_V850_R0REL) },
3059 { STRING_COMMA_LEN (".zdata"), -2, SHT_PROGBITS, (SHF_ALLOC + SHF_WRITE
3060 + SHF_V850_R0REL) },
3061 { NULL, 0, 0, 0, 0 }
3064 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
3065 #define TARGET_LITTLE_NAME "elf32-v850"
3066 #define ELF_ARCH bfd_arch_v850
3067 #define ELF_MACHINE_CODE EM_V850
3068 #define ELF_MACHINE_ALT1 EM_CYGNUS_V850
3069 #define ELF_MACHINE_ALT2 EM_V800 /* This is the value used by the GreenHills toolchain. */
3070 #define ELF_MAXPAGESIZE 0x1000
3072 #define elf_info_to_howto v850_elf_info_to_howto_rela
3073 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
3075 #define elf_backend_check_relocs v850_elf_check_relocs
3076 #define elf_backend_relocate_section v850_elf_relocate_section
3077 #define elf_backend_object_p v850_elf_object_p
3078 #define elf_backend_final_write_processing v850_elf_final_write_processing
3079 #define elf_backend_section_from_bfd_section v850_elf_section_from_bfd_section
3080 #define elf_backend_symbol_processing v850_elf_symbol_processing
3081 #define elf_backend_add_symbol_hook v850_elf_add_symbol_hook
3082 #define elf_backend_link_output_symbol_hook v850_elf_link_output_symbol_hook
3083 #define elf_backend_section_from_shdr v850_elf_section_from_shdr
3084 #define elf_backend_fake_sections v850_elf_fake_sections
3085 #define elf_backend_gc_mark_hook v850_elf_gc_mark_hook
3086 #define elf_backend_special_sections v850_elf_special_sections
3088 #define elf_backend_can_gc_sections 1
3089 #define elf_backend_rela_normal 1
3091 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
3092 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
3093 #define bfd_elf32_bfd_reloc_name_lookup v850_elf_reloc_name_lookup
3094 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
3095 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
3096 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
3097 #define bfd_elf32_bfd_relax_section v850_elf_relax_section
3099 #define elf_symbol_leading_char '_'
3101 #include "elf32-target.h"