1 /* V850-specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009 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. */
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
44 v850_elf_check_relocs (bfd
*abfd
,
45 struct bfd_link_info
*info
,
47 const Elf_Internal_Rela
*relocs
)
49 bfd_boolean ret
= TRUE
;
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
;
57 const char *common
= NULL
;
59 if (info
->relocatable
)
63 _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
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
)
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
);
98 case R_V850_LO16_SPLIT_OFFSET
:
103 case R_V850_CALLT_6_7_OFFSET
:
104 case R_V850_CALLT_16_16_OFFSET
:
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
))
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
);
119 && !bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
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
;
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
;
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
;
147 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
152 /* Flag which type of relocation was used. */
154 if ((h
->other
& V850_OTHER_MASK
) != (other
& V850_OTHER_MASK
)
155 && (h
->other
& V850_OTHER_ERROR
) == 0)
158 static char buff
[200]; /* XXX */
160 switch (h
->other
& V850_OTHER_MASK
)
163 msg
= _("Variable `%s' cannot occupy in multiple small data regions");
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");
168 case V850_OTHER_SDA
| V850_OTHER_ZDA
:
169 msg
= _("Variable `%s' cannot be in both small and zero data regions simultaneously");
171 case V850_OTHER_SDA
| V850_OTHER_TDA
:
172 msg
= _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
174 case V850_OTHER_ZDA
| V850_OTHER_TDA
:
175 msg
= _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
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
,
184 bfd_set_error (bfd_error_bad_value
);
185 h
->other
|= V850_OTHER_ERROR
;
190 if (h
&& h
->root
.type
== bfd_link_hash_common
192 && !strcmp (bfd_get_section_name (abfd
, h
->root
.u
.c
.p
->section
), "COMMON"))
196 section
= h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
, common
);
197 section
->flags
|= SEC_IS_COMMON
;
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" : "");
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
230 unsigned long counter
;
232 struct hi16s_location
* next
;
236 static hi16s_location
* previous_hi16s
;
237 static hi16s_location
* free_hi16s
;
238 static unsigned long hi16s_counter
;
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
);
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;
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
;
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
))
296 /* Extract the address. */
297 addr
= match
->address
;
299 /* Remember if this entry has already been used before. */
301 * already_found
= match
->found
;
303 /* Note that this entry has now been used. */
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
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
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:
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
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)
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)
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)
433 + 0x00006fff (bit 15 not set, so the top half is zero)
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)
447 + 0x00006fff (bit 15 not set, so the top half is zero)
449 0x00006fff which is wrong (assuming that fred is at 0xffff). */
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
);
473 bfd_put_16 (abfd
, hi_insn
, hi16s_address
);
478 fprintf (stderr
, _("FAILED to find previous HI16 reloc\n"));
485 /* Do not complain if value has top bit set, as this has been
487 *insn
= (*insn
+ addend
) & 0xffff;
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
,
501 unsigned long result
;
502 bfd_signed_vma saddend
= (bfd_signed_vma
) addend
;
507 return bfd_reloc_notsupported
;
511 bfd_put_32 (abfd
, addend
, address
);
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
);
523 insn
|= (((addend
& 0xfffe) << 16) | ((addend
& 0x3f0000) >> 16));
524 bfd_put_32 (abfd
, (bfd_vma
) insn
, address
);
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
);
536 insn
|= ((addend
& 0x1f0) << 7) | ((addend
& 0x0e) << 3);
540 addend
+= (bfd_get_16 (abfd
, address
) << 16);
541 addend
= (addend
>> 16);
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. */
560 insn
= bfd_get_16 (abfd
, address
);
561 if (! v850_elf_perform_lo16_relocation (abfd
, &insn
, addend
))
562 return bfd_reloc_overflow
;
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
);
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
;
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
;
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
;
612 return bfd_reloc_dangerous
;
614 insn
= (addend
&~ (bfd_vma
) 1) | (insn
& 1);
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
;
627 return bfd_reloc_dangerous
;
630 insn
|= (addend
>> 1);
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
;
643 return bfd_reloc_dangerous
;
646 insn
|= (addend
>> 1);
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
;
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
;
672 return bfd_reloc_dangerous
;
675 insn
|= (addend
>> 1);
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
;
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
);
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
;
713 insn
|= (addend
& 1) << 5;
714 insn
|= (addend
&~ (bfd_vma
) 1) << 16;
716 bfd_put_32 (abfd
, (bfd_vma
) insn
, address
);
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
;
729 return bfd_reloc_dangerous
;
732 insn
|= (addend
>> 1);
735 case R_V850_GNU_VTINHERIT
:
736 case R_V850_GNU_VTENTRY
:
741 bfd_put_16 (abfd
, (bfd_vma
) insn
, address
);
745 /* Insert the addend into the instruction. */
747 static bfd_reloc_status_type
748 v850_elf_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
751 void * data ATTRIBUTE_UNUSED
,
754 char **err ATTRIBUTE_UNUSED
)
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. */
764 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
765 && (! reloc
->howto
->partial_inplace
766 || reloc
->addend
== 0))
768 reloc
->address
+= isection
->output_offset
;
772 /* Catch relocs involving undefined symbols. */
773 if (bfd_is_und_section (symbol
->section
)
774 && (symbol
->flags
& BSF_WEAK
) == 0
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
)
790 /* Get symbol value. (Common symbols are special.) */
791 if (bfd_is_com_section (symbol
->section
))
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
;
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
,
815 char **error_message ATTRIBUTE_UNUSED
)
817 if (output_bfd
!= NULL
)
818 reloc_entry
->address
+= input_section
->output_offset
;
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. */
829 2, /* Size (0 = byte, 1 = short, 2 = long). */
831 FALSE
, /* PC_relative. */
833 complain_overflow_bitfield
, /* Complain_on_overflow. */
834 bfd_elf_generic_reloc
, /* Special_function. */
835 "R_V850_NONE", /* Name. */
836 FALSE
, /* Partial_inplace. */
839 FALSE
), /* PCrel_offset. */
841 /* A PC relative 9 bit branch. */
842 HOWTO (R_V850_9_PCREL
, /* Type. */
844 2, /* Size (0 = byte, 1 = short, 2 = long). */
846 TRUE
, /* PC_relative. */
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. */
859 2, /* Size (0 = byte, 1 = short, 2 = long). */
861 TRUE
, /* PC_relative. */
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. */
874 1, /* Size (0 = byte, 1 = short, 2 = long). */
876 FALSE
, /* PC_relative. */
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. */
889 1, /* Size (0 = byte, 1 = short, 2 = long). */
891 FALSE
, /* PC_relative. */
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. */
904 1, /* Size (0 = byte, 1 = short, 2 = long). */
906 FALSE
, /* PC_relative. */
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. */
919 2, /* Size (0 = byte, 1 = short, 2 = long). */
921 FALSE
, /* PC_relative. */
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. */
934 1, /* Size (0 = byte, 1 = short, 2 = long). */
936 FALSE
, /* PC_relative. */
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. */
949 0, /* Size (0 = byte, 1 = short, 2 = long). */
951 FALSE
, /* PC_relative. */
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. */
964 1, /* Size (0 = byte, 1 = short, 2 = long). */
966 FALSE
, /* PC_relative. */
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. */
979 1, /* Size (0 = byte, 1 = short, 2 = long). */
981 FALSE
, /* PC_relative. */
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. */
994 1, /* Size (0 = byte, 1 = short, 2 = long). */
996 FALSE
, /* PC_relative. */
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). */
1011 FALSE
, /* PC_relative. */
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). */
1026 FALSE
, /* PC_relative. */
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). */
1041 FALSE
, /* PC_relative. */
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). */
1056 FALSE
, /* PC_relative. */
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). */
1071 FALSE
, /* PC_relative. */
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). */
1086 FALSE
, /* PC_relative. */
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). */
1101 FALSE
, /* PC_relative. */
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). */
1116 FALSE
, /* PC_relative. */
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). */
1131 FALSE
, /* PC_relative. */
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). */
1146 FALSE
, /* PC_relative. */
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). */
1161 FALSE
, /* PC_relative. */
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). */
1176 FALSE
, /* PC_relative. */
1178 complain_overflow_dont
, /* Complain_on_overflow. */
1179 NULL
, /* Special_function. */
1180 "R_V850_GNU_VTINHERIT", /* Name. */
1181 FALSE
, /* Partial_inplace. */
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). */
1191 FALSE
, /* PC_relative. */
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. */
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). */
1207 TRUE
, /* PC_relative. */
1209 complain_overflow_signed
, /* Complain_on_overflow. */
1210 v850_elf_ignore_reloc
, /* Special_function. */
1211 "R_V850_LONGCALL", /* Name. */
1212 FALSE
, /* Partial_inplace. */
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). */
1223 TRUE
, /* PC_relative. */
1225 complain_overflow_signed
, /* Complain_on_overflow. */
1226 v850_elf_ignore_reloc
, /* Special_function. */
1227 "R_V850_LONGJUMP", /* Name. */
1228 FALSE
, /* Partial_inplace. */
1231 TRUE
), /* PCrel_offset. */
1233 HOWTO (R_V850_ALIGN
, /* Type. */
1234 0, /* Rightshift. */
1235 1, /* Size (0 = byte, 1 = short, 2 = long). */
1237 FALSE
, /* PC_relative. */
1239 complain_overflow_unsigned
, /* Complain_on_overflow. */
1240 v850_elf_ignore_reloc
, /* Special_function. */
1241 "R_V850_ALIGN", /* Name. */
1242 FALSE
, /* Partial_inplace. */
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). */
1252 TRUE
, /* PC_relative. */
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). */
1267 FALSE
, /* PC_relative. */
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
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
)
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
;
1344 static reloc_howto_type
*
1345 v850_elf_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1351 i
< sizeof (v850_elf_howto_table
) / sizeof (v850_elf_howto_table
[0]);
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
];
1360 /* Set the howto pointer for an V850 ELF reloc. */
1363 v850_elf_info_to_howto_rel (bfd
*abfd ATTRIBUTE_UNUSED
,
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). */
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
];
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
,
1405 bfd
*output_bfd ATTRIBUTE_UNUSED
,
1406 asection
*input_section
,
1411 struct bfd_link_info
*info
,
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. */
1421 case R_V850_9_PCREL
:
1422 value
-= (input_section
->output_section
->vma
1423 + input_section
->output_offset
);
1427 case R_V850_22_PCREL
:
1428 value
-= (input_section
->output_section
->vma
1429 + input_section
->output_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
);
1441 value
-= (input_section
->output_section
->vma
1442 + input_section
->output_offset
1449 case R_V850_LO16_SPLIT_OFFSET
:
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
;
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
:
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
);
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
);
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
:
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
);
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
);
1513 case R_V850_CALLT_6_7_OFFSET
:
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
);
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
);
1531 case R_V850_CALLT_16_16_OFFSET
:
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
);
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
);
1555 case R_V850_GNU_VTINHERIT
:
1556 case R_V850_GNU_VTENTRY
:
1557 case R_V850_LONGCALL
:
1558 case R_V850_LONGJUMP
:
1560 return bfd_reloc_ok
;
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. */
1573 v850_elf_relocate_section (bfd
*output_bfd
,
1574 struct bfd_link_info
*info
,
1576 asection
*input_section
,
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
;
1596 relend
= relocs
+ input_section
->reloc_count
;
1597 for (; rel
< relend
; rel
++)
1600 reloc_howto_type
*howto
;
1601 unsigned long r_symndx
;
1602 Elf_Internal_Sym
*sym
;
1604 struct elf_link_hash_entry
*h
;
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
)
1615 howto
= v850_elf_howto_table
+ r_type
;
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
);
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);
1641 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1642 r_symndx
, symtab_hdr
, sym_hashes
,
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
);
1658 if (info
->relocatable
)
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
,
1664 contents
, rel
->r_offset
,
1665 relocation
, rel
->r_addend
,
1666 info
, sec
, h
== NULL
);
1668 if (r
!= bfd_reloc_ok
)
1671 const char * msg
= NULL
;
1674 name
= h
->root
.root
.string
;
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
);
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
,
1693 case bfd_reloc_undefined
:
1694 if (! ((*info
->callbacks
->undefined_symbol
)
1695 (info
, name
, input_bfd
, input_section
,
1696 rel
->r_offset
, TRUE
)))
1700 case bfd_reloc_outofrange
:
1701 msg
= _("internal error: out of range error");
1704 case bfd_reloc_notsupported
:
1705 msg
= _("internal error: unsupported relocation error");
1708 case bfd_reloc_dangerous
:
1709 msg
= _("internal error: dangerous relocation");
1712 case bfd_reloc_gp_not_found
:
1713 msg
= _("could not locate special linker symbol __gp");
1716 case bfd_reloc_ep_not_found
:
1717 msg
= _("could not locate special linker symbol __ep");
1720 case bfd_reloc_ctbp_not_found
:
1721 msg
= _("could not locate special linker symbol __ctbp");
1725 msg
= _("internal error: unknown error");
1729 if (!((*info
->callbacks
->warning
)
1730 (info
, msg
, name
, input_bfd
, input_section
,
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
)
1749 switch (ELF32_R_TYPE (rel
->r_info
))
1751 case R_V850_GNU_VTINHERIT
:
1752 case R_V850_GNU_VTENTRY
:
1756 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
1759 /* Set the right machine number. */
1762 v850_elf_object_p (bfd
*abfd
)
1764 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1768 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850
);
1771 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e
);
1774 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e1
);
1780 /* Store the machine number in the flags field. */
1783 v850_elf_final_write_processing (bfd
*abfd
,
1784 bfd_boolean linker ATTRIBUTE_UNUSED
)
1788 switch (bfd_get_mach (abfd
))
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. */
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
;
1813 /* Merge backend specific data from an object file
1814 to the output object file when linking. */
1817 v850_elf_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
1822 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1823 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
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
)
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
));
1850 /* Check flag compatibility. */
1851 if (in_flags
== out_flags
)
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
)
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
);
1871 _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1878 /* Display the flags field. */
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
)
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;
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. */
1926 v850_elf_section_from_bfd_section (bfd
*abfd ATTRIBUTE_UNUSED
,
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
;
1942 /* Handle the special V850 section numbers that a symbol may use. */
1945 v850_elf_symbol_processing (bfd
*abfd
, asymbol
*asym
)
1947 elf_symbol_type
* elfsym
= (elf_symbol_type
*) asym
;
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
;
1965 case SHT_V850_TCOMMON
:
1966 indx
= SHN_V850_TCOMMON
;
1969 case SHT_V850_ZCOMMON
:
1970 indx
= SHN_V850_ZCOMMON
;
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
;
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
;
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
;
2035 /* Hook called by the linker routine which adds symbols from an object
2036 file. We must handle the special v850 section numbers here. */
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
,
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
;
2062 case SHT_V850_TCOMMON
:
2063 indx
= SHN_V850_TCOMMON
;
2066 case SHT_V850_ZCOMMON
:
2067 indx
= SHN_V850_ZCOMMON
;
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
;
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
;
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
;
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
);
2129 v850_elf_section_from_shdr (bfd
*abfd
,
2130 Elf_Internal_Shdr
*hdr
,
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
))
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
,
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. */
2160 v850_elf_fake_sections (bfd
*abfd ATTRIBUTE_UNUSED
,
2161 Elf_Internal_Shdr
*hdr
,
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
;
2178 /* Delete some bytes from a section while relaxing. */
2181 v850_elf_relax_delete_bytes (bfd
*abfd
,
2187 Elf_Internal_Shdr
*symtab_hdr
;
2188 Elf32_External_Sym
*extsyms
;
2189 Elf32_External_Sym
*esym
;
2190 Elf32_External_Sym
*esymend
;
2192 unsigned int sec_shndx
;
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
);
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
),
2242 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_ALIGN
)
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
,
2250 if (isym
.st_shndx
!= sec_shndx
)
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
);
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
);
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)
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
);
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. */
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
);
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)
2406 v850_elf_relax_section (bfd
*abfd
,
2408 struct bfd_link_info
*link_info
,
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
;
2420 int align_pad_size
= 0;
2421 bfd_boolean result
= TRUE
;
2425 if (link_info
->relocatable
2426 || (sec
->flags
& SEC_RELOC
) == 0
2427 || sec
->reloc_count
== 0)
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
)
2437 irelend
= internal_relocs
+ sec
->reloc_count
;
2439 while (addr
< 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
;
2450 fprintf (stderr
, "relax region 0x%x to 0x%x align pad %d\n",
2451 addr
, toaddr
, align_pad_size
);
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
)
2465 align_pad_size
= alignto
- alignmoveto
;
2467 fprintf (stderr
, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2468 alignmoveto
, toaddr
, align_pad_size
);
2470 if (!v850_elf_relax_delete_bytes (abfd
, sec
, alignmoveto
,
2471 toaddr
, align_pad_size
))
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
);
2484 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
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
)))
2502 fprintf (stderr
, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
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
;
2515 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
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,
2528 if (isymbuf
== NULL
)
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)
2550 && ((insn
[1] & MOVEA_MASK
) != MOVEA
2551 || MOVHI_R2 (insn
[0]) != MOVEA_R1 (insn
[1])))
2555 && (insn
[2] & JARL_4_MASK
) != JARL_4
)
2559 && ((insn
[3] & ADD_I_MASK
) != ADD_I
2560 || ADD_I5 (insn
[3]) != 4
2561 || JARL_R2 (insn
[2]) != ADD_R2 (insn
[3])))
2565 && ((insn
[4] & JMP_R_MASK
) != JMP_R
2566 || MOVEA_R2 (insn
[1]) != JMP_R1 (insn
[4])))
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
));
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
]));
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
)
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
)
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
)
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
));
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
;
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. */
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
));
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
;
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
;
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
);
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. */
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
2704 + sec
->output_section
->vma
2705 + sec
->output_offset
2708 fprintf (stderr
, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2711 + sec
->output_section
->vma
2712 + sec
->output_offset
),
2713 symval
, addend
, foff
);
2716 if (foff
< -0x100000 || foff
>= 0x100000)
2717 /* After all that work, we can't shorten this function call. */
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
);
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
2741 0x00000780 | (JARL_R2 (insn
[2])<<11) | ((addend
<< 16) & 0xffff) | ((addend
>> 16) & 0xf),
2742 contents
+ irel
->r_offset
);
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
);
2751 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
2753 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_V850_NONE
);
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))
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)
2777 && ((insn
[1] & MOVEA_MASK
) != MOVEA
2778 || MOVHI_R2 (insn
[0]) != MOVEA_R1 (insn
[1])))
2782 && ((insn
[2] & JMP_R_MASK
) != JMP_R
2783 || MOVEA_R2 (insn
[1]) != JMP_R1 (insn
[2])))
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
));
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
]));
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
)
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
)
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
));
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
;
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
;
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
);
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
);
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. */
2877 symval
= (h
->root
.u
.def
.value
2878 + h
->root
.u
.def
.section
->output_section
->vma
2879 + h
->root
.u
.def
.section
->output_offset
);
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
);
2888 addend
= irel
->r_addend
;
2890 foff
= (symval
+ addend
2892 + sec
->output_section
->vma
2893 + sec
->output_offset
2896 fprintf (stderr
, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2899 + sec
->output_section
->vma
2900 + sec
->output_offset
),
2901 symval
, addend
, foff
);
2903 if (foff
< -0x100000 || foff
>= 0x100000)
2904 /* After all that work, we can't shorten this function call. */
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. */
2923 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_V850_22_PCREL
);
2925 irel
->r_addend
= addend
;
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
2933 0x00000780 | ((addend
<< 15) & 0xffff0000) | ((addend
>> 17) & 0xf),
2934 contents
+ irel
->r_offset
);
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
);
2942 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
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))
2949 align_pad_size
+= 6;
2953 /* Replace the long jump with a br. */
2956 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_V850_9_PCREL
);
2958 irel
->r_addend
= addend
;
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
2966 0x0585 | ((addend
<< 10) & 0xf800) | ((addend
<< 3) & 0x0070),
2967 contents
+ irel
->r_offset
);
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
);
2975 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
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))
2982 align_pad_size
+= 8;
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
)
3006 fprintf (stderr
, "relax pad %d shorten %d -> %d\n",
3009 sec
->size
- align_pad_size
);
3011 sec
->size
-= align_pad_size
;
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
)
3024 && symtab_hdr
->contents
!= (bfd_byte
*) isymbuf
)
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
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"