1 /* Matsushita 10200 specific support for 32-bit ELF
2 Copyright (C) 1996-2016 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 ATTRIBUTE_UNUSED,
218 Elf_Internal_Rela *dst)
222 r_type = ELF32_R_TYPE (dst->r_info);
223 BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX);
224 cache_ptr->howto = &elf_mn10200_howto_table[r_type];
227 /* Perform a relocation as part of a final link. */
229 static bfd_reloc_status_type
230 mn10200_elf_final_link_relocate (reloc_howto_type *howto,
232 bfd *output_bfd ATTRIBUTE_UNUSED,
233 asection *input_section,
238 struct bfd_link_info *info ATTRIBUTE_UNUSED,
239 asection *sym_sec ATTRIBUTE_UNUSED,
240 int is_local ATTRIBUTE_UNUSED)
242 unsigned long r_type = howto->type;
243 bfd_byte *hit_data = contents + offset;
253 bfd_put_32 (input_bfd, value, hit_data);
259 if ((long) value > 0x7fff || (long) value < -0x8000)
260 return bfd_reloc_overflow;
262 bfd_put_16 (input_bfd, value, hit_data);
268 if ((long) value > 0x7f || (long) value < -0x80)
269 return bfd_reloc_overflow;
271 bfd_put_8 (input_bfd, value, hit_data);
277 if ((long) value > 0x7fffff || (long) value < -0x800000)
278 return bfd_reloc_overflow;
281 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
282 bfd_put_32 (input_bfd, value, hit_data);
285 case R_MN10200_PCREL8:
286 value -= (input_section->output_section->vma
287 + input_section->output_offset);
288 value -= (offset + 1);
291 if ((long) value > 0xff || (long) value < -0x100)
292 return bfd_reloc_overflow;
294 bfd_put_8 (input_bfd, value, hit_data);
297 case R_MN10200_PCREL16:
298 value -= (input_section->output_section->vma
299 + input_section->output_offset);
300 value -= (offset + 2);
303 if ((long) value > 0xffff || (long) value < -0x10000)
304 return bfd_reloc_overflow;
306 bfd_put_16 (input_bfd, value, hit_data);
309 case R_MN10200_PCREL24:
310 value -= (input_section->output_section->vma
311 + input_section->output_offset);
312 value -= (offset + 3);
315 if ((long) value > 0xffffff || (long) value < -0x1000000)
316 return bfd_reloc_overflow;
319 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
320 bfd_put_32 (input_bfd, value, hit_data);
324 return bfd_reloc_notsupported;
328 /* Relocate an MN10200 ELF section. */
330 mn10200_elf_relocate_section (bfd *output_bfd,
331 struct bfd_link_info *info,
333 asection *input_section,
335 Elf_Internal_Rela *relocs,
336 Elf_Internal_Sym *local_syms,
337 asection **local_sections)
339 Elf_Internal_Shdr *symtab_hdr;
340 struct elf_link_hash_entry **sym_hashes;
341 Elf_Internal_Rela *rel, *relend;
343 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
344 sym_hashes = elf_sym_hashes (input_bfd);
347 relend = relocs + input_section->reloc_count;
348 for (; rel < relend; rel++)
351 reloc_howto_type *howto;
352 unsigned long r_symndx;
353 Elf_Internal_Sym *sym;
355 struct elf_link_hash_entry *h;
357 bfd_reloc_status_type r;
359 r_symndx = ELF32_R_SYM (rel->r_info);
360 r_type = ELF32_R_TYPE (rel->r_info);
361 howto = elf_mn10200_howto_table + r_type;
366 if (r_symndx < symtab_hdr->sh_info)
368 sym = local_syms + r_symndx;
369 sec = local_sections[r_symndx];
370 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
374 bfd_boolean unresolved_reloc, warned, ignored;
376 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
377 r_symndx, symtab_hdr, sym_hashes,
379 unresolved_reloc, warned, ignored);
382 if (sec != NULL && discarded_section (sec))
383 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
384 rel, 1, relend, howto, 0, contents);
386 if (bfd_link_relocatable (info))
389 r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
391 contents, rel->r_offset,
392 relocation, rel->r_addend,
393 info, sec, h == NULL);
395 if (r != bfd_reloc_ok)
398 const char *msg = (const char *) 0;
401 name = h->root.root.string;
404 name = (bfd_elf_string_from_elf_section
405 (input_bfd, symtab_hdr->sh_link, sym->st_name));
406 if (name == NULL || *name == '\0')
407 name = bfd_section_name (input_bfd, sec);
412 case bfd_reloc_overflow:
413 (*info->callbacks->reloc_overflow)
414 (info, (h ? &h->root : NULL), name, howto->name,
415 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
418 case bfd_reloc_undefined:
419 (*info->callbacks->undefined_symbol) (info, name, input_bfd,
421 rel->r_offset, TRUE);
424 case bfd_reloc_outofrange:
425 msg = _("internal error: out of range error");
428 case bfd_reloc_notsupported:
429 msg = _("internal error: unsupported relocation error");
432 case bfd_reloc_dangerous:
433 msg = _("internal error: dangerous error");
437 msg = _("internal error: unknown error");
441 (*info->callbacks->warning) (info, msg, name, input_bfd,
442 input_section, rel->r_offset);
451 /* Delete some bytes from a section while relaxing. */
454 mn10200_elf_relax_delete_bytes (bfd *abfd, asection *sec,
455 bfd_vma addr, int count)
457 Elf_Internal_Shdr *symtab_hdr;
458 unsigned int sec_shndx;
460 Elf_Internal_Rela *irel, *irelend;
462 Elf_Internal_Sym *isym;
463 Elf_Internal_Sym *isymend;
464 struct elf_link_hash_entry **sym_hashes;
465 struct elf_link_hash_entry **end_hashes;
466 unsigned int symcount;
468 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
470 contents = elf_section_data (sec)->this_hdr.contents;
474 irel = elf_section_data (sec)->relocs;
475 irelend = irel + sec->reloc_count;
477 /* Actually delete the bytes. */
478 memmove (contents + addr, contents + addr + count,
479 (size_t) (toaddr - addr - count));
482 /* Adjust all the relocs. */
483 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
485 /* Get the new reloc address. */
486 if ((irel->r_offset > addr
487 && irel->r_offset < toaddr))
488 irel->r_offset -= count;
491 /* Adjust the local symbols defined in this section. */
492 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
493 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
494 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
496 if (isym->st_shndx == sec_shndx
497 && isym->st_value > addr
498 && isym->st_value < toaddr)
499 isym->st_value -= count;
502 /* Now adjust the global symbols defined in this section. */
503 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
504 - symtab_hdr->sh_info);
505 sym_hashes = elf_sym_hashes (abfd);
506 end_hashes = sym_hashes + symcount;
507 for (; sym_hashes < end_hashes; sym_hashes++)
509 struct elf_link_hash_entry *sym_hash = *sym_hashes;
510 if ((sym_hash->root.type == bfd_link_hash_defined
511 || sym_hash->root.type == bfd_link_hash_defweak)
512 && sym_hash->root.u.def.section == sec
513 && sym_hash->root.u.def.value > addr
514 && sym_hash->root.u.def.value < toaddr)
516 sym_hash->root.u.def.value -= count;
523 /* This function handles relaxing for the mn10200.
525 There are quite a few relaxing opportunities available on the mn10200:
527 * jsr:24 -> jsr:16 2 bytes
529 * jmp:24 -> jmp:16 2 bytes
530 * jmp:16 -> bra:8 1 byte
532 * If the previous instruction is a conditional branch
533 around the jump/bra, we may be able to reverse its condition
534 and change its target to the jump's target. The jump/bra
535 can then be deleted. 2 bytes
537 * mov abs24 -> mov abs16 2 byte savings
539 * Most instructions which accept imm24 can relax to imm16 2 bytes
540 - Most instructions which accept imm16 can relax to imm8 1 byte
542 * Most instructions which accept d24 can relax to d16 2 bytes
543 - Most instructions which accept d16 can relax to d8 1 byte
545 abs24, imm24, d24 all look the same at the reloc level. It
546 might make the code simpler if we had different relocs for
547 the various relaxable operand types.
549 We don't handle imm16->imm8 or d16->d8 as they're very rare
550 and somewhat more difficult to support. */
553 mn10200_elf_relax_section (bfd *abfd,
555 struct bfd_link_info *link_info,
558 Elf_Internal_Shdr *symtab_hdr;
559 Elf_Internal_Rela *internal_relocs;
560 Elf_Internal_Rela *irel, *irelend;
561 bfd_byte *contents = NULL;
562 Elf_Internal_Sym *isymbuf = NULL;
564 /* Assume nothing changes. */
567 /* We don't have to do anything for a relocatable link, if
568 this section does not have relocs, or if this is not a
570 if (bfd_link_relocatable (link_info)
571 || (sec->flags & SEC_RELOC) == 0
572 || sec->reloc_count == 0
573 || (sec->flags & SEC_CODE) == 0)
576 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
578 /* Get a copy of the native relocations. */
579 internal_relocs = (_bfd_elf_link_read_relocs
580 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
581 link_info->keep_memory));
582 if (internal_relocs == NULL)
585 /* Walk through them looking for relaxing opportunities. */
586 irelend = internal_relocs + sec->reloc_count;
587 for (irel = internal_relocs; irel < irelend; irel++)
591 /* If this isn't something that can be relaxed, then ignore
593 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_NONE
594 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_8
595 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_MAX)
598 /* Get the section contents if we haven't done so already. */
599 if (contents == NULL)
601 /* Get cached copy if it exists. */
602 if (elf_section_data (sec)->this_hdr.contents != NULL)
603 contents = elf_section_data (sec)->this_hdr.contents;
606 /* Go get them off disk. */
607 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
612 /* Read this BFD's local symbols if we haven't done so already. */
613 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
615 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
617 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
618 symtab_hdr->sh_info, 0,
624 /* Get the value of the symbol referred to by the reloc. */
625 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
627 /* A local symbol. */
628 Elf_Internal_Sym *isym;
631 isym = isymbuf + ELF32_R_SYM (irel->r_info);
632 if (isym->st_shndx == SHN_UNDEF)
633 sym_sec = bfd_und_section_ptr;
634 else if (isym->st_shndx == SHN_ABS)
635 sym_sec = bfd_abs_section_ptr;
636 else if (isym->st_shndx == SHN_COMMON)
637 sym_sec = bfd_com_section_ptr;
639 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
640 symval = (isym->st_value
641 + sym_sec->output_section->vma
642 + sym_sec->output_offset);
647 struct elf_link_hash_entry *h;
649 /* An external symbol. */
650 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
651 h = elf_sym_hashes (abfd)[indx];
652 BFD_ASSERT (h != NULL);
653 if (h->root.type != bfd_link_hash_defined
654 && h->root.type != bfd_link_hash_defweak)
656 /* This appears to be a reference to an undefined
657 symbol. Just ignore it--it will be caught by the
658 regular reloc processing. */
662 symval = (h->root.u.def.value
663 + h->root.u.def.section->output_section->vma
664 + h->root.u.def.section->output_offset);
667 /* For simplicity of coding, we are going to modify the section
668 contents, the section relocs, and the BFD symbol table. We
669 must tell the rest of the code not to free up this
670 information. It would be possible to instead create a table
671 of changes which have to be made, as is done in coff-mips.c;
672 that would be more work, but would require less memory when
673 the linker is run. */
675 /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
677 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL24)
679 bfd_vma value = symval;
681 /* Deal with pc-relative gunk. */
682 value -= (sec->output_section->vma + sec->output_offset);
683 value -= (irel->r_offset + 3);
684 value += irel->r_addend;
686 /* See if the value will fit in 16 bits, note the high value is
687 0x7fff + 2 as the target will be two bytes closer if we are
689 if ((long) value < 0x8001 && (long) value > -0x8000)
693 /* Get the opcode. */
694 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
696 if (code != 0xe0 && code != 0xe1)
699 /* Note that we've changed the relocs, section contents, etc. */
700 elf_section_data (sec)->relocs = internal_relocs;
701 elf_section_data (sec)->this_hdr.contents = contents;
702 symtab_hdr->contents = (unsigned char *) isymbuf;
704 /* Fix the opcode. */
706 bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 2);
707 else if (code == 0xe1)
708 bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 2);
710 /* Fix the relocation's type. */
711 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
714 /* The opcode got shorter too, so we have to fix the offset. */
717 /* Delete two bytes of data. */
718 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
719 irel->r_offset + 1, 2))
722 /* That will change things, so, we should relax again.
723 Note that this is not required, and it may be slow. */
728 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
730 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL16)
732 bfd_vma value = symval;
734 /* Deal with pc-relative gunk. */
735 value -= (sec->output_section->vma + sec->output_offset);
736 value -= (irel->r_offset + 2);
737 value += irel->r_addend;
739 /* See if the value will fit in 8 bits, note the high value is
740 0x7f + 1 as the target will be one bytes closer if we are
742 if ((long) value < 0x80 && (long) value > -0x80)
746 /* Get the opcode. */
747 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
752 /* Note that we've changed the relocs, section contents, etc. */
753 elf_section_data (sec)->relocs = internal_relocs;
754 elf_section_data (sec)->this_hdr.contents = contents;
755 symtab_hdr->contents = (unsigned char *) isymbuf;
757 /* Fix the opcode. */
758 bfd_put_8 (abfd, 0xea, contents + irel->r_offset - 1);
760 /* Fix the relocation's type. */
761 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
764 /* Delete one byte of data. */
765 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
766 irel->r_offset + 1, 1))
769 /* That will change things, so, we should relax again.
770 Note that this is not required, and it may be slow. */
775 /* Try to eliminate an unconditional 8 bit pc-relative branch
776 which immediately follows a conditional 8 bit pc-relative
777 branch around the unconditional branch.
784 This happens when the bCC can't reach lab2 at assembly time,
785 but due to other relaxations it can reach at link time. */
786 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL8)
788 Elf_Internal_Rela *nrel;
789 bfd_vma value = symval;
792 /* Deal with pc-relative gunk. */
793 value -= (sec->output_section->vma + sec->output_offset);
794 value -= (irel->r_offset + 1);
795 value += irel->r_addend;
797 /* Do nothing if this reloc is the last byte in the section. */
798 if (irel->r_offset == sec->size)
801 /* See if the next instruction is an unconditional pc-relative
802 branch, more often than not this test will fail, so we
803 test it first to speed things up. */
804 code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
808 /* Also make sure the next relocation applies to the next
809 instruction and that it's a pc-relative 8 bit branch. */
812 || irel->r_offset + 2 != nrel->r_offset
813 || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10200_PCREL8)
816 /* Make sure our destination immediately follows the
817 unconditional branch. */
818 if (symval != (sec->output_section->vma + sec->output_offset
819 + irel->r_offset + 3))
822 /* Now make sure we are a conditional branch. This may not
823 be necessary, but why take the chance.
825 Note these checks assume that R_MN10200_PCREL8 relocs
826 only occur on bCC and bCCx insns. If they occured
827 elsewhere, we'd need to know the start of this insn
828 for this check to be accurate. */
829 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
830 if (code != 0xe0 && code != 0xe1 && code != 0xe2
831 && code != 0xe3 && code != 0xe4 && code != 0xe5
832 && code != 0xe6 && code != 0xe7 && code != 0xe8
833 && code != 0xe9 && code != 0xec && code != 0xed
834 && code != 0xee && code != 0xef && code != 0xfc
835 && code != 0xfd && code != 0xfe && code != 0xff)
838 /* We also have to be sure there is no symbol/label
839 at the unconditional branch. */
840 if (mn10200_elf_symbol_address_p (abfd, sec, isymbuf,
844 /* Note that we've changed the relocs, section contents, etc. */
845 elf_section_data (sec)->relocs = internal_relocs;
846 elf_section_data (sec)->this_hdr.contents = contents;
847 symtab_hdr->contents = (unsigned char *) isymbuf;
849 /* Reverse the condition of the first branch. */
907 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
909 /* Set the reloc type and symbol for the first branch
910 from the second branch. */
911 irel->r_info = nrel->r_info;
913 /* Make the reloc for the second branch a null reloc. */
914 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
917 /* Delete two bytes of data. */
918 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
919 irel->r_offset + 1, 2))
922 /* That will change things, so, we should relax again.
923 Note that this is not required, and it may be slow. */
927 /* Try to turn a 24bit immediate, displacement or absolute address
928 into a 16bit immediate, displacement or absolute address. */
929 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_24)
931 bfd_vma value = symval;
933 /* See if the value will fit in 16 bits.
934 We allow any 16bit match here. We prune those we can't
936 if ((long) value < 0x7fff && (long) value > -0x8000)
940 /* All insns which have 24bit operands are 5 bytes long,
941 the first byte will always be 0xf4, but we double check
944 /* Get the first opcode. */
945 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
950 /* Get the second opcode. */
951 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
955 /* mov imm24,dn -> mov imm16,dn */
957 /* Not safe if the high bit is on as relaxing may
958 move the value out of high mem and thus not fit
959 in a signed 16bit value. */
963 /* Note that we've changed the relocation contents, etc. */
964 elf_section_data (sec)->relocs = internal_relocs;
965 elf_section_data (sec)->this_hdr.contents = contents;
966 symtab_hdr->contents = (unsigned char *) isymbuf;
968 /* Fix the opcode. */
969 bfd_put_8 (abfd, 0xf8 + (code & 0x03),
970 contents + irel->r_offset - 2);
972 /* Fix the relocation's type. */
973 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
976 /* The opcode got shorter too, so we have to fix the
980 /* Delete two bytes of data. */
981 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
982 irel->r_offset + 1, 2))
985 /* That will change things, so, we should relax again.
986 Note that this is not required, and it may be slow. */
990 /* mov imm24,an -> mov imm16,an
991 cmp imm24,an -> cmp imm16,an
992 mov (abs24),dn -> mov (abs16),dn
993 mov dn,(abs24) -> mov dn,(abs16)
994 movb dn,(abs24) -> movb dn,(abs16)
995 movbu (abs24),dn -> movbu (abs16),dn */
1002 /* Note that we've changed the relocation contents, etc. */
1003 elf_section_data (sec)->relocs = internal_relocs;
1004 elf_section_data (sec)->this_hdr.contents = contents;
1005 symtab_hdr->contents = (unsigned char *) isymbuf;
1007 if ((code & 0xfc) == 0x74)
1008 code = 0xdc + (code & 0x03);
1009 else if ((code & 0xfc) == 0x7c)
1010 code = 0xec + (code & 0x03);
1011 else if ((code & 0xfc) == 0xc0)
1012 code = 0xc8 + (code & 0x03);
1013 else if ((code & 0xfc) == 0x40)
1014 code = 0xc0 + (code & 0x03);
1015 else if ((code & 0xfc) == 0x44)
1016 code = 0xc4 + (code & 0x03);
1017 else if ((code & 0xfc) == 0xc8)
1018 code = 0xcc + (code & 0x03);
1020 /* Fix the opcode. */
1021 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
1023 /* Fix the relocation's type. */
1024 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1027 /* The opcode got shorter too, so we have to fix the
1029 irel->r_offset -= 1;
1031 /* Delete two bytes of data. */
1032 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1033 irel->r_offset + 1, 2))
1036 /* That will change things, so, we should relax again.
1037 Note that this is not required, and it may be slow. */
1041 /* cmp imm24,dn -> cmp imm16,dn
1042 mov (abs24),an -> mov (abs16),an
1043 mov an,(abs24) -> mov an,(abs16)
1044 add imm24,dn -> add imm16,dn
1045 add imm24,an -> add imm16,an
1046 sub imm24,dn -> sub imm16,dn
1047 sub imm24,an -> sub imm16,an
1048 And all d24->d16 in memory ops. */
1065 /* Not safe if the high bit is on as relaxing may
1066 move the value out of high mem and thus not fit
1067 in a signed 16bit value. */
1068 if (((code & 0xfc) == 0x78
1069 || (code & 0xfc) == 0x60
1070 || (code & 0xfc) == 0x64
1071 || (code & 0xfc) == 0x68
1072 || (code & 0xfc) == 0x6c
1073 || (code & 0xfc) == 0x80
1074 || (code & 0xfc) == 0xf0
1075 || (code & 0xfc) == 0x00
1076 || (code & 0xfc) == 0x10
1077 || (code & 0xfc) == 0xb0
1078 || (code & 0xfc) == 0x30
1079 || (code & 0xfc) == 0xa0
1080 || (code & 0xfc) == 0x20
1081 || (code & 0xfc) == 0x90)
1082 && (value & 0x8000) != 0)
1085 /* Note that we've changed the relocation contents, etc. */
1086 elf_section_data (sec)->relocs = internal_relocs;
1087 elf_section_data (sec)->this_hdr.contents = contents;
1088 symtab_hdr->contents = (unsigned char *) isymbuf;
1090 /* Fix the opcode. */
1091 bfd_put_8 (abfd, 0xf7, contents + irel->r_offset - 2);
1093 if ((code & 0xfc) == 0x78)
1094 code = 0x48 + (code & 0x03);
1095 else if ((code & 0xfc) == 0xd0)
1096 code = 0x30 + (code & 0x03);
1097 else if ((code & 0xfc) == 0x50)
1098 code = 0x20 + (code & 0x03);
1099 else if ((code & 0xfc) == 0x60)
1100 code = 0x18 + (code & 0x03);
1101 else if ((code & 0xfc) == 0x64)
1102 code = 0x08 + (code & 0x03);
1103 else if ((code & 0xfc) == 0x68)
1104 code = 0x1c + (code & 0x03);
1105 else if ((code & 0xfc) == 0x6c)
1106 code = 0x0c + (code & 0x03);
1107 else if ((code & 0xfc) == 0x80)
1108 code = 0xc0 + (code & 0x07);
1109 else if ((code & 0xfc) == 0xf0)
1110 code = 0xb0 + (code & 0x07);
1111 else if ((code & 0xfc) == 0x00)
1112 code = 0x80 + (code & 0x07);
1113 else if ((code & 0xfc) == 0x10)
1114 code = 0xa0 + (code & 0x07);
1115 else if ((code & 0xfc) == 0xb0)
1116 code = 0x70 + (code & 0x07);
1117 else if ((code & 0xfc) == 0x30)
1118 code = 0x60 + (code & 0x07);
1119 else if ((code & 0xfc) == 0xa0)
1120 code = 0xd0 + (code & 0x07);
1121 else if ((code & 0xfc) == 0x20)
1122 code = 0x90 + (code & 0x07);
1123 else if ((code & 0xfc) == 0x90)
1124 code = 0x50 + (code & 0x07);
1126 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1128 /* Fix the relocation's type. */
1129 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1132 /* Delete one bytes of data. */
1133 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1134 irel->r_offset + 2, 1))
1137 /* That will change things, so, we should relax again.
1138 Note that this is not required, and it may be slow. */
1142 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1144 /* Note that we've changed the reldection contents, etc. */
1145 elf_section_data (sec)->relocs = internal_relocs;
1146 elf_section_data (sec)->this_hdr.contents = contents;
1147 symtab_hdr->contents = (unsigned char *) isymbuf;
1149 bfd_put_8 (abfd, 0xcc + (code & 0x03),
1150 contents + irel->r_offset - 2);
1152 bfd_put_8 (abfd, 0xb8 + (code & 0x03),
1153 contents + irel->r_offset - 1);
1155 /* Fix the relocation's type. */
1156 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1159 /* The reloc will be applied one byte in front of its
1160 current location. */
1161 irel->r_offset -= 1;
1163 /* Delete one bytes of data. */
1164 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1165 irel->r_offset + 2, 1))
1168 /* That will change things, so, we should relax again.
1169 Note that this is not required, and it may be slow. */
1178 && symtab_hdr->contents != (unsigned char *) isymbuf)
1180 if (! link_info->keep_memory)
1184 /* Cache the symbols for elf_link_input_bfd. */
1185 symtab_hdr->contents = (unsigned char *) isymbuf;
1189 if (contents != NULL
1190 && elf_section_data (sec)->this_hdr.contents != contents)
1192 if (! link_info->keep_memory)
1196 /* Cache the section contents for elf_link_input_bfd. */
1197 elf_section_data (sec)->this_hdr.contents = contents;
1201 if (internal_relocs != NULL
1202 && elf_section_data (sec)->relocs != internal_relocs)
1203 free (internal_relocs);
1209 && symtab_hdr->contents != (unsigned char *) isymbuf)
1211 if (contents != NULL
1212 && elf_section_data (sec)->this_hdr.contents != contents)
1214 if (internal_relocs != NULL
1215 && elf_section_data (sec)->relocs != internal_relocs)
1216 free (internal_relocs);
1221 /* Return TRUE if a symbol exists at the given address, else return
1224 mn10200_elf_symbol_address_p (bfd *abfd,
1226 Elf_Internal_Sym *isym,
1229 Elf_Internal_Shdr *symtab_hdr;
1230 unsigned int sec_shndx;
1231 Elf_Internal_Sym *isymend;
1232 struct elf_link_hash_entry **sym_hashes;
1233 struct elf_link_hash_entry **end_hashes;
1234 unsigned int symcount;
1236 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1238 /* Examine all the local symbols. */
1239 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1240 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
1242 if (isym->st_shndx == sec_shndx
1243 && isym->st_value == addr)
1247 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1248 - symtab_hdr->sh_info);
1249 sym_hashes = elf_sym_hashes (abfd);
1250 end_hashes = sym_hashes + symcount;
1251 for (; sym_hashes < end_hashes; sym_hashes++)
1253 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1254 if ((sym_hash->root.type == bfd_link_hash_defined
1255 || sym_hash->root.type == bfd_link_hash_defweak)
1256 && sym_hash->root.u.def.section == sec
1257 && sym_hash->root.u.def.value == addr)
1264 /* This is a version of bfd_generic_get_relocated_section_contents
1265 which uses mn10200_elf_relocate_section. */
1268 mn10200_elf_get_relocated_section_contents (bfd *output_bfd,
1269 struct bfd_link_info *link_info,
1270 struct bfd_link_order *link_order,
1272 bfd_boolean relocatable,
1275 Elf_Internal_Shdr *symtab_hdr;
1276 asection *input_section = link_order->u.indirect.section;
1277 bfd *input_bfd = input_section->owner;
1278 asection **sections = NULL;
1279 Elf_Internal_Rela *internal_relocs = NULL;
1280 Elf_Internal_Sym *isymbuf = NULL;
1282 /* We only need to handle the case of relaxing, or of having a
1283 particular set of section contents, specially. */
1285 || elf_section_data (input_section)->this_hdr.contents == NULL)
1286 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1291 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1293 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1294 (size_t) input_section->size);
1296 if ((input_section->flags & SEC_RELOC) != 0
1297 && input_section->reloc_count > 0)
1299 Elf_Internal_Sym *isym;
1300 Elf_Internal_Sym *isymend;
1304 internal_relocs = (_bfd_elf_link_read_relocs
1305 (input_bfd, input_section, NULL,
1306 (Elf_Internal_Rela *) NULL, FALSE));
1307 if (internal_relocs == NULL)
1310 if (symtab_hdr->sh_info != 0)
1312 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1313 if (isymbuf == NULL)
1314 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1315 symtab_hdr->sh_info, 0,
1317 if (isymbuf == NULL)
1321 amt = symtab_hdr->sh_info;
1322 amt *= sizeof (asection *);
1323 sections = (asection **) bfd_malloc (amt);
1324 if (sections == NULL && amt != 0)
1327 isymend = isymbuf + symtab_hdr->sh_info;
1328 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1332 if (isym->st_shndx == SHN_UNDEF)
1333 isec = bfd_und_section_ptr;
1334 else if (isym->st_shndx == SHN_ABS)
1335 isec = bfd_abs_section_ptr;
1336 else if (isym->st_shndx == SHN_COMMON)
1337 isec = bfd_com_section_ptr;
1339 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1344 if (! mn10200_elf_relocate_section (output_bfd, link_info, input_bfd,
1345 input_section, data, internal_relocs,
1349 if (sections != NULL)
1352 && symtab_hdr->contents != (unsigned char *) isymbuf)
1354 if (elf_section_data (input_section)->relocs != internal_relocs)
1355 free (internal_relocs);
1361 if (sections != NULL)
1364 && symtab_hdr->contents != (unsigned char *) isymbuf)
1366 if (internal_relocs != NULL
1367 && 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 0
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"