1 /* Matsushita 10200 specific support for 32-bit ELF
2 Copyright (C) 1996-2021 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
27 mn10200_elf_relax_delete_bytes (bfd
*, asection
*, bfd_vma
, int);
29 mn10200_elf_symbol_address_p (bfd
*, asection
*, Elf_Internal_Sym
*, bfd_vma
);
44 static reloc_howto_type elf_mn10200_howto_table
[] =
46 /* Dummy relocation. Does nothing. */
47 HOWTO (R_MN10200_NONE
,
53 complain_overflow_dont
,
54 bfd_elf_generic_reloc
,
60 /* Standard 32 bit reloc. */
67 complain_overflow_bitfield
,
68 bfd_elf_generic_reloc
,
74 /* Standard 16 bit reloc. */
81 complain_overflow_bitfield
,
82 bfd_elf_generic_reloc
,
88 /* Standard 8 bit reloc. */
95 complain_overflow_bitfield
,
96 bfd_elf_generic_reloc
,
102 /* Standard 24 bit reloc. */
109 complain_overflow_bitfield
,
110 bfd_elf_generic_reloc
,
116 /* Simple 8 pc-relative reloc. */
117 HOWTO (R_MN10200_PCREL8
,
123 complain_overflow_bitfield
,
124 bfd_elf_generic_reloc
,
130 /* Simple 16 pc-relative reloc. */
131 HOWTO (R_MN10200_PCREL16
,
137 complain_overflow_bitfield
,
138 bfd_elf_generic_reloc
,
144 /* Simple 32bit pc-relative reloc with a 1 byte adjustment
145 to get the pc-relative offset correct. */
146 HOWTO (R_MN10200_PCREL24
,
152 complain_overflow_bitfield
,
153 bfd_elf_generic_reloc
,
161 struct mn10200_reloc_map
163 bfd_reloc_code_real_type bfd_reloc_val
;
164 unsigned char elf_reloc_val
;
167 static const struct mn10200_reloc_map mn10200_reloc_map
[] =
169 { BFD_RELOC_NONE
, R_MN10200_NONE
, },
170 { BFD_RELOC_32
, R_MN10200_32
, },
171 { BFD_RELOC_16
, R_MN10200_16
, },
172 { BFD_RELOC_8
, R_MN10200_8
, },
173 { BFD_RELOC_24
, R_MN10200_24
, },
174 { BFD_RELOC_8_PCREL
, R_MN10200_PCREL8
, },
175 { BFD_RELOC_16_PCREL
, R_MN10200_PCREL16
, },
176 { BFD_RELOC_24_PCREL
, R_MN10200_PCREL24
, },
179 static reloc_howto_type
*
180 bfd_elf32_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
181 bfd_reloc_code_real_type code
)
186 i
< sizeof (mn10200_reloc_map
) / sizeof (struct mn10200_reloc_map
);
189 if (mn10200_reloc_map
[i
].bfd_reloc_val
== code
)
190 return &elf_mn10200_howto_table
[mn10200_reloc_map
[i
].elf_reloc_val
];
196 static reloc_howto_type
*
197 bfd_elf32_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
203 i
< (sizeof (elf_mn10200_howto_table
)
204 / sizeof (elf_mn10200_howto_table
[0]));
206 if (elf_mn10200_howto_table
[i
].name
!= NULL
207 && strcasecmp (elf_mn10200_howto_table
[i
].name
, r_name
) == 0)
208 return &elf_mn10200_howto_table
[i
];
213 /* Set the howto pointer for an MN10200 ELF reloc. */
216 mn10200_info_to_howto (bfd
*abfd
,
218 Elf_Internal_Rela
*dst
)
222 r_type
= ELF32_R_TYPE (dst
->r_info
);
223 if (r_type
>= (unsigned int) R_MN10200_MAX
)
225 /* xgettext:c-format */
226 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
228 bfd_set_error (bfd_error_bad_value
);
232 cache_ptr
->howto
= &elf_mn10200_howto_table
[r_type
];
233 return cache_ptr
->howto
!= NULL
;
236 /* Perform a relocation as part of a final link. */
238 static bfd_reloc_status_type
239 mn10200_elf_final_link_relocate (reloc_howto_type
*howto
,
241 bfd
*output_bfd ATTRIBUTE_UNUSED
,
242 asection
*input_section
,
247 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
248 asection
*sym_sec ATTRIBUTE_UNUSED
,
249 int is_local ATTRIBUTE_UNUSED
)
251 unsigned long r_type
= howto
->type
;
252 bfd_byte
*hit_data
= contents
+ offset
;
262 bfd_put_32 (input_bfd
, value
, hit_data
);
268 if ((long) value
> 0x7fff || (long) value
< -0x8000)
269 return bfd_reloc_overflow
;
271 bfd_put_16 (input_bfd
, value
, hit_data
);
277 if ((long) value
> 0x7f || (long) value
< -0x80)
278 return bfd_reloc_overflow
;
280 bfd_put_8 (input_bfd
, value
, hit_data
);
286 if ((long) value
> 0x7fffff || (long) value
< -0x800000)
287 return bfd_reloc_overflow
;
290 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
291 bfd_put_32 (input_bfd
, value
, hit_data
);
294 case R_MN10200_PCREL8
:
295 value
-= (input_section
->output_section
->vma
296 + input_section
->output_offset
);
297 value
-= (offset
+ 1);
300 if ((long) value
> 0xff || (long) value
< -0x100)
301 return bfd_reloc_overflow
;
303 bfd_put_8 (input_bfd
, value
, hit_data
);
306 case R_MN10200_PCREL16
:
307 value
-= (input_section
->output_section
->vma
308 + input_section
->output_offset
);
309 value
-= (offset
+ 2);
312 if ((long) value
> 0xffff || (long) value
< -0x10000)
313 return bfd_reloc_overflow
;
315 bfd_put_16 (input_bfd
, value
, hit_data
);
318 case R_MN10200_PCREL24
:
319 value
-= (input_section
->output_section
->vma
320 + input_section
->output_offset
);
321 value
-= (offset
+ 3);
324 if ((long) value
> 0xffffff || (long) value
< -0x1000000)
325 return bfd_reloc_overflow
;
328 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
329 bfd_put_32 (input_bfd
, value
, hit_data
);
333 return bfd_reloc_notsupported
;
337 /* Relocate an MN10200 ELF section. */
339 mn10200_elf_relocate_section (bfd
*output_bfd
,
340 struct bfd_link_info
*info
,
342 asection
*input_section
,
344 Elf_Internal_Rela
*relocs
,
345 Elf_Internal_Sym
*local_syms
,
346 asection
**local_sections
)
348 Elf_Internal_Shdr
*symtab_hdr
;
349 struct elf_link_hash_entry
**sym_hashes
;
350 Elf_Internal_Rela
*rel
, *relend
;
352 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
353 sym_hashes
= elf_sym_hashes (input_bfd
);
356 relend
= relocs
+ input_section
->reloc_count
;
357 for (; rel
< relend
; rel
++)
360 reloc_howto_type
*howto
;
361 unsigned long r_symndx
;
362 Elf_Internal_Sym
*sym
;
364 struct elf_link_hash_entry
*h
;
366 bfd_reloc_status_type r
;
368 r_symndx
= ELF32_R_SYM (rel
->r_info
);
369 r_type
= ELF32_R_TYPE (rel
->r_info
);
370 howto
= elf_mn10200_howto_table
+ r_type
;
375 if (r_symndx
< symtab_hdr
->sh_info
)
377 sym
= local_syms
+ r_symndx
;
378 sec
= local_sections
[r_symndx
];
379 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
383 bool unresolved_reloc
, warned
, ignored
;
385 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
386 r_symndx
, symtab_hdr
, sym_hashes
,
388 unresolved_reloc
, warned
, ignored
);
391 if (sec
!= NULL
&& discarded_section (sec
))
392 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
393 rel
, 1, relend
, howto
, 0, contents
);
395 if (bfd_link_relocatable (info
))
398 r
= mn10200_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
400 contents
, rel
->r_offset
,
401 relocation
, rel
->r_addend
,
402 info
, sec
, h
== NULL
);
404 if (r
!= bfd_reloc_ok
)
407 const char *msg
= (const char *) 0;
410 name
= h
->root
.root
.string
;
413 name
= (bfd_elf_string_from_elf_section
414 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
415 if (name
== NULL
|| *name
== '\0')
416 name
= bfd_section_name (sec
);
421 case bfd_reloc_overflow
:
422 (*info
->callbacks
->reloc_overflow
)
423 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
424 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
);
427 case bfd_reloc_undefined
:
428 (*info
->callbacks
->undefined_symbol
) (info
, name
, input_bfd
,
430 rel
->r_offset
, true);
433 case bfd_reloc_outofrange
:
434 msg
= _("internal error: out of range error");
437 case bfd_reloc_notsupported
:
438 msg
= _("internal error: unsupported relocation error");
441 case bfd_reloc_dangerous
:
442 msg
= _("internal error: dangerous error");
446 msg
= _("internal error: unknown error");
450 (*info
->callbacks
->warning
) (info
, msg
, name
, input_bfd
,
451 input_section
, rel
->r_offset
);
460 /* Delete some bytes from a section while relaxing. */
463 mn10200_elf_relax_delete_bytes (bfd
*abfd
, asection
*sec
,
464 bfd_vma addr
, int count
)
466 Elf_Internal_Shdr
*symtab_hdr
;
467 unsigned int sec_shndx
;
469 Elf_Internal_Rela
*irel
, *irelend
;
471 Elf_Internal_Sym
*isym
;
472 Elf_Internal_Sym
*isymend
;
473 struct elf_link_hash_entry
**sym_hashes
;
474 struct elf_link_hash_entry
**end_hashes
;
475 unsigned int symcount
;
477 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
479 contents
= elf_section_data (sec
)->this_hdr
.contents
;
483 irel
= elf_section_data (sec
)->relocs
;
484 irelend
= irel
+ sec
->reloc_count
;
486 /* Actually delete the bytes. */
487 memmove (contents
+ addr
, contents
+ addr
+ count
,
488 (size_t) (toaddr
- addr
- count
));
491 /* Adjust all the relocs. */
492 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
494 /* Get the new reloc address. */
495 if ((irel
->r_offset
> addr
496 && irel
->r_offset
< toaddr
))
497 irel
->r_offset
-= count
;
500 /* Adjust the local symbols defined in this section. */
501 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
502 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
503 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
505 if (isym
->st_shndx
== sec_shndx
506 && isym
->st_value
> addr
507 && isym
->st_value
< toaddr
)
508 isym
->st_value
-= count
;
511 /* Now adjust the global symbols defined in this section. */
512 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
513 - symtab_hdr
->sh_info
);
514 sym_hashes
= elf_sym_hashes (abfd
);
515 end_hashes
= sym_hashes
+ symcount
;
516 for (; sym_hashes
< end_hashes
; sym_hashes
++)
518 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
519 if ((sym_hash
->root
.type
== bfd_link_hash_defined
520 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
521 && sym_hash
->root
.u
.def
.section
== sec
522 && sym_hash
->root
.u
.def
.value
> addr
523 && sym_hash
->root
.u
.def
.value
< toaddr
)
525 sym_hash
->root
.u
.def
.value
-= count
;
532 /* This function handles relaxing for the mn10200.
534 There are quite a few relaxing opportunities available on the mn10200:
536 * jsr:24 -> jsr:16 2 bytes
538 * jmp:24 -> jmp:16 2 bytes
539 * jmp:16 -> bra:8 1 byte
541 * If the previous instruction is a conditional branch
542 around the jump/bra, we may be able to reverse its condition
543 and change its target to the jump's target. The jump/bra
544 can then be deleted. 2 bytes
546 * mov abs24 -> mov abs16 2 byte savings
548 * Most instructions which accept imm24 can relax to imm16 2 bytes
549 - Most instructions which accept imm16 can relax to imm8 1 byte
551 * Most instructions which accept d24 can relax to d16 2 bytes
552 - Most instructions which accept d16 can relax to d8 1 byte
554 abs24, imm24, d24 all look the same at the reloc level. It
555 might make the code simpler if we had different relocs for
556 the various relaxable operand types.
558 We don't handle imm16->imm8 or d16->d8 as they're very rare
559 and somewhat more difficult to support. */
562 mn10200_elf_relax_section (bfd
*abfd
,
564 struct bfd_link_info
*link_info
,
567 Elf_Internal_Shdr
*symtab_hdr
;
568 Elf_Internal_Rela
*internal_relocs
;
569 Elf_Internal_Rela
*irel
, *irelend
;
570 bfd_byte
*contents
= NULL
;
571 Elf_Internal_Sym
*isymbuf
= NULL
;
573 /* Assume nothing changes. */
576 /* We don't have to do anything for a relocatable link, if
577 this section does not have relocs, or if this is not a
579 if (bfd_link_relocatable (link_info
)
580 || (sec
->flags
& SEC_RELOC
) == 0
581 || sec
->reloc_count
== 0
582 || (sec
->flags
& SEC_CODE
) == 0)
585 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
587 /* Get a copy of the native relocations. */
588 internal_relocs
= (_bfd_elf_link_read_relocs
589 (abfd
, sec
, NULL
, (Elf_Internal_Rela
*) NULL
,
590 link_info
->keep_memory
));
591 if (internal_relocs
== NULL
)
594 /* Walk through them looking for relaxing opportunities. */
595 irelend
= internal_relocs
+ sec
->reloc_count
;
596 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
600 /* If this isn't something that can be relaxed, then ignore
602 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_NONE
603 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_8
604 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_MAX
)
607 /* Get the section contents if we haven't done so already. */
608 if (contents
== NULL
)
610 /* Get cached copy if it exists. */
611 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
612 contents
= elf_section_data (sec
)->this_hdr
.contents
;
615 /* Go get them off disk. */
616 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
621 /* Read this BFD's local symbols if we haven't done so already. */
622 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
624 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
626 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
627 symtab_hdr
->sh_info
, 0,
633 /* Get the value of the symbol referred to by the reloc. */
634 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
636 /* A local symbol. */
637 Elf_Internal_Sym
*isym
;
640 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
641 if (isym
->st_shndx
== SHN_UNDEF
)
642 sym_sec
= bfd_und_section_ptr
;
643 else if (isym
->st_shndx
== SHN_ABS
)
644 sym_sec
= bfd_abs_section_ptr
;
645 else if (isym
->st_shndx
== SHN_COMMON
)
646 sym_sec
= bfd_com_section_ptr
;
648 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
649 symval
= (isym
->st_value
650 + sym_sec
->output_section
->vma
651 + sym_sec
->output_offset
);
656 struct elf_link_hash_entry
*h
;
658 /* An external symbol. */
659 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
660 h
= elf_sym_hashes (abfd
)[indx
];
661 BFD_ASSERT (h
!= NULL
);
662 if (h
->root
.type
!= bfd_link_hash_defined
663 && h
->root
.type
!= bfd_link_hash_defweak
)
665 /* This appears to be a reference to an undefined
666 symbol. Just ignore it--it will be caught by the
667 regular reloc processing. */
671 symval
= (h
->root
.u
.def
.value
672 + h
->root
.u
.def
.section
->output_section
->vma
673 + h
->root
.u
.def
.section
->output_offset
);
676 /* For simplicity of coding, we are going to modify the section
677 contents, the section relocs, and the BFD symbol table. We
678 must tell the rest of the code not to free up this
679 information. It would be possible to instead create a table
680 of changes which have to be made, as is done in coff-mips.c;
681 that would be more work, but would require less memory when
682 the linker is run. */
684 /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
686 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL24
)
688 bfd_vma value
= symval
;
690 /* Deal with pc-relative gunk. */
691 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
692 value
-= (irel
->r_offset
+ 3);
693 value
+= irel
->r_addend
;
695 /* See if the value will fit in 16 bits, note the high value is
696 0x7fff + 2 as the target will be two bytes closer if we are
698 if ((long) value
< 0x8001 && (long) value
> -0x8000)
702 /* Get the opcode. */
703 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
705 if (code
!= 0xe0 && code
!= 0xe1)
708 /* Note that we've changed the relocs, section contents, etc. */
709 elf_section_data (sec
)->relocs
= internal_relocs
;
710 elf_section_data (sec
)->this_hdr
.contents
= contents
;
711 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
713 /* Fix the opcode. */
715 bfd_put_8 (abfd
, 0xfc, contents
+ irel
->r_offset
- 2);
716 else if (code
== 0xe1)
717 bfd_put_8 (abfd
, 0xfd, contents
+ irel
->r_offset
- 2);
719 /* Fix the relocation's type. */
720 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
723 /* The opcode got shorter too, so we have to fix the offset. */
726 /* Delete two bytes of data. */
727 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
728 irel
->r_offset
+ 1, 2))
731 /* That will change things, so, we should relax again.
732 Note that this is not required, and it may be slow. */
737 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
739 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL16
)
741 bfd_vma value
= symval
;
743 /* Deal with pc-relative gunk. */
744 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
745 value
-= (irel
->r_offset
+ 2);
746 value
+= irel
->r_addend
;
748 /* See if the value will fit in 8 bits, note the high value is
749 0x7f + 1 as the target will be one bytes closer if we are
751 if ((long) value
< 0x80 && (long) value
> -0x80)
755 /* Get the opcode. */
756 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
761 /* Note that we've changed the relocs, section contents, etc. */
762 elf_section_data (sec
)->relocs
= internal_relocs
;
763 elf_section_data (sec
)->this_hdr
.contents
= contents
;
764 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
766 /* Fix the opcode. */
767 bfd_put_8 (abfd
, 0xea, contents
+ irel
->r_offset
- 1);
769 /* Fix the relocation's type. */
770 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
773 /* Delete one byte of data. */
774 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
775 irel
->r_offset
+ 1, 1))
778 /* That will change things, so, we should relax again.
779 Note that this is not required, and it may be slow. */
784 /* Try to eliminate an unconditional 8 bit pc-relative branch
785 which immediately follows a conditional 8 bit pc-relative
786 branch around the unconditional branch.
793 This happens when the bCC can't reach lab2 at assembly time,
794 but due to other relaxations it can reach at link time. */
795 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL8
)
797 Elf_Internal_Rela
*nrel
;
798 bfd_vma value
= symval
;
801 /* Deal with pc-relative gunk. */
802 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
803 value
-= (irel
->r_offset
+ 1);
804 value
+= irel
->r_addend
;
806 /* Do nothing if this reloc is the last byte in the section. */
807 if (irel
->r_offset
== sec
->size
)
810 /* See if the next instruction is an unconditional pc-relative
811 branch, more often than not this test will fail, so we
812 test it first to speed things up. */
813 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
817 /* Also make sure the next relocation applies to the next
818 instruction and that it's a pc-relative 8 bit branch. */
821 || irel
->r_offset
+ 2 != nrel
->r_offset
822 || ELF32_R_TYPE (nrel
->r_info
) != (int) R_MN10200_PCREL8
)
825 /* Make sure our destination immediately follows the
826 unconditional branch. */
827 if (symval
!= (sec
->output_section
->vma
+ sec
->output_offset
828 + irel
->r_offset
+ 3))
831 /* Now make sure we are a conditional branch. This may not
832 be necessary, but why take the chance.
834 Note these checks assume that R_MN10200_PCREL8 relocs
835 only occur on bCC and bCCx insns. If they occured
836 elsewhere, we'd need to know the start of this insn
837 for this check to be accurate. */
838 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
839 if (code
!= 0xe0 && code
!= 0xe1 && code
!= 0xe2
840 && code
!= 0xe3 && code
!= 0xe4 && code
!= 0xe5
841 && code
!= 0xe6 && code
!= 0xe7 && code
!= 0xe8
842 && code
!= 0xe9 && code
!= 0xec && code
!= 0xed
843 && code
!= 0xee && code
!= 0xef && code
!= 0xfc
844 && code
!= 0xfd && code
!= 0xfe && code
!= 0xff)
847 /* We also have to be sure there is no symbol/label
848 at the unconditional branch. */
849 if (mn10200_elf_symbol_address_p (abfd
, sec
, isymbuf
,
853 /* Note that we've changed the relocs, section contents, etc. */
854 elf_section_data (sec
)->relocs
= internal_relocs
;
855 elf_section_data (sec
)->this_hdr
.contents
= contents
;
856 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
858 /* Reverse the condition of the first branch. */
916 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
918 /* Set the reloc type and symbol for the first branch
919 from the second branch. */
920 irel
->r_info
= nrel
->r_info
;
922 /* Make the reloc for the second branch a null reloc. */
923 nrel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (nrel
->r_info
),
926 /* Delete two bytes of data. */
927 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
928 irel
->r_offset
+ 1, 2))
931 /* That will change things, so, we should relax again.
932 Note that this is not required, and it may be slow. */
936 /* Try to turn a 24bit immediate, displacement or absolute address
937 into a 16bit immediate, displacement or absolute address. */
938 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_24
)
940 bfd_vma value
= symval
;
942 /* See if the value will fit in 16 bits.
943 We allow any 16bit match here. We prune those we can't
945 if ((long) value
< 0x7fff && (long) value
> -0x8000)
949 /* All insns which have 24bit operands are 5 bytes long,
950 the first byte will always be 0xf4, but we double check
953 /* Get the first opcode. */
954 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
959 /* Get the second opcode. */
960 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
964 /* mov imm24,dn -> mov imm16,dn */
966 /* Not safe if the high bit is on as relaxing may
967 move the value out of high mem and thus not fit
968 in a signed 16bit value. */
972 /* Note that we've changed the relocation contents, etc. */
973 elf_section_data (sec
)->relocs
= internal_relocs
;
974 elf_section_data (sec
)->this_hdr
.contents
= contents
;
975 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
977 /* Fix the opcode. */
978 bfd_put_8 (abfd
, 0xf8 + (code
& 0x03),
979 contents
+ irel
->r_offset
- 2);
981 /* Fix the relocation's type. */
982 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
985 /* The opcode got shorter too, so we have to fix the
989 /* Delete two bytes of data. */
990 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
991 irel
->r_offset
+ 1, 2))
994 /* That will change things, so, we should relax again.
995 Note that this is not required, and it may be slow. */
999 /* mov imm24,an -> mov imm16,an
1000 cmp imm24,an -> cmp imm16,an
1001 mov (abs24),dn -> mov (abs16),dn
1002 mov dn,(abs24) -> mov dn,(abs16)
1003 movb dn,(abs24) -> movb dn,(abs16)
1004 movbu (abs24),dn -> movbu (abs16),dn */
1011 /* Note that we've changed the relocation contents, etc. */
1012 elf_section_data (sec
)->relocs
= internal_relocs
;
1013 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1014 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1016 if ((code
& 0xfc) == 0x74)
1017 code
= 0xdc + (code
& 0x03);
1018 else if ((code
& 0xfc) == 0x7c)
1019 code
= 0xec + (code
& 0x03);
1020 else if ((code
& 0xfc) == 0xc0)
1021 code
= 0xc8 + (code
& 0x03);
1022 else if ((code
& 0xfc) == 0x40)
1023 code
= 0xc0 + (code
& 0x03);
1024 else if ((code
& 0xfc) == 0x44)
1025 code
= 0xc4 + (code
& 0x03);
1026 else if ((code
& 0xfc) == 0xc8)
1027 code
= 0xcc + (code
& 0x03);
1029 /* Fix the opcode. */
1030 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 2);
1032 /* Fix the relocation's type. */
1033 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1036 /* The opcode got shorter too, so we have to fix the
1038 irel
->r_offset
-= 1;
1040 /* Delete two bytes of data. */
1041 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1042 irel
->r_offset
+ 1, 2))
1045 /* That will change things, so, we should relax again.
1046 Note that this is not required, and it may be slow. */
1050 /* cmp imm24,dn -> cmp imm16,dn
1051 mov (abs24),an -> mov (abs16),an
1052 mov an,(abs24) -> mov an,(abs16)
1053 add imm24,dn -> add imm16,dn
1054 add imm24,an -> add imm16,an
1055 sub imm24,dn -> sub imm16,dn
1056 sub imm24,an -> sub imm16,an
1057 And all d24->d16 in memory ops. */
1074 /* Not safe if the high bit is on as relaxing may
1075 move the value out of high mem and thus not fit
1076 in a signed 16bit value. */
1077 if (((code
& 0xfc) == 0x78
1078 || (code
& 0xfc) == 0x60
1079 || (code
& 0xfc) == 0x64
1080 || (code
& 0xfc) == 0x68
1081 || (code
& 0xfc) == 0x6c
1082 || (code
& 0xfc) == 0x80
1083 || (code
& 0xfc) == 0xf0
1084 || (code
& 0xfc) == 0x00
1085 || (code
& 0xfc) == 0x10
1086 || (code
& 0xfc) == 0xb0
1087 || (code
& 0xfc) == 0x30
1088 || (code
& 0xfc) == 0xa0
1089 || (code
& 0xfc) == 0x20
1090 || (code
& 0xfc) == 0x90)
1091 && (value
& 0x8000) != 0)
1094 /* Note that we've changed the relocation contents, etc. */
1095 elf_section_data (sec
)->relocs
= internal_relocs
;
1096 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1097 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1099 /* Fix the opcode. */
1100 bfd_put_8 (abfd
, 0xf7, contents
+ irel
->r_offset
- 2);
1102 if ((code
& 0xfc) == 0x78)
1103 code
= 0x48 + (code
& 0x03);
1104 else if ((code
& 0xfc) == 0xd0)
1105 code
= 0x30 + (code
& 0x03);
1106 else if ((code
& 0xfc) == 0x50)
1107 code
= 0x20 + (code
& 0x03);
1108 else if ((code
& 0xfc) == 0x60)
1109 code
= 0x18 + (code
& 0x03);
1110 else if ((code
& 0xfc) == 0x64)
1111 code
= 0x08 + (code
& 0x03);
1112 else if ((code
& 0xfc) == 0x68)
1113 code
= 0x1c + (code
& 0x03);
1114 else if ((code
& 0xfc) == 0x6c)
1115 code
= 0x0c + (code
& 0x03);
1116 else if ((code
& 0xfc) == 0x80)
1117 code
= 0xc0 + (code
& 0x07);
1118 else if ((code
& 0xfc) == 0xf0)
1119 code
= 0xb0 + (code
& 0x07);
1120 else if ((code
& 0xfc) == 0x00)
1121 code
= 0x80 + (code
& 0x07);
1122 else if ((code
& 0xfc) == 0x10)
1123 code
= 0xa0 + (code
& 0x07);
1124 else if ((code
& 0xfc) == 0xb0)
1125 code
= 0x70 + (code
& 0x07);
1126 else if ((code
& 0xfc) == 0x30)
1127 code
= 0x60 + (code
& 0x07);
1128 else if ((code
& 0xfc) == 0xa0)
1129 code
= 0xd0 + (code
& 0x07);
1130 else if ((code
& 0xfc) == 0x20)
1131 code
= 0x90 + (code
& 0x07);
1132 else if ((code
& 0xfc) == 0x90)
1133 code
= 0x50 + (code
& 0x07);
1135 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
1137 /* Fix the relocation's type. */
1138 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1141 /* Delete one bytes of data. */
1142 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1143 irel
->r_offset
+ 2, 1))
1146 /* That will change things, so, we should relax again.
1147 Note that this is not required, and it may be slow. */
1151 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1153 /* Note that we've changed the reldection contents, etc. */
1154 elf_section_data (sec
)->relocs
= internal_relocs
;
1155 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1156 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1158 bfd_put_8 (abfd
, 0xcc + (code
& 0x03),
1159 contents
+ irel
->r_offset
- 2);
1161 bfd_put_8 (abfd
, 0xb8 + (code
& 0x03),
1162 contents
+ irel
->r_offset
- 1);
1164 /* Fix the relocation's type. */
1165 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1168 /* The reloc will be applied one byte in front of its
1169 current location. */
1170 irel
->r_offset
-= 1;
1172 /* Delete one bytes of data. */
1173 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1174 irel
->r_offset
+ 2, 1))
1177 /* That will change things, so, we should relax again.
1178 Note that this is not required, and it may be slow. */
1187 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1189 if (! link_info
->keep_memory
)
1193 /* Cache the symbols for elf_link_input_bfd. */
1194 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1198 if (contents
!= NULL
1199 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1201 if (! link_info
->keep_memory
)
1205 /* Cache the section contents for elf_link_input_bfd. */
1206 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1210 if (elf_section_data (sec
)->relocs
!= internal_relocs
)
1211 free (internal_relocs
);
1216 if (symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1218 if (elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1220 if (elf_section_data (sec
)->relocs
!= internal_relocs
)
1221 free (internal_relocs
);
1226 /* Return TRUE if a symbol exists at the given address, else return
1229 mn10200_elf_symbol_address_p (bfd
*abfd
,
1231 Elf_Internal_Sym
*isym
,
1234 Elf_Internal_Shdr
*symtab_hdr
;
1235 unsigned int sec_shndx
;
1236 Elf_Internal_Sym
*isymend
;
1237 struct elf_link_hash_entry
**sym_hashes
;
1238 struct elf_link_hash_entry
**end_hashes
;
1239 unsigned int symcount
;
1241 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1243 /* Examine all the local symbols. */
1244 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1245 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1247 if (isym
->st_shndx
== sec_shndx
1248 && isym
->st_value
== addr
)
1252 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1253 - symtab_hdr
->sh_info
);
1254 sym_hashes
= elf_sym_hashes (abfd
);
1255 end_hashes
= sym_hashes
+ symcount
;
1256 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1258 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1259 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1260 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1261 && sym_hash
->root
.u
.def
.section
== sec
1262 && sym_hash
->root
.u
.def
.value
== addr
)
1269 /* This is a version of bfd_generic_get_relocated_section_contents
1270 which uses mn10200_elf_relocate_section. */
1273 mn10200_elf_get_relocated_section_contents (bfd
*output_bfd
,
1274 struct bfd_link_info
*link_info
,
1275 struct bfd_link_order
*link_order
,
1280 Elf_Internal_Shdr
*symtab_hdr
;
1281 asection
*input_section
= link_order
->u
.indirect
.section
;
1282 bfd
*input_bfd
= input_section
->owner
;
1283 asection
**sections
= NULL
;
1284 Elf_Internal_Rela
*internal_relocs
= NULL
;
1285 Elf_Internal_Sym
*isymbuf
= NULL
;
1287 /* We only need to handle the case of relaxing, or of having a
1288 particular set of section contents, specially. */
1290 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
1291 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
1296 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1298 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
1299 (size_t) input_section
->size
);
1301 if ((input_section
->flags
& SEC_RELOC
) != 0
1302 && input_section
->reloc_count
> 0)
1304 Elf_Internal_Sym
*isym
;
1305 Elf_Internal_Sym
*isymend
;
1309 internal_relocs
= (_bfd_elf_link_read_relocs
1310 (input_bfd
, input_section
, NULL
,
1311 (Elf_Internal_Rela
*) NULL
, false));
1312 if (internal_relocs
== NULL
)
1315 if (symtab_hdr
->sh_info
!= 0)
1317 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1318 if (isymbuf
== NULL
)
1319 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
1320 symtab_hdr
->sh_info
, 0,
1322 if (isymbuf
== NULL
)
1326 amt
= symtab_hdr
->sh_info
;
1327 amt
*= sizeof (asection
*);
1328 sections
= (asection
**) bfd_malloc (amt
);
1329 if (sections
== NULL
&& amt
!= 0)
1332 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
1333 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
1337 if (isym
->st_shndx
== SHN_UNDEF
)
1338 isec
= bfd_und_section_ptr
;
1339 else if (isym
->st_shndx
== SHN_ABS
)
1340 isec
= bfd_abs_section_ptr
;
1341 else if (isym
->st_shndx
== SHN_COMMON
)
1342 isec
= bfd_com_section_ptr
;
1344 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
1349 if (! mn10200_elf_relocate_section (output_bfd
, link_info
, input_bfd
,
1350 input_section
, data
, internal_relocs
,
1355 if (symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1357 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
1358 free (internal_relocs
);
1365 if (symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1367 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
1368 free (internal_relocs
);
1372 #define TARGET_LITTLE_SYM mn10200_elf32_vec
1373 #define TARGET_LITTLE_NAME "elf32-mn10200"
1374 #define ELF_ARCH bfd_arch_mn10200
1375 #define ELF_MACHINE_CODE EM_MN10200
1376 #define ELF_MACHINE_ALT1 EM_CYGNUS_MN10200
1377 #define ELF_MAXPAGESIZE 0x1000
1379 #define elf_backend_rela_normal 1
1380 #define elf_info_to_howto mn10200_info_to_howto
1381 #define elf_info_to_howto_rel NULL
1382 #define elf_backend_relocate_section mn10200_elf_relocate_section
1383 #define bfd_elf32_bfd_relax_section mn10200_elf_relax_section
1384 #define bfd_elf32_bfd_get_relocated_section_contents \
1385 mn10200_elf_get_relocated_section_contents
1387 #define elf_symbol_leading_char '_'
1389 #include "elf32-target.h"