2001-03-26 H.J. Lu <hjl@gnu.org>
[binutils.git] / bfd / elf-m10300.c
blob268deba3be4f4d18a0498180248476b57b8b5d2f
1 /* Matsushita 10300 specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
3 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/mn10300.h"
27 struct elf32_mn10300_link_hash_entry {
28 /* The basic elf link hash table entry. */
29 struct elf_link_hash_entry root;
31 /* For function symbols, the number of times this function is
32 called directly (ie by name). */
33 unsigned int direct_calls;
35 /* For function symbols, the size of this function's stack
36 (if <= 255 bytes). We stuff this into "call" instructions
37 to this target when it's valid and profitable to do so.
39 This does not include stack allocated by movm! */
40 unsigned char stack_size;
42 /* For function symbols, arguments (if any) for movm instruction
43 in the prologue. We stuff this value into "call" instructions
44 to the target when it's valid and profitable to do so. */
45 unsigned char movm_args;
47 /* For funtion symbols, the amount of stack space that would be allocated
48 by the movm instruction. This is redundant with movm_args, but we
49 add it to the hash table to avoid computing it over and over. */
50 unsigned char movm_stack_size;
52 /* When set, convert all "call" instructions to this target into "calls"
53 instructions. */
54 #define MN10300_CONVERT_CALL_TO_CALLS 0x1
56 /* Used to mark functions which have had redundant parts of their
57 prologue deleted. */
58 #define MN10300_DELETED_PROLOGUE_BYTES 0x2
59 unsigned char flags;
62 /* We derive a hash table from the main elf linker hash table so
63 we can store state variables and a secondary hash table without
64 resorting to global variables. */
65 struct elf32_mn10300_link_hash_table {
66 /* The main hash table. */
67 struct elf_link_hash_table root;
69 /* A hash table for static functions. We could derive a new hash table
70 instead of using the full elf32_mn10300_link_hash_table if we wanted
71 to save some memory. */
72 struct elf32_mn10300_link_hash_table *static_hash_table;
74 /* Random linker state flags. */
75 #define MN10300_HASH_ENTRIES_INITIALIZED 0x1
76 char flags;
79 /* For MN10300 linker hash table. */
81 /* Get the MN10300 ELF linker hash table from a link_info structure. */
83 #define elf32_mn10300_hash_table(p) \
84 ((struct elf32_mn10300_link_hash_table *) ((p)->hash))
86 #define elf32_mn10300_link_hash_traverse(table, func, info) \
87 (elf_link_hash_traverse \
88 (&(table)->root, \
89 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
90 (info)))
92 static struct bfd_hash_entry *elf32_mn10300_link_hash_newfunc
93 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
94 static struct bfd_link_hash_table *elf32_mn10300_link_hash_table_create
95 PARAMS ((bfd *));
97 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
98 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
99 static void mn10300_info_to_howto
100 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
101 static boolean mn10300_elf_check_relocs
102 PARAMS ((bfd *, struct bfd_link_info *, asection *,
103 const Elf_Internal_Rela *));
104 static asection *mn10300_elf_gc_mark_hook
105 PARAMS ((bfd *, struct bfd_link_info *info, Elf_Internal_Rela *,
106 struct elf_link_hash_entry *, Elf_Internal_Sym *));
107 static boolean mn10300_elf_relax_delete_bytes
108 PARAMS ((bfd *, asection *, bfd_vma, int));
109 static boolean mn10300_elf_symbol_address_p
110 PARAMS ((bfd *, asection *, Elf32_External_Sym *, bfd_vma));
111 static boolean elf32_mn10300_finish_hash_table_entry
112 PARAMS ((struct bfd_hash_entry *, PTR));
113 static void compute_function_info
114 PARAMS ((bfd *, struct elf32_mn10300_link_hash_entry *,
115 bfd_vma, unsigned char *));
117 /* We have to use RELA instructions since md_apply_fix3 in the assembler
118 does absolutely nothing. */
119 #define USE_RELA
121 static reloc_howto_type elf_mn10300_howto_table[] = {
122 /* Dummy relocation. Does nothing. */
123 HOWTO (R_MN10300_NONE,
127 false,
129 complain_overflow_bitfield,
130 bfd_elf_generic_reloc,
131 "R_MN10300_NONE",
132 false,
135 false),
136 /* Standard 32 bit reloc. */
137 HOWTO (R_MN10300_32,
141 false,
143 complain_overflow_bitfield,
144 bfd_elf_generic_reloc,
145 "R_MN10300_32",
146 false,
147 0xffffffff,
148 0xffffffff,
149 false),
150 /* Standard 16 bit reloc. */
151 HOWTO (R_MN10300_16,
155 false,
157 complain_overflow_bitfield,
158 bfd_elf_generic_reloc,
159 "R_MN10300_16",
160 false,
161 0xffff,
162 0xffff,
163 false),
164 /* Standard 8 bit reloc. */
165 HOWTO (R_MN10300_8,
169 false,
171 complain_overflow_bitfield,
172 bfd_elf_generic_reloc,
173 "R_MN10300_8",
174 false,
175 0xff,
176 0xff,
177 false),
178 /* Standard 32bit pc-relative reloc. */
179 HOWTO (R_MN10300_PCREL32,
183 true,
185 complain_overflow_bitfield,
186 bfd_elf_generic_reloc,
187 "R_MN10300_PCREL32",
188 false,
189 0xffffffff,
190 0xffffffff,
191 true),
192 /* Standard 16bit pc-relative reloc. */
193 HOWTO (R_MN10300_PCREL16,
197 true,
199 complain_overflow_bitfield,
200 bfd_elf_generic_reloc,
201 "R_MN10300_PCREL16",
202 false,
203 0xffff,
204 0xffff,
205 true),
206 /* Standard 8 pc-relative reloc. */
207 HOWTO (R_MN10300_PCREL8,
211 true,
213 complain_overflow_bitfield,
214 bfd_elf_generic_reloc,
215 "R_MN10300_PCREL8",
216 false,
217 0xff,
218 0xff,
219 true),
221 /* GNU extension to record C++ vtable hierarchy */
222 HOWTO (R_MN10300_GNU_VTINHERIT, /* type */
223 0, /* rightshift */
224 0, /* size (0 = byte, 1 = short, 2 = long) */
225 0, /* bitsize */
226 false, /* pc_relative */
227 0, /* bitpos */
228 complain_overflow_dont, /* complain_on_overflow */
229 NULL, /* special_function */
230 "R_MN10300_GNU_VTINHERIT", /* name */
231 false, /* partial_inplace */
232 0, /* src_mask */
233 0, /* dst_mask */
234 false), /* pcrel_offset */
236 /* GNU extension to record C++ vtable member usage */
237 HOWTO (R_MN10300_GNU_VTENTRY, /* type */
238 0, /* rightshift */
239 0, /* size (0 = byte, 1 = short, 2 = long) */
240 0, /* bitsize */
241 false, /* pc_relative */
242 0, /* bitpos */
243 complain_overflow_dont, /* complain_on_overflow */
244 NULL, /* special_function */
245 "R_MN10300_GNU_VTENTRY", /* name */
246 false, /* partial_inplace */
247 0, /* src_mask */
248 0, /* dst_mask */
249 false), /* pcrel_offset */
251 /* Standard 24 bit reloc. */
252 HOWTO (R_MN10300_24,
256 false,
258 complain_overflow_bitfield,
259 bfd_elf_generic_reloc,
260 "R_MN10300_24",
261 false,
262 0xffffff,
263 0xffffff,
264 false),
267 struct mn10300_reloc_map {
268 bfd_reloc_code_real_type bfd_reloc_val;
269 unsigned char elf_reloc_val;
272 static const struct mn10300_reloc_map mn10300_reloc_map[] = {
273 { BFD_RELOC_NONE, R_MN10300_NONE, },
274 { BFD_RELOC_32, R_MN10300_32, },
275 { BFD_RELOC_16, R_MN10300_16, },
276 { BFD_RELOC_8, R_MN10300_8, },
277 { BFD_RELOC_32_PCREL, R_MN10300_PCREL32, },
278 { BFD_RELOC_16_PCREL, R_MN10300_PCREL16, },
279 { BFD_RELOC_8_PCREL, R_MN10300_PCREL8, },
280 { BFD_RELOC_24, R_MN10300_24, },
281 { BFD_RELOC_VTABLE_INHERIT, R_MN10300_GNU_VTINHERIT },
282 { BFD_RELOC_VTABLE_ENTRY, R_MN10300_GNU_VTENTRY },
285 static reloc_howto_type *
286 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
287 bfd *abfd ATTRIBUTE_UNUSED;
288 bfd_reloc_code_real_type code;
290 unsigned int i;
292 for (i = 0;
293 i < sizeof (mn10300_reloc_map) / sizeof (struct mn10300_reloc_map);
294 i++)
296 if (mn10300_reloc_map[i].bfd_reloc_val == code)
297 return &elf_mn10300_howto_table[mn10300_reloc_map[i].elf_reloc_val];
300 return NULL;
303 /* Set the howto pointer for an MN10300 ELF reloc. */
305 static void
306 mn10300_info_to_howto (abfd, cache_ptr, dst)
307 bfd *abfd ATTRIBUTE_UNUSED;
308 arelent *cache_ptr;
309 Elf32_Internal_Rela *dst;
311 unsigned int r_type;
313 r_type = ELF32_R_TYPE (dst->r_info);
314 BFD_ASSERT (r_type < (unsigned int) R_MN10300_MAX);
315 cache_ptr->howto = &elf_mn10300_howto_table[r_type];
318 /* Look through the relocs for a section during the first phase.
319 Since we don't do .gots or .plts, we just need to consider the
320 virtual table relocs for gc. */
322 static boolean
323 mn10300_elf_check_relocs (abfd, info, sec, relocs)
324 bfd *abfd;
325 struct bfd_link_info *info;
326 asection *sec;
327 const Elf_Internal_Rela *relocs;
329 Elf_Internal_Shdr *symtab_hdr;
330 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
331 const Elf_Internal_Rela *rel;
332 const Elf_Internal_Rela *rel_end;
334 if (info->relocateable)
335 return true;
337 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
338 sym_hashes = elf_sym_hashes (abfd);
339 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
340 if (!elf_bad_symtab (abfd))
341 sym_hashes_end -= symtab_hdr->sh_info;
343 rel_end = relocs + sec->reloc_count;
344 for (rel = relocs; rel < rel_end; rel++)
346 struct elf_link_hash_entry *h;
347 unsigned long r_symndx;
349 r_symndx = ELF32_R_SYM (rel->r_info);
350 if (r_symndx < symtab_hdr->sh_info)
351 h = NULL;
352 else
353 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
355 switch (ELF32_R_TYPE (rel->r_info))
357 /* This relocation describes the C++ object vtable hierarchy.
358 Reconstruct it for later use during GC. */
359 case R_MN10300_GNU_VTINHERIT:
360 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
361 return false;
362 break;
364 /* This relocation describes which C++ vtable entries are actually
365 used. Record for later use during GC. */
366 case R_MN10300_GNU_VTENTRY:
367 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
368 return false;
369 break;
373 return true;
376 /* Return the section that should be marked against GC for a given
377 relocation. */
379 static asection *
380 mn10300_elf_gc_mark_hook (abfd, info, rel, h, sym)
381 bfd *abfd;
382 struct bfd_link_info *info ATTRIBUTE_UNUSED;
383 Elf_Internal_Rela *rel;
384 struct elf_link_hash_entry *h;
385 Elf_Internal_Sym *sym;
387 if (h != NULL)
389 switch (ELF32_R_TYPE (rel->r_info))
391 case R_MN10300_GNU_VTINHERIT:
392 case R_MN10300_GNU_VTENTRY:
393 break;
395 default:
396 switch (h->root.type)
398 case bfd_link_hash_defined:
399 case bfd_link_hash_defweak:
400 return h->root.u.def.section;
402 case bfd_link_hash_common:
403 return h->root.u.c.p->section;
405 default:
406 break;
410 else
412 if (!(elf_bad_symtab (abfd)
413 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
414 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
415 && sym->st_shndx != SHN_COMMON))
417 return bfd_section_from_elf_index (abfd, sym->st_shndx);
421 return NULL;
424 /* Perform a relocation as part of a final link. */
425 static bfd_reloc_status_type
426 mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
427 input_section, contents, offset, value,
428 addend, info, sym_sec, is_local)
429 reloc_howto_type *howto;
430 bfd *input_bfd;
431 bfd *output_bfd ATTRIBUTE_UNUSED;
432 asection *input_section;
433 bfd_byte *contents;
434 bfd_vma offset;
435 bfd_vma value;
436 bfd_vma addend;
437 struct bfd_link_info *info ATTRIBUTE_UNUSED;
438 asection *sym_sec ATTRIBUTE_UNUSED;
439 int is_local ATTRIBUTE_UNUSED;
441 unsigned long r_type = howto->type;
442 bfd_byte *hit_data = contents + offset;
444 switch (r_type)
446 case R_MN10300_NONE:
447 return bfd_reloc_ok;
449 case R_MN10300_32:
450 value += addend;
451 bfd_put_32 (input_bfd, value, hit_data);
452 return bfd_reloc_ok;
454 case R_MN10300_24:
455 value += addend;
457 if ((long) value > 0x7fffff || (long) value < -0x800000)
458 return bfd_reloc_overflow;
460 bfd_put_8 (input_bfd, value & 0xff, hit_data);
461 bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
462 bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
463 return bfd_reloc_ok;
465 case R_MN10300_16:
466 value += addend;
468 if ((long) value > 0x7fff || (long) value < -0x8000)
469 return bfd_reloc_overflow;
471 bfd_put_16 (input_bfd, value, hit_data);
472 return bfd_reloc_ok;
474 case R_MN10300_8:
475 value += addend;
477 if ((long) value > 0x7f || (long) value < -0x80)
478 return bfd_reloc_overflow;
480 bfd_put_8 (input_bfd, value, hit_data);
481 return bfd_reloc_ok;
483 case R_MN10300_PCREL8:
484 value -= (input_section->output_section->vma
485 + input_section->output_offset);
486 value -= offset;
487 value += addend;
489 if ((long) value > 0xff || (long) value < -0x100)
490 return bfd_reloc_overflow;
492 bfd_put_8 (input_bfd, value, hit_data);
493 return bfd_reloc_ok;
495 case R_MN10300_PCREL16:
496 value -= (input_section->output_section->vma
497 + input_section->output_offset);
498 value -= offset;
499 value += addend;
501 if ((long) value > 0xffff || (long) value < -0x10000)
502 return bfd_reloc_overflow;
504 bfd_put_16 (input_bfd, value, hit_data);
505 return bfd_reloc_ok;
507 case R_MN10300_PCREL32:
508 value -= (input_section->output_section->vma
509 + input_section->output_offset);
510 value -= offset;
511 value += addend;
513 bfd_put_32 (input_bfd, value, hit_data);
514 return bfd_reloc_ok;
516 case R_MN10300_GNU_VTINHERIT:
517 case R_MN10300_GNU_VTENTRY:
518 return bfd_reloc_ok;
520 default:
521 return bfd_reloc_notsupported;
525 /* Relocate an MN10300 ELF section. */
526 static boolean
527 mn10300_elf_relocate_section (output_bfd, info, input_bfd, input_section,
528 contents, relocs, local_syms, local_sections)
529 bfd *output_bfd;
530 struct bfd_link_info *info;
531 bfd *input_bfd;
532 asection *input_section;
533 bfd_byte *contents;
534 Elf_Internal_Rela *relocs;
535 Elf_Internal_Sym *local_syms;
536 asection **local_sections;
538 Elf_Internal_Shdr *symtab_hdr;
539 struct elf32_mn10300_link_hash_entry **sym_hashes;
540 Elf_Internal_Rela *rel, *relend;
542 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
543 sym_hashes = (struct elf32_mn10300_link_hash_entry **)
544 (elf_sym_hashes (input_bfd));
546 rel = relocs;
547 relend = relocs + input_section->reloc_count;
548 for (; rel < relend; rel++)
550 int r_type;
551 reloc_howto_type *howto;
552 unsigned long r_symndx;
553 Elf_Internal_Sym *sym;
554 asection *sec;
555 struct elf32_mn10300_link_hash_entry *h;
556 bfd_vma relocation;
557 bfd_reloc_status_type r;
559 r_symndx = ELF32_R_SYM (rel->r_info);
560 r_type = ELF32_R_TYPE (rel->r_info);
561 howto = elf_mn10300_howto_table + r_type;
563 /* Just skip the vtable gc relocs. */
564 if (r_type == R_MN10300_GNU_VTINHERIT
565 || r_type == R_MN10300_GNU_VTENTRY)
566 continue;
568 if (info->relocateable)
570 /* This is a relocateable link. We don't have to change
571 anything, unless the reloc is against a section symbol,
572 in which case we have to adjust according to where the
573 section symbol winds up in the output section. */
574 if (r_symndx < symtab_hdr->sh_info)
576 sym = local_syms + r_symndx;
577 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
579 sec = local_sections[r_symndx];
580 rel->r_addend += sec->output_offset + sym->st_value;
584 continue;
587 /* This is a final link. */
588 h = NULL;
589 sym = NULL;
590 sec = NULL;
591 if (r_symndx < symtab_hdr->sh_info)
593 sym = local_syms + r_symndx;
594 sec = local_sections[r_symndx];
595 relocation = (sec->output_section->vma
596 + sec->output_offset
597 + sym->st_value);
599 else
601 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
602 while (h->root.type == bfd_link_hash_indirect
603 || h->root.type == bfd_link_hash_warning)
604 h = (struct elf32_mn10300_link_hash_entry *) h->root.root.u.i.link;
605 if (h->root.root.type == bfd_link_hash_defined
606 || h->root.root.type == bfd_link_hash_defweak)
608 sec = h->root.root.u.def.section;
609 relocation = (h->root.root.u.def.value
610 + sec->output_section->vma
611 + sec->output_offset);
613 else if (h->root.root.type == bfd_link_hash_undefweak)
614 relocation = 0;
615 else
617 if (! ((*info->callbacks->undefined_symbol)
618 (info, h->root.root.root.string, input_bfd,
619 input_section, rel->r_offset, true)))
620 return false;
621 relocation = 0;
625 r = mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
626 input_section,
627 contents, rel->r_offset,
628 relocation, rel->r_addend,
629 info, sec, h == NULL);
631 if (r != bfd_reloc_ok)
633 const char *name;
634 const char *msg = (const char *) 0;
636 if (h != NULL)
637 name = h->root.root.root.string;
638 else
640 name = (bfd_elf_string_from_elf_section
641 (input_bfd, symtab_hdr->sh_link, sym->st_name));
642 if (name == NULL || *name == '\0')
643 name = bfd_section_name (input_bfd, sec);
646 switch (r)
648 case bfd_reloc_overflow:
649 if (! ((*info->callbacks->reloc_overflow)
650 (info, name, howto->name, (bfd_vma) 0,
651 input_bfd, input_section, rel->r_offset)))
652 return false;
653 break;
655 case bfd_reloc_undefined:
656 if (! ((*info->callbacks->undefined_symbol)
657 (info, name, input_bfd, input_section,
658 rel->r_offset, true)))
659 return false;
660 break;
662 case bfd_reloc_outofrange:
663 msg = _("internal error: out of range error");
664 goto common_error;
666 case bfd_reloc_notsupported:
667 msg = _("internal error: unsupported relocation error");
668 goto common_error;
670 case bfd_reloc_dangerous:
671 msg = _("internal error: dangerous error");
672 goto common_error;
674 default:
675 msg = _("internal error: unknown error");
676 /* fall through */
678 common_error:
679 if (!((*info->callbacks->warning)
680 (info, msg, name, input_bfd, input_section,
681 rel->r_offset)))
682 return false;
683 break;
688 return true;
691 /* Finish initializing one hash table entry. */
692 static boolean
693 elf32_mn10300_finish_hash_table_entry (gen_entry, in_args)
694 struct bfd_hash_entry *gen_entry;
695 PTR in_args ATTRIBUTE_UNUSED;
697 struct elf32_mn10300_link_hash_entry *entry;
698 unsigned int byte_count = 0;
700 entry = (struct elf32_mn10300_link_hash_entry *) gen_entry;
702 /* If we already know we want to convert "call" to "calls" for calls
703 to this symbol, then return now. */
704 if (entry->flags == MN10300_CONVERT_CALL_TO_CALLS)
705 return true;
707 /* If there are no named calls to this symbol, or there's nothing we
708 can move from the function itself into the "call" instruction, then
709 note that all "call" instructions should be converted into "calls"
710 instructions and return. */
711 if (entry->direct_calls == 0
712 || (entry->stack_size == 0 && entry->movm_args == 0))
714 /* Make a note that we should convert "call" instructions to "calls"
715 instructions for calls to this symbol. */
716 entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
717 return true;
720 /* We may be able to move some instructions from the function itself into
721 the "call" instruction. Count how many bytes we might be able to
722 eliminate in the function itself. */
724 /* A movm instruction is two bytes. */
725 if (entry->movm_args)
726 byte_count += 2;
728 /* Count the insn to allocate stack space too. */
729 if (entry->stack_size > 0 && entry->stack_size <= 128)
730 byte_count += 3;
731 else if (entry->stack_size > 0 && entry->stack_size < 256)
732 byte_count += 4;
734 /* If using "call" will result in larger code, then turn all
735 the associated "call" instructions into "calls" instrutions. */
736 if (byte_count < entry->direct_calls)
737 entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
739 /* This routine never fails. */
740 return true;
743 /* This function handles relaxing for the mn10300.
745 There's quite a few relaxing opportunites available on the mn10300:
747 * calls:32 -> calls:16 2 bytes
748 * call:32 -> call:16 2 bytes
750 * call:32 -> calls:32 1 byte
751 * call:16 -> calls:16 1 byte
752 * These are done anytime using "calls" would result
753 in smaller code, or when necessary to preserve the
754 meaning of the program.
756 * call:32 varies
757 * call:16
758 * In some circumstances we can move instructions
759 from a function prologue into a "call" instruction.
760 This is only done if the resulting code is no larger
761 than the original code.
763 * jmp:32 -> jmp:16 2 bytes
764 * jmp:16 -> bra:8 1 byte
766 * If the previous instruction is a conditional branch
767 around the jump/bra, we may be able to reverse its condition
768 and change its target to the jump's target. The jump/bra
769 can then be deleted. 2 bytes
771 * mov abs32 -> mov abs16 1 or 2 bytes
773 * Most instructions which accept imm32 can relax to imm16 1 or 2 bytes
774 - Most instructions which accept imm16 can relax to imm8 1 or 2 bytes
776 * Most instructions which accept d32 can relax to d16 1 or 2 bytes
777 - Most instructions which accept d16 can relax to d8 1 or 2 bytes
779 We don't handle imm16->imm8 or d16->d8 as they're very rare
780 and somewhat more difficult to support. */
782 static boolean
783 mn10300_elf_relax_section (abfd, sec, link_info, again)
784 bfd *abfd;
785 asection *sec;
786 struct bfd_link_info *link_info;
787 boolean *again;
789 Elf_Internal_Shdr *symtab_hdr;
790 Elf_Internal_Rela *internal_relocs = NULL;
791 Elf_Internal_Rela *free_relocs = NULL;
792 Elf_Internal_Rela *irel, *irelend;
793 bfd_byte *contents = NULL;
794 bfd_byte *free_contents = NULL;
795 Elf32_External_Sym *extsyms = NULL;
796 Elf32_External_Sym *free_extsyms = NULL;
797 struct elf32_mn10300_link_hash_table *hash_table;
799 /* Assume nothing changes. */
800 *again = false;
802 /* We need a pointer to the mn10300 specific hash table. */
803 hash_table = elf32_mn10300_hash_table (link_info);
805 /* Initialize fields in each hash table entry the first time through. */
806 if ((hash_table->flags & MN10300_HASH_ENTRIES_INITIALIZED) == 0)
808 bfd *input_bfd;
810 /* Iterate over all the input bfds. */
811 for (input_bfd = link_info->input_bfds;
812 input_bfd != NULL;
813 input_bfd = input_bfd->link_next)
815 asection *section;
817 /* We're going to need all the symbols for each bfd. */
818 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
820 /* Get cached copy if it exists. */
821 if (symtab_hdr->contents != NULL)
822 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
823 else
825 /* Go get them off disk. */
826 extsyms = ((Elf32_External_Sym *)
827 bfd_malloc (symtab_hdr->sh_size));
828 if (extsyms == NULL)
829 goto error_return;
830 free_extsyms = extsyms;
831 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
832 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, input_bfd)
833 != symtab_hdr->sh_size))
834 goto error_return;
837 /* Iterate over each section in this bfd. */
838 for (section = input_bfd->sections;
839 section != NULL;
840 section = section->next)
842 struct elf32_mn10300_link_hash_entry *hash;
843 Elf_Internal_Sym *sym;
844 asection *sym_sec = NULL;
845 const char *sym_name;
846 char *new_name;
848 /* Get cached copy of section contents if it exists. */
849 if (elf_section_data (section)->this_hdr.contents != NULL)
850 contents = elf_section_data (section)->this_hdr.contents;
851 else if (section->_raw_size != 0)
853 /* Go get them off disk. */
854 contents = (bfd_byte *) bfd_malloc (section->_raw_size);
855 if (contents == NULL)
856 goto error_return;
857 free_contents = contents;
859 if (!bfd_get_section_contents (input_bfd, section,
860 contents, (file_ptr) 0,
861 section->_raw_size))
862 goto error_return;
864 else
866 contents = NULL;
867 free_contents = NULL;
870 /* If there aren't any relocs, then there's nothing to do. */
871 if ((section->flags & SEC_RELOC) != 0
872 && section->reloc_count != 0)
875 /* Get a copy of the native relocations. */
876 internal_relocs = (_bfd_elf32_link_read_relocs
877 (input_bfd, section, (PTR) NULL,
878 (Elf_Internal_Rela *) NULL,
879 link_info->keep_memory));
880 if (internal_relocs == NULL)
881 goto error_return;
882 if (! link_info->keep_memory)
883 free_relocs = internal_relocs;
885 /* Now examine each relocation. */
886 irel = internal_relocs;
887 irelend = irel + section->reloc_count;
888 for (; irel < irelend; irel++)
890 long r_type;
891 unsigned long r_index;
892 unsigned char code;
894 r_type = ELF32_R_TYPE (irel->r_info);
895 r_index = ELF32_R_SYM (irel->r_info);
897 if (r_type < 0 || r_type >= (int) R_MN10300_MAX)
898 goto error_return;
900 /* We need the name and hash table entry of the target
901 symbol! */
902 hash = NULL;
903 sym = NULL;
904 sym_sec = NULL;
906 if (r_index < symtab_hdr->sh_info)
908 /* A local symbol. */
909 Elf_Internal_Sym isym;
911 bfd_elf32_swap_symbol_in (input_bfd,
912 extsyms + r_index, &isym);
914 if (isym.st_shndx == SHN_UNDEF)
915 sym_sec = bfd_und_section_ptr;
916 else if (isym.st_shndx > 0
917 && isym.st_shndx < SHN_LORESERVE)
918 sym_sec
919 = bfd_section_from_elf_index (input_bfd,
920 isym.st_shndx);
921 else if (isym.st_shndx == SHN_ABS)
922 sym_sec = bfd_abs_section_ptr;
923 else if (isym.st_shndx == SHN_COMMON)
924 sym_sec = bfd_com_section_ptr;
926 sym_name = bfd_elf_string_from_elf_section (input_bfd,
927 symtab_hdr->sh_link,
928 isym.st_name);
930 /* If it isn't a function, then we don't care
931 about it. */
932 if (r_index < symtab_hdr->sh_info
933 && ELF_ST_TYPE (isym.st_info) != STT_FUNC)
934 continue;
936 /* Tack on an ID so we can uniquely identify this
937 local symbol in the global hash table. */
938 new_name = bfd_malloc (strlen (sym_name) + 10);
939 if (new_name == 0)
940 goto error_return;
942 sprintf (new_name, "%s_%08x",
943 sym_name, (int) sym_sec);
944 sym_name = new_name;
946 hash = (struct elf32_mn10300_link_hash_entry *)
947 elf_link_hash_lookup (&hash_table->static_hash_table->root,
948 sym_name, true,
949 true, false);
950 free (new_name);
952 else
954 r_index -= symtab_hdr->sh_info;
955 hash = (struct elf32_mn10300_link_hash_entry *)
956 elf_sym_hashes (input_bfd)[r_index];
959 /* If this is not a "call" instruction, then we
960 should convert "call" instructions to "calls"
961 instructions. */
962 code = bfd_get_8 (input_bfd,
963 contents + irel->r_offset - 1);
964 if (code != 0xdd && code != 0xcd)
965 hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
967 /* If this is a jump/call, then bump the direct_calls
968 counter. Else force "call" to "calls" conversions. */
969 if (r_type == R_MN10300_PCREL32
970 || r_type == R_MN10300_PCREL16)
971 hash->direct_calls++;
972 else
973 hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
977 /* Now look at the actual contents to get the stack size,
978 and a list of what registers were saved in the prologue
979 (ie movm_args). */
980 if ((section->flags & SEC_CODE) != 0)
983 Elf32_External_Sym *esym, *esymend;
984 int idx, shndx;
986 shndx = _bfd_elf_section_from_bfd_section (input_bfd,
987 section);
989 /* Look at each function defined in this section and
990 update info for that function. */
991 esym = extsyms;
992 esymend = esym + symtab_hdr->sh_info;
993 for (; esym < esymend; esym++)
995 Elf_Internal_Sym isym;
997 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
998 if (isym.st_shndx == shndx
999 && ELF_ST_TYPE (isym.st_info) == STT_FUNC)
1001 if (isym.st_shndx == SHN_UNDEF)
1002 sym_sec = bfd_und_section_ptr;
1003 else if (isym.st_shndx > 0
1004 && isym.st_shndx < SHN_LORESERVE)
1005 sym_sec
1006 = bfd_section_from_elf_index (input_bfd,
1007 isym.st_shndx);
1008 else if (isym.st_shndx == SHN_ABS)
1009 sym_sec = bfd_abs_section_ptr;
1010 else if (isym.st_shndx == SHN_COMMON)
1011 sym_sec = bfd_com_section_ptr;
1013 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1014 symtab_hdr->sh_link,
1015 isym.st_name);
1017 /* Tack on an ID so we can uniquely identify this
1018 local symbol in the global hash table. */
1019 new_name = bfd_malloc (strlen (sym_name) + 10);
1020 if (new_name == 0)
1021 goto error_return;
1023 sprintf (new_name, "%s_%08x",
1024 sym_name, (int) sym_sec);
1025 sym_name = new_name;
1027 hash = (struct elf32_mn10300_link_hash_entry *)
1028 elf_link_hash_lookup (&hash_table->static_hash_table->root,
1029 sym_name, true,
1030 true, false);
1031 free (new_name);
1032 compute_function_info (input_bfd, hash,
1033 isym.st_value, contents);
1037 esym = extsyms + symtab_hdr->sh_info;
1038 esymend = extsyms + (symtab_hdr->sh_size
1039 / sizeof (Elf32_External_Sym));
1040 for (idx = 0; esym < esymend; esym++, idx++)
1042 Elf_Internal_Sym isym;
1044 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
1045 hash = (struct elf32_mn10300_link_hash_entry *)
1046 elf_sym_hashes (input_bfd)[idx];
1047 if (isym.st_shndx == shndx
1048 && ELF_ST_TYPE (isym.st_info) == STT_FUNC
1049 && (hash)->root.root.u.def.section == section
1050 && ((hash)->root.root.type == bfd_link_hash_defined
1051 || (hash)->root.root.type == bfd_link_hash_defweak))
1052 compute_function_info (input_bfd, hash,
1053 (hash)->root.root.u.def.value,
1054 contents);
1058 /* Cache or free any memory we allocated for the relocs. */
1059 if (free_relocs != NULL)
1061 free (free_relocs);
1062 free_relocs = NULL;
1065 /* Cache or free any memory we allocated for the contents. */
1066 if (free_contents != NULL)
1068 if (! link_info->keep_memory)
1069 free (free_contents);
1070 else
1072 /* Cache the section contents for elf_link_input_bfd. */
1073 elf_section_data (section)->this_hdr.contents = contents;
1075 free_contents = NULL;
1079 /* Cache or free any memory we allocated for the symbols. */
1080 if (free_extsyms != NULL)
1082 if (! link_info->keep_memory)
1083 free (free_extsyms);
1084 else
1086 /* Cache the symbols for elf_link_input_bfd. */
1087 symtab_hdr->contents = extsyms;
1089 free_extsyms = NULL;
1093 /* Now iterate on each symbol in the hash table and perform
1094 the final initialization steps on each. */
1095 elf32_mn10300_link_hash_traverse (hash_table,
1096 elf32_mn10300_finish_hash_table_entry,
1097 NULL);
1098 elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
1099 elf32_mn10300_finish_hash_table_entry,
1100 NULL);
1102 /* All entries in the hash table are fully initialized. */
1103 hash_table->flags |= MN10300_HASH_ENTRIES_INITIALIZED;
1105 /* Now that everything has been initialized, go through each
1106 code section and delete any prologue insns which will be
1107 redundant because their operations will be performed by
1108 a "call" instruction. */
1109 for (input_bfd = link_info->input_bfds;
1110 input_bfd != NULL;
1111 input_bfd = input_bfd->link_next)
1113 asection *section;
1115 /* We're going to need all the symbols for each bfd. */
1116 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1118 /* Get cached copy if it exists. */
1119 if (symtab_hdr->contents != NULL)
1120 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1121 else
1123 /* Go get them off disk. */
1124 extsyms = ((Elf32_External_Sym *)
1125 bfd_malloc (symtab_hdr->sh_size));
1126 if (extsyms == NULL)
1127 goto error_return;
1128 free_extsyms = extsyms;
1129 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1130 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, input_bfd)
1131 != symtab_hdr->sh_size))
1132 goto error_return;
1135 /* Walk over each section in this bfd. */
1136 for (section = input_bfd->sections;
1137 section != NULL;
1138 section = section->next)
1140 int shndx;
1141 Elf32_External_Sym *esym, *esymend;
1142 int idx;
1144 /* Skip non-code sections and empty sections. */
1145 if ((section->flags & SEC_CODE) == 0 || section->_raw_size == 0)
1146 continue;
1148 if (section->reloc_count != 0)
1150 /* Get a copy of the native relocations. */
1151 internal_relocs = (_bfd_elf32_link_read_relocs
1152 (input_bfd, section, (PTR) NULL,
1153 (Elf_Internal_Rela *) NULL,
1154 link_info->keep_memory));
1155 if (internal_relocs == NULL)
1156 goto error_return;
1157 if (! link_info->keep_memory)
1158 free_relocs = internal_relocs;
1161 /* Get cached copy of section contents if it exists. */
1162 if (elf_section_data (section)->this_hdr.contents != NULL)
1163 contents = elf_section_data (section)->this_hdr.contents;
1164 else
1166 /* Go get them off disk. */
1167 contents = (bfd_byte *) bfd_malloc (section->_raw_size);
1168 if (contents == NULL)
1169 goto error_return;
1170 free_contents = contents;
1172 if (!bfd_get_section_contents (input_bfd, section,
1173 contents, (file_ptr) 0,
1174 section->_raw_size))
1175 goto error_return;
1178 shndx = _bfd_elf_section_from_bfd_section (input_bfd, section);
1180 /* Now look for any function in this section which needs
1181 insns deleted from its prologue. */
1182 esym = extsyms;
1183 esymend = esym + symtab_hdr->sh_info;
1184 for (; esym < esymend; esym++)
1186 Elf_Internal_Sym isym;
1187 struct elf32_mn10300_link_hash_entry *sym_hash;
1188 asection *sym_sec = NULL;
1189 const char *sym_name;
1190 char *new_name;
1192 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
1194 if (isym.st_shndx != shndx)
1195 continue;
1197 if (isym.st_shndx == SHN_UNDEF)
1198 sym_sec = bfd_und_section_ptr;
1199 else if (isym.st_shndx > 0 && isym.st_shndx < SHN_LORESERVE)
1200 sym_sec
1201 = bfd_section_from_elf_index (input_bfd, isym.st_shndx);
1202 else if (isym.st_shndx == SHN_ABS)
1203 sym_sec = bfd_abs_section_ptr;
1204 else if (isym.st_shndx == SHN_COMMON)
1205 sym_sec = bfd_com_section_ptr;
1206 else
1207 abort ();
1209 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1210 symtab_hdr->sh_link,
1211 isym.st_name);
1213 /* Tack on an ID so we can uniquely identify this
1214 local symbol in the global hash table. */
1215 new_name = bfd_malloc (strlen (sym_name) + 10);
1216 if (new_name == 0)
1217 goto error_return;
1218 sprintf (new_name, "%s_%08x", sym_name, (int) sym_sec);
1219 sym_name = new_name;
1221 sym_hash = (struct elf32_mn10300_link_hash_entry *)
1222 elf_link_hash_lookup (&hash_table->static_hash_table->root,
1223 sym_name, false,
1224 false, false);
1226 free (new_name);
1227 if (sym_hash == NULL)
1228 continue;
1230 if (! ((sym_hash)->flags & MN10300_CONVERT_CALL_TO_CALLS)
1231 && ! ((sym_hash)->flags & MN10300_DELETED_PROLOGUE_BYTES))
1233 int bytes = 0;
1235 /* Note that we've changed things. */
1236 elf_section_data (section)->relocs = internal_relocs;
1237 free_relocs = NULL;
1239 elf_section_data (section)->this_hdr.contents = contents;
1240 free_contents = NULL;
1242 symtab_hdr->contents = (bfd_byte *) extsyms;
1243 free_extsyms = NULL;
1245 /* Count how many bytes we're going to delete. */
1246 if (sym_hash->movm_args)
1247 bytes += 2;
1249 if (sym_hash->stack_size && sym_hash->stack_size <= 128)
1250 bytes += 3;
1251 else if (sym_hash->stack_size
1252 && sym_hash->stack_size < 256)
1253 bytes += 4;
1255 /* Note that we've deleted prologue bytes for this
1256 function. */
1257 sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
1259 /* Actually delete the bytes. */
1260 if (!mn10300_elf_relax_delete_bytes (input_bfd,
1261 section,
1262 isym.st_value,
1263 bytes))
1264 goto error_return;
1266 /* Something changed. Not strictly necessary, but
1267 may lead to more relaxing opportunities. */
1268 *again = true;
1272 /* Look for any global functions in this section which
1273 need insns deleted from their prologues. */
1274 esym = extsyms + symtab_hdr->sh_info;
1275 esymend = extsyms + (symtab_hdr->sh_size
1276 / sizeof (Elf32_External_Sym));
1277 for (idx = 0; esym < esymend; esym++, idx++)
1279 Elf_Internal_Sym isym;
1280 struct elf32_mn10300_link_hash_entry *sym_hash;
1282 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
1283 sym_hash = (struct elf32_mn10300_link_hash_entry *)
1284 (elf_sym_hashes (input_bfd)[idx]);
1285 if (isym.st_shndx == shndx
1286 && (sym_hash)->root.root.u.def.section == section
1287 && ! ((sym_hash)->flags & MN10300_CONVERT_CALL_TO_CALLS)
1288 && ! ((sym_hash)->flags & MN10300_DELETED_PROLOGUE_BYTES))
1290 int bytes = 0;
1292 /* Note that we've changed things. */
1293 elf_section_data (section)->relocs = internal_relocs;
1294 free_relocs = NULL;
1296 elf_section_data (section)->this_hdr.contents = contents;
1297 free_contents = NULL;
1299 symtab_hdr->contents = (bfd_byte *) extsyms;
1300 free_extsyms = NULL;
1302 /* Count how many bytes we're going to delete. */
1303 if (sym_hash->movm_args)
1304 bytes += 2;
1306 if (sym_hash->stack_size && sym_hash->stack_size <= 128)
1307 bytes += 3;
1308 else if (sym_hash->stack_size
1309 && sym_hash->stack_size < 256)
1310 bytes += 4;
1312 /* Note that we've deleted prologue bytes for this
1313 function. */
1314 sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
1316 /* Actually delete the bytes. */
1317 if (!mn10300_elf_relax_delete_bytes (input_bfd,
1318 section,
1319 (sym_hash)->root.root.u.def.value,
1320 bytes))
1321 goto error_return;
1323 /* Something changed. Not strictly necessary, but
1324 may lead to more relaxing opportunities. */
1325 *again = true;
1329 /* Cache or free any memory we allocated for the relocs. */
1330 if (free_relocs != NULL)
1332 free (free_relocs);
1333 free_relocs = NULL;
1336 /* Cache or free any memory we allocated for the contents. */
1337 if (free_contents != NULL)
1339 if (! link_info->keep_memory)
1340 free (free_contents);
1341 else
1343 /* Cache the section contents for elf_link_input_bfd. */
1344 elf_section_data (section)->this_hdr.contents = contents;
1346 free_contents = NULL;
1350 /* Cache or free any memory we allocated for the symbols. */
1351 if (free_extsyms != NULL)
1353 if (! link_info->keep_memory)
1354 free (free_extsyms);
1355 else
1357 /* Cache the symbols for elf_link_input_bfd. */
1358 symtab_hdr->contents = extsyms;
1360 free_extsyms = NULL;
1365 /* (Re)initialize for the basic instruction shortening/relaxing pass. */
1366 contents = NULL;
1367 extsyms = NULL;
1368 internal_relocs = NULL;
1369 free_relocs = NULL;
1370 free_contents = NULL;
1371 free_extsyms = NULL;
1373 /* We don't have to do anything for a relocateable link, if
1374 this section does not have relocs, or if this is not a
1375 code section. */
1376 if (link_info->relocateable
1377 || (sec->flags & SEC_RELOC) == 0
1378 || sec->reloc_count == 0
1379 || (sec->flags & SEC_CODE) == 0)
1380 return true;
1382 /* If this is the first time we have been called for this section,
1383 initialize the cooked size. */
1384 if (sec->_cooked_size == 0)
1385 sec->_cooked_size = sec->_raw_size;
1387 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1389 /* Get a copy of the native relocations. */
1390 internal_relocs = (_bfd_elf32_link_read_relocs
1391 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1392 link_info->keep_memory));
1393 if (internal_relocs == NULL)
1394 goto error_return;
1395 if (! link_info->keep_memory)
1396 free_relocs = internal_relocs;
1398 /* Walk through them looking for relaxing opportunities. */
1399 irelend = internal_relocs + sec->reloc_count;
1400 for (irel = internal_relocs; irel < irelend; irel++)
1402 bfd_vma symval;
1403 struct elf32_mn10300_link_hash_entry *h = NULL;
1405 /* If this isn't something that can be relaxed, then ignore
1406 this reloc. */
1407 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_NONE
1408 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_8
1409 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_MAX)
1410 continue;
1412 /* Get the section contents if we haven't done so already. */
1413 if (contents == NULL)
1415 /* Get cached copy if it exists. */
1416 if (elf_section_data (sec)->this_hdr.contents != NULL)
1417 contents = elf_section_data (sec)->this_hdr.contents;
1418 else
1420 /* Go get them off disk. */
1421 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1422 if (contents == NULL)
1423 goto error_return;
1424 free_contents = contents;
1426 if (! bfd_get_section_contents (abfd, sec, contents,
1427 (file_ptr) 0, sec->_raw_size))
1428 goto error_return;
1432 /* Read this BFD's symbols if we haven't done so already. */
1433 if (extsyms == NULL)
1435 /* Get cached copy if it exists. */
1436 if (symtab_hdr->contents != NULL)
1437 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1438 else
1440 /* Go get them off disk. */
1441 extsyms = ((Elf32_External_Sym *)
1442 bfd_malloc (symtab_hdr->sh_size));
1443 if (extsyms == NULL)
1444 goto error_return;
1445 free_extsyms = extsyms;
1446 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1447 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
1448 != symtab_hdr->sh_size))
1449 goto error_return;
1453 /* Get the value of the symbol referred to by the reloc. */
1454 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1456 Elf_Internal_Sym isym;
1457 asection *sym_sec = NULL;
1458 const char *sym_name;
1459 char *new_name;
1461 /* A local symbol. */
1462 bfd_elf32_swap_symbol_in (abfd,
1463 extsyms + ELF32_R_SYM (irel->r_info),
1464 &isym);
1466 if (isym.st_shndx == SHN_UNDEF)
1467 sym_sec = bfd_und_section_ptr;
1468 else if (isym.st_shndx > 0 && isym.st_shndx < SHN_LORESERVE)
1469 sym_sec = bfd_section_from_elf_index (abfd, isym.st_shndx);
1470 else if (isym.st_shndx == SHN_ABS)
1471 sym_sec = bfd_abs_section_ptr;
1472 else if (isym.st_shndx == SHN_COMMON)
1473 sym_sec = bfd_com_section_ptr;
1474 else
1475 abort ();
1477 symval = (isym.st_value
1478 + sym_sec->output_section->vma
1479 + sym_sec->output_offset);
1480 sym_name = bfd_elf_string_from_elf_section (abfd,
1481 symtab_hdr->sh_link,
1482 isym.st_name);
1484 /* Tack on an ID so we can uniquely identify this
1485 local symbol in the global hash table. */
1486 new_name = bfd_malloc (strlen (sym_name) + 10);
1487 if (new_name == 0)
1488 goto error_return;
1489 sprintf (new_name, "%s_%08x", sym_name, (int) sym_sec);
1490 sym_name = new_name;
1492 h = (struct elf32_mn10300_link_hash_entry *)
1493 elf_link_hash_lookup (&hash_table->static_hash_table->root,
1494 sym_name, false, false, false);
1495 free (new_name);
1497 else
1499 unsigned long indx;
1501 /* An external symbol. */
1502 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1503 h = (struct elf32_mn10300_link_hash_entry *)
1504 (elf_sym_hashes (abfd)[indx]);
1505 BFD_ASSERT (h != NULL);
1506 if (h->root.root.type != bfd_link_hash_defined
1507 && h->root.root.type != bfd_link_hash_defweak)
1509 /* This appears to be a reference to an undefined
1510 symbol. Just ignore it--it will be caught by the
1511 regular reloc processing. */
1512 continue;
1515 symval = (h->root.root.u.def.value
1516 + h->root.root.u.def.section->output_section->vma
1517 + h->root.root.u.def.section->output_offset);
1520 /* For simplicity of coding, we are going to modify the section
1521 contents, the section relocs, and the BFD symbol table. We
1522 must tell the rest of the code not to free up this
1523 information. It would be possible to instead create a table
1524 of changes which have to be made, as is done in coff-mips.c;
1525 that would be more work, but would require less memory when
1526 the linker is run. */
1528 /* Try to turn a 32bit pc-relative branch/call into a 16bit pc-relative
1529 branch/call, also deal with "call" -> "calls" conversions and
1530 insertion of prologue data into "call" instructions. */
1531 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL32)
1533 bfd_vma value = symval;
1535 /* If we've got a "call" instruction that needs to be turned
1536 into a "calls" instruction, do so now. It saves a byte. */
1537 if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
1539 unsigned char code;
1541 /* Get the opcode. */
1542 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1544 /* Make sure we're working with a "call" instruction! */
1545 if (code == 0xdd)
1547 /* Note that we've changed the relocs, section contents,
1548 etc. */
1549 elf_section_data (sec)->relocs = internal_relocs;
1550 free_relocs = NULL;
1552 elf_section_data (sec)->this_hdr.contents = contents;
1553 free_contents = NULL;
1555 symtab_hdr->contents = (bfd_byte *) extsyms;
1556 free_extsyms = NULL;
1558 /* Fix the opcode. */
1559 bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 1);
1560 bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
1562 /* Fix irel->r_offset and irel->r_addend. */
1563 irel->r_offset += 1;
1564 irel->r_addend += 1;
1566 /* Delete one byte of data. */
1567 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1568 irel->r_offset + 3, 1))
1569 goto error_return;
1571 /* That will change things, so, we should relax again.
1572 Note that this is not required, and it may be slow. */
1573 *again = true;
1576 else if (h)
1578 /* We've got a "call" instruction which needs some data
1579 from target function filled in. */
1580 unsigned char code;
1582 /* Get the opcode. */
1583 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1585 /* Insert data from the target function into the "call"
1586 instruction if needed. */
1587 if (code == 0xdd)
1589 bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 4);
1590 bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
1591 contents + irel->r_offset + 5);
1595 /* Deal with pc-relative gunk. */
1596 value -= (sec->output_section->vma + sec->output_offset);
1597 value -= irel->r_offset;
1598 value += irel->r_addend;
1600 /* See if the value will fit in 16 bits, note the high value is
1601 0x7fff + 2 as the target will be two bytes closer if we are
1602 able to relax. */
1603 if ((long) value < 0x8001 && (long) value > -0x8000)
1605 unsigned char code;
1607 /* Get the opcode. */
1608 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1610 if (code != 0xdc && code != 0xdd && code != 0xff)
1611 continue;
1613 /* Note that we've changed the relocs, section contents, etc. */
1614 elf_section_data (sec)->relocs = internal_relocs;
1615 free_relocs = NULL;
1617 elf_section_data (sec)->this_hdr.contents = contents;
1618 free_contents = NULL;
1620 symtab_hdr->contents = (bfd_byte *) extsyms;
1621 free_extsyms = NULL;
1623 /* Fix the opcode. */
1624 if (code == 0xdc)
1625 bfd_put_8 (abfd, 0xcc, contents + irel->r_offset - 1);
1626 else if (code == 0xdd)
1627 bfd_put_8 (abfd, 0xcd, contents + irel->r_offset - 1);
1628 else if (code == 0xff)
1629 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
1631 /* Fix the relocation's type. */
1632 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1633 R_MN10300_PCREL16);
1635 /* Delete two bytes of data. */
1636 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1637 irel->r_offset + 1, 2))
1638 goto error_return;
1640 /* That will change things, so, we should relax again.
1641 Note that this is not required, and it may be slow. */
1642 *again = true;
1646 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
1647 branch. */
1648 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL16)
1650 bfd_vma value = symval;
1652 /* If we've got a "call" instruction that needs to be turned
1653 into a "calls" instruction, do so now. It saves a byte. */
1654 if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
1656 unsigned char code;
1658 /* Get the opcode. */
1659 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1661 /* Make sure we're working with a "call" instruction! */
1662 if (code == 0xcd)
1664 /* Note that we've changed the relocs, section contents,
1665 etc. */
1666 elf_section_data (sec)->relocs = internal_relocs;
1667 free_relocs = NULL;
1669 elf_section_data (sec)->this_hdr.contents = contents;
1670 free_contents = NULL;
1672 symtab_hdr->contents = (bfd_byte *) extsyms;
1673 free_extsyms = NULL;
1675 /* Fix the opcode. */
1676 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 1);
1677 bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
1679 /* Fix irel->r_offset and irel->r_addend. */
1680 irel->r_offset += 1;
1681 irel->r_addend += 1;
1683 /* Delete one byte of data. */
1684 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1685 irel->r_offset + 1, 1))
1686 goto error_return;
1688 /* That will change things, so, we should relax again.
1689 Note that this is not required, and it may be slow. */
1690 *again = true;
1693 else if (h)
1695 unsigned char code;
1697 /* Get the opcode. */
1698 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1700 /* Insert data from the target function into the "call"
1701 instruction if needed. */
1702 if (code == 0xcd)
1704 bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 2);
1705 bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
1706 contents + irel->r_offset + 3);
1710 /* Deal with pc-relative gunk. */
1711 value -= (sec->output_section->vma + sec->output_offset);
1712 value -= irel->r_offset;
1713 value += irel->r_addend;
1715 /* See if the value will fit in 8 bits, note the high value is
1716 0x7f + 1 as the target will be one bytes closer if we are
1717 able to relax. */
1718 if ((long) value < 0x80 && (long) value > -0x80)
1720 unsigned char code;
1722 /* Get the opcode. */
1723 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1725 if (code != 0xcc)
1726 continue;
1728 /* Note that we've changed the relocs, section contents, etc. */
1729 elf_section_data (sec)->relocs = internal_relocs;
1730 free_relocs = NULL;
1732 elf_section_data (sec)->this_hdr.contents = contents;
1733 free_contents = NULL;
1735 symtab_hdr->contents = (bfd_byte *) extsyms;
1736 free_extsyms = NULL;
1738 /* Fix the opcode. */
1739 bfd_put_8 (abfd, 0xca, contents + irel->r_offset - 1);
1741 /* Fix the relocation's type. */
1742 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1743 R_MN10300_PCREL8);
1745 /* Delete one byte of data. */
1746 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1747 irel->r_offset + 1, 1))
1748 goto error_return;
1750 /* That will change things, so, we should relax again.
1751 Note that this is not required, and it may be slow. */
1752 *again = true;
1756 /* Try to eliminate an unconditional 8 bit pc-relative branch
1757 which immediately follows a conditional 8 bit pc-relative
1758 branch around the unconditional branch.
1760 original: new:
1761 bCC lab1 bCC' lab2
1762 bra lab2
1763 lab1: lab1:
1765 This happens when the bCC can't reach lab2 at assembly time,
1766 but due to other relaxations it can reach at link time. */
1767 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL8)
1769 Elf_Internal_Rela *nrel;
1770 bfd_vma value = symval;
1771 unsigned char code;
1773 /* Deal with pc-relative gunk. */
1774 value -= (sec->output_section->vma + sec->output_offset);
1775 value -= irel->r_offset;
1776 value += irel->r_addend;
1778 /* Do nothing if this reloc is the last byte in the section. */
1779 if (irel->r_offset == sec->_cooked_size)
1780 continue;
1782 /* See if the next instruction is an unconditional pc-relative
1783 branch, more often than not this test will fail, so we
1784 test it first to speed things up. */
1785 code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
1786 if (code != 0xca)
1787 continue;
1789 /* Also make sure the next relocation applies to the next
1790 instruction and that it's a pc-relative 8 bit branch. */
1791 nrel = irel + 1;
1792 if (nrel == irelend
1793 || irel->r_offset + 2 != nrel->r_offset
1794 || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10300_PCREL8)
1795 continue;
1797 /* Make sure our destination immediately follows the
1798 unconditional branch. */
1799 if (symval != (sec->output_section->vma + sec->output_offset
1800 + irel->r_offset + 3))
1801 continue;
1803 /* Now make sure we are a conditional branch. This may not
1804 be necessary, but why take the chance.
1806 Note these checks assume that R_MN10300_PCREL8 relocs
1807 only occur on bCC and bCCx insns. If they occured
1808 elsewhere, we'd need to know the start of this insn
1809 for this check to be accurate. */
1810 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1811 if (code != 0xc0 && code != 0xc1 && code != 0xc2
1812 && code != 0xc3 && code != 0xc4 && code != 0xc5
1813 && code != 0xc6 && code != 0xc7 && code != 0xc8
1814 && code != 0xc9 && code != 0xe8 && code != 0xe9
1815 && code != 0xea && code != 0xeb)
1816 continue;
1818 /* We also have to be sure there is no symbol/label
1819 at the unconditional branch. */
1820 if (mn10300_elf_symbol_address_p (abfd, sec, extsyms,
1821 irel->r_offset + 1))
1822 continue;
1824 /* Note that we've changed the relocs, section contents, etc. */
1825 elf_section_data (sec)->relocs = internal_relocs;
1826 free_relocs = NULL;
1828 elf_section_data (sec)->this_hdr.contents = contents;
1829 free_contents = NULL;
1831 symtab_hdr->contents = (bfd_byte *) extsyms;
1832 free_extsyms = NULL;
1834 /* Reverse the condition of the first branch. */
1835 switch (code)
1837 case 0xc8:
1838 code = 0xc9;
1839 break;
1840 case 0xc9:
1841 code = 0xc8;
1842 break;
1843 case 0xc0:
1844 code = 0xc2;
1845 break;
1846 case 0xc2:
1847 code = 0xc0;
1848 break;
1849 case 0xc3:
1850 code = 0xc1;
1851 break;
1852 case 0xc1:
1853 code = 0xc3;
1854 break;
1855 case 0xc4:
1856 code = 0xc6;
1857 break;
1858 case 0xc6:
1859 code = 0xc4;
1860 break;
1861 case 0xc7:
1862 code = 0xc5;
1863 break;
1864 case 0xc5:
1865 code = 0xc7;
1866 break;
1867 case 0xe8:
1868 code = 0xe9;
1869 break;
1870 case 0x9d:
1871 code = 0xe8;
1872 break;
1873 case 0xea:
1874 code = 0xeb;
1875 break;
1876 case 0xeb:
1877 code = 0xea;
1878 break;
1880 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1882 /* Set the reloc type and symbol for the first branch
1883 from the second branch. */
1884 irel->r_info = nrel->r_info;
1886 /* Make the reloc for the second branch a null reloc. */
1887 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1888 R_MN10300_NONE);
1890 /* Delete two bytes of data. */
1891 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1892 irel->r_offset + 1, 2))
1893 goto error_return;
1895 /* That will change things, so, we should relax again.
1896 Note that this is not required, and it may be slow. */
1897 *again = true;
1900 /* Try to turn a 24 immediate, displacement or absolute address
1901 into a 8 immediate, displacement or absolute address. */
1902 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_24)
1904 bfd_vma value = symval;
1905 value += irel->r_addend;
1907 /* See if the value will fit in 8 bits. */
1908 if ((long) value < 0x7f && (long) value > -0x80)
1910 unsigned char code;
1912 /* AM33 insns which have 24 operands are 6 bytes long and
1913 will have 0xfd as the first byte. */
1915 /* Get the first opcode. */
1916 code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
1918 if (code == 0xfd)
1920 /* Get the second opcode. */
1921 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1923 /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
1924 equivalent instructions exists. */
1925 if (code != 0x6b && code != 0x7b
1926 && code != 0x8b && code != 0x9b
1927 && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
1928 || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
1929 || (code & 0x0f) == 0x0e))
1931 /* Not safe if the high bit is on as relaxing may
1932 move the value out of high mem and thus not fit
1933 in a signed 8bit value. This is currently over
1934 conservative. */
1935 if ((value & 0x80) == 0)
1937 /* Note that we've changed the relocation contents,
1938 etc. */
1939 elf_section_data (sec)->relocs = internal_relocs;
1940 free_relocs = NULL;
1942 elf_section_data (sec)->this_hdr.contents = contents;
1943 free_contents = NULL;
1945 symtab_hdr->contents = (bfd_byte *) extsyms;
1946 free_extsyms = NULL;
1948 /* Fix the opcode. */
1949 bfd_put_8 (abfd, 0xfb, contents + irel->r_offset - 3);
1950 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
1952 /* Fix the relocation's type. */
1953 irel->r_info =
1954 ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1955 R_MN10300_8);
1957 /* Delete two bytes of data. */
1958 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1959 irel->r_offset + 1, 2))
1960 goto error_return;
1962 /* That will change things, so, we should relax
1963 again. Note that this is not required, and it
1964 may be slow. */
1965 *again = true;
1966 break;
1973 /* Try to turn a 32bit immediate, displacement or absolute address
1974 into a 16bit immediate, displacement or absolute address. */
1975 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_32)
1977 bfd_vma value = symval;
1978 value += irel->r_addend;
1980 /* See if the value will fit in 24 bits.
1981 We allow any 16bit match here. We prune those we can't
1982 handle below. */
1983 if ((long) value < 0x7fffff && (long) value > -0x800000)
1985 unsigned char code;
1987 /* AM33 insns which have 32bit operands are 7 bytes long and
1988 will have 0xfe as the first byte. */
1990 /* Get the first opcode. */
1991 code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
1993 if (code == 0xfe)
1995 /* Get the second opcode. */
1996 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1998 /* All the am33 32 -> 24 relaxing possibilities. */
1999 /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
2000 equivalent instructions exists. */
2001 if (code != 0x6b && code != 0x7b
2002 && code != 0x8b && code != 0x9b
2003 && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
2004 || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
2005 || (code & 0x0f) == 0x0e))
2007 /* Not safe if the high bit is on as relaxing may
2008 move the value out of high mem and thus not fit
2009 in a signed 16bit value. This is currently over
2010 conservative. */
2011 if ((value & 0x8000) == 0)
2013 /* Note that we've changed the relocation contents,
2014 etc. */
2015 elf_section_data (sec)->relocs = internal_relocs;
2016 free_relocs = NULL;
2018 elf_section_data (sec)->this_hdr.contents = contents;
2019 free_contents = NULL;
2021 symtab_hdr->contents = (bfd_byte *) extsyms;
2022 free_extsyms = NULL;
2024 /* Fix the opcode. */
2025 bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 3);
2026 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
2028 /* Fix the relocation's type. */
2029 irel->r_info =
2030 ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2031 R_MN10300_24);
2033 /* Delete one byte of data. */
2034 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2035 irel->r_offset + 3, 1))
2036 goto error_return;
2038 /* That will change things, so, we should relax
2039 again. Note that this is not required, and it
2040 may be slow. */
2041 *again = true;
2042 break;
2048 /* See if the value will fit in 16 bits.
2049 We allow any 16bit match here. We prune those we can't
2050 handle below. */
2051 if ((long) value < 0x7fff && (long) value > -0x8000)
2053 unsigned char code;
2055 /* Most insns which have 32bit operands are 6 bytes long;
2056 exceptions are pcrel insns and bit insns.
2058 We handle pcrel insns above. We don't bother trying
2059 to handle the bit insns here.
2061 The first byte of the remaining insns will be 0xfc. */
2063 /* Get the first opcode. */
2064 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
2066 if (code != 0xfc)
2067 continue;
2069 /* Get the second opcode. */
2070 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
2072 if ((code & 0xf0) < 0x80)
2073 switch (code & 0xf0)
2075 /* mov (d32,am),dn -> mov (d32,am),dn
2076 mov dm,(d32,am) -> mov dn,(d32,am)
2077 mov (d32,am),an -> mov (d32,am),an
2078 mov dm,(d32,am) -> mov dn,(d32,am)
2079 movbu (d32,am),dn -> movbu (d32,am),dn
2080 movbu dm,(d32,am) -> movbu dn,(d32,am)
2081 movhu (d32,am),dn -> movhu (d32,am),dn
2082 movhu dm,(d32,am) -> movhu dn,(d32,am) */
2083 case 0x00:
2084 case 0x10:
2085 case 0x20:
2086 case 0x30:
2087 case 0x40:
2088 case 0x50:
2089 case 0x60:
2090 case 0x70:
2091 /* Not safe if the high bit is on as relaxing may
2092 move the value out of high mem and thus not fit
2093 in a signed 16bit value. */
2094 if (code == 0xcc
2095 && (value & 0x8000))
2096 continue;
2098 /* Note that we've changed the relocation contents, etc. */
2099 elf_section_data (sec)->relocs = internal_relocs;
2100 free_relocs = NULL;
2102 elf_section_data (sec)->this_hdr.contents = contents;
2103 free_contents = NULL;
2105 symtab_hdr->contents = (bfd_byte *) extsyms;
2106 free_extsyms = NULL;
2108 /* Fix the opcode. */
2109 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2110 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
2112 /* Fix the relocation's type. */
2113 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2114 R_MN10300_16);
2116 /* Delete two bytes of data. */
2117 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2118 irel->r_offset + 2, 2))
2119 goto error_return;
2121 /* That will change things, so, we should relax again.
2122 Note that this is not required, and it may be slow. */
2123 *again = true;
2124 break;
2126 else if ((code & 0xf0) == 0x80
2127 || (code & 0xf0) == 0x90)
2128 switch (code & 0xf3)
2130 /* mov dn,(abs32) -> mov dn,(abs16)
2131 movbu dn,(abs32) -> movbu dn,(abs16)
2132 movhu dn,(abs32) -> movhu dn,(abs16) */
2133 case 0x81:
2134 case 0x82:
2135 case 0x83:
2136 /* Note that we've changed the relocation contents, etc. */
2137 elf_section_data (sec)->relocs = internal_relocs;
2138 free_relocs = NULL;
2140 elf_section_data (sec)->this_hdr.contents = contents;
2141 free_contents = NULL;
2143 symtab_hdr->contents = (bfd_byte *) extsyms;
2144 free_extsyms = NULL;
2146 if ((code & 0xf3) == 0x81)
2147 code = 0x01 + (code & 0x0c);
2148 else if ((code & 0xf3) == 0x82)
2149 code = 0x02 + (code & 0x0c);
2150 else if ((code & 0xf3) == 0x83)
2151 code = 0x03 + (code & 0x0c);
2152 else
2153 abort ();
2155 /* Fix the opcode. */
2156 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
2158 /* Fix the relocation's type. */
2159 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2160 R_MN10300_16);
2162 /* The opcode got shorter too, so we have to fix the
2163 addend and offset too! */
2164 irel->r_offset -= 1;
2166 /* Delete three bytes of data. */
2167 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2168 irel->r_offset + 1, 3))
2169 goto error_return;
2171 /* That will change things, so, we should relax again.
2172 Note that this is not required, and it may be slow. */
2173 *again = true;
2174 break;
2176 /* mov am,(abs32) -> mov am,(abs16)
2177 mov am,(d32,sp) -> mov am,(d16,sp)
2178 mov dm,(d32,sp) -> mov dm,(d32,sp)
2179 movbu dm,(d32,sp) -> movbu dm,(d32,sp)
2180 movhu dm,(d32,sp) -> movhu dm,(d32,sp) */
2181 case 0x80:
2182 case 0x90:
2183 case 0x91:
2184 case 0x92:
2185 case 0x93:
2186 /* Note that we've changed the relocation contents, etc. */
2187 elf_section_data (sec)->relocs = internal_relocs;
2188 free_relocs = NULL;
2190 elf_section_data (sec)->this_hdr.contents = contents;
2191 free_contents = NULL;
2193 symtab_hdr->contents = (bfd_byte *) extsyms;
2194 free_extsyms = NULL;
2196 /* Fix the opcode. */
2197 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2198 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
2200 /* Fix the relocation's type. */
2201 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2202 R_MN10300_16);
2204 /* Delete two bytes of data. */
2205 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2206 irel->r_offset + 2, 2))
2207 goto error_return;
2209 /* That will change things, so, we should relax again.
2210 Note that this is not required, and it may be slow. */
2211 *again = true;
2212 break;
2214 else if ((code & 0xf0) < 0xf0)
2215 switch (code & 0xfc)
2217 /* mov imm32,dn -> mov imm16,dn
2218 mov imm32,an -> mov imm16,an
2219 mov (abs32),dn -> mov (abs16),dn
2220 movbu (abs32),dn -> movbu (abs16),dn
2221 movhu (abs32),dn -> movhu (abs16),dn */
2222 case 0xcc:
2223 case 0xdc:
2224 case 0xa4:
2225 case 0xa8:
2226 case 0xac:
2227 /* Not safe if the high bit is on as relaxing may
2228 move the value out of high mem and thus not fit
2229 in a signed 16bit value. */
2230 if (code == 0xcc
2231 && (value & 0x8000))
2232 continue;
2234 /* Note that we've changed the relocation contents, etc. */
2235 elf_section_data (sec)->relocs = internal_relocs;
2236 free_relocs = NULL;
2238 elf_section_data (sec)->this_hdr.contents = contents;
2239 free_contents = NULL;
2241 symtab_hdr->contents = (bfd_byte *) extsyms;
2242 free_extsyms = NULL;
2244 if ((code & 0xfc) == 0xcc)
2245 code = 0x2c + (code & 0x03);
2246 else if ((code & 0xfc) == 0xdc)
2247 code = 0x24 + (code & 0x03);
2248 else if ((code & 0xfc) == 0xa4)
2249 code = 0x30 + (code & 0x03);
2250 else if ((code & 0xfc) == 0xa8)
2251 code = 0x34 + (code & 0x03);
2252 else if ((code & 0xfc) == 0xac)
2253 code = 0x38 + (code & 0x03);
2254 else
2255 abort ();
2257 /* Fix the opcode. */
2258 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
2260 /* Fix the relocation's type. */
2261 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2262 R_MN10300_16);
2264 /* The opcode got shorter too, so we have to fix the
2265 addend and offset too! */
2266 irel->r_offset -= 1;
2268 /* Delete three bytes of data. */
2269 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2270 irel->r_offset + 1, 3))
2271 goto error_return;
2273 /* That will change things, so, we should relax again.
2274 Note that this is not required, and it may be slow. */
2275 *again = true;
2276 break;
2278 /* mov (abs32),an -> mov (abs16),an
2279 mov (d32,sp),an -> mov (d32,sp),an
2280 mov (d32,sp),dn -> mov (d32,sp),dn
2281 movbu (d32,sp),dn -> movbu (d32,sp),dn
2282 movhu (d32,sp),dn -> movhu (d32,sp),dn
2283 add imm32,dn -> add imm16,dn
2284 cmp imm32,dn -> cmp imm16,dn
2285 add imm32,an -> add imm16,an
2286 cmp imm32,an -> cmp imm16,an
2287 and imm32,dn -> and imm32,dn
2288 or imm32,dn -> or imm32,dn
2289 xor imm32,dn -> xor imm32,dn
2290 btst imm32,dn -> btst imm32,dn */
2292 case 0xa0:
2293 case 0xb0:
2294 case 0xb1:
2295 case 0xb2:
2296 case 0xb3:
2297 case 0xc0:
2298 case 0xc8:
2300 case 0xd0:
2301 case 0xd8:
2302 case 0xe0:
2303 case 0xe1:
2304 case 0xe2:
2305 case 0xe3:
2306 /* Note that we've changed the relocation contents, etc. */
2307 elf_section_data (sec)->relocs = internal_relocs;
2308 free_relocs = NULL;
2310 elf_section_data (sec)->this_hdr.contents = contents;
2311 free_contents = NULL;
2313 symtab_hdr->contents = (bfd_byte *) extsyms;
2314 free_extsyms = NULL;
2316 /* Fix the opcode. */
2317 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2318 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
2320 /* Fix the relocation's type. */
2321 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2322 R_MN10300_16);
2324 /* Delete two bytes of data. */
2325 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2326 irel->r_offset + 2, 2))
2327 goto error_return;
2329 /* That will change things, so, we should relax again.
2330 Note that this is not required, and it may be slow. */
2331 *again = true;
2332 break;
2334 else if (code == 0xfe)
2336 /* add imm32,sp -> add imm16,sp */
2338 /* Note that we've changed the relocation contents, etc. */
2339 elf_section_data (sec)->relocs = internal_relocs;
2340 free_relocs = NULL;
2342 elf_section_data (sec)->this_hdr.contents = contents;
2343 free_contents = NULL;
2345 symtab_hdr->contents = (bfd_byte *) extsyms;
2346 free_extsyms = NULL;
2348 /* Fix the opcode. */
2349 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2350 bfd_put_8 (abfd, 0xfe, contents + irel->r_offset - 1);
2352 /* Fix the relocation's type. */
2353 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2354 R_MN10300_16);
2356 /* Delete two bytes of data. */
2357 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2358 irel->r_offset + 2, 2))
2359 goto error_return;
2361 /* That will change things, so, we should relax again.
2362 Note that this is not required, and it may be slow. */
2363 *again = true;
2364 break;
2370 if (free_relocs != NULL)
2372 free (free_relocs);
2373 free_relocs = NULL;
2376 if (free_contents != NULL)
2378 if (! link_info->keep_memory)
2379 free (free_contents);
2380 else
2382 /* Cache the section contents for elf_link_input_bfd. */
2383 elf_section_data (sec)->this_hdr.contents = contents;
2385 free_contents = NULL;
2388 if (free_extsyms != NULL)
2390 if (! link_info->keep_memory)
2391 free (free_extsyms);
2392 else
2394 /* Cache the symbols for elf_link_input_bfd. */
2395 symtab_hdr->contents = extsyms;
2397 free_extsyms = NULL;
2400 return true;
2402 error_return:
2403 if (free_relocs != NULL)
2404 free (free_relocs);
2405 if (free_contents != NULL)
2406 free (free_contents);
2407 if (free_extsyms != NULL)
2408 free (free_extsyms);
2409 return false;
2412 /* Compute the stack size and movm arguments for the function
2413 referred to by HASH at address ADDR in section with
2414 contents CONTENTS, store the information in the hash table. */
2415 static void
2416 compute_function_info (abfd, hash, addr, contents)
2417 bfd *abfd;
2418 struct elf32_mn10300_link_hash_entry *hash;
2419 bfd_vma addr;
2420 unsigned char *contents;
2422 unsigned char byte1, byte2;
2423 /* We only care about a very small subset of the possible prologue
2424 sequences here. Basically we look for:
2426 movm [d2,d3,a2,a3],sp (optional)
2427 add <size>,sp (optional, and only for sizes which fit in an unsigned
2428 8 bit number)
2430 If we find anything else, we quit. */
2432 /* Look for movm [regs],sp */
2433 byte1 = bfd_get_8 (abfd, contents + addr);
2434 byte2 = bfd_get_8 (abfd, contents + addr + 1);
2436 if (byte1 == 0xcf)
2438 hash->movm_args = byte2;
2439 addr += 2;
2440 byte1 = bfd_get_8 (abfd, contents + addr);
2441 byte2 = bfd_get_8 (abfd, contents + addr + 1);
2444 /* Now figure out how much stack space will be allocated by the movm
2445 instruction. We need this kept separate from the funtion's normal
2446 stack space. */
2447 if (hash->movm_args)
2449 /* Space for d2. */
2450 if (hash->movm_args & 0x80)
2451 hash->movm_stack_size += 4;
2453 /* Space for d3. */
2454 if (hash->movm_args & 0x40)
2455 hash->movm_stack_size += 4;
2457 /* Space for a2. */
2458 if (hash->movm_args & 0x20)
2459 hash->movm_stack_size += 4;
2461 /* Space for a3. */
2462 if (hash->movm_args & 0x10)
2463 hash->movm_stack_size += 4;
2465 /* "other" space. d0, d1, a0, a1, mdr, lir, lar, 4 byte pad. */
2466 if (hash->movm_args & 0x08)
2467 hash->movm_stack_size += 8 * 4;
2469 if (bfd_get_mach (abfd) == bfd_mach_am33)
2471 /* "exother" space. e0, e1, mdrq, mcrh, mcrl, mcvf */
2472 if (hash->movm_args & 0x1)
2473 hash->movm_stack_size += 6 * 4;
2475 /* exreg1 space. e4, e5, e6, e7 */
2476 if (hash->movm_args & 0x2)
2477 hash->movm_stack_size += 4 * 4;
2479 /* exreg0 space. e2, e3 */
2480 if (hash->movm_args & 0x4)
2481 hash->movm_stack_size += 2 * 4;
2485 /* Now look for the two stack adjustment variants. */
2486 if (byte1 == 0xf8 && byte2 == 0xfe)
2488 int temp = bfd_get_8 (abfd, contents + addr + 2);
2489 temp = ((temp & 0xff) ^ (~0x7f)) + 0x80;
2491 hash->stack_size = -temp;
2493 else if (byte1 == 0xfa && byte2 == 0xfe)
2495 int temp = bfd_get_16 (abfd, contents + addr + 2);
2496 temp = ((temp & 0xffff) ^ (~0x7fff)) + 0x8000;
2497 temp = -temp;
2499 if (temp < 255)
2500 hash->stack_size = temp;
2503 /* If the total stack to be allocated by the call instruction is more
2504 than 255 bytes, then we can't remove the stack adjustment by using
2505 "call" (we might still be able to remove the "movm" instruction. */
2506 if (hash->stack_size + hash->movm_stack_size > 255)
2507 hash->stack_size = 0;
2509 return;
2512 /* Delete some bytes from a section while relaxing. */
2514 static boolean
2515 mn10300_elf_relax_delete_bytes (abfd, sec, addr, count)
2516 bfd *abfd;
2517 asection *sec;
2518 bfd_vma addr;
2519 int count;
2521 Elf_Internal_Shdr *symtab_hdr;
2522 Elf32_External_Sym *extsyms;
2523 int shndx, index;
2524 bfd_byte *contents;
2525 Elf_Internal_Rela *irel, *irelend;
2526 Elf_Internal_Rela *irelalign;
2527 bfd_vma toaddr;
2528 Elf32_External_Sym *esym, *esymend;
2529 struct elf32_mn10300_link_hash_entry *sym_hash;
2531 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2532 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2534 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2536 contents = elf_section_data (sec)->this_hdr.contents;
2538 /* The deletion must stop at the next ALIGN reloc for an aligment
2539 power larger than the number of bytes we are deleting. */
2541 irelalign = NULL;
2542 toaddr = sec->_cooked_size;
2544 irel = elf_section_data (sec)->relocs;
2545 irelend = irel + sec->reloc_count;
2547 /* Actually delete the bytes. */
2548 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2549 sec->_cooked_size -= count;
2551 /* Adjust all the relocs. */
2552 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
2554 /* Get the new reloc address. */
2555 if ((irel->r_offset > addr
2556 && irel->r_offset < toaddr))
2557 irel->r_offset -= count;
2560 /* Adjust the local symbols defined in this section. */
2561 esym = extsyms;
2562 esymend = esym + symtab_hdr->sh_info;
2563 for (; esym < esymend; esym++)
2565 Elf_Internal_Sym isym;
2567 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
2569 if (isym.st_shndx == shndx
2570 && isym.st_value > addr
2571 && isym.st_value < toaddr)
2573 isym.st_value -= count;
2574 bfd_elf32_swap_symbol_out (abfd, &isym, esym);
2578 /* Now adjust the global symbols defined in this section. */
2579 esym = extsyms + symtab_hdr->sh_info;
2580 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2581 for (index = 0; esym < esymend; esym++, index++)
2583 Elf_Internal_Sym isym;
2585 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
2586 sym_hash = (struct elf32_mn10300_link_hash_entry *)
2587 (elf_sym_hashes (abfd)[index]);
2588 if (isym.st_shndx == shndx
2589 && ((sym_hash)->root.root.type == bfd_link_hash_defined
2590 || (sym_hash)->root.root.type == bfd_link_hash_defweak)
2591 && (sym_hash)->root.root.u.def.section == sec
2592 && (sym_hash)->root.root.u.def.value > addr
2593 && (sym_hash)->root.root.u.def.value < toaddr)
2595 (sym_hash)->root.root.u.def.value -= count;
2599 return true;
2602 /* Return true if a symbol exists at the given address, else return
2603 false. */
2604 static boolean
2605 mn10300_elf_symbol_address_p (abfd, sec, extsyms, addr)
2606 bfd *abfd;
2607 asection *sec;
2608 Elf32_External_Sym *extsyms;
2609 bfd_vma addr;
2611 Elf_Internal_Shdr *symtab_hdr;
2612 int shndx;
2613 Elf32_External_Sym *esym, *esymend;
2614 struct elf32_mn10300_link_hash_entry **sym_hash, **sym_hash_end;
2616 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2617 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2619 /* Examine all the symbols. */
2620 esym = extsyms;
2621 esymend = esym + symtab_hdr->sh_info;
2622 for (; esym < esymend; esym++)
2624 Elf_Internal_Sym isym;
2626 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
2628 if (isym.st_shndx == shndx
2629 && isym.st_value == addr)
2630 return true;
2633 sym_hash = (struct elf32_mn10300_link_hash_entry **) (elf_sym_hashes (abfd));
2634 sym_hash_end = (sym_hash
2635 + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2636 - symtab_hdr->sh_info));
2637 for (; sym_hash < sym_hash_end; sym_hash++)
2639 if (((*sym_hash)->root.root.type == bfd_link_hash_defined
2640 || (*sym_hash)->root.root.type == bfd_link_hash_defweak)
2641 && (*sym_hash)->root.root.u.def.section == sec
2642 && (*sym_hash)->root.root.u.def.value == addr)
2643 return true;
2645 return false;
2648 /* This is a version of bfd_generic_get_relocated_section_contents
2649 which uses mn10300_elf_relocate_section. */
2651 static bfd_byte *
2652 mn10300_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
2653 data, relocateable, symbols)
2654 bfd *output_bfd;
2655 struct bfd_link_info *link_info;
2656 struct bfd_link_order *link_order;
2657 bfd_byte *data;
2658 boolean relocateable;
2659 asymbol **symbols;
2661 Elf_Internal_Shdr *symtab_hdr;
2662 asection *input_section = link_order->u.indirect.section;
2663 bfd *input_bfd = input_section->owner;
2664 asection **sections = NULL;
2665 Elf_Internal_Rela *internal_relocs = NULL;
2666 Elf32_External_Sym *external_syms = NULL;
2667 Elf_Internal_Sym *internal_syms = NULL;
2669 /* We only need to handle the case of relaxing, or of having a
2670 particular set of section contents, specially. */
2671 if (relocateable
2672 || elf_section_data (input_section)->this_hdr.contents == NULL)
2673 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2674 link_order, data,
2675 relocateable,
2676 symbols);
2678 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2680 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2681 input_section->_raw_size);
2683 if ((input_section->flags & SEC_RELOC) != 0
2684 && input_section->reloc_count > 0)
2686 Elf_Internal_Sym *isymp;
2687 asection **secpp;
2688 Elf32_External_Sym *esym, *esymend;
2690 if (symtab_hdr->contents != NULL)
2691 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
2692 else
2694 external_syms = ((Elf32_External_Sym *)
2695 bfd_malloc (symtab_hdr->sh_info
2696 * sizeof (Elf32_External_Sym)));
2697 if (external_syms == NULL && symtab_hdr->sh_info > 0)
2698 goto error_return;
2699 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
2700 || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
2701 symtab_hdr->sh_info, input_bfd)
2702 != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
2703 goto error_return;
2706 internal_relocs = (_bfd_elf32_link_read_relocs
2707 (input_bfd, input_section, (PTR) NULL,
2708 (Elf_Internal_Rela *) NULL, false));
2709 if (internal_relocs == NULL)
2710 goto error_return;
2712 internal_syms = ((Elf_Internal_Sym *)
2713 bfd_malloc (symtab_hdr->sh_info
2714 * sizeof (Elf_Internal_Sym)));
2715 if (internal_syms == NULL && symtab_hdr->sh_info > 0)
2716 goto error_return;
2718 sections = (asection **) bfd_malloc (symtab_hdr->sh_info
2719 * sizeof (asection *));
2720 if (sections == NULL && symtab_hdr->sh_info > 0)
2721 goto error_return;
2723 isymp = internal_syms;
2724 secpp = sections;
2725 esym = external_syms;
2726 esymend = esym + symtab_hdr->sh_info;
2727 for (; esym < esymend; ++esym, ++isymp, ++secpp)
2729 asection *isec;
2731 bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
2733 if (isymp->st_shndx == SHN_UNDEF)
2734 isec = bfd_und_section_ptr;
2735 else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
2736 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
2737 else if (isymp->st_shndx == SHN_ABS)
2738 isec = bfd_abs_section_ptr;
2739 else if (isymp->st_shndx == SHN_COMMON)
2740 isec = bfd_com_section_ptr;
2741 else
2743 /* Who knows? */
2744 isec = NULL;
2747 *secpp = isec;
2750 if (! mn10300_elf_relocate_section (output_bfd, link_info, input_bfd,
2751 input_section, data, internal_relocs,
2752 internal_syms, sections))
2753 goto error_return;
2755 if (sections != NULL)
2756 free (sections);
2757 sections = NULL;
2758 if (internal_syms != NULL)
2759 free (internal_syms);
2760 internal_syms = NULL;
2761 if (external_syms != NULL && symtab_hdr->contents == NULL)
2762 free (external_syms);
2763 external_syms = NULL;
2764 if (internal_relocs != elf_section_data (input_section)->relocs)
2765 free (internal_relocs);
2766 internal_relocs = NULL;
2769 return data;
2771 error_return:
2772 if (internal_relocs != NULL
2773 && internal_relocs != elf_section_data (input_section)->relocs)
2774 free (internal_relocs);
2775 if (external_syms != NULL && symtab_hdr->contents == NULL)
2776 free (external_syms);
2777 if (internal_syms != NULL)
2778 free (internal_syms);
2779 if (sections != NULL)
2780 free (sections);
2781 return NULL;
2784 /* Assorted hash table functions. */
2786 /* Initialize an entry in the link hash table. */
2788 /* Create an entry in an MN10300 ELF linker hash table. */
2790 static struct bfd_hash_entry *
2791 elf32_mn10300_link_hash_newfunc (entry, table, string)
2792 struct bfd_hash_entry *entry;
2793 struct bfd_hash_table *table;
2794 const char *string;
2796 struct elf32_mn10300_link_hash_entry *ret =
2797 (struct elf32_mn10300_link_hash_entry *) entry;
2799 /* Allocate the structure if it has not already been allocated by a
2800 subclass. */
2801 if (ret == (struct elf32_mn10300_link_hash_entry *) NULL)
2802 ret = ((struct elf32_mn10300_link_hash_entry *)
2803 bfd_hash_allocate (table,
2804 sizeof (struct elf32_mn10300_link_hash_entry)));
2805 if (ret == (struct elf32_mn10300_link_hash_entry *) NULL)
2806 return (struct bfd_hash_entry *) ret;
2808 /* Call the allocation method of the superclass. */
2809 ret = ((struct elf32_mn10300_link_hash_entry *)
2810 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2811 table, string));
2812 if (ret != (struct elf32_mn10300_link_hash_entry *) NULL)
2814 ret->direct_calls = 0;
2815 ret->stack_size = 0;
2816 ret->movm_stack_size = 0;
2817 ret->flags = 0;
2818 ret->movm_args = 0;
2821 return (struct bfd_hash_entry *) ret;
2824 /* Create an mn10300 ELF linker hash table. */
2826 static struct bfd_link_hash_table *
2827 elf32_mn10300_link_hash_table_create (abfd)
2828 bfd *abfd;
2830 struct elf32_mn10300_link_hash_table *ret;
2832 ret = ((struct elf32_mn10300_link_hash_table *)
2833 bfd_alloc (abfd, sizeof (struct elf32_mn10300_link_hash_table)));
2834 if (ret == (struct elf32_mn10300_link_hash_table *) NULL)
2835 return NULL;
2837 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
2838 elf32_mn10300_link_hash_newfunc))
2840 bfd_release (abfd, ret);
2841 return NULL;
2844 ret->flags = 0;
2845 ret->static_hash_table
2846 = ((struct elf32_mn10300_link_hash_table *)
2847 bfd_alloc (abfd, sizeof (struct elf_link_hash_table)));
2848 if (ret->static_hash_table == NULL)
2850 bfd_release (abfd, ret);
2851 return NULL;
2854 if (! _bfd_elf_link_hash_table_init (&ret->static_hash_table->root, abfd,
2855 elf32_mn10300_link_hash_newfunc))
2857 bfd_release (abfd, ret->static_hash_table);
2858 bfd_release (abfd, ret);
2859 return NULL;
2861 return &ret->root.root;
2864 static int
2865 elf_mn10300_mach (flags)
2866 flagword flags;
2868 switch (flags & EF_MN10300_MACH)
2870 case E_MN10300_MACH_MN10300:
2871 default:
2872 return bfd_mach_mn10300;
2874 case E_MN10300_MACH_AM33:
2875 return bfd_mach_am33;
2879 /* The final processing done just before writing out a MN10300 ELF object
2880 file. This gets the MN10300 architecture right based on the machine
2881 number. */
2883 void
2884 _bfd_mn10300_elf_final_write_processing (abfd, linker)
2885 bfd *abfd;
2886 boolean linker ATTRIBUTE_UNUSED;
2888 unsigned long val;
2890 switch (bfd_get_mach (abfd))
2892 default:
2893 case bfd_mach_mn10300:
2894 val = E_MN10300_MACH_MN10300;
2895 break;
2897 case bfd_mach_am33:
2898 val = E_MN10300_MACH_AM33;
2899 break;
2902 elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH);
2903 elf_elfheader (abfd)->e_flags |= val;
2906 boolean
2907 _bfd_mn10300_elf_object_p (abfd)
2908 bfd *abfd;
2910 bfd_default_set_arch_mach (abfd, bfd_arch_mn10300,
2911 elf_mn10300_mach (elf_elfheader (abfd)->e_flags));
2912 return true;
2915 /* Merge backend specific data from an object file to the output
2916 object file when linking. */
2918 boolean
2919 _bfd_mn10300_elf_merge_private_bfd_data (ibfd, obfd)
2920 bfd *ibfd;
2921 bfd *obfd;
2923 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2924 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2925 return true;
2927 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2928 && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
2930 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
2931 bfd_get_mach (ibfd)))
2932 return false;
2935 return true;
2938 #define TARGET_LITTLE_SYM bfd_elf32_mn10300_vec
2939 #define TARGET_LITTLE_NAME "elf32-mn10300"
2940 #define ELF_ARCH bfd_arch_mn10300
2941 #define ELF_MACHINE_CODE EM_CYGNUS_MN10300
2942 #define ELF_MAXPAGESIZE 0x1000
2944 #define elf_info_to_howto mn10300_info_to_howto
2945 #define elf_info_to_howto_rel 0
2946 #define elf_backend_can_gc_sections 1
2947 #define elf_backend_check_relocs mn10300_elf_check_relocs
2948 #define elf_backend_gc_mark_hook mn10300_elf_gc_mark_hook
2949 #define elf_backend_relocate_section mn10300_elf_relocate_section
2950 #define bfd_elf32_bfd_relax_section mn10300_elf_relax_section
2951 #define bfd_elf32_bfd_get_relocated_section_contents \
2952 mn10300_elf_get_relocated_section_contents
2953 #define bfd_elf32_bfd_link_hash_table_create \
2954 elf32_mn10300_link_hash_table_create
2956 #define elf_symbol_leading_char '_'
2958 /* So we can set bits in e_flags. */
2959 #define elf_backend_final_write_processing \
2960 _bfd_mn10300_elf_final_write_processing
2961 #define elf_backend_object_p _bfd_mn10300_elf_object_p
2963 #define bfd_elf32_bfd_merge_private_bfd_data \
2964 _bfd_mn10300_elf_merge_private_bfd_data
2966 #include "elf32-target.h"