]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/elf-m10300.c
Minor formatting fixes.
[thirdparty/binutils-gdb.git] / bfd / elf-m10300.c
1 /* Matsushita 10300 specific support for 32-bit ELF
2 Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
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 2 of the License, or
9 (at your option) any later version.
10
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.
15
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "bfd.h"
21 #include "sysdep.h"
22 #include "libbfd.h"
23 #include "elf-bfd.h"
24 #include "elf/mn10300.h"
25
26 struct elf32_mn10300_link_hash_entry
27 {
28 /* The basic elf link hash table entry. */
29 struct elf_link_hash_entry root;
30
31 /* For function symbols, the number of times this function is
32 called directly (ie by name). */
33 unsigned int direct_calls;
34
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.
38
39 This does not include stack allocated by movm! */
40 unsigned char stack_size;
41
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;
46
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;
51
52 /* When set, convert all "call" instructions to this target into "calls"
53 instructions. */
54 #define MN10300_CONVERT_CALL_TO_CALLS 0x1
55
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;
60 };
61
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 {
67 /* The main hash table. */
68 struct elf_link_hash_table root;
69
70 /* A hash table for static functions. We could derive a new hash table
71 instead of using the full elf32_mn10300_link_hash_table if we wanted
72 to save some memory. */
73 struct elf32_mn10300_link_hash_table *static_hash_table;
74
75 /* Random linker state flags. */
76 #define MN10300_HASH_ENTRIES_INITIALIZED 0x1
77 char flags;
78 };
79
80 /* For MN10300 linker hash table. */
81
82 /* Get the MN10300 ELF linker hash table from a link_info structure. */
83
84 #define elf32_mn10300_hash_table(p) \
85 ((struct elf32_mn10300_link_hash_table *) ((p)->hash))
86
87 #define elf32_mn10300_link_hash_traverse(table, func, info) \
88 (elf_link_hash_traverse \
89 (&(table)->root, \
90 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
91 (info)))
92
93 static struct bfd_hash_entry *elf32_mn10300_link_hash_newfunc
94 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
95 static struct bfd_link_hash_table *elf32_mn10300_link_hash_table_create
96 PARAMS ((bfd *));
97
98 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
99 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
100 static void mn10300_info_to_howto
101 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
102 static boolean mn10300_elf_check_relocs
103 PARAMS ((bfd *, struct bfd_link_info *, asection *,
104 const Elf_Internal_Rela *));
105 static asection *mn10300_elf_gc_mark_hook
106 PARAMS ((bfd *, struct bfd_link_info *info, Elf_Internal_Rela *,
107 struct elf_link_hash_entry *, Elf_Internal_Sym *));
108 static boolean mn10300_elf_relax_delete_bytes
109 PARAMS ((bfd *, asection *, bfd_vma, int));
110 static boolean mn10300_elf_symbol_address_p
111 PARAMS ((bfd *, asection *, Elf32_External_Sym *, bfd_vma));
112 static boolean elf32_mn10300_finish_hash_table_entry
113 PARAMS ((struct bfd_hash_entry *, PTR));
114 static void compute_function_info
115 PARAMS ((bfd *, struct elf32_mn10300_link_hash_entry *,
116 bfd_vma, unsigned char *));
117
118 /* We have to use RELA instructions since md_apply_fix3 in the assembler
119 does absolutely nothing. */
120 #define USE_RELA
121
122
123 static reloc_howto_type elf_mn10300_howto_table[] =
124 {
125 /* Dummy relocation. Does nothing. */
126 HOWTO (R_MN10300_NONE,
127 0,
128 2,
129 16,
130 false,
131 0,
132 complain_overflow_bitfield,
133 bfd_elf_generic_reloc,
134 "R_MN10300_NONE",
135 false,
136 0,
137 0,
138 false),
139 /* Standard 32 bit reloc. */
140 HOWTO (R_MN10300_32,
141 0,
142 2,
143 32,
144 false,
145 0,
146 complain_overflow_bitfield,
147 bfd_elf_generic_reloc,
148 "R_MN10300_32",
149 false,
150 0xffffffff,
151 0xffffffff,
152 false),
153 /* Standard 16 bit reloc. */
154 HOWTO (R_MN10300_16,
155 0,
156 1,
157 16,
158 false,
159 0,
160 complain_overflow_bitfield,
161 bfd_elf_generic_reloc,
162 "R_MN10300_16",
163 false,
164 0xffff,
165 0xffff,
166 false),
167 /* Standard 8 bit reloc. */
168 HOWTO (R_MN10300_8,
169 0,
170 0,
171 8,
172 false,
173 0,
174 complain_overflow_bitfield,
175 bfd_elf_generic_reloc,
176 "R_MN10300_8",
177 false,
178 0xff,
179 0xff,
180 false),
181 /* Standard 32bit pc-relative reloc. */
182 HOWTO (R_MN10300_PCREL32,
183 0,
184 2,
185 32,
186 true,
187 0,
188 complain_overflow_bitfield,
189 bfd_elf_generic_reloc,
190 "R_MN10300_PCREL32",
191 false,
192 0xffffffff,
193 0xffffffff,
194 true),
195 /* Standard 16bit pc-relative reloc. */
196 HOWTO (R_MN10300_PCREL16,
197 0,
198 1,
199 16,
200 true,
201 0,
202 complain_overflow_bitfield,
203 bfd_elf_generic_reloc,
204 "R_MN10300_PCREL16",
205 false,
206 0xffff,
207 0xffff,
208 true),
209 /* Standard 8 pc-relative reloc. */
210 HOWTO (R_MN10300_PCREL8,
211 0,
212 0,
213 8,
214 true,
215 0,
216 complain_overflow_bitfield,
217 bfd_elf_generic_reloc,
218 "R_MN10300_PCREL8",
219 false,
220 0xff,
221 0xff,
222 true),
223
224 /* GNU extension to record C++ vtable hierarchy */
225 HOWTO (R_MN10300_GNU_VTINHERIT, /* type */
226 0, /* rightshift */
227 0, /* size (0 = byte, 1 = short, 2 = long) */
228 0, /* bitsize */
229 false, /* pc_relative */
230 0, /* bitpos */
231 complain_overflow_dont, /* complain_on_overflow */
232 NULL, /* special_function */
233 "R_MN10300_GNU_VTINHERIT", /* name */
234 false, /* partial_inplace */
235 0, /* src_mask */
236 0, /* dst_mask */
237 false), /* pcrel_offset */
238
239 /* GNU extension to record C++ vtable member usage */
240 HOWTO (R_MN10300_GNU_VTENTRY, /* type */
241 0, /* rightshift */
242 0, /* size (0 = byte, 1 = short, 2 = long) */
243 0, /* bitsize */
244 false, /* pc_relative */
245 0, /* bitpos */
246 complain_overflow_dont, /* complain_on_overflow */
247 NULL, /* special_function */
248 "R_MN10300_GNU_VTENTRY", /* name */
249 false, /* partial_inplace */
250 0, /* src_mask */
251 0, /* dst_mask */
252 false), /* pcrel_offset */
253
254 /* Standard 24 bit reloc. */
255 HOWTO (R_MN10300_24,
256 0,
257 2,
258 24,
259 false,
260 0,
261 complain_overflow_bitfield,
262 bfd_elf_generic_reloc,
263 "R_MN10300_24",
264 false,
265 0xffffff,
266 0xffffff,
267 false),
268
269 };
270
271 struct mn10300_reloc_map
272 {
273 bfd_reloc_code_real_type bfd_reloc_val;
274 unsigned char elf_reloc_val;
275 };
276
277 static const struct mn10300_reloc_map mn10300_reloc_map[] =
278 {
279 { BFD_RELOC_NONE, R_MN10300_NONE, },
280 { BFD_RELOC_32, R_MN10300_32, },
281 { BFD_RELOC_16, R_MN10300_16, },
282 { BFD_RELOC_8, R_MN10300_8, },
283 { BFD_RELOC_32_PCREL, R_MN10300_PCREL32, },
284 { BFD_RELOC_16_PCREL, R_MN10300_PCREL16, },
285 { BFD_RELOC_8_PCREL, R_MN10300_PCREL8, },
286 { BFD_RELOC_24, R_MN10300_24, },
287 { BFD_RELOC_VTABLE_INHERIT, R_MN10300_GNU_VTINHERIT },
288 { BFD_RELOC_VTABLE_ENTRY, R_MN10300_GNU_VTENTRY },
289 };
290
291 static reloc_howto_type *
292 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
293 bfd *abfd ATTRIBUTE_UNUSED;
294 bfd_reloc_code_real_type code;
295 {
296 unsigned int i;
297
298 for (i = 0;
299 i < sizeof (mn10300_reloc_map) / sizeof (struct mn10300_reloc_map);
300 i++)
301 {
302 if (mn10300_reloc_map[i].bfd_reloc_val == code)
303 return &elf_mn10300_howto_table[mn10300_reloc_map[i].elf_reloc_val];
304 }
305
306 return NULL;
307 }
308
309 /* Set the howto pointer for an MN10300 ELF reloc. */
310
311 static void
312 mn10300_info_to_howto (abfd, cache_ptr, dst)
313 bfd *abfd ATTRIBUTE_UNUSED;
314 arelent *cache_ptr;
315 Elf32_Internal_Rela *dst;
316 {
317 unsigned int r_type;
318
319 r_type = ELF32_R_TYPE (dst->r_info);
320 BFD_ASSERT (r_type < (unsigned int) R_MN10300_MAX);
321 cache_ptr->howto = &elf_mn10300_howto_table[r_type];
322 }
323
324 /* Look through the relocs for a section during the first phase.
325 Since we don't do .gots or .plts, we just need to consider the
326 virtual table relocs for gc. */
327
328 static boolean
329 mn10300_elf_check_relocs (abfd, info, sec, relocs)
330 bfd *abfd;
331 struct bfd_link_info *info;
332 asection *sec;
333 const Elf_Internal_Rela *relocs;
334 {
335 Elf_Internal_Shdr *symtab_hdr;
336 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
337 const Elf_Internal_Rela *rel;
338 const Elf_Internal_Rela *rel_end;
339
340 if (info->relocateable)
341 return true;
342
343 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
344 sym_hashes = elf_sym_hashes (abfd);
345 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
346 if (!elf_bad_symtab (abfd))
347 sym_hashes_end -= symtab_hdr->sh_info;
348
349 rel_end = relocs + sec->reloc_count;
350 for (rel = relocs; rel < rel_end; rel++)
351 {
352 struct elf_link_hash_entry *h;
353 unsigned long r_symndx;
354
355 r_symndx = ELF32_R_SYM (rel->r_info);
356 if (r_symndx < symtab_hdr->sh_info)
357 h = NULL;
358 else
359 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
360
361 switch (ELF32_R_TYPE (rel->r_info))
362 {
363 /* This relocation describes the C++ object vtable hierarchy.
364 Reconstruct it for later use during GC. */
365 case R_MN10300_GNU_VTINHERIT:
366 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
367 return false;
368 break;
369
370 /* This relocation describes which C++ vtable entries are actually
371 used. Record for later use during GC. */
372 case R_MN10300_GNU_VTENTRY:
373 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
374 return false;
375 break;
376 }
377 }
378
379 return true;
380 }
381
382 /* Return the section that should be marked against GC for a given
383 relocation. */
384
385 static asection *
386 mn10300_elf_gc_mark_hook (abfd, info, rel, h, sym)
387 bfd *abfd;
388 struct bfd_link_info *info ATTRIBUTE_UNUSED;
389 Elf_Internal_Rela *rel;
390 struct elf_link_hash_entry *h;
391 Elf_Internal_Sym *sym;
392 {
393 if (h != NULL)
394 {
395 switch (ELF32_R_TYPE (rel->r_info))
396 {
397 case R_MN10300_GNU_VTINHERIT:
398 case R_MN10300_GNU_VTENTRY:
399 break;
400
401 default:
402 switch (h->root.type)
403 {
404 case bfd_link_hash_defined:
405 case bfd_link_hash_defweak:
406 return h->root.u.def.section;
407
408 case bfd_link_hash_common:
409 return h->root.u.c.p->section;
410
411 default:
412 break;
413 }
414 }
415 }
416 else
417 {
418 if (!(elf_bad_symtab (abfd)
419 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
420 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
421 && sym->st_shndx != SHN_COMMON))
422 {
423 return bfd_section_from_elf_index (abfd, sym->st_shndx);
424 }
425 }
426
427 return NULL;
428 }
429
430 /* Perform a relocation as part of a final link. */
431 static bfd_reloc_status_type
432 mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
433 input_section, contents, offset, value,
434 addend, info, sym_sec, is_local)
435 reloc_howto_type *howto;
436 bfd *input_bfd;
437 bfd *output_bfd ATTRIBUTE_UNUSED;
438 asection *input_section;
439 bfd_byte *contents;
440 bfd_vma offset;
441 bfd_vma value;
442 bfd_vma addend;
443 struct bfd_link_info *info ATTRIBUTE_UNUSED;
444 asection *sym_sec ATTRIBUTE_UNUSED;
445 int is_local ATTRIBUTE_UNUSED;
446 {
447 unsigned long r_type = howto->type;
448 bfd_byte *hit_data = contents + offset;
449
450 switch (r_type)
451 {
452 case R_MN10300_NONE:
453 return bfd_reloc_ok;
454
455 case R_MN10300_32:
456 value += addend;
457 bfd_put_32 (input_bfd, value, hit_data);
458 return bfd_reloc_ok;
459
460 case R_MN10300_24:
461 value += addend;
462
463 if ((long)value > 0x7fffff || (long)value < -0x800000)
464 return bfd_reloc_overflow;
465
466 bfd_put_8 (input_bfd, value & 0xff, hit_data);
467 bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
468 bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
469 return bfd_reloc_ok;
470
471 case R_MN10300_16:
472 value += addend;
473
474 if ((long)value > 0x7fff || (long)value < -0x8000)
475 return bfd_reloc_overflow;
476
477 bfd_put_16 (input_bfd, value, hit_data);
478 return bfd_reloc_ok;
479
480 case R_MN10300_8:
481 value += addend;
482
483 if ((long)value > 0x7f || (long)value < -0x80)
484 return bfd_reloc_overflow;
485
486 bfd_put_8 (input_bfd, value, hit_data);
487 return bfd_reloc_ok;
488
489 case R_MN10300_PCREL8:
490 value -= (input_section->output_section->vma
491 + input_section->output_offset);
492 value -= offset;
493 value += addend;
494
495 if ((long)value > 0xff || (long)value < -0x100)
496 return bfd_reloc_overflow;
497
498 bfd_put_8 (input_bfd, value, hit_data);
499 return bfd_reloc_ok;
500
501 case R_MN10300_PCREL16:
502 value -= (input_section->output_section->vma
503 + input_section->output_offset);
504 value -= offset;
505 value += addend;
506
507 if ((long)value > 0xffff || (long)value < -0x10000)
508 return bfd_reloc_overflow;
509
510 bfd_put_16 (input_bfd, value, hit_data);
511 return bfd_reloc_ok;
512
513 case R_MN10300_PCREL32:
514 value -= (input_section->output_section->vma
515 + input_section->output_offset);
516 value -= offset;
517 value += addend;
518
519 bfd_put_32 (input_bfd, value, hit_data);
520 return bfd_reloc_ok;
521
522 case R_MN10300_GNU_VTINHERIT:
523 case R_MN10300_GNU_VTENTRY:
524 return bfd_reloc_ok;
525
526 default:
527 return bfd_reloc_notsupported;
528 }
529 }
530
531 \f
532 /* Relocate an MN10300 ELF section. */
533 static boolean
534 mn10300_elf_relocate_section (output_bfd, info, input_bfd, input_section,
535 contents, relocs, local_syms, local_sections)
536 bfd *output_bfd;
537 struct bfd_link_info *info;
538 bfd *input_bfd;
539 asection *input_section;
540 bfd_byte *contents;
541 Elf_Internal_Rela *relocs;
542 Elf_Internal_Sym *local_syms;
543 asection **local_sections;
544 {
545 Elf_Internal_Shdr *symtab_hdr;
546 struct elf32_mn10300_link_hash_entry **sym_hashes;
547 Elf_Internal_Rela *rel, *relend;
548
549 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
550 sym_hashes = (struct elf32_mn10300_link_hash_entry **)
551 (elf_sym_hashes (input_bfd));
552
553 rel = relocs;
554 relend = relocs + input_section->reloc_count;
555 for (; rel < relend; rel++)
556 {
557 int r_type;
558 reloc_howto_type *howto;
559 unsigned long r_symndx;
560 Elf_Internal_Sym *sym;
561 asection *sec;
562 struct elf32_mn10300_link_hash_entry *h;
563 bfd_vma relocation;
564 bfd_reloc_status_type r;
565
566 r_symndx = ELF32_R_SYM (rel->r_info);
567 r_type = ELF32_R_TYPE (rel->r_info);
568 howto = elf_mn10300_howto_table + r_type;
569
570 /* Just skip the vtable gc relocs. */
571 if (r_type == R_MN10300_GNU_VTINHERIT
572 || r_type == R_MN10300_GNU_VTENTRY)
573 continue;
574
575 if (info->relocateable)
576 {
577 /* This is a relocateable link. We don't have to change
578 anything, unless the reloc is against a section symbol,
579 in which case we have to adjust according to where the
580 section symbol winds up in the output section. */
581 if (r_symndx < symtab_hdr->sh_info)
582 {
583 sym = local_syms + r_symndx;
584 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
585 {
586 sec = local_sections[r_symndx];
587 rel->r_addend += sec->output_offset + sym->st_value;
588 }
589 }
590
591 continue;
592 }
593
594 /* This is a final link. */
595 h = NULL;
596 sym = NULL;
597 sec = NULL;
598 if (r_symndx < symtab_hdr->sh_info)
599 {
600 sym = local_syms + r_symndx;
601 sec = local_sections[r_symndx];
602 relocation = (sec->output_section->vma
603 + sec->output_offset
604 + sym->st_value);
605 }
606 else
607 {
608 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
609 while (h->root.type == bfd_link_hash_indirect
610 || h->root.type == bfd_link_hash_warning)
611 h = (struct elf32_mn10300_link_hash_entry *) h->root.root.u.i.link;
612 if (h->root.root.type == bfd_link_hash_defined
613 || h->root.root.type == bfd_link_hash_defweak)
614 {
615 sec = h->root.root.u.def.section;
616 relocation = (h->root.root.u.def.value
617 + sec->output_section->vma
618 + sec->output_offset);
619 }
620 else if (h->root.root.type == bfd_link_hash_undefweak)
621 relocation = 0;
622 else
623 {
624 if (! ((*info->callbacks->undefined_symbol)
625 (info, h->root.root.root.string, input_bfd,
626 input_section, rel->r_offset, true)))
627 return false;
628 relocation = 0;
629 }
630 }
631
632 r = mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
633 input_section,
634 contents, rel->r_offset,
635 relocation, rel->r_addend,
636 info, sec, h == NULL);
637
638 if (r != bfd_reloc_ok)
639 {
640 const char *name;
641 const char *msg = (const char *)0;
642
643 if (h != NULL)
644 name = h->root.root.root.string;
645 else
646 {
647 name = (bfd_elf_string_from_elf_section
648 (input_bfd, symtab_hdr->sh_link, sym->st_name));
649 if (name == NULL || *name == '\0')
650 name = bfd_section_name (input_bfd, sec);
651 }
652
653 switch (r)
654 {
655 case bfd_reloc_overflow:
656 if (! ((*info->callbacks->reloc_overflow)
657 (info, name, howto->name, (bfd_vma) 0,
658 input_bfd, input_section, rel->r_offset)))
659 return false;
660 break;
661
662 case bfd_reloc_undefined:
663 if (! ((*info->callbacks->undefined_symbol)
664 (info, name, input_bfd, input_section,
665 rel->r_offset, true)))
666 return false;
667 break;
668
669 case bfd_reloc_outofrange:
670 msg = _("internal error: out of range error");
671 goto common_error;
672
673 case bfd_reloc_notsupported:
674 msg = _("internal error: unsupported relocation error");
675 goto common_error;
676
677 case bfd_reloc_dangerous:
678 msg = _("internal error: dangerous error");
679 goto common_error;
680
681 default:
682 msg = _("internal error: unknown error");
683 /* fall through */
684
685 common_error:
686 if (!((*info->callbacks->warning)
687 (info, msg, name, input_bfd, input_section,
688 rel->r_offset)))
689 return false;
690 break;
691 }
692 }
693 }
694
695 return true;
696 }
697
698 /* Finish initializing one hash table entry. */
699 static boolean
700 elf32_mn10300_finish_hash_table_entry (gen_entry, in_args)
701 struct bfd_hash_entry *gen_entry;
702 PTR in_args ATTRIBUTE_UNUSED;
703 {
704 struct elf32_mn10300_link_hash_entry *entry;
705 unsigned int byte_count = 0;
706
707 entry = (struct elf32_mn10300_link_hash_entry *)gen_entry;
708
709 /* If we already know we want to convert "call" to "calls" for calls
710 to this symbol, then return now. */
711 if (entry->flags == MN10300_CONVERT_CALL_TO_CALLS)
712 return true;
713
714 /* If there are no named calls to this symbol, or there's nothing we
715 can move from the function itself into the "call" instruction, then
716 note that all "call" instructions should be converted into "calls"
717 instructions and return. */
718 if (entry->direct_calls == 0
719 || (entry->stack_size == 0 && entry->movm_args == 0))
720 {
721 /* Make a note that we should convert "call" instructions to "calls"
722 instructions for calls to this symbol. */
723 entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
724 return true;
725 }
726
727 /* We may be able to move some instructions from the function itself into
728 the "call" instruction. Count how many bytes we might be able to
729 eliminate in the function itself. */
730
731 /* A movm instruction is two bytes. */
732 if (entry->movm_args)
733 byte_count += 2;
734
735 /* Count the insn to allocate stack space too. */
736 if (entry->stack_size > 0 && entry->stack_size <= 128)
737 byte_count += 3;
738 else if (entry->stack_size > 0 && entry->stack_size < 256)
739 byte_count += 4;
740
741 /* If using "call" will result in larger code, then turn all
742 the associated "call" instructions into "calls" instrutions. */
743 if (byte_count < entry->direct_calls)
744 entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
745
746 /* This routine never fails. */
747 return true;
748 }
749
750 /* This function handles relaxing for the mn10300.
751
752 There's quite a few relaxing opportunites available on the mn10300:
753
754 * calls:32 -> calls:16 2 bytes
755 * call:32 -> call:16 2 bytes
756
757 * call:32 -> calls:32 1 byte
758 * call:16 -> calls:16 1 byte
759 * These are done anytime using "calls" would result
760 in smaller code, or when necessary to preserve the
761 meaning of the program.
762
763 * call:32 varies
764 * call:16
765 * In some circumstances we can move instructions
766 from a function prologue into a "call" instruction.
767 This is only done if the resulting code is no larger
768 than the original code.
769
770
771 * jmp:32 -> jmp:16 2 bytes
772 * jmp:16 -> bra:8 1 byte
773
774 * If the previous instruction is a conditional branch
775 around the jump/bra, we may be able to reverse its condition
776 and change its target to the jump's target. The jump/bra
777 can then be deleted. 2 bytes
778
779 * mov abs32 -> mov abs16 1 or 2 bytes
780
781 * Most instructions which accept imm32 can relax to imm16 1 or 2 bytes
782 - Most instructions which accept imm16 can relax to imm8 1 or 2 bytes
783
784 * Most instructions which accept d32 can relax to d16 1 or 2 bytes
785 - Most instructions which accept d16 can relax to d8 1 or 2 bytes
786
787 We don't handle imm16->imm8 or d16->d8 as they're very rare
788 and somewhat more difficult to support. */
789
790 static boolean
791 mn10300_elf_relax_section (abfd, sec, link_info, again)
792 bfd *abfd;
793 asection *sec;
794 struct bfd_link_info *link_info;
795 boolean *again;
796 {
797 Elf_Internal_Shdr *symtab_hdr;
798 Elf_Internal_Rela *internal_relocs = NULL;
799 Elf_Internal_Rela *free_relocs = NULL;
800 Elf_Internal_Rela *irel, *irelend;
801 bfd_byte *contents = NULL;
802 bfd_byte *free_contents = NULL;
803 Elf32_External_Sym *extsyms = NULL;
804 Elf32_External_Sym *free_extsyms = NULL;
805 struct elf32_mn10300_link_hash_table *hash_table;
806
807 /* Assume nothing changes. */
808 *again = false;
809
810 /* We need a pointer to the mn10300 specific hash table. */
811 hash_table = elf32_mn10300_hash_table (link_info);
812
813 /* Initialize fields in each hash table entry the first time through. */
814 if ((hash_table->flags & MN10300_HASH_ENTRIES_INITIALIZED) == 0)
815 {
816 bfd *input_bfd;
817
818 /* Iterate over all the input bfds. */
819 for (input_bfd = link_info->input_bfds;
820 input_bfd != NULL;
821 input_bfd = input_bfd->link_next)
822 {
823 asection *section;
824
825 /* We're going to need all the symbols for each bfd. */
826 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
827
828 /* Get cached copy if it exists. */
829 if (symtab_hdr->contents != NULL)
830 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
831 else
832 {
833 /* Go get them off disk. */
834 extsyms = ((Elf32_External_Sym *)
835 bfd_malloc (symtab_hdr->sh_size));
836 if (extsyms == NULL)
837 goto error_return;
838 free_extsyms = extsyms;
839 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
840 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, input_bfd)
841 != symtab_hdr->sh_size))
842 goto error_return;
843 }
844
845 /* Iterate over each section in this bfd. */
846 for (section = input_bfd->sections;
847 section != NULL;
848 section = section->next)
849 {
850 struct elf32_mn10300_link_hash_entry *hash;
851 Elf_Internal_Sym *sym;
852 asection *sym_sec = NULL;
853 const char *sym_name;
854 char *new_name;
855
856 /* Get cached copy of section contents if it exists. */
857 if (elf_section_data (section)->this_hdr.contents != NULL)
858 contents = elf_section_data (section)->this_hdr.contents;
859 else if (section->_raw_size != 0)
860 {
861 /* Go get them off disk. */
862 contents = (bfd_byte *)bfd_malloc (section->_raw_size);
863 if (contents == NULL)
864 goto error_return;
865 free_contents = contents;
866
867 if (!bfd_get_section_contents (input_bfd, section,
868 contents, (file_ptr) 0,
869 section->_raw_size))
870 goto error_return;
871 }
872 else
873 {
874 contents = NULL;
875 free_contents = NULL;
876 }
877
878 /* If there aren't any relocs, then there's nothing to do. */
879 if ((section->flags & SEC_RELOC) != 0
880 && section->reloc_count != 0)
881 {
882
883 /* Get a copy of the native relocations. */
884 internal_relocs = (_bfd_elf32_link_read_relocs
885 (input_bfd, section, (PTR) NULL,
886 (Elf_Internal_Rela *) NULL,
887 link_info->keep_memory));
888 if (internal_relocs == NULL)
889 goto error_return;
890 if (! link_info->keep_memory)
891 free_relocs = internal_relocs;
892
893 /* Now examine each relocation. */
894 irel = internal_relocs;
895 irelend = irel + section->reloc_count;
896 for (; irel < irelend; irel++)
897 {
898 long r_type;
899 unsigned long r_index;
900 unsigned char code;
901
902 r_type = ELF32_R_TYPE (irel->r_info);
903 r_index = ELF32_R_SYM (irel->r_info);
904
905 if (r_type < 0 || r_type >= (int)R_MN10300_MAX)
906 goto error_return;
907
908 /* We need the name and hash table entry of the target
909 symbol! */
910 hash = NULL;
911 sym = NULL;
912 sym_sec = NULL;
913
914 if (r_index < symtab_hdr->sh_info)
915 {
916 /* A local symbol. */
917 Elf_Internal_Sym isym;
918
919 bfd_elf32_swap_symbol_in (input_bfd,
920 extsyms + r_index, &isym);
921
922 if (isym.st_shndx == SHN_UNDEF)
923 sym_sec = bfd_und_section_ptr;
924 else if (isym.st_shndx > 0
925 && isym.st_shndx < SHN_LORESERVE)
926 sym_sec
927 = bfd_section_from_elf_index (input_bfd,
928 isym.st_shndx);
929 else if (isym.st_shndx == SHN_ABS)
930 sym_sec = bfd_abs_section_ptr;
931 else if (isym.st_shndx == SHN_COMMON)
932 sym_sec = bfd_com_section_ptr;
933
934 sym_name = bfd_elf_string_from_elf_section (input_bfd,
935 symtab_hdr->sh_link,
936 isym.st_name);
937
938 /* If it isn't a function, then we don't care
939 about it. */
940 if (r_index < symtab_hdr->sh_info
941 && ELF_ST_TYPE (isym.st_info) != STT_FUNC)
942 continue;
943
944 /* Tack on an ID so we can uniquely identify this
945 local symbol in the global hash table. */
946 new_name = bfd_malloc (strlen (sym_name) + 10);
947 if (new_name == 0)
948 goto error_return;
949
950 sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
951 sym_name = new_name;
952
953 hash = (struct elf32_mn10300_link_hash_entry *)
954 elf_link_hash_lookup (&hash_table->static_hash_table->root,
955 sym_name, true,
956 true, false);
957 free (new_name);
958 }
959 else
960 {
961 r_index -= symtab_hdr->sh_info;
962 hash = (struct elf32_mn10300_link_hash_entry *)
963 elf_sym_hashes (input_bfd)[r_index];
964 }
965
966 /* If this is not a "call" instruction, then we
967 should convert "call" instructions to "calls"
968 instructions. */
969 code = bfd_get_8 (input_bfd,
970 contents + irel->r_offset - 1);
971 if (code != 0xdd && code != 0xcd)
972 hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
973
974 /* If this is a jump/call, then bump the direct_calls
975 counter. Else force "call" to "calls" conversions. */
976 if (r_type == R_MN10300_PCREL32
977 || r_type == R_MN10300_PCREL16)
978 hash->direct_calls++;
979 else
980 hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
981 }
982 }
983
984 /* Now look at the actual contents to get the stack size,
985 and a list of what registers were saved in the prologue
986 (ie movm_args). */
987 if ((section->flags & SEC_CODE) != 0)
988 {
989
990 Elf32_External_Sym *esym, *esymend;
991 int idx, shndx;
992
993 shndx = _bfd_elf_section_from_bfd_section (input_bfd,
994 section);
995
996
997 /* Look at each function defined in this section and
998 update info for that function. */
999 esym = extsyms;
1000 esymend = esym + symtab_hdr->sh_info;
1001 for (; esym < esymend; esym++)
1002 {
1003 Elf_Internal_Sym isym;
1004
1005 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
1006 if (isym.st_shndx == shndx
1007 && ELF_ST_TYPE (isym.st_info) == STT_FUNC)
1008 {
1009 if (isym.st_shndx == SHN_UNDEF)
1010 sym_sec = bfd_und_section_ptr;
1011 else if (isym.st_shndx > 0
1012 && isym.st_shndx < SHN_LORESERVE)
1013 sym_sec
1014 = bfd_section_from_elf_index (input_bfd,
1015 isym.st_shndx);
1016 else if (isym.st_shndx == SHN_ABS)
1017 sym_sec = bfd_abs_section_ptr;
1018 else if (isym.st_shndx == SHN_COMMON)
1019 sym_sec = bfd_com_section_ptr;
1020
1021 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1022 symtab_hdr->sh_link,
1023 isym.st_name);
1024
1025 /* Tack on an ID so we can uniquely identify this
1026 local symbol in the global hash table. */
1027 new_name = bfd_malloc (strlen (sym_name) + 10);
1028 if (new_name == 0)
1029 goto error_return;
1030
1031 sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
1032 sym_name = new_name;
1033
1034 hash = (struct elf32_mn10300_link_hash_entry *)
1035 elf_link_hash_lookup (&hash_table->static_hash_table->root,
1036 sym_name, true,
1037 true, false);
1038 free (new_name);
1039 compute_function_info (input_bfd, hash,
1040 isym.st_value, contents);
1041 }
1042 }
1043
1044 esym = extsyms + symtab_hdr->sh_info;
1045 esymend = extsyms + (symtab_hdr->sh_size
1046 / sizeof (Elf32_External_Sym));
1047 for (idx = 0; esym < esymend; esym++, idx++)
1048 {
1049 Elf_Internal_Sym isym;
1050
1051 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
1052 hash = (struct elf32_mn10300_link_hash_entry *)
1053 elf_sym_hashes (input_bfd)[idx];
1054 if (isym.st_shndx == shndx
1055 && ELF_ST_TYPE (isym.st_info) == STT_FUNC
1056 && (hash)->root.root.u.def.section == section
1057 && ((hash)->root.root.type == bfd_link_hash_defined
1058 || (hash)->root.root.type == bfd_link_hash_defweak))
1059 compute_function_info (input_bfd, hash,
1060 (hash)->root.root.u.def.value,
1061 contents);
1062 }
1063 }
1064
1065 /* Cache or free any memory we allocated for the relocs. */
1066 if (free_relocs != NULL)
1067 {
1068 free (free_relocs);
1069 free_relocs = NULL;
1070 }
1071
1072 /* Cache or free any memory we allocated for the contents. */
1073 if (free_contents != NULL)
1074 {
1075 if (! link_info->keep_memory)
1076 free (free_contents);
1077 else
1078 {
1079 /* Cache the section contents for elf_link_input_bfd. */
1080 elf_section_data (section)->this_hdr.contents = contents;
1081 }
1082 free_contents = NULL;
1083 }
1084 }
1085
1086 /* Cache or free any memory we allocated for the symbols. */
1087 if (free_extsyms != NULL)
1088 {
1089 if (! link_info->keep_memory)
1090 free (free_extsyms);
1091 else
1092 {
1093 /* Cache the symbols for elf_link_input_bfd. */
1094 symtab_hdr->contents = extsyms;
1095 }
1096 free_extsyms = NULL;
1097 }
1098 }
1099
1100 /* Now iterate on each symbol in the hash table and perform
1101 the final initialization steps on each. */
1102 elf32_mn10300_link_hash_traverse (hash_table,
1103 elf32_mn10300_finish_hash_table_entry,
1104 NULL);
1105 elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
1106 elf32_mn10300_finish_hash_table_entry,
1107 NULL);
1108
1109 /* All entries in the hash table are fully initialized. */
1110 hash_table->flags |= MN10300_HASH_ENTRIES_INITIALIZED;
1111
1112 /* Now that everything has been initialized, go through each
1113 code section and delete any prologue insns which will be
1114 redundant because their operations will be performed by
1115 a "call" instruction. */
1116 for (input_bfd = link_info->input_bfds;
1117 input_bfd != NULL;
1118 input_bfd = input_bfd->link_next)
1119 {
1120 asection *section;
1121
1122 /* We're going to need all the symbols for each bfd. */
1123 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1124
1125 /* Get cached copy if it exists. */
1126 if (symtab_hdr->contents != NULL)
1127 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1128 else
1129 {
1130 /* Go get them off disk. */
1131 extsyms = ((Elf32_External_Sym *)
1132 bfd_malloc (symtab_hdr->sh_size));
1133 if (extsyms == NULL)
1134 goto error_return;
1135 free_extsyms = extsyms;
1136 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1137 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, input_bfd)
1138 != symtab_hdr->sh_size))
1139 goto error_return;
1140 }
1141
1142 /* Walk over each section in this bfd. */
1143 for (section = input_bfd->sections;
1144 section != NULL;
1145 section = section->next)
1146 {
1147 int shndx;
1148 Elf32_External_Sym *esym, *esymend;
1149 int idx;
1150
1151 /* Skip non-code sections and empty sections. */
1152 if ((section->flags & SEC_CODE) == 0 || section->_raw_size == 0)
1153 continue;
1154
1155 if (section->reloc_count != 0)
1156 {
1157 /* Get a copy of the native relocations. */
1158 internal_relocs = (_bfd_elf32_link_read_relocs
1159 (input_bfd, section, (PTR) NULL,
1160 (Elf_Internal_Rela *) NULL,
1161 link_info->keep_memory));
1162 if (internal_relocs == NULL)
1163 goto error_return;
1164 if (! link_info->keep_memory)
1165 free_relocs = internal_relocs;
1166 }
1167
1168 /* Get cached copy of section contents if it exists. */
1169 if (elf_section_data (section)->this_hdr.contents != NULL)
1170 contents = elf_section_data (section)->this_hdr.contents;
1171 else
1172 {
1173 /* Go get them off disk. */
1174 contents = (bfd_byte *)bfd_malloc (section->_raw_size);
1175 if (contents == NULL)
1176 goto error_return;
1177 free_contents = contents;
1178
1179 if (!bfd_get_section_contents (input_bfd, section,
1180 contents, (file_ptr) 0,
1181 section->_raw_size))
1182 goto error_return;
1183 }
1184
1185
1186 shndx = _bfd_elf_section_from_bfd_section (input_bfd, section);
1187
1188 /* Now look for any function in this section which needs
1189 insns deleted from its prologue. */
1190 esym = extsyms;
1191 esymend = esym + symtab_hdr->sh_info;
1192 for (; esym < esymend; esym++)
1193 {
1194 Elf_Internal_Sym isym;
1195 struct elf32_mn10300_link_hash_entry *sym_hash;
1196 asection *sym_sec = NULL;
1197 const char *sym_name;
1198 char *new_name;
1199
1200 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
1201
1202 if (isym.st_shndx != shndx)
1203 continue;
1204
1205 if (isym.st_shndx == SHN_UNDEF)
1206 sym_sec = bfd_und_section_ptr;
1207 else if (isym.st_shndx > 0 && isym.st_shndx < SHN_LORESERVE)
1208 sym_sec
1209 = bfd_section_from_elf_index (input_bfd, isym.st_shndx);
1210 else if (isym.st_shndx == SHN_ABS)
1211 sym_sec = bfd_abs_section_ptr;
1212 else if (isym.st_shndx == SHN_COMMON)
1213 sym_sec = bfd_com_section_ptr;
1214 else
1215 abort ();
1216
1217 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1218 symtab_hdr->sh_link,
1219 isym.st_name);
1220
1221 /* Tack on an ID so we can uniquely identify this
1222 local symbol in the global hash table. */
1223 new_name = bfd_malloc (strlen (sym_name) + 10);
1224 if (new_name == 0)
1225 goto error_return;
1226 sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
1227 sym_name = new_name;
1228
1229 sym_hash = (struct elf32_mn10300_link_hash_entry *)
1230 elf_link_hash_lookup (&hash_table->static_hash_table->root,
1231 sym_name, false,
1232 false, false);
1233
1234 free (new_name);
1235 if (sym_hash == NULL)
1236 continue;
1237
1238 if (! ((sym_hash)->flags & MN10300_CONVERT_CALL_TO_CALLS)
1239 && ! ((sym_hash)->flags & MN10300_DELETED_PROLOGUE_BYTES))
1240 {
1241 int bytes = 0;
1242
1243 /* Note that we've changed things. */
1244 elf_section_data (section)->relocs = internal_relocs;
1245 free_relocs = NULL;
1246
1247 elf_section_data (section)->this_hdr.contents = contents;
1248 free_contents = NULL;
1249
1250 symtab_hdr->contents = (bfd_byte *)extsyms;
1251 free_extsyms = NULL;
1252
1253 /* Count how many bytes we're going to delete. */
1254 if (sym_hash->movm_args)
1255 bytes += 2;
1256
1257 if (sym_hash->stack_size && sym_hash->stack_size <= 128)
1258 bytes += 3;
1259 else if (sym_hash->stack_size
1260 && sym_hash->stack_size < 256)
1261 bytes += 4;
1262
1263 /* Note that we've deleted prologue bytes for this
1264 function. */
1265 sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
1266
1267 /* Actually delete the bytes. */
1268 if (!mn10300_elf_relax_delete_bytes (input_bfd,
1269 section,
1270 isym.st_value,
1271 bytes))
1272 goto error_return;
1273
1274 /* Something changed. Not strictly necessary, but
1275 may lead to more relaxing opportunities. */
1276 *again = true;
1277 }
1278 }
1279
1280 /* Look for any global functions in this section which
1281 need insns deleted from their prologues. */
1282 esym = extsyms + symtab_hdr->sh_info;
1283 esymend = extsyms + (symtab_hdr->sh_size
1284 / sizeof (Elf32_External_Sym));
1285 for (idx = 0; esym < esymend; esym++, idx++)
1286 {
1287 Elf_Internal_Sym isym;
1288 struct elf32_mn10300_link_hash_entry *sym_hash;
1289
1290 bfd_elf32_swap_symbol_in (input_bfd, esym, &isym);
1291 sym_hash = (struct elf32_mn10300_link_hash_entry *)
1292 (elf_sym_hashes (input_bfd)[idx]);
1293 if (isym.st_shndx == shndx
1294 && (sym_hash)->root.root.u.def.section == section
1295 && ! ((sym_hash)->flags & MN10300_CONVERT_CALL_TO_CALLS)
1296 && ! ((sym_hash)->flags & MN10300_DELETED_PROLOGUE_BYTES))
1297 {
1298 int bytes = 0;
1299
1300 /* Note that we've changed things. */
1301 elf_section_data (section)->relocs = internal_relocs;
1302 free_relocs = NULL;
1303
1304 elf_section_data (section)->this_hdr.contents = contents;
1305 free_contents = NULL;
1306
1307 symtab_hdr->contents = (bfd_byte *)extsyms;
1308 free_extsyms = NULL;
1309
1310 /* Count how many bytes we're going to delete. */
1311 if (sym_hash->movm_args)
1312 bytes += 2;
1313
1314 if (sym_hash->stack_size && sym_hash->stack_size <= 128)
1315 bytes += 3;
1316 else if (sym_hash->stack_size
1317 && sym_hash->stack_size < 256)
1318 bytes += 4;
1319
1320 /* Note that we've deleted prologue bytes for this
1321 function. */
1322 sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
1323
1324 /* Actually delete the bytes. */
1325 if (!mn10300_elf_relax_delete_bytes (input_bfd,
1326 section,
1327 (sym_hash)->root.root.u.def.value,
1328 bytes))
1329 goto error_return;
1330
1331 /* Something changed. Not strictly necessary, but
1332 may lead to more relaxing opportunities. */
1333 *again = true;
1334 }
1335 }
1336
1337 /* Cache or free any memory we allocated for the relocs. */
1338 if (free_relocs != NULL)
1339 {
1340 free (free_relocs);
1341 free_relocs = NULL;
1342 }
1343
1344 /* Cache or free any memory we allocated for the contents. */
1345 if (free_contents != NULL)
1346 {
1347 if (! link_info->keep_memory)
1348 free (free_contents);
1349 else
1350 {
1351 /* Cache the section contents for elf_link_input_bfd. */
1352 elf_section_data (section)->this_hdr.contents = contents;
1353 }
1354 free_contents = NULL;
1355 }
1356 }
1357
1358 /* Cache or free any memory we allocated for the symbols. */
1359 if (free_extsyms != NULL)
1360 {
1361 if (! link_info->keep_memory)
1362 free (free_extsyms);
1363 else
1364 {
1365 /* Cache the symbols for elf_link_input_bfd. */
1366 symtab_hdr->contents = extsyms;
1367 }
1368 free_extsyms = NULL;
1369 }
1370 }
1371 }
1372
1373
1374 /* (Re)initialize for the basic instruction shortening/relaxing pass. */
1375 contents = NULL;
1376 extsyms = NULL;
1377 internal_relocs = NULL;
1378 free_relocs = NULL;
1379 free_contents = NULL;
1380 free_extsyms = NULL;
1381
1382 /* We don't have to do anything for a relocateable link, if
1383 this section does not have relocs, or if this is not a
1384 code section. */
1385 if (link_info->relocateable
1386 || (sec->flags & SEC_RELOC) == 0
1387 || sec->reloc_count == 0
1388 || (sec->flags & SEC_CODE) == 0)
1389 return true;
1390
1391 /* If this is the first time we have been called for this section,
1392 initialize the cooked size. */
1393 if (sec->_cooked_size == 0)
1394 sec->_cooked_size = sec->_raw_size;
1395
1396 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1397
1398 /* Get a copy of the native relocations. */
1399 internal_relocs = (_bfd_elf32_link_read_relocs
1400 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1401 link_info->keep_memory));
1402 if (internal_relocs == NULL)
1403 goto error_return;
1404 if (! link_info->keep_memory)
1405 free_relocs = internal_relocs;
1406
1407 /* Walk through them looking for relaxing opportunities. */
1408 irelend = internal_relocs + sec->reloc_count;
1409 for (irel = internal_relocs; irel < irelend; irel++)
1410 {
1411 bfd_vma symval;
1412 struct elf32_mn10300_link_hash_entry *h = NULL;
1413
1414 /* If this isn't something that can be relaxed, then ignore
1415 this reloc. */
1416 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_NONE
1417 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_8
1418 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_MAX)
1419 continue;
1420
1421 /* Get the section contents if we haven't done so already. */
1422 if (contents == NULL)
1423 {
1424 /* Get cached copy if it exists. */
1425 if (elf_section_data (sec)->this_hdr.contents != NULL)
1426 contents = elf_section_data (sec)->this_hdr.contents;
1427 else
1428 {
1429 /* Go get them off disk. */
1430 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1431 if (contents == NULL)
1432 goto error_return;
1433 free_contents = contents;
1434
1435 if (! bfd_get_section_contents (abfd, sec, contents,
1436 (file_ptr) 0, sec->_raw_size))
1437 goto error_return;
1438 }
1439 }
1440
1441 /* Read this BFD's symbols if we haven't done so already. */
1442 if (extsyms == NULL)
1443 {
1444 /* Get cached copy if it exists. */
1445 if (symtab_hdr->contents != NULL)
1446 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1447 else
1448 {
1449 /* Go get them off disk. */
1450 extsyms = ((Elf32_External_Sym *)
1451 bfd_malloc (symtab_hdr->sh_size));
1452 if (extsyms == NULL)
1453 goto error_return;
1454 free_extsyms = extsyms;
1455 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1456 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
1457 != symtab_hdr->sh_size))
1458 goto error_return;
1459 }
1460 }
1461
1462 /* Get the value of the symbol referred to by the reloc. */
1463 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1464 {
1465 Elf_Internal_Sym isym;
1466 asection *sym_sec = NULL;
1467 const char *sym_name;
1468 char *new_name;
1469
1470 /* A local symbol. */
1471 bfd_elf32_swap_symbol_in (abfd,
1472 extsyms + ELF32_R_SYM (irel->r_info),
1473 &isym);
1474
1475 if (isym.st_shndx == SHN_UNDEF)
1476 sym_sec = bfd_und_section_ptr;
1477 else if (isym.st_shndx > 0 && isym.st_shndx < SHN_LORESERVE)
1478 sym_sec = bfd_section_from_elf_index (abfd, isym.st_shndx);
1479 else if (isym.st_shndx == SHN_ABS)
1480 sym_sec = bfd_abs_section_ptr;
1481 else if (isym.st_shndx == SHN_COMMON)
1482 sym_sec = bfd_com_section_ptr;
1483 else
1484 abort ();
1485
1486 symval = (isym.st_value
1487 + sym_sec->output_section->vma
1488 + sym_sec->output_offset);
1489 sym_name = bfd_elf_string_from_elf_section (abfd,
1490 symtab_hdr->sh_link,
1491 isym.st_name);
1492
1493 /* Tack on an ID so we can uniquely identify this
1494 local symbol in the global hash table. */
1495 new_name = bfd_malloc (strlen (sym_name) + 10);
1496 if (new_name == 0)
1497 goto error_return;
1498 sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
1499 sym_name = new_name;
1500
1501 h = (struct elf32_mn10300_link_hash_entry *)
1502 elf_link_hash_lookup (&hash_table->static_hash_table->root,
1503 sym_name, false, false, false);
1504 free (new_name);
1505 }
1506 else
1507 {
1508 unsigned long indx;
1509
1510 /* An external symbol. */
1511 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1512 h = (struct elf32_mn10300_link_hash_entry *)
1513 (elf_sym_hashes (abfd)[indx]);
1514 BFD_ASSERT (h != NULL);
1515 if (h->root.root.type != bfd_link_hash_defined
1516 && h->root.root.type != bfd_link_hash_defweak)
1517 {
1518 /* This appears to be a reference to an undefined
1519 symbol. Just ignore it--it will be caught by the
1520 regular reloc processing. */
1521 continue;
1522 }
1523
1524 symval = (h->root.root.u.def.value
1525 + h->root.root.u.def.section->output_section->vma
1526 + h->root.root.u.def.section->output_offset);
1527 }
1528
1529 /* For simplicity of coding, we are going to modify the section
1530 contents, the section relocs, and the BFD symbol table. We
1531 must tell the rest of the code not to free up this
1532 information. It would be possible to instead create a table
1533 of changes which have to be made, as is done in coff-mips.c;
1534 that would be more work, but would require less memory when
1535 the linker is run. */
1536
1537 /* Try to turn a 32bit pc-relative branch/call into a 16bit pc-relative
1538 branch/call, also deal with "call" -> "calls" conversions and
1539 insertion of prologue data into "call" instructions. */
1540 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL32)
1541 {
1542 bfd_vma value = symval;
1543
1544 /* If we've got a "call" instruction that needs to be turned
1545 into a "calls" instruction, do so now. It saves a byte. */
1546 if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
1547 {
1548 unsigned char code;
1549
1550 /* Get the opcode. */
1551 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1552
1553 /* Make sure we're working with a "call" instruction! */
1554 if (code == 0xdd)
1555 {
1556 /* Note that we've changed the relocs, section contents,
1557 etc. */
1558 elf_section_data (sec)->relocs = internal_relocs;
1559 free_relocs = NULL;
1560
1561 elf_section_data (sec)->this_hdr.contents = contents;
1562 free_contents = NULL;
1563
1564 symtab_hdr->contents = (bfd_byte *) extsyms;
1565 free_extsyms = NULL;
1566
1567 /* Fix the opcode. */
1568 bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 1);
1569 bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
1570
1571 /* Fix irel->r_offset and irel->r_addend. */
1572 irel->r_offset += 1;
1573 irel->r_addend += 1;
1574
1575 /* Delete one byte of data. */
1576 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1577 irel->r_offset + 3, 1))
1578 goto error_return;
1579
1580 /* That will change things, so, we should relax again.
1581 Note that this is not required, and it may be slow. */
1582 *again = true;
1583 }
1584 }
1585 else if (h)
1586 {
1587 /* We've got a "call" instruction which needs some data
1588 from target function filled in. */
1589 unsigned char code;
1590
1591 /* Get the opcode. */
1592 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1593
1594 /* Insert data from the target function into the "call"
1595 instruction if needed. */
1596 if (code == 0xdd)
1597 {
1598 bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 4);
1599 bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
1600 contents + irel->r_offset + 5);
1601 }
1602 }
1603
1604 /* Deal with pc-relative gunk. */
1605 value -= (sec->output_section->vma + sec->output_offset);
1606 value -= irel->r_offset;
1607 value += irel->r_addend;
1608
1609 /* See if the value will fit in 16 bits, note the high value is
1610 0x7fff + 2 as the target will be two bytes closer if we are
1611 able to relax. */
1612 if ((long)value < 0x8001 && (long)value > -0x8000)
1613 {
1614 unsigned char code;
1615
1616 /* Get the opcode. */
1617 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1618
1619 if (code != 0xdc && code != 0xdd && code != 0xff)
1620 continue;
1621
1622 /* Note that we've changed the relocs, section contents, etc. */
1623 elf_section_data (sec)->relocs = internal_relocs;
1624 free_relocs = NULL;
1625
1626 elf_section_data (sec)->this_hdr.contents = contents;
1627 free_contents = NULL;
1628
1629 symtab_hdr->contents = (bfd_byte *) extsyms;
1630 free_extsyms = NULL;
1631
1632 /* Fix the opcode. */
1633 if (code == 0xdc)
1634 bfd_put_8 (abfd, 0xcc, contents + irel->r_offset - 1);
1635 else if (code == 0xdd)
1636 bfd_put_8 (abfd, 0xcd, contents + irel->r_offset - 1);
1637 else if (code == 0xff)
1638 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
1639
1640 /* Fix the relocation's type. */
1641 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1642 R_MN10300_PCREL16);
1643
1644 /* Delete two bytes of data. */
1645 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1646 irel->r_offset + 1, 2))
1647 goto error_return;
1648
1649 /* That will change things, so, we should relax again.
1650 Note that this is not required, and it may be slow. */
1651 *again = true;
1652 }
1653 }
1654
1655 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
1656 branch. */
1657 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL16)
1658 {
1659 bfd_vma value = symval;
1660
1661 /* If we've got a "call" instruction that needs to be turned
1662 into a "calls" instruction, do so now. It saves a byte. */
1663 if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
1664 {
1665 unsigned char code;
1666
1667 /* Get the opcode. */
1668 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1669
1670 /* Make sure we're working with a "call" instruction! */
1671 if (code == 0xcd)
1672 {
1673 /* Note that we've changed the relocs, section contents,
1674 etc. */
1675 elf_section_data (sec)->relocs = internal_relocs;
1676 free_relocs = NULL;
1677
1678 elf_section_data (sec)->this_hdr.contents = contents;
1679 free_contents = NULL;
1680
1681 symtab_hdr->contents = (bfd_byte *) extsyms;
1682 free_extsyms = NULL;
1683
1684 /* Fix the opcode. */
1685 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 1);
1686 bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
1687
1688 /* Fix irel->r_offset and irel->r_addend. */
1689 irel->r_offset += 1;
1690 irel->r_addend += 1;
1691
1692 /* Delete one byte of data. */
1693 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1694 irel->r_offset + 1, 1))
1695 goto error_return;
1696
1697 /* That will change things, so, we should relax again.
1698 Note that this is not required, and it may be slow. */
1699 *again = true;
1700 }
1701 }
1702 else if (h)
1703 {
1704 unsigned char code;
1705
1706 /* Get the opcode. */
1707 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1708
1709 /* Insert data from the target function into the "call"
1710 instruction if needed. */
1711 if (code == 0xcd)
1712 {
1713 bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 2);
1714 bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
1715 contents + irel->r_offset + 3);
1716 }
1717 }
1718
1719 /* Deal with pc-relative gunk. */
1720 value -= (sec->output_section->vma + sec->output_offset);
1721 value -= irel->r_offset;
1722 value += irel->r_addend;
1723
1724 /* See if the value will fit in 8 bits, note the high value is
1725 0x7f + 1 as the target will be one bytes closer if we are
1726 able to relax. */
1727 if ((long)value < 0x80 && (long)value > -0x80)
1728 {
1729 unsigned char code;
1730
1731 /* Get the opcode. */
1732 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1733
1734 if (code != 0xcc)
1735 continue;
1736
1737 /* Note that we've changed the relocs, section contents, etc. */
1738 elf_section_data (sec)->relocs = internal_relocs;
1739 free_relocs = NULL;
1740
1741 elf_section_data (sec)->this_hdr.contents = contents;
1742 free_contents = NULL;
1743
1744 symtab_hdr->contents = (bfd_byte *) extsyms;
1745 free_extsyms = NULL;
1746
1747 /* Fix the opcode. */
1748 bfd_put_8 (abfd, 0xca, contents + irel->r_offset - 1);
1749
1750 /* Fix the relocation's type. */
1751 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1752 R_MN10300_PCREL8);
1753
1754 /* Delete one byte of data. */
1755 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1756 irel->r_offset + 1, 1))
1757 goto error_return;
1758
1759 /* That will change things, so, we should relax again.
1760 Note that this is not required, and it may be slow. */
1761 *again = true;
1762 }
1763 }
1764
1765 /* Try to eliminate an unconditional 8 bit pc-relative branch
1766 which immediately follows a conditional 8 bit pc-relative
1767 branch around the unconditional branch.
1768
1769 original: new:
1770 bCC lab1 bCC' lab2
1771 bra lab2
1772 lab1: lab1:
1773
1774
1775 This happens when the bCC can't reach lab2 at assembly time,
1776 but due to other relaxations it can reach at link time. */
1777 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL8)
1778 {
1779 Elf_Internal_Rela *nrel;
1780 bfd_vma value = symval;
1781 unsigned char code;
1782
1783 /* Deal with pc-relative gunk. */
1784 value -= (sec->output_section->vma + sec->output_offset);
1785 value -= irel->r_offset;
1786 value += irel->r_addend;
1787
1788 /* Do nothing if this reloc is the last byte in the section. */
1789 if (irel->r_offset == sec->_cooked_size)
1790 continue;
1791
1792 /* See if the next instruction is an unconditional pc-relative
1793 branch, more often than not this test will fail, so we
1794 test it first to speed things up. */
1795 code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
1796 if (code != 0xca)
1797 continue;
1798
1799 /* Also make sure the next relocation applies to the next
1800 instruction and that it's a pc-relative 8 bit branch. */
1801 nrel = irel + 1;
1802 if (nrel == irelend
1803 || irel->r_offset + 2 != nrel->r_offset
1804 || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10300_PCREL8)
1805 continue;
1806
1807 /* Make sure our destination immediately follows the
1808 unconditional branch. */
1809 if (symval != (sec->output_section->vma + sec->output_offset
1810 + irel->r_offset + 3))
1811 continue;
1812
1813 /* Now make sure we are a conditional branch. This may not
1814 be necessary, but why take the chance.
1815
1816 Note these checks assume that R_MN10300_PCREL8 relocs
1817 only occur on bCC and bCCx insns. If they occured
1818 elsewhere, we'd need to know the start of this insn
1819 for this check to be accurate. */
1820 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1821 if (code != 0xc0 && code != 0xc1 && code != 0xc2
1822 && code != 0xc3 && code != 0xc4 && code != 0xc5
1823 && code != 0xc6 && code != 0xc7 && code != 0xc8
1824 && code != 0xc9 && code != 0xe8 && code != 0xe9
1825 && code != 0xea && code != 0xeb)
1826 continue;
1827
1828 /* We also have to be sure there is no symbol/label
1829 at the unconditional branch. */
1830 if (mn10300_elf_symbol_address_p (abfd, sec, extsyms,
1831 irel->r_offset + 1))
1832 continue;
1833
1834 /* Note that we've changed the relocs, section contents, etc. */
1835 elf_section_data (sec)->relocs = internal_relocs;
1836 free_relocs = NULL;
1837
1838 elf_section_data (sec)->this_hdr.contents = contents;
1839 free_contents = NULL;
1840
1841 symtab_hdr->contents = (bfd_byte *) extsyms;
1842 free_extsyms = NULL;
1843
1844 /* Reverse the condition of the first branch. */
1845 switch (code)
1846 {
1847 case 0xc8:
1848 code = 0xc9;
1849 break;
1850 case 0xc9:
1851 code = 0xc8;
1852 break;
1853 case 0xc0:
1854 code = 0xc2;
1855 break;
1856 case 0xc2:
1857 code = 0xc0;
1858 break;
1859 case 0xc3:
1860 code = 0xc1;
1861 break;
1862 case 0xc1:
1863 code = 0xc3;
1864 break;
1865 case 0xc4:
1866 code = 0xc6;
1867 break;
1868 case 0xc6:
1869 code = 0xc4;
1870 break;
1871 case 0xc7:
1872 code = 0xc5;
1873 break;
1874 case 0xc5:
1875 code = 0xc7;
1876 break;
1877 case 0xe8:
1878 code = 0xe9;
1879 break;
1880 case 0x9d:
1881 code = 0xe8;
1882 break;
1883 case 0xea:
1884 code = 0xeb;
1885 break;
1886 case 0xeb:
1887 code = 0xea;
1888 break;
1889 }
1890 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1891
1892 /* Set the reloc type and symbol for the first branch
1893 from the second branch. */
1894 irel->r_info = nrel->r_info;
1895
1896 /* Make the reloc for the second branch a null reloc. */
1897 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1898 R_MN10300_NONE);
1899
1900 /* Delete two bytes of data. */
1901 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1902 irel->r_offset + 1, 2))
1903 goto error_return;
1904
1905 /* That will change things, so, we should relax again.
1906 Note that this is not required, and it may be slow. */
1907 *again = true;
1908 }
1909
1910 /* Try to turn a 24 immediate, displacement or absolute address
1911 into a 8 immediate, displacement or absolute address. */
1912 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_24)
1913 {
1914 bfd_vma value = symval;
1915 value += irel->r_addend;
1916
1917 /* See if the value will fit in 8 bits. */
1918 if ((long)value < 0x7f && (long)value > -0x80)
1919 {
1920 unsigned char code;
1921
1922 /* AM33 insns which have 24 operands are 6 bytes long and
1923 will have 0xfd as the first byte. */
1924
1925 /* Get the first opcode. */
1926 code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
1927
1928 if (code == 0xfd)
1929 {
1930 /* Get the second opcode. */
1931 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1932
1933 /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
1934 equivalent instructions exists. */
1935 if (code != 0x6b && code != 0x7b
1936 && code != 0x8b && code != 0x9b
1937 && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
1938 || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
1939 || (code & 0x0f) == 0x0e))
1940 {
1941 /* Not safe if the high bit is on as relaxing may
1942 move the value out of high mem and thus not fit
1943 in a signed 8bit value. This is currently over
1944 conservative. */
1945 if ((value & 0x80) == 0)
1946 {
1947 /* Note that we've changed the relocation contents,
1948 etc. */
1949 elf_section_data (sec)->relocs = internal_relocs;
1950 free_relocs = NULL;
1951
1952 elf_section_data (sec)->this_hdr.contents = contents;
1953 free_contents = NULL;
1954
1955 symtab_hdr->contents = (bfd_byte *) extsyms;
1956 free_extsyms = NULL;
1957
1958 /* Fix the opcode. */
1959 bfd_put_8 (abfd, 0xfb, contents + irel->r_offset - 3);
1960 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
1961
1962 /* Fix the relocation's type. */
1963 irel->r_info
1964 = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1965 R_MN10300_8);
1966
1967 /* Delete two bytes of data. */
1968 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
1969 irel->r_offset + 1, 2))
1970 goto error_return;
1971
1972 /* That will change things, so, we should relax
1973 again. Note that this is not required, and it
1974 may be slow. */
1975 *again = true;
1976 break;
1977 }
1978 }
1979
1980 }
1981 }
1982 }
1983
1984 /* Try to turn a 32bit immediate, displacement or absolute address
1985 into a 16bit immediate, displacement or absolute address. */
1986 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_32)
1987 {
1988 bfd_vma value = symval;
1989 value += irel->r_addend;
1990
1991 /* See if the value will fit in 24 bits.
1992 We allow any 16bit match here. We prune those we can't
1993 handle below. */
1994 if ((long)value < 0x7fffff && (long)value > -0x800000)
1995 {
1996 unsigned char code;
1997
1998 /* AM33 insns which have 32bit operands are 7 bytes long and
1999 will have 0xfe as the first byte. */
2000
2001 /* Get the first opcode. */
2002 code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
2003
2004 if (code == 0xfe)
2005 {
2006 /* Get the second opcode. */
2007 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
2008
2009 /* All the am33 32 -> 24 relaxing possibilities. */
2010 /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
2011 equivalent instructions exists. */
2012 if (code != 0x6b && code != 0x7b
2013 && code != 0x8b && code != 0x9b
2014 && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
2015 || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
2016 || (code & 0x0f) == 0x0e))
2017 {
2018 /* Not safe if the high bit is on as relaxing may
2019 move the value out of high mem and thus not fit
2020 in a signed 16bit value. This is currently over
2021 conservative. */
2022 if ((value & 0x8000) == 0)
2023 {
2024 /* Note that we've changed the relocation contents,
2025 etc. */
2026 elf_section_data (sec)->relocs = internal_relocs;
2027 free_relocs = NULL;
2028
2029 elf_section_data (sec)->this_hdr.contents = contents;
2030 free_contents = NULL;
2031
2032 symtab_hdr->contents = (bfd_byte *) extsyms;
2033 free_extsyms = NULL;
2034
2035 /* Fix the opcode. */
2036 bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 3);
2037 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
2038
2039 /* Fix the relocation's type. */
2040 irel->r_info
2041 = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2042 R_MN10300_24);
2043
2044 /* Delete one byte of data. */
2045 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2046 irel->r_offset + 3, 1))
2047 goto error_return;
2048
2049 /* That will change things, so, we should relax
2050 again. Note that this is not required, and it
2051 may be slow. */
2052 *again = true;
2053 break;
2054 }
2055 }
2056
2057 }
2058 }
2059
2060 /* See if the value will fit in 16 bits.
2061 We allow any 16bit match here. We prune those we can't
2062 handle below. */
2063 if ((long)value < 0x7fff && (long)value > -0x8000)
2064 {
2065 unsigned char code;
2066
2067 /* Most insns which have 32bit operands are 6 bytes long;
2068 exceptions are pcrel insns and bit insns.
2069
2070 We handle pcrel insns above. We don't bother trying
2071 to handle the bit insns here.
2072
2073 The first byte of the remaining insns will be 0xfc. */
2074
2075 /* Get the first opcode. */
2076 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
2077
2078 if (code != 0xfc)
2079 continue;
2080
2081 /* Get the second opcode. */
2082 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
2083
2084 if ((code & 0xf0) < 0x80)
2085 switch (code & 0xf0)
2086 {
2087 /* mov (d32,am),dn -> mov (d32,am),dn
2088 mov dm,(d32,am) -> mov dn,(d32,am)
2089 mov (d32,am),an -> mov (d32,am),an
2090 mov dm,(d32,am) -> mov dn,(d32,am)
2091 movbu (d32,am),dn -> movbu (d32,am),dn
2092 movbu dm,(d32,am) -> movbu dn,(d32,am)
2093 movhu (d32,am),dn -> movhu (d32,am),dn
2094 movhu dm,(d32,am) -> movhu dn,(d32,am) */
2095 case 0x00:
2096 case 0x10:
2097 case 0x20:
2098 case 0x30:
2099 case 0x40:
2100 case 0x50:
2101 case 0x60:
2102 case 0x70:
2103 /* Not safe if the high bit is on as relaxing may
2104 move the value out of high mem and thus not fit
2105 in a signed 16bit value. */
2106 if (code == 0xcc
2107 && (value & 0x8000))
2108 continue;
2109
2110 /* Note that we've changed the relocation contents, etc. */
2111 elf_section_data (sec)->relocs = internal_relocs;
2112 free_relocs = NULL;
2113
2114 elf_section_data (sec)->this_hdr.contents = contents;
2115 free_contents = NULL;
2116
2117 symtab_hdr->contents = (bfd_byte *) extsyms;
2118 free_extsyms = NULL;
2119
2120 /* Fix the opcode. */
2121 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2122 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
2123
2124 /* Fix the relocation's type. */
2125 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2126 R_MN10300_16);
2127
2128 /* Delete two bytes of data. */
2129 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2130 irel->r_offset + 2, 2))
2131 goto error_return;
2132
2133 /* That will change things, so, we should relax again.
2134 Note that this is not required, and it may be slow. */
2135 *again = true;
2136 break;
2137 }
2138 else if ((code & 0xf0) == 0x80
2139 || (code & 0xf0) == 0x90)
2140 switch (code & 0xf3)
2141 {
2142 /* mov dn,(abs32) -> mov dn,(abs16)
2143 movbu dn,(abs32) -> movbu dn,(abs16)
2144 movhu dn,(abs32) -> movhu dn,(abs16) */
2145 case 0x81:
2146 case 0x82:
2147 case 0x83:
2148 /* Note that we've changed the relocation contents, etc. */
2149 elf_section_data (sec)->relocs = internal_relocs;
2150 free_relocs = NULL;
2151
2152 elf_section_data (sec)->this_hdr.contents = contents;
2153 free_contents = NULL;
2154
2155 symtab_hdr->contents = (bfd_byte *) extsyms;
2156 free_extsyms = NULL;
2157
2158 if ((code & 0xf3) == 0x81)
2159 code = 0x01 + (code & 0x0c);
2160 else if ((code & 0xf3) == 0x82)
2161 code = 0x02 + (code & 0x0c);
2162 else if ((code & 0xf3) == 0x83)
2163 code = 0x03 + (code & 0x0c);
2164 else
2165 abort ();
2166
2167 /* Fix the opcode. */
2168 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
2169
2170 /* Fix the relocation's type. */
2171 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2172 R_MN10300_16);
2173
2174 /* The opcode got shorter too, so we have to fix the
2175 addend and offset too! */
2176 irel->r_offset -= 1;
2177
2178 /* Delete three bytes of data. */
2179 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2180 irel->r_offset + 1, 3))
2181 goto error_return;
2182
2183 /* That will change things, so, we should relax again.
2184 Note that this is not required, and it may be slow. */
2185 *again = true;
2186 break;
2187
2188 /* mov am,(abs32) -> mov am,(abs16)
2189 mov am,(d32,sp) -> mov am,(d16,sp)
2190 mov dm,(d32,sp) -> mov dm,(d32,sp)
2191 movbu dm,(d32,sp) -> movbu dm,(d32,sp)
2192 movhu dm,(d32,sp) -> movhu dm,(d32,sp) */
2193 case 0x80:
2194 case 0x90:
2195 case 0x91:
2196 case 0x92:
2197 case 0x93:
2198 /* Note that we've changed the relocation contents, etc. */
2199 elf_section_data (sec)->relocs = internal_relocs;
2200 free_relocs = NULL;
2201
2202 elf_section_data (sec)->this_hdr.contents = contents;
2203 free_contents = NULL;
2204
2205 symtab_hdr->contents = (bfd_byte *) extsyms;
2206 free_extsyms = NULL;
2207
2208 /* Fix the opcode. */
2209 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2210 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
2211
2212 /* Fix the relocation's type. */
2213 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2214 R_MN10300_16);
2215
2216 /* Delete two bytes of data. */
2217 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2218 irel->r_offset + 2, 2))
2219 goto error_return;
2220
2221 /* That will change things, so, we should relax again.
2222 Note that this is not required, and it may be slow. */
2223 *again = true;
2224 break;
2225 }
2226 else if ((code & 0xf0) < 0xf0)
2227 switch (code & 0xfc)
2228 {
2229 /* mov imm32,dn -> mov imm16,dn
2230 mov imm32,an -> mov imm16,an
2231 mov (abs32),dn -> mov (abs16),dn
2232 movbu (abs32),dn -> movbu (abs16),dn
2233 movhu (abs32),dn -> movhu (abs16),dn */
2234 case 0xcc:
2235 case 0xdc:
2236 case 0xa4:
2237 case 0xa8:
2238 case 0xac:
2239 /* Not safe if the high bit is on as relaxing may
2240 move the value out of high mem and thus not fit
2241 in a signed 16bit value. */
2242 if (code == 0xcc
2243 && (value & 0x8000))
2244 continue;
2245
2246 /* Note that we've changed the relocation contents, etc. */
2247 elf_section_data (sec)->relocs = internal_relocs;
2248 free_relocs = NULL;
2249
2250 elf_section_data (sec)->this_hdr.contents = contents;
2251 free_contents = NULL;
2252
2253 symtab_hdr->contents = (bfd_byte *) extsyms;
2254 free_extsyms = NULL;
2255
2256 if ((code & 0xfc) == 0xcc)
2257 code = 0x2c + (code & 0x03);
2258 else if ((code & 0xfc) == 0xdc)
2259 code = 0x24 + (code & 0x03);
2260 else if ((code & 0xfc) == 0xa4)
2261 code = 0x30 + (code & 0x03);
2262 else if ((code & 0xfc) == 0xa8)
2263 code = 0x34 + (code & 0x03);
2264 else if ((code & 0xfc) == 0xac)
2265 code = 0x38 + (code & 0x03);
2266 else
2267 abort ();
2268
2269 /* Fix the opcode. */
2270 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
2271
2272 /* Fix the relocation's type. */
2273 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2274 R_MN10300_16);
2275
2276 /* The opcode got shorter too, so we have to fix the
2277 addend and offset too! */
2278 irel->r_offset -= 1;
2279
2280 /* Delete three bytes of data. */
2281 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2282 irel->r_offset + 1, 3))
2283 goto error_return;
2284
2285 /* That will change things, so, we should relax again.
2286 Note that this is not required, and it may be slow. */
2287 *again = true;
2288 break;
2289
2290 /* mov (abs32),an -> mov (abs16),an
2291 mov (d32,sp),an -> mov (d32,sp),an
2292 mov (d32,sp),dn -> mov (d32,sp),dn
2293 movbu (d32,sp),dn -> movbu (d32,sp),dn
2294 movhu (d32,sp),dn -> movhu (d32,sp),dn
2295 add imm32,dn -> add imm16,dn
2296 cmp imm32,dn -> cmp imm16,dn
2297 add imm32,an -> add imm16,an
2298 cmp imm32,an -> cmp imm16,an
2299 and imm32,dn -> and imm32,dn
2300 or imm32,dn -> or imm32,dn
2301 xor imm32,dn -> xor imm32,dn
2302 btst imm32,dn -> btst imm32,dn */
2303
2304 case 0xa0:
2305 case 0xb0:
2306 case 0xb1:
2307 case 0xb2:
2308 case 0xb3:
2309 case 0xc0:
2310 case 0xc8:
2311
2312 case 0xd0:
2313 case 0xd8:
2314 case 0xe0:
2315 case 0xe1:
2316 case 0xe2:
2317 case 0xe3:
2318 /* Note that we've changed the relocation contents, etc. */
2319 elf_section_data (sec)->relocs = internal_relocs;
2320 free_relocs = NULL;
2321
2322 elf_section_data (sec)->this_hdr.contents = contents;
2323 free_contents = NULL;
2324
2325 symtab_hdr->contents = (bfd_byte *) extsyms;
2326 free_extsyms = NULL;
2327
2328 /* Fix the opcode. */
2329 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2330 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
2331
2332 /* Fix the relocation's type. */
2333 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2334 R_MN10300_16);
2335
2336 /* Delete two bytes of data. */
2337 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2338 irel->r_offset + 2, 2))
2339 goto error_return;
2340
2341 /* That will change things, so, we should relax again.
2342 Note that this is not required, and it may be slow. */
2343 *again = true;
2344 break;
2345 }
2346 else if (code == 0xfe)
2347 {
2348 /* add imm32,sp -> add imm16,sp */
2349
2350 /* Note that we've changed the relocation contents, etc. */
2351 elf_section_data (sec)->relocs = internal_relocs;
2352 free_relocs = NULL;
2353
2354 elf_section_data (sec)->this_hdr.contents = contents;
2355 free_contents = NULL;
2356
2357 symtab_hdr->contents = (bfd_byte *) extsyms;
2358 free_extsyms = NULL;
2359
2360 /* Fix the opcode. */
2361 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2362 bfd_put_8 (abfd, 0xfe, contents + irel->r_offset - 1);
2363
2364 /* Fix the relocation's type. */
2365 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2366 R_MN10300_16);
2367
2368 /* Delete two bytes of data. */
2369 if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2370 irel->r_offset + 2, 2))
2371 goto error_return;
2372
2373 /* That will change things, so, we should relax again.
2374 Note that this is not required, and it may be slow. */
2375 *again = true;
2376 break;
2377 }
2378 }
2379 }
2380 }
2381
2382 if (free_relocs != NULL)
2383 {
2384 free (free_relocs);
2385 free_relocs = NULL;
2386 }
2387
2388 if (free_contents != NULL)
2389 {
2390 if (! link_info->keep_memory)
2391 free (free_contents);
2392 else
2393 {
2394 /* Cache the section contents for elf_link_input_bfd. */
2395 elf_section_data (sec)->this_hdr.contents = contents;
2396 }
2397 free_contents = NULL;
2398 }
2399
2400 if (free_extsyms != NULL)
2401 {
2402 if (! link_info->keep_memory)
2403 free (free_extsyms);
2404 else
2405 {
2406 /* Cache the symbols for elf_link_input_bfd. */
2407 symtab_hdr->contents = extsyms;
2408 }
2409 free_extsyms = NULL;
2410 }
2411
2412 return true;
2413
2414 error_return:
2415 if (free_relocs != NULL)
2416 free (free_relocs);
2417 if (free_contents != NULL)
2418 free (free_contents);
2419 if (free_extsyms != NULL)
2420 free (free_extsyms);
2421 return false;
2422 }
2423
2424 /* Compute the stack size and movm arguments for the function
2425 referred to by HASH at address ADDR in section with
2426 contents CONTENTS, store the information in the hash table. */
2427 static void
2428 compute_function_info (abfd, hash, addr, contents)
2429 bfd *abfd;
2430 struct elf32_mn10300_link_hash_entry *hash;
2431 bfd_vma addr;
2432 unsigned char *contents;
2433 {
2434 unsigned char byte1, byte2;
2435 /* We only care about a very small subset of the possible prologue
2436 sequences here. Basically we look for:
2437
2438 movm [d2,d3,a2,a3],sp (optional)
2439 add <size>,sp (optional, and only for sizes which fit in an unsigned
2440 8 bit number)
2441
2442 If we find anything else, we quit. */
2443
2444 /* Look for movm [regs],sp */
2445 byte1 = bfd_get_8 (abfd, contents + addr);
2446 byte2 = bfd_get_8 (abfd, contents + addr + 1);
2447
2448 if (byte1 == 0xcf)
2449 {
2450 hash->movm_args = byte2;
2451 addr += 2;
2452 byte1 = bfd_get_8 (abfd, contents + addr);
2453 byte2 = bfd_get_8 (abfd, contents + addr + 1);
2454 }
2455
2456 /* Now figure out how much stack space will be allocated by the movm
2457 instruction. We need this kept separate from the funtion's normal
2458 stack space. */
2459 if (hash->movm_args)
2460 {
2461 /* Space for d2. */
2462 if (hash->movm_args & 0x80)
2463 hash->movm_stack_size += 4;
2464
2465 /* Space for d3. */
2466 if (hash->movm_args & 0x40)
2467 hash->movm_stack_size += 4;
2468
2469 /* Space for a2. */
2470 if (hash->movm_args & 0x20)
2471 hash->movm_stack_size += 4;
2472
2473 /* Space for a3. */
2474 if (hash->movm_args & 0x10)
2475 hash->movm_stack_size += 4;
2476
2477 /* "other" space. d0, d1, a0, a1, mdr, lir, lar, 4 byte pad. */
2478 if (hash->movm_args & 0x08)
2479 hash->movm_stack_size += 8 * 4;
2480
2481 if (bfd_get_mach (abfd) == bfd_mach_am33)
2482 {
2483 /* "exother" space. e0, e1, mdrq, mcrh, mcrl, mcvf */
2484 if (hash->movm_args & 0x1)
2485 hash->movm_stack_size += 6 * 4;
2486
2487 /* exreg1 space. e4, e5, e6, e7 */
2488 if (hash->movm_args & 0x2)
2489 hash->movm_stack_size += 4 * 4;
2490
2491 /* exreg0 space. e2, e3 */
2492 if (hash->movm_args & 0x4)
2493 hash->movm_stack_size += 2 * 4;
2494 }
2495 }
2496
2497 /* Now look for the two stack adjustment variants. */
2498 if (byte1 == 0xf8 && byte2 == 0xfe)
2499 {
2500 int temp = bfd_get_8 (abfd, contents + addr + 2);
2501 temp = ((temp & 0xff) ^ (~0x7f)) + 0x80;
2502
2503 hash->stack_size = -temp;
2504 }
2505 else if (byte1 == 0xfa && byte2 == 0xfe)
2506 {
2507 int temp = bfd_get_16 (abfd, contents + addr + 2);
2508 temp = ((temp & 0xffff) ^ (~0x7fff)) + 0x8000;
2509 temp = -temp;
2510
2511 if (temp < 255)
2512 hash->stack_size = temp;
2513 }
2514
2515 /* If the total stack to be allocated by the call instruction is more
2516 than 255 bytes, then we can't remove the stack adjustment by using
2517 "call" (we might still be able to remove the "movm" instruction. */
2518 if (hash->stack_size + hash->movm_stack_size > 255)
2519 hash->stack_size = 0;
2520
2521 return;
2522 }
2523
2524 /* Delete some bytes from a section while relaxing. */
2525
2526 static boolean
2527 mn10300_elf_relax_delete_bytes (abfd, sec, addr, count)
2528 bfd *abfd;
2529 asection *sec;
2530 bfd_vma addr;
2531 int count;
2532 {
2533 Elf_Internal_Shdr *symtab_hdr;
2534 Elf32_External_Sym *extsyms;
2535 int shndx, index;
2536 bfd_byte *contents;
2537 Elf_Internal_Rela *irel, *irelend;
2538 Elf_Internal_Rela *irelalign;
2539 bfd_vma toaddr;
2540 Elf32_External_Sym *esym, *esymend;
2541 struct elf32_mn10300_link_hash_entry *sym_hash;
2542
2543 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2544 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
2545
2546 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2547
2548 contents = elf_section_data (sec)->this_hdr.contents;
2549
2550 /* The deletion must stop at the next ALIGN reloc for an aligment
2551 power larger than the number of bytes we are deleting. */
2552
2553 irelalign = NULL;
2554 toaddr = sec->_cooked_size;
2555
2556 irel = elf_section_data (sec)->relocs;
2557 irelend = irel + sec->reloc_count;
2558
2559 /* Actually delete the bytes. */
2560 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
2561 sec->_cooked_size -= count;
2562
2563 /* Adjust all the relocs. */
2564 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
2565 {
2566 /* Get the new reloc address. */
2567 if ((irel->r_offset > addr
2568 && irel->r_offset < toaddr))
2569 irel->r_offset -= count;
2570 }
2571
2572 /* Adjust the local symbols defined in this section. */
2573 esym = extsyms;
2574 esymend = esym + symtab_hdr->sh_info;
2575 for (; esym < esymend; esym++)
2576 {
2577 Elf_Internal_Sym isym;
2578
2579 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
2580
2581 if (isym.st_shndx == shndx
2582 && isym.st_value > addr
2583 && isym.st_value < toaddr)
2584 {
2585 isym.st_value -= count;
2586 bfd_elf32_swap_symbol_out (abfd, &isym, esym);
2587 }
2588 }
2589
2590 /* Now adjust the global symbols defined in this section. */
2591 esym = extsyms + symtab_hdr->sh_info;
2592 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
2593 for (index = 0; esym < esymend; esym++, index++)
2594 {
2595 Elf_Internal_Sym isym;
2596
2597 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
2598 sym_hash = (struct elf32_mn10300_link_hash_entry *)
2599 (elf_sym_hashes (abfd)[index]);
2600 if (isym.st_shndx == shndx
2601 && ((sym_hash)->root.root.type == bfd_link_hash_defined
2602 || (sym_hash)->root.root.type == bfd_link_hash_defweak)
2603 && (sym_hash)->root.root.u.def.section == sec
2604 && (sym_hash)->root.root.u.def.value > addr
2605 && (sym_hash)->root.root.u.def.value < toaddr)
2606 {
2607 (sym_hash)->root.root.u.def.value -= count;
2608 }
2609 }
2610
2611 return true;
2612 }
2613
2614 /* Return true if a symbol exists at the given address, else return
2615 false. */
2616 static boolean
2617 mn10300_elf_symbol_address_p (abfd, sec, extsyms, addr)
2618 bfd *abfd;
2619 asection *sec;
2620 Elf32_External_Sym *extsyms;
2621 bfd_vma addr;
2622 {
2623 Elf_Internal_Shdr *symtab_hdr;
2624 int shndx;
2625 Elf32_External_Sym *esym, *esymend;
2626 struct elf32_mn10300_link_hash_entry **sym_hash, **sym_hash_end;
2627
2628 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2629 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2630
2631 /* Examine all the symbols. */
2632 esym = extsyms;
2633 esymend = esym + symtab_hdr->sh_info;
2634 for (; esym < esymend; esym++)
2635 {
2636 Elf_Internal_Sym isym;
2637
2638 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
2639
2640 if (isym.st_shndx == shndx
2641 && isym.st_value == addr)
2642 return true;
2643 }
2644
2645 sym_hash = (struct elf32_mn10300_link_hash_entry **)(elf_sym_hashes (abfd));
2646 sym_hash_end = (sym_hash
2647 + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2648 - symtab_hdr->sh_info));
2649 for (; sym_hash < sym_hash_end; sym_hash++)
2650 {
2651 if (((*sym_hash)->root.root.type == bfd_link_hash_defined
2652 || (*sym_hash)->root.root.type == bfd_link_hash_defweak)
2653 && (*sym_hash)->root.root.u.def.section == sec
2654 && (*sym_hash)->root.root.u.def.value == addr)
2655 return true;
2656 }
2657 return false;
2658 }
2659
2660 /* This is a version of bfd_generic_get_relocated_section_contents
2661 which uses mn10300_elf_relocate_section. */
2662
2663 static bfd_byte *
2664 mn10300_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
2665 data, relocateable, symbols)
2666 bfd *output_bfd;
2667 struct bfd_link_info *link_info;
2668 struct bfd_link_order *link_order;
2669 bfd_byte *data;
2670 boolean relocateable;
2671 asymbol **symbols;
2672 {
2673 Elf_Internal_Shdr *symtab_hdr;
2674 asection *input_section = link_order->u.indirect.section;
2675 bfd *input_bfd = input_section->owner;
2676 asection **sections = NULL;
2677 Elf_Internal_Rela *internal_relocs = NULL;
2678 Elf32_External_Sym *external_syms = NULL;
2679 Elf_Internal_Sym *internal_syms = NULL;
2680
2681 /* We only need to handle the case of relaxing, or of having a
2682 particular set of section contents, specially. */
2683 if (relocateable
2684 || elf_section_data (input_section)->this_hdr.contents == NULL)
2685 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2686 link_order, data,
2687 relocateable,
2688 symbols);
2689
2690 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2691
2692 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2693 input_section->_raw_size);
2694
2695 if ((input_section->flags & SEC_RELOC) != 0
2696 && input_section->reloc_count > 0)
2697 {
2698 Elf_Internal_Sym *isymp;
2699 asection **secpp;
2700 Elf32_External_Sym *esym, *esymend;
2701
2702 if (symtab_hdr->contents != NULL)
2703 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
2704 else
2705 {
2706 external_syms = ((Elf32_External_Sym *)
2707 bfd_malloc (symtab_hdr->sh_info
2708 * sizeof (Elf32_External_Sym)));
2709 if (external_syms == NULL && symtab_hdr->sh_info > 0)
2710 goto error_return;
2711 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
2712 || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
2713 symtab_hdr->sh_info, input_bfd)
2714 != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
2715 goto error_return;
2716 }
2717
2718 internal_relocs = (_bfd_elf32_link_read_relocs
2719 (input_bfd, input_section, (PTR) NULL,
2720 (Elf_Internal_Rela *) NULL, false));
2721 if (internal_relocs == NULL)
2722 goto error_return;
2723
2724 internal_syms = ((Elf_Internal_Sym *)
2725 bfd_malloc (symtab_hdr->sh_info
2726 * sizeof (Elf_Internal_Sym)));
2727 if (internal_syms == NULL && symtab_hdr->sh_info > 0)
2728 goto error_return;
2729
2730 sections = (asection **) bfd_malloc (symtab_hdr->sh_info
2731 * sizeof (asection *));
2732 if (sections == NULL && symtab_hdr->sh_info > 0)
2733 goto error_return;
2734
2735 isymp = internal_syms;
2736 secpp = sections;
2737 esym = external_syms;
2738 esymend = esym + symtab_hdr->sh_info;
2739 for (; esym < esymend; ++esym, ++isymp, ++secpp)
2740 {
2741 asection *isec;
2742
2743 bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
2744
2745 if (isymp->st_shndx == SHN_UNDEF)
2746 isec = bfd_und_section_ptr;
2747 else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
2748 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
2749 else if (isymp->st_shndx == SHN_ABS)
2750 isec = bfd_abs_section_ptr;
2751 else if (isymp->st_shndx == SHN_COMMON)
2752 isec = bfd_com_section_ptr;
2753 else
2754 {
2755 /* Who knows? */
2756 isec = NULL;
2757 }
2758
2759 *secpp = isec;
2760 }
2761
2762 if (! mn10300_elf_relocate_section (output_bfd, link_info, input_bfd,
2763 input_section, data, internal_relocs,
2764 internal_syms, sections))
2765 goto error_return;
2766
2767 if (sections != NULL)
2768 free (sections);
2769 sections = NULL;
2770 if (internal_syms != NULL)
2771 free (internal_syms);
2772 internal_syms = NULL;
2773 if (external_syms != NULL && symtab_hdr->contents == NULL)
2774 free (external_syms);
2775 external_syms = NULL;
2776 if (internal_relocs != elf_section_data (input_section)->relocs)
2777 free (internal_relocs);
2778 internal_relocs = NULL;
2779 }
2780
2781 return data;
2782
2783 error_return:
2784 if (internal_relocs != NULL
2785 && internal_relocs != elf_section_data (input_section)->relocs)
2786 free (internal_relocs);
2787 if (external_syms != NULL && symtab_hdr->contents == NULL)
2788 free (external_syms);
2789 if (internal_syms != NULL)
2790 free (internal_syms);
2791 if (sections != NULL)
2792 free (sections);
2793 return NULL;
2794 }
2795
2796 /* Assorted hash table functions. */
2797
2798 /* Initialize an entry in the link hash table. */
2799
2800 /* Create an entry in an MN10300 ELF linker hash table. */
2801
2802 static struct bfd_hash_entry *
2803 elf32_mn10300_link_hash_newfunc (entry, table, string)
2804 struct bfd_hash_entry *entry;
2805 struct bfd_hash_table *table;
2806 const char *string;
2807 {
2808 struct elf32_mn10300_link_hash_entry *ret =
2809 (struct elf32_mn10300_link_hash_entry *) entry;
2810
2811 /* Allocate the structure if it has not already been allocated by a
2812 subclass. */
2813 if (ret == (struct elf32_mn10300_link_hash_entry *) NULL)
2814 ret = ((struct elf32_mn10300_link_hash_entry *)
2815 bfd_hash_allocate (table,
2816 sizeof (struct elf32_mn10300_link_hash_entry)));
2817 if (ret == (struct elf32_mn10300_link_hash_entry *) NULL)
2818 return (struct bfd_hash_entry *) ret;
2819
2820 /* Call the allocation method of the superclass. */
2821 ret = ((struct elf32_mn10300_link_hash_entry *)
2822 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2823 table, string));
2824 if (ret != (struct elf32_mn10300_link_hash_entry *) NULL)
2825 {
2826 ret->direct_calls = 0;
2827 ret->stack_size = 0;
2828 ret->movm_stack_size = 0;
2829 ret->flags = 0;
2830 ret->movm_args = 0;
2831 }
2832
2833 return (struct bfd_hash_entry *) ret;
2834 }
2835
2836 /* Create an mn10300 ELF linker hash table. */
2837
2838 static struct bfd_link_hash_table *
2839 elf32_mn10300_link_hash_table_create (abfd)
2840 bfd *abfd;
2841 {
2842 struct elf32_mn10300_link_hash_table *ret;
2843
2844 ret = ((struct elf32_mn10300_link_hash_table *)
2845 bfd_alloc (abfd, sizeof (struct elf32_mn10300_link_hash_table)));
2846 if (ret == (struct elf32_mn10300_link_hash_table *) NULL)
2847 return NULL;
2848
2849 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
2850 elf32_mn10300_link_hash_newfunc))
2851 {
2852 bfd_release (abfd, ret);
2853 return NULL;
2854 }
2855
2856 ret->flags = 0;
2857 ret->static_hash_table
2858 = ((struct elf32_mn10300_link_hash_table *)
2859 bfd_alloc (abfd, sizeof (struct elf_link_hash_table)));
2860 if (ret->static_hash_table == NULL)
2861 {
2862 bfd_release (abfd, ret);
2863 return NULL;
2864 }
2865
2866 if (! _bfd_elf_link_hash_table_init (&ret->static_hash_table->root, abfd,
2867 elf32_mn10300_link_hash_newfunc))
2868 {
2869 bfd_release (abfd, ret->static_hash_table);
2870 bfd_release (abfd, ret);
2871 return NULL;
2872 }
2873 return &ret->root.root;
2874 }
2875
2876 static int
2877 elf_mn10300_mach (flags)
2878 flagword flags;
2879 {
2880 switch (flags & EF_MN10300_MACH)
2881 {
2882 case E_MN10300_MACH_MN10300:
2883 default:
2884 return bfd_mach_mn10300;
2885
2886 case E_MN10300_MACH_AM33:
2887 return bfd_mach_am33;
2888 }
2889 }
2890
2891 /* The final processing done just before writing out a MN10300 ELF object
2892 file. This gets the MN10300 architecture right based on the machine
2893 number. */
2894
2895 /*ARGSUSED*/
2896 void
2897 _bfd_mn10300_elf_final_write_processing (abfd, linker)
2898 bfd *abfd;
2899 boolean linker ATTRIBUTE_UNUSED;
2900 {
2901 unsigned long val;
2902
2903 switch (bfd_get_mach (abfd))
2904 {
2905 default:
2906 case bfd_mach_mn10300:
2907 val = E_MN10300_MACH_MN10300;
2908 break;
2909
2910 case bfd_mach_am33:
2911 val = E_MN10300_MACH_AM33;
2912 break;
2913 }
2914
2915 elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH);
2916 elf_elfheader (abfd)->e_flags |= val;
2917 }
2918
2919 boolean
2920 _bfd_mn10300_elf_object_p (abfd)
2921 bfd *abfd;
2922 {
2923 bfd_default_set_arch_mach (abfd, bfd_arch_mn10300,
2924 elf_mn10300_mach (elf_elfheader (abfd)->e_flags));
2925 return true;
2926 }
2927
2928 /* Merge backend specific data from an object file to the output
2929 object file when linking. */
2930
2931 boolean
2932 _bfd_mn10300_elf_merge_private_bfd_data (ibfd, obfd)
2933 bfd *ibfd;
2934 bfd *obfd;
2935 {
2936 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2937 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2938 return true;
2939
2940 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2941 && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
2942 {
2943 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
2944 bfd_get_mach (ibfd)))
2945 return false;
2946 }
2947
2948 return true;
2949 }
2950
2951
2952 #define TARGET_LITTLE_SYM bfd_elf32_mn10300_vec
2953 #define TARGET_LITTLE_NAME "elf32-mn10300"
2954 #define ELF_ARCH bfd_arch_mn10300
2955 #define ELF_MACHINE_CODE EM_CYGNUS_MN10300
2956 #define ELF_MAXPAGESIZE 0x1000
2957
2958 #define elf_info_to_howto mn10300_info_to_howto
2959 #define elf_info_to_howto_rel 0
2960 #define elf_backend_can_gc_sections 1
2961 #define elf_backend_check_relocs mn10300_elf_check_relocs
2962 #define elf_backend_gc_mark_hook mn10300_elf_gc_mark_hook
2963 #define elf_backend_relocate_section mn10300_elf_relocate_section
2964 #define bfd_elf32_bfd_relax_section mn10300_elf_relax_section
2965 #define bfd_elf32_bfd_get_relocated_section_contents \
2966 mn10300_elf_get_relocated_section_contents
2967 #define bfd_elf32_bfd_link_hash_table_create \
2968 elf32_mn10300_link_hash_table_create
2969
2970 #define elf_symbol_leading_char '_'
2971
2972 /* So we can set bits in e_flags. */
2973 #define elf_backend_final_write_processing \
2974 _bfd_mn10300_elf_final_write_processing
2975 #define elf_backend_object_p _bfd_mn10300_elf_object_p
2976
2977 #define bfd_elf32_bfd_merge_private_bfd_data \
2978 _bfd_mn10300_elf_merge_private_bfd_data
2979
2980
2981 #include "elf32-target.h"