2001-02-06 Kazu Hirata <kazu@hxi.com>
[external/binutils.git] / bfd / elf-m10200.c
1 /* Matsushita 10200 specific support for 32-bit ELF
2    Copyright (C) 1996, 1997, 1998, 1999, 2001 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
25 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
26   PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
27 static void mn10200_info_to_howto
28   PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
29 static boolean mn10200_elf_relax_delete_bytes
30   PARAMS ((bfd *, asection *, bfd_vma, int));
31 static boolean mn10200_elf_symbol_address_p
32   PARAMS ((bfd *, asection *, Elf32_External_Sym *, bfd_vma));
33
34 /* We have to use RELA instructions since md_apply_fix3 in the assembler
35    does absolutely nothing.  */
36 #define USE_RELA
37
38 enum reloc_type {
39   R_MN10200_NONE = 0,
40   R_MN10200_32,
41   R_MN10200_16,
42   R_MN10200_8,
43   R_MN10200_24,
44   R_MN10200_PCREL8,
45   R_MN10200_PCREL16,
46   R_MN10200_PCREL24,
47   R_MN10200_MAX
48 };
49
50 static reloc_howto_type elf_mn10200_howto_table[] = {
51   /* Dummy relocation.  Does nothing.  */
52   HOWTO (R_MN10200_NONE,
53          0,
54          2,
55          16,
56          false,
57          0,
58          complain_overflow_bitfield,
59          bfd_elf_generic_reloc,
60          "R_MN10200_NONE",
61          false,
62          0,
63          0,
64          false),
65   /* Standard 32 bit reloc.  */
66   HOWTO (R_MN10200_32,
67          0,
68          2,
69          32,
70          false,
71          0,
72          complain_overflow_bitfield,
73          bfd_elf_generic_reloc,
74          "R_MN10200_32",
75          false,
76          0xffffffff,
77          0xffffffff,
78          false),
79   /* Standard 16 bit reloc.  */
80   HOWTO (R_MN10200_16,
81          0,
82          1,
83          16,
84          false,
85          0,
86          complain_overflow_bitfield,
87          bfd_elf_generic_reloc,
88          "R_MN10200_16",
89          false,
90          0xffff,
91          0xffff,
92          false),
93   /* Standard 8 bit reloc.  */
94   HOWTO (R_MN10200_8,
95          0,
96          0,
97          8,
98          false,
99          0,
100          complain_overflow_bitfield,
101          bfd_elf_generic_reloc,
102          "R_MN10200_8",
103          false,
104          0xff,
105          0xff,
106          false),
107   /* Standard 24 bit reloc.  */
108   HOWTO (R_MN10200_24,
109          0,
110          2,
111          24,
112          false,
113          0,
114          complain_overflow_bitfield,
115          bfd_elf_generic_reloc,
116          "R_MN10200_24",
117          false,
118          0xffffff,
119          0xffffff,
120          false),
121   /* Simple 8 pc-relative reloc.  */
122   HOWTO (R_MN10200_PCREL8,
123          0,
124          0,
125          8,
126          true,
127          0,
128          complain_overflow_bitfield,
129          bfd_elf_generic_reloc,
130          "R_MN10200_PCREL8",
131          false,
132          0xff,
133          0xff,
134          true),
135   /* Simple 16 pc-relative reloc.  */
136   HOWTO (R_MN10200_PCREL16,
137          0,
138          1,
139          16,
140          true,
141          0,
142          complain_overflow_bitfield,
143          bfd_elf_generic_reloc,
144          "R_MN10200_PCREL16",
145          false,
146          0xffff,
147          0xffff,
148          true),
149   /* Simple 32bit pc-relative reloc with a 1 byte adjustment
150      to get the pc-relative offset correct.  */
151   HOWTO (R_MN10200_PCREL24,
152          0,
153          2,
154          24,
155          true,
156          0,
157          complain_overflow_bitfield,
158          bfd_elf_generic_reloc,
159          "R_MN10200_PCREL24",
160          false,
161          0xffffff,
162          0xffffff,
163          true),
164 };
165
166 struct mn10200_reloc_map {
167   bfd_reloc_code_real_type bfd_reloc_val;
168   unsigned char elf_reloc_val;
169 };
170
171 static const struct mn10200_reloc_map mn10200_reloc_map[] = {
172   { BFD_RELOC_NONE    , R_MN10200_NONE   , },
173   { BFD_RELOC_32      , R_MN10200_32     , },
174   { BFD_RELOC_16      , R_MN10200_16     , },
175   { BFD_RELOC_8       , R_MN10200_8      , },
176   { BFD_RELOC_24      , R_MN10200_24     , },
177   { BFD_RELOC_8_PCREL , R_MN10200_PCREL8 , },
178   { BFD_RELOC_16_PCREL, R_MN10200_PCREL16, },
179   { BFD_RELOC_24_PCREL, R_MN10200_PCREL24, },
180 };
181
182 static reloc_howto_type *
183 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
184      bfd *abfd ATTRIBUTE_UNUSED;
185      bfd_reloc_code_real_type code;
186 {
187   unsigned int i;
188
189   for (i = 0;
190        i < sizeof (mn10200_reloc_map) / sizeof (struct mn10200_reloc_map);
191        i++)
192     {
193       if (mn10200_reloc_map[i].bfd_reloc_val == code)
194         return &elf_mn10200_howto_table[mn10200_reloc_map[i].elf_reloc_val];
195     }
196
197   return NULL;
198 }
199
200 /* Set the howto pointer for an MN10200 ELF reloc.  */
201
202 static void
203 mn10200_info_to_howto (abfd, cache_ptr, dst)
204      bfd *abfd ATTRIBUTE_UNUSED;
205      arelent *cache_ptr;
206      Elf32_Internal_Rela *dst;
207 {
208   unsigned int r_type;
209
210   r_type = ELF32_R_TYPE (dst->r_info);
211   BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX);
212   cache_ptr->howto = &elf_mn10200_howto_table[r_type];
213 }
214
215 /* Perform a relocation as part of a final link.  */
216 static bfd_reloc_status_type
217 mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
218                                  input_section, contents, offset, value,
219                                  addend, info, sym_sec, is_local)
220      reloc_howto_type *howto;
221      bfd *input_bfd;
222      bfd *output_bfd ATTRIBUTE_UNUSED;
223      asection *input_section;
224      bfd_byte *contents;
225      bfd_vma offset;
226      bfd_vma value;
227      bfd_vma addend;
228      struct bfd_link_info *info ATTRIBUTE_UNUSED;
229      asection *sym_sec ATTRIBUTE_UNUSED;
230      int is_local ATTRIBUTE_UNUSED;
231 {
232   unsigned long r_type = howto->type;
233   bfd_byte *hit_data = contents + offset;
234
235   switch (r_type)
236     {
237
238     case R_MN10200_NONE:
239       return bfd_reloc_ok;
240
241     case R_MN10200_32:
242       value += addend;
243       bfd_put_32 (input_bfd, value, hit_data);
244       return bfd_reloc_ok;
245
246     case R_MN10200_16:
247       value += addend;
248
249       if ((long) value > 0x7fff || (long) value < -0x8000)
250         return bfd_reloc_overflow;
251
252       bfd_put_16 (input_bfd, value, hit_data);
253       return bfd_reloc_ok;
254
255     case R_MN10200_8:
256       value += addend;
257
258       if ((long) value > 0x7f || (long) value < -0x80)
259         return bfd_reloc_overflow;
260
261       bfd_put_8 (input_bfd, value, hit_data);
262       return bfd_reloc_ok;
263
264     case R_MN10200_24:
265       value += addend;
266
267       if ((long) value > 0x7fffff || (long) value < -0x800000)
268         return bfd_reloc_overflow;
269
270       value &= 0xffffff;
271       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
272       bfd_put_32 (input_bfd, value, hit_data);
273       return bfd_reloc_ok;
274
275     case R_MN10200_PCREL8:
276       value -= (input_section->output_section->vma
277                 + input_section->output_offset);
278       value -= (offset + 1);
279       value += addend;
280
281       if ((long) value > 0xff || (long) value < -0x100)
282         return bfd_reloc_overflow;
283
284       bfd_put_8 (input_bfd, value, hit_data);
285       return bfd_reloc_ok;
286
287     case R_MN10200_PCREL16:
288       value -= (input_section->output_section->vma
289                 + input_section->output_offset);
290       value -= (offset + 2);
291       value += addend;
292
293       if ((long) value > 0xffff || (long) value < -0x10000)
294         return bfd_reloc_overflow;
295
296       bfd_put_16 (input_bfd, value, hit_data);
297       return bfd_reloc_ok;
298
299     case R_MN10200_PCREL24:
300       value -= (input_section->output_section->vma
301                 + input_section->output_offset);
302       value -= (offset + 3);
303       value += addend;
304
305       if ((long) value > 0xffffff || (long) value < -0x1000000)
306         return bfd_reloc_overflow;
307
308       value &= 0xffffff;
309       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
310       bfd_put_32 (input_bfd, value, hit_data);
311       return bfd_reloc_ok;
312
313     default:
314       return bfd_reloc_notsupported;
315     }
316 }
317 \f
318 /* Relocate an MN10200 ELF section.  */
319 static boolean
320 mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
321                               contents, relocs, local_syms, local_sections)
322      bfd *output_bfd;
323      struct bfd_link_info *info;
324      bfd *input_bfd;
325      asection *input_section;
326      bfd_byte *contents;
327      Elf_Internal_Rela *relocs;
328      Elf_Internal_Sym *local_syms;
329      asection **local_sections;
330 {
331   Elf_Internal_Shdr *symtab_hdr;
332   struct elf_link_hash_entry **sym_hashes;
333   Elf_Internal_Rela *rel, *relend;
334
335   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
336   sym_hashes = elf_sym_hashes (input_bfd);
337
338   rel = relocs;
339   relend = relocs + input_section->reloc_count;
340   for (; rel < relend; rel++)
341     {
342       int r_type;
343       reloc_howto_type *howto;
344       unsigned long r_symndx;
345       Elf_Internal_Sym *sym;
346       asection *sec;
347       struct elf_link_hash_entry *h;
348       bfd_vma relocation;
349       bfd_reloc_status_type r;
350
351       r_symndx = ELF32_R_SYM (rel->r_info);
352       r_type = ELF32_R_TYPE (rel->r_info);
353       howto = elf_mn10200_howto_table + r_type;
354
355       if (info->relocateable)
356         {
357           /* This is a relocateable link.  We don't have to change
358              anything, unless the reloc is against a section symbol,
359              in which case we have to adjust according to where the
360              section symbol winds up in the output section.  */
361           if (r_symndx < symtab_hdr->sh_info)
362             {
363               sym = local_syms + r_symndx;
364               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
365                 {
366                   sec = local_sections[r_symndx];
367                   rel->r_addend += sec->output_offset + sym->st_value;
368                 }
369             }
370
371           continue;
372         }
373
374       /* This is a final link.  */
375       h = NULL;
376       sym = NULL;
377       sec = NULL;
378       if (r_symndx < symtab_hdr->sh_info)
379         {
380           sym = local_syms + r_symndx;
381           sec = local_sections[r_symndx];
382           relocation = (sec->output_section->vma
383                         + sec->output_offset
384                         + sym->st_value);
385         }
386       else
387         {
388           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
389           while (h->root.type == bfd_link_hash_indirect
390                  || h->root.type == bfd_link_hash_warning)
391             h = (struct elf_link_hash_entry *) h->root.u.i.link;
392           if (h->root.type == bfd_link_hash_defined
393               || h->root.type == bfd_link_hash_defweak)
394             {
395               sec = h->root.u.def.section;
396               relocation = (h->root.u.def.value
397                             + sec->output_section->vma
398                             + sec->output_offset);
399             }
400           else if (h->root.type == bfd_link_hash_undefweak)
401             relocation = 0;
402           else
403             {
404               if (! ((*info->callbacks->undefined_symbol)
405                      (info, h->root.root.string, input_bfd,
406                       input_section, rel->r_offset, true)))
407                 return false;
408               relocation = 0;
409             }
410         }
411
412       r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
413                                            input_section,
414                                            contents, rel->r_offset,
415                                            relocation, rel->r_addend,
416                                            info, sec, h == NULL);
417
418       if (r != bfd_reloc_ok)
419         {
420           const char *name;
421           const char *msg = (const char *) 0;
422
423           if (h != NULL)
424             name = h->root.root.string;
425           else
426             {
427               name = (bfd_elf_string_from_elf_section
428                       (input_bfd, symtab_hdr->sh_link, sym->st_name));
429               if (name == NULL || *name == '\0')
430                 name = bfd_section_name (input_bfd, sec);
431             }
432
433           switch (r)
434             {
435             case bfd_reloc_overflow:
436               if (! ((*info->callbacks->reloc_overflow)
437                      (info, name, howto->name, (bfd_vma) 0,
438                       input_bfd, input_section, rel->r_offset)))
439                 return false;
440               break;
441
442             case bfd_reloc_undefined:
443               if (! ((*info->callbacks->undefined_symbol)
444                      (info, name, input_bfd, input_section,
445                       rel->r_offset, true)))
446                 return false;
447               break;
448
449             case bfd_reloc_outofrange:
450               msg = _("internal error: out of range error");
451               goto common_error;
452
453             case bfd_reloc_notsupported:
454               msg = _("internal error: unsupported relocation error");
455               goto common_error;
456
457             case bfd_reloc_dangerous:
458               msg = _("internal error: dangerous error");
459               goto common_error;
460
461             default:
462               msg = _("internal error: unknown error");
463               /* fall through */
464
465             common_error:
466               if (!((*info->callbacks->warning)
467                     (info, msg, name, input_bfd, input_section,
468                      rel->r_offset)))
469                 return false;
470               break;
471             }
472         }
473     }
474
475   return true;
476 }
477
478 /* This function handles relaxing for the mn10200.
479
480    There's quite a few relaxing opportunites available on the mn10200:
481
482         * jsr:24 -> jsr:16                                         2 bytes
483
484         * jmp:24 -> jmp:16                                         2 bytes
485         * jmp:16 -> bra:8                                          1 byte
486
487                 * If the previous instruction is a conditional branch
488                 around the jump/bra, we may be able to reverse its condition
489                 and change its target to the jump's target.  The jump/bra
490                 can then be deleted.                               2 bytes
491
492         * mov abs24 -> mov abs16        2 byte savings
493
494         * Most instructions which accept imm24 can relax to imm16  2 bytes
495         - Most instructions which accept imm16 can relax to imm8   1 byte
496
497         * Most instructions which accept d24 can relax to d16      2 bytes
498         - Most instructions which accept d16 can relax to d8       1 byte
499
500         abs24, imm24, d24 all look the same at the reloc level.  It
501         might make the code simpler if we had different relocs for
502         the various relaxable operand types.
503
504         We don't handle imm16->imm8 or d16->d8 as they're very rare
505         and somewhat more difficult to support.  */
506
507 static boolean
508 mn10200_elf_relax_section (abfd, sec, link_info, again)
509      bfd *abfd;
510      asection *sec;
511      struct bfd_link_info *link_info;
512      boolean *again;
513 {
514   Elf_Internal_Shdr *symtab_hdr;
515   Elf_Internal_Rela *internal_relocs;
516   Elf_Internal_Rela *free_relocs = NULL;
517   Elf_Internal_Rela *irel, *irelend;
518   bfd_byte *contents = NULL;
519   bfd_byte *free_contents = NULL;
520   Elf32_External_Sym *extsyms = NULL;
521   Elf32_External_Sym *free_extsyms = NULL;
522
523   /* Assume nothing changes.  */
524   *again = false;
525
526   /* We don't have to do anything for a relocateable link, if
527      this section does not have relocs, or if this is not a
528      code section.  */
529   if (link_info->relocateable
530       || (sec->flags & SEC_RELOC) == 0
531       || sec->reloc_count == 0
532       || (sec->flags & SEC_CODE) == 0)
533     return true;
534
535   /* If this is the first time we have been called for this section,
536      initialize the cooked size.  */
537   if (sec->_cooked_size == 0)
538     sec->_cooked_size = sec->_raw_size;
539
540   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
541
542   /* Get a copy of the native relocations.  */
543   internal_relocs = (_bfd_elf32_link_read_relocs
544                      (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
545                       link_info->keep_memory));
546   if (internal_relocs == NULL)
547     goto error_return;
548   if (! link_info->keep_memory)
549     free_relocs = internal_relocs;
550
551   /* Walk through them looking for relaxing opportunities.  */
552   irelend = internal_relocs + sec->reloc_count;
553   for (irel = internal_relocs; irel < irelend; irel++)
554     {
555       bfd_vma symval;
556
557       /* If this isn't something that can be relaxed, then ignore
558          this reloc.  */
559       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_NONE
560           || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_8
561           || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_MAX)
562         continue;
563
564       /* Get the section contents if we haven't done so already.  */
565       if (contents == NULL)
566         {
567           /* Get cached copy if it exists.  */
568           if (elf_section_data (sec)->this_hdr.contents != NULL)
569             contents = elf_section_data (sec)->this_hdr.contents;
570           else
571             {
572               /* Go get them off disk.  */
573               contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
574               if (contents == NULL)
575                 goto error_return;
576               free_contents = contents;
577
578               if (! bfd_get_section_contents (abfd, sec, contents,
579                                               (file_ptr) 0, sec->_raw_size))
580                 goto error_return;
581             }
582         }
583
584       /* Read this BFD's symbols if we haven't done so already.  */
585       if (extsyms == NULL)
586         {
587           /* Get cached copy if it exists.  */
588           if (symtab_hdr->contents != NULL)
589             extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
590           else
591             {
592               /* Go get them off disk.  */
593               extsyms = ((Elf32_External_Sym *)
594                          bfd_malloc (symtab_hdr->sh_size));
595               if (extsyms == NULL)
596                 goto error_return;
597               free_extsyms = extsyms;
598               if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
599                   || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
600                       != symtab_hdr->sh_size))
601                 goto error_return;
602             }
603         }
604
605       /* Get the value of the symbol referred to by the reloc.  */
606       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
607         {
608           Elf_Internal_Sym isym;
609           asection *sym_sec;
610
611           /* A local symbol.  */
612           bfd_elf32_swap_symbol_in (abfd,
613                                     extsyms + ELF32_R_SYM (irel->r_info),
614                                     &isym);
615
616           sym_sec = bfd_section_from_elf_index (abfd, isym.st_shndx);
617           symval = (isym.st_value
618                     + sym_sec->output_section->vma
619                     + sym_sec->output_offset);
620         }
621       else
622         {
623           unsigned long indx;
624           struct elf_link_hash_entry *h;
625
626           /* An external symbol.  */
627           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
628           h = elf_sym_hashes (abfd)[indx];
629           BFD_ASSERT (h != NULL);
630           if (h->root.type != bfd_link_hash_defined
631               && h->root.type != bfd_link_hash_defweak)
632             {
633               /* This appears to be a reference to an undefined
634                  symbol.  Just ignore it--it will be caught by the
635                  regular reloc processing.  */
636               continue;
637             }
638
639           symval = (h->root.u.def.value
640                     + h->root.u.def.section->output_section->vma
641                     + h->root.u.def.section->output_offset);
642         }
643
644       /* For simplicity of coding, we are going to modify the section
645          contents, the section relocs, and the BFD symbol table.  We
646          must tell the rest of the code not to free up this
647          information.  It would be possible to instead create a table
648          of changes which have to be made, as is done in coff-mips.c;
649          that would be more work, but would require less memory when
650          the linker is run.  */
651
652       /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
653          branch/call.  */
654       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL24)
655         {
656           bfd_vma value = symval;
657
658           /* Deal with pc-relative gunk.  */
659           value -= (sec->output_section->vma + sec->output_offset);
660           value -= (irel->r_offset + 3);
661           value += irel->r_addend;
662
663           /* See if the value will fit in 16 bits, note the high value is
664              0x7fff + 2 as the target will be two bytes closer if we are
665              able to relax.  */
666           if ((long) value < 0x8001 && (long) value > -0x8000)
667             {
668               unsigned char code;
669
670               /* Get the opcode.  */
671               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
672
673               if (code != 0xe0 && code != 0xe1)
674                 continue;
675
676               /* Note that we've changed the relocs, section contents, etc.  */
677               elf_section_data (sec)->relocs = internal_relocs;
678               free_relocs = NULL;
679
680               elf_section_data (sec)->this_hdr.contents = contents;
681               free_contents = NULL;
682
683               symtab_hdr->contents = (bfd_byte *) extsyms;
684               free_extsyms = NULL;
685
686               /* Fix the opcode.  */
687               if (code == 0xe0)
688                 bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 2);
689               else if (code == 0xe1)
690                 bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 2);
691
692               /* Fix the relocation's type.  */
693               irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
694                                            R_MN10200_PCREL16);
695
696               /* The opcode got shorter too, so we have to fix the offset.  */
697               irel->r_offset -= 1;
698
699               /* Delete two bytes of data.  */
700               if (!mn10200_elf_relax_delete_bytes (abfd, sec,
701                                                    irel->r_offset + 1, 2))
702                 goto error_return;
703
704               /* That will change things, so, we should relax again.
705                  Note that this is not required, and it may be slow.  */
706               *again = true;
707             }
708         }
709
710       /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
711          branch.  */
712       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL16)
713         {
714           bfd_vma value = symval;
715
716           /* Deal with pc-relative gunk.  */
717           value -= (sec->output_section->vma + sec->output_offset);
718           value -= (irel->r_offset + 2);
719           value += irel->r_addend;
720
721           /* See if the value will fit in 8 bits, note the high value is
722              0x7f + 1 as the target will be one bytes closer if we are
723              able to relax.  */
724           if ((long) value < 0x80 && (long) value > -0x80)
725             {
726               unsigned char code;
727
728               /* Get the opcode.  */
729               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
730
731               if (code != 0xfc)
732                 continue;
733
734               /* Note that we've changed the relocs, section contents, etc.  */
735               elf_section_data (sec)->relocs = internal_relocs;
736               free_relocs = NULL;
737
738               elf_section_data (sec)->this_hdr.contents = contents;
739               free_contents = NULL;
740
741               symtab_hdr->contents = (bfd_byte *) extsyms;
742               free_extsyms = NULL;
743
744               /* Fix the opcode.  */
745               bfd_put_8 (abfd, 0xea, contents + irel->r_offset - 1);
746
747               /* Fix the relocation's type.  */
748               irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
749                                            R_MN10200_PCREL8);
750
751               /* Delete one byte of data.  */
752               if (!mn10200_elf_relax_delete_bytes (abfd, sec,
753                                                    irel->r_offset + 1, 1))
754                 goto error_return;
755
756               /* That will change things, so, we should relax again.
757                  Note that this is not required, and it may be slow.  */
758               *again = true;
759             }
760         }
761
762       /* Try to eliminate an unconditional 8 bit pc-relative branch
763          which immediately follows a conditional 8 bit pc-relative
764          branch around the unconditional branch.
765
766             original:           new:
767             bCC lab1            bCC' lab2
768             bra lab2
769            lab1:               lab1:
770
771          This happens when the bCC can't reach lab2 at assembly time,
772          but due to other relaxations it can reach at link time.  */
773       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL8)
774         {
775           Elf_Internal_Rela *nrel;
776           bfd_vma value = symval;
777           unsigned char code;
778
779           /* Deal with pc-relative gunk.  */
780           value -= (sec->output_section->vma + sec->output_offset);
781           value -= (irel->r_offset + 1);
782           value += irel->r_addend;
783
784           /* Do nothing if this reloc is the last byte in the section.  */
785           if (irel->r_offset == sec->_cooked_size)
786             continue;
787
788           /* See if the next instruction is an unconditional pc-relative
789              branch, more often than not this test will fail, so we
790              test it first to speed things up.  */
791           code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
792           if (code != 0xea)
793             continue;
794
795           /* Also make sure the next relocation applies to the next
796              instruction and that it's a pc-relative 8 bit branch.  */
797           nrel = irel + 1;
798           if (nrel == irelend
799               || irel->r_offset + 2 != nrel->r_offset
800               || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10200_PCREL8)
801             continue;
802
803           /* Make sure our destination immediately follows the
804              unconditional branch.  */
805           if (symval != (sec->output_section->vma + sec->output_offset
806                          + irel->r_offset + 3))
807             continue;
808
809           /* Now make sure we are a conditional branch.  This may not
810              be necessary, but why take the chance.
811
812              Note these checks assume that R_MN10200_PCREL8 relocs
813              only occur on bCC and bCCx insns.  If they occured
814              elsewhere, we'd need to know the start of this insn
815              for this check to be accurate.  */
816           code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
817           if (code != 0xe0 && code != 0xe1 && code != 0xe2
818               && code != 0xe3 && code != 0xe4 && code != 0xe5
819               && code != 0xe6 && code != 0xe7 && code != 0xe8
820               && code != 0xe9 && code != 0xec && code != 0xed
821               && code != 0xee && code != 0xef && code != 0xfc
822               && code != 0xfd && code != 0xfe && code != 0xff)
823             continue;
824
825           /* We also have to be sure there is no symbol/label
826              at the unconditional branch.  */
827           if (mn10200_elf_symbol_address_p (abfd, sec, extsyms,
828                                             irel->r_offset + 1))
829             continue;
830
831           /* Note that we've changed the relocs, section contents, etc.  */
832           elf_section_data (sec)->relocs = internal_relocs;
833           free_relocs = NULL;
834
835           elf_section_data (sec)->this_hdr.contents = contents;
836           free_contents = NULL;
837
838           symtab_hdr->contents = (bfd_byte *) extsyms;
839           free_extsyms = NULL;
840
841           /* Reverse the condition of the first branch.  */
842           switch (code)
843             {
844             case 0xfc:
845               code = 0xfd;
846               break;
847             case 0xfd:
848               code = 0xfc;
849               break;
850             case 0xfe:
851               code = 0xff;
852               break;
853             case 0xff:
854               code = 0xfe;
855               break;
856             case 0xe8:
857               code = 0xe9;
858               break;
859             case 0xe9:
860               code = 0xe8;
861               break;
862             case 0xe0:
863               code = 0xe2;
864               break;
865             case 0xe2:
866               code = 0xe0;
867               break;
868             case 0xe3:
869               code = 0xe1;
870               break;
871             case 0xe1:
872               code = 0xe3;
873               break;
874             case 0xe4:
875               code = 0xe6;
876               break;
877             case 0xe6:
878               code = 0xe4;
879               break;
880             case 0xe7:
881               code = 0xe5;
882               break;
883             case 0xe5:
884               code = 0xe7;
885               break;
886             case 0xec:
887               code = 0xed;
888               break;
889             case 0xed:
890               code = 0xec;
891               break;
892             case 0xee:
893               code = 0xef;
894               break;
895             case 0xef:
896               code = 0xee;
897               break;
898             }
899           bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
900
901           /* Set the reloc type and symbol for the first branch
902              from the second branch.  */
903           irel->r_info = nrel->r_info;
904
905           /* Make the reloc for the second branch a null reloc.  */
906           nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
907                                        R_MN10200_NONE);
908
909           /* Delete two bytes of data.  */
910           if (!mn10200_elf_relax_delete_bytes (abfd, sec,
911                                                irel->r_offset + 1, 2))
912             goto error_return;
913
914           /* That will change things, so, we should relax again.
915              Note that this is not required, and it may be slow.  */
916           *again = true;
917         }
918
919       /* Try to turn a 24bit immediate, displacement or absolute address
920          into a 16bit immediate, displacement or absolute address.  */
921       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_24)
922         {
923           bfd_vma value = symval;
924
925           /* See if the value will fit in 16 bits.
926              We allow any 16bit match here.  We prune those we can't
927              handle below.  */
928           if ((long) value < 0x7fff && (long) value > -0x8000)
929             {
930               unsigned char code;
931
932               /* All insns which have 24bit operands are 5 bytes long,
933                  the first byte will always be 0xf4, but we double check
934                  it just in case.  */
935
936               /* Get the first opcode.  */
937               code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
938
939               if (code != 0xf4)
940                 continue;
941
942               /* Get the second opcode.  */
943               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
944
945               switch (code & 0xfc)
946                 {
947                 /* mov imm24,dn -> mov imm16,dn */
948                 case 0x70:
949                   /* Not safe if the high bit is on as relaxing may
950                      move the value out of high mem and thus not fit
951                      in a signed 16bit value.  */
952                   if (value & 0x8000)
953                     continue;
954
955                   /* Note that we've changed the reldection contents, etc.  */
956                   elf_section_data (sec)->relocs = internal_relocs;
957                   free_relocs = NULL;
958
959                   elf_section_data (sec)->this_hdr.contents = contents;
960                   free_contents = NULL;
961
962                   symtab_hdr->contents = (bfd_byte *) extsyms;
963                   free_extsyms = NULL;
964
965                   /* Fix the opcode.  */
966                   bfd_put_8 (abfd, 0xf8 + (code & 0x03),
967                              contents + irel->r_offset - 2);
968
969                   /* Fix the relocation's type.  */
970                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
971                                                R_MN10200_16);
972
973                   /* The opcode got shorter too, so we have to fix the
974                      offset.  */
975                   irel->r_offset -= 1;
976
977                   /* Delete two bytes of data.  */
978                   if (!mn10200_elf_relax_delete_bytes (abfd, sec,
979                                                        irel->r_offset + 1, 2))
980                     goto error_return;
981
982                   /* That will change things, so, we should relax again.
983                      Note that this is not required, and it may be slow.  */
984                   *again = true;
985                   break;
986
987                 /* mov imm24,an -> mov imm16,an
988                    cmp imm24,an -> cmp imm16,an
989                    mov (abs24),dn -> mov (abs16),dn
990                    mov dn,(abs24) -> mov dn,(abs16)
991                    movb dn,(abs24) -> movb dn,(abs16)
992                    movbu (abs24),dn -> movbu (abs16),dn */
993                 case 0x74:
994                 case 0x7c:
995                 case 0xc0:
996                 case 0x40:
997                 case 0x44:
998                 case 0xc8:
999                   /* Note that we've changed the reldection contents, etc.  */
1000                   elf_section_data (sec)->relocs = internal_relocs;
1001                   free_relocs = NULL;
1002
1003                   elf_section_data (sec)->this_hdr.contents = contents;
1004                   free_contents = NULL;
1005
1006                   symtab_hdr->contents = (bfd_byte *) extsyms;
1007                   free_extsyms = NULL;
1008
1009                   if ((code & 0xfc) == 0x74)
1010                     code = 0xdc + (code & 0x03);
1011                   else if ((code & 0xfc) == 0x7c)
1012                     code = 0xec + (code & 0x03);
1013                   else if ((code & 0xfc) == 0xc0)
1014                     code = 0xc8 + (code & 0x03);
1015                   else if ((code & 0xfc) == 0x40)
1016                     code = 0xc0 + (code & 0x03);
1017                   else if ((code & 0xfc) == 0x44)
1018                     code = 0xc4 + (code & 0x03);
1019                   else if ((code & 0xfc) == 0xc8)
1020                     code = 0xcc + (code & 0x03);
1021
1022                   /* Fix the opcode.  */
1023                   bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
1024
1025                   /* Fix the relocation's type.  */
1026                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1027                                                R_MN10200_16);
1028
1029                   /* The opcode got shorter too, so we have to fix the
1030                      offset.  */
1031                   irel->r_offset -= 1;
1032
1033                   /* Delete two bytes of data.  */
1034                   if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1035                                                        irel->r_offset + 1, 2))
1036                     goto error_return;
1037
1038                   /* That will change things, so, we should relax again.
1039                      Note that this is not required, and it may be slow.  */
1040                   *again = true;
1041                   break;
1042
1043                 /* cmp imm24,dn -> cmp imm16,dn
1044                    mov (abs24),an -> mov (abs16),an
1045                    mov an,(abs24) -> mov an,(abs16)
1046                    add imm24,dn -> add imm16,dn
1047                    add imm24,an -> add imm16,an
1048                    sub imm24,dn -> sub imm16,dn
1049                    sub imm24,an -> sub imm16,an
1050                    And all d24->d16 in memory ops.  */
1051                 case 0x78:
1052                 case 0xd0:
1053                 case 0x50:
1054                 case 0x60:
1055                 case 0x64:
1056                 case 0x68:
1057                 case 0x6c:
1058                 case 0x80:
1059                 case 0xf0:
1060                 case 0x00:
1061                 case 0x10:
1062                 case 0xb0:
1063                 case 0x30:
1064                 case 0xa0:
1065                 case 0x20:
1066                 case 0x90:
1067                   /* Not safe if the high bit is on as relaxing may
1068                      move the value out of high mem and thus not fit
1069                      in a signed 16bit value.  */
1070                   if (((code & 0xfc) == 0x78
1071                        || (code & 0xfc) == 0x60
1072                        || (code & 0xfc) == 0x64
1073                        || (code & 0xfc) == 0x68
1074                        || (code & 0xfc) == 0x6c
1075                        || (code & 0xfc) == 0x80
1076                        || (code & 0xfc) == 0xf0
1077                        || (code & 0xfc) == 0x00
1078                        || (code & 0xfc) == 0x10
1079                        || (code & 0xfc) == 0xb0
1080                        || (code & 0xfc) == 0x30
1081                        || (code & 0xfc) == 0xa0
1082                        || (code & 0xfc) == 0x20
1083                        || (code & 0xfc) == 0x90)
1084                       && (value & 0x8000) != 0)
1085                     continue;
1086
1087                   /* Note that we've changed the reldection contents, etc.  */
1088                   elf_section_data (sec)->relocs = internal_relocs;
1089                   free_relocs = NULL;
1090
1091                   elf_section_data (sec)->this_hdr.contents = contents;
1092                   free_contents = NULL;
1093
1094                   symtab_hdr->contents = (bfd_byte *) extsyms;
1095                   free_extsyms = NULL;
1096
1097                   /* Fix the opcode.  */
1098                   bfd_put_8 (abfd, 0xf7, contents + irel->r_offset - 2);
1099
1100                   if ((code & 0xfc) == 0x78)
1101                     code = 0x48 + (code & 0x03);
1102                   else if ((code & 0xfc) == 0xd0)
1103                     code = 0x30 + (code & 0x03);
1104                   else if ((code & 0xfc) == 0x50)
1105                     code = 0x20 + (code & 0x03);
1106                   else if ((code & 0xfc) == 0x60)
1107                     code = 0x18 + (code & 0x03);
1108                   else if ((code & 0xfc) == 0x64)
1109                     code = 0x08 + (code & 0x03);
1110                   else if ((code & 0xfc) == 0x68)
1111                     code = 0x1c + (code & 0x03);
1112                   else if ((code & 0xfc) == 0x6c)
1113                     code = 0x0c + (code & 0x03);
1114                   else if ((code & 0xfc) == 0x80)
1115                     code = 0xc0 + (code & 0x07);
1116                   else if ((code & 0xfc) == 0xf0)
1117                     code = 0xb0 + (code & 0x07);
1118                   else if ((code & 0xfc) == 0x00)
1119                     code = 0x80 + (code & 0x07);
1120                   else if ((code & 0xfc) == 0x10)
1121                     code = 0xa0 + (code & 0x07);
1122                   else if ((code & 0xfc) == 0xb0)
1123                     code = 0x70 + (code & 0x07);
1124                   else if ((code & 0xfc) == 0x30)
1125                     code = 0x60 + (code & 0x07);
1126                   else if ((code & 0xfc) == 0xa0)
1127                     code = 0xd0 + (code & 0x07);
1128                   else if ((code & 0xfc) == 0x20)
1129                     code = 0x90 + (code & 0x07);
1130                   else if ((code & 0xfc) == 0x90)
1131                     code = 0x50 + (code & 0x07);
1132
1133                   bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1134
1135                   /* Fix the relocation's type.  */
1136                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1137                                                R_MN10200_16);
1138
1139                   /* Delete one bytes of data.  */
1140                   if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1141                                                        irel->r_offset + 2, 1))
1142                     goto error_return;
1143
1144                   /* That will change things, so, we should relax again.
1145                      Note that this is not required, and it may be slow.  */
1146                   *again = true;
1147                   break;
1148
1149                 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1150                 case 0xc4:
1151                   /* Note that we've changed the reldection contents, etc.  */
1152                   elf_section_data (sec)->relocs = internal_relocs;
1153                   free_relocs = NULL;
1154
1155                   elf_section_data (sec)->this_hdr.contents = contents;
1156                   free_contents = NULL;
1157
1158                   symtab_hdr->contents = (bfd_byte *) extsyms;
1159                   free_extsyms = NULL;
1160
1161                   bfd_put_8 (abfd, 0xcc + (code & 0x03),
1162                              contents + irel->r_offset - 2);
1163
1164                   bfd_put_8 (abfd, 0xb8 + (code & 0x03),
1165                              contents + irel->r_offset - 1);
1166
1167                   /* Fix the relocation's type.  */
1168                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1169                                                R_MN10200_16);
1170
1171                   /* The reloc will be applied one byte in front of its
1172                      current location.  */
1173                   irel->r_offset -= 1;
1174
1175                   /* Delete one bytes of data.  */
1176                   if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1177                                                        irel->r_offset + 2, 1))
1178                     goto error_return;
1179
1180                   /* That will change things, so, we should relax again.
1181                      Note that this is not required, and it may be slow.  */
1182                   *again = true;
1183                   break;
1184                 }
1185             }
1186         }
1187     }
1188
1189   if (free_relocs != NULL)
1190     {
1191       free (free_relocs);
1192       free_relocs = NULL;
1193     }
1194
1195   if (free_contents != NULL)
1196     {
1197       if (! link_info->keep_memory)
1198         free (free_contents);
1199       else
1200         {
1201           /* Cache the section contents for elf_link_input_bfd.  */
1202           elf_section_data (sec)->this_hdr.contents = contents;
1203         }
1204       free_contents = NULL;
1205     }
1206
1207   if (free_extsyms != NULL)
1208     {
1209       if (! link_info->keep_memory)
1210         free (free_extsyms);
1211       else
1212         {
1213           /* Cache the symbols for elf_link_input_bfd.  */
1214           symtab_hdr->contents = extsyms;
1215         }
1216       free_extsyms = NULL;
1217     }
1218
1219   return true;
1220
1221  error_return:
1222   if (free_relocs != NULL)
1223     free (free_relocs);
1224   if (free_contents != NULL)
1225     free (free_contents);
1226   if (free_extsyms != NULL)
1227     free (free_extsyms);
1228   return false;
1229 }
1230
1231 /* Delete some bytes from a section while relaxing.  */
1232
1233 static boolean
1234 mn10200_elf_relax_delete_bytes (abfd, sec, addr, count)
1235      bfd *abfd;
1236      asection *sec;
1237      bfd_vma addr;
1238      int count;
1239 {
1240   Elf_Internal_Shdr *symtab_hdr;
1241   Elf32_External_Sym *extsyms;
1242   int shndx, index;
1243   bfd_byte *contents;
1244   Elf_Internal_Rela *irel, *irelend;
1245   Elf_Internal_Rela *irelalign;
1246   bfd_vma toaddr;
1247   Elf32_External_Sym *esym, *esymend;
1248   struct elf_link_hash_entry *sym_hash;
1249
1250   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1251   extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1252
1253   shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1254
1255   contents = elf_section_data (sec)->this_hdr.contents;
1256
1257   /* The deletion must stop at the next ALIGN reloc for an aligment
1258      power larger than the number of bytes we are deleting.  */
1259
1260   irelalign = NULL;
1261   toaddr = sec->_cooked_size;
1262
1263   irel = elf_section_data (sec)->relocs;
1264   irelend = irel + sec->reloc_count;
1265
1266   /* Actually delete the bytes.  */
1267   memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1268   sec->_cooked_size -= count;
1269
1270   /* Adjust all the relocs.  */
1271   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1272     {
1273       /* Get the new reloc address.  */
1274       if ((irel->r_offset > addr
1275            && irel->r_offset < toaddr))
1276         irel->r_offset -= count;
1277     }
1278
1279   /* Adjust the local symbols defined in this section.  */
1280   esym = extsyms;
1281   esymend = esym + symtab_hdr->sh_info;
1282   for (; esym < esymend; esym++)
1283     {
1284       Elf_Internal_Sym isym;
1285
1286       bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1287
1288       if (isym.st_shndx == shndx
1289           && isym.st_value > addr
1290           && isym.st_value < toaddr)
1291         {
1292           isym.st_value -= count;
1293           bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1294         }
1295     }
1296
1297   /* Now adjust the global symbols defined in this section.  */
1298   esym = extsyms + symtab_hdr->sh_info;
1299   esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1300   for (index = 0; esym < esymend; esym++, index++)
1301     {
1302       Elf_Internal_Sym isym;
1303
1304       bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1305       sym_hash = elf_sym_hashes (abfd)[index];
1306       if (isym.st_shndx == shndx
1307           && ((sym_hash)->root.type == bfd_link_hash_defined
1308               || (sym_hash)->root.type == bfd_link_hash_defweak)
1309           && (sym_hash)->root.u.def.section == sec
1310           && (sym_hash)->root.u.def.value > addr
1311           && (sym_hash)->root.u.def.value < toaddr)
1312         {
1313           (sym_hash)->root.u.def.value -= count;
1314         }
1315     }
1316
1317   return true;
1318 }
1319
1320 /* Return true if a symbol exists at the given address, else return
1321    false.  */
1322 static boolean
1323 mn10200_elf_symbol_address_p (abfd, sec, extsyms, addr)
1324      bfd *abfd;
1325      asection *sec;
1326      Elf32_External_Sym *extsyms;
1327      bfd_vma addr;
1328 {
1329   Elf_Internal_Shdr *symtab_hdr;
1330   int shndx;
1331   Elf32_External_Sym *esym, *esymend;
1332   struct elf_link_hash_entry **sym_hash, **sym_hash_end;
1333
1334   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1335   shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1336
1337   /* Examine all the symbols.  */
1338   esym = extsyms;
1339   esymend = esym + symtab_hdr->sh_info;
1340   for (; esym < esymend; esym++)
1341     {
1342       Elf_Internal_Sym isym;
1343
1344       bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1345
1346       if (isym.st_shndx == shndx
1347           && isym.st_value == addr)
1348         return true;
1349     }
1350
1351   sym_hash = elf_sym_hashes (abfd);
1352   sym_hash_end = (sym_hash
1353                   + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1354                      - symtab_hdr->sh_info));
1355   for (; sym_hash < sym_hash_end; sym_hash++)
1356     {
1357       if (((*sym_hash)->root.type == bfd_link_hash_defined
1358            || (*sym_hash)->root.type == bfd_link_hash_defweak)
1359           && (*sym_hash)->root.u.def.section == sec
1360           && (*sym_hash)->root.u.def.value == addr)
1361         return true;
1362     }
1363   return false;
1364 }
1365
1366 /* This is a version of bfd_generic_get_relocated_section_contents
1367    which uses mn10200_elf_relocate_section.  */
1368
1369 static bfd_byte *
1370 mn10200_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1371                                             data, relocateable, symbols)
1372      bfd *output_bfd;
1373      struct bfd_link_info *link_info;
1374      struct bfd_link_order *link_order;
1375      bfd_byte *data;
1376      boolean relocateable;
1377      asymbol **symbols;
1378 {
1379   Elf_Internal_Shdr *symtab_hdr;
1380   asection *input_section = link_order->u.indirect.section;
1381   bfd *input_bfd = input_section->owner;
1382   asection **sections = NULL;
1383   Elf_Internal_Rela *internal_relocs = NULL;
1384   Elf32_External_Sym *external_syms = NULL;
1385   Elf_Internal_Sym *internal_syms = NULL;
1386
1387   /* We only need to handle the case of relaxing, or of having a
1388      particular set of section contents, specially.  */
1389   if (relocateable
1390       || elf_section_data (input_section)->this_hdr.contents == NULL)
1391     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1392                                                        link_order, data,
1393                                                        relocateable,
1394                                                        symbols);
1395
1396   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1397
1398   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1399           input_section->_raw_size);
1400
1401   if ((input_section->flags & SEC_RELOC) != 0
1402       && input_section->reloc_count > 0)
1403     {
1404       Elf_Internal_Sym *isymp;
1405       asection **secpp;
1406       Elf32_External_Sym *esym, *esymend;
1407
1408       if (symtab_hdr->contents != NULL)
1409         external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
1410       else
1411         {
1412           external_syms = ((Elf32_External_Sym *)
1413                            bfd_malloc (symtab_hdr->sh_info
1414                                        * sizeof (Elf32_External_Sym)));
1415           if (external_syms == NULL && symtab_hdr->sh_info > 0)
1416             goto error_return;
1417           if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1418               || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
1419                             symtab_hdr->sh_info, input_bfd)
1420                   != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
1421             goto error_return;
1422         }
1423
1424       internal_relocs = (_bfd_elf32_link_read_relocs
1425                          (input_bfd, input_section, (PTR) NULL,
1426                           (Elf_Internal_Rela *) NULL, false));
1427       if (internal_relocs == NULL)
1428         goto error_return;
1429
1430       internal_syms = ((Elf_Internal_Sym *)
1431                        bfd_malloc (symtab_hdr->sh_info
1432                                    * sizeof (Elf_Internal_Sym)));
1433       if (internal_syms == NULL && symtab_hdr->sh_info > 0)
1434         goto error_return;
1435
1436       sections = (asection **) bfd_malloc (symtab_hdr->sh_info
1437                                            * sizeof (asection *));
1438       if (sections == NULL && symtab_hdr->sh_info > 0)
1439         goto error_return;
1440
1441       isymp = internal_syms;
1442       secpp = sections;
1443       esym = external_syms;
1444       esymend = esym + symtab_hdr->sh_info;
1445       for (; esym < esymend; ++esym, ++isymp, ++secpp)
1446         {
1447           asection *isec;
1448
1449           bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
1450
1451           if (isymp->st_shndx == SHN_UNDEF)
1452             isec = bfd_und_section_ptr;
1453           else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
1454             isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
1455           else if (isymp->st_shndx == SHN_ABS)
1456             isec = bfd_abs_section_ptr;
1457           else if (isymp->st_shndx == SHN_COMMON)
1458             isec = bfd_com_section_ptr;
1459           else
1460             {
1461               /* Who knows?  */
1462               isec = NULL;
1463             }
1464
1465           *secpp = isec;
1466         }
1467
1468       if (! mn10200_elf_relocate_section (output_bfd, link_info, input_bfd,
1469                                      input_section, data, internal_relocs,
1470                                      internal_syms, sections))
1471         goto error_return;
1472
1473       if (sections != NULL)
1474         free (sections);
1475       sections = NULL;
1476       if (internal_syms != NULL)
1477         free (internal_syms);
1478       internal_syms = NULL;
1479       if (external_syms != NULL && symtab_hdr->contents == NULL)
1480         free (external_syms);
1481       external_syms = NULL;
1482       if (internal_relocs != elf_section_data (input_section)->relocs)
1483         free (internal_relocs);
1484       internal_relocs = NULL;
1485     }
1486
1487   return data;
1488
1489  error_return:
1490   if (internal_relocs != NULL
1491       && internal_relocs != elf_section_data (input_section)->relocs)
1492     free (internal_relocs);
1493   if (external_syms != NULL && symtab_hdr->contents == NULL)
1494     free (external_syms);
1495   if (internal_syms != NULL)
1496     free (internal_syms);
1497   if (sections != NULL)
1498     free (sections);
1499   return NULL;
1500 }
1501
1502 #define TARGET_LITTLE_SYM       bfd_elf32_mn10200_vec
1503 #define TARGET_LITTLE_NAME      "elf32-mn10200"
1504 #define ELF_ARCH                bfd_arch_mn10200
1505 #define ELF_MACHINE_CODE        EM_CYGNUS_MN10200
1506 #define ELF_MAXPAGESIZE         0x1000
1507
1508 #define elf_info_to_howto       mn10200_info_to_howto
1509 #define elf_info_to_howto_rel   0
1510 #define elf_backend_relocate_section mn10200_elf_relocate_section
1511 #define bfd_elf32_bfd_relax_section     mn10200_elf_relax_section
1512 #define bfd_elf32_bfd_get_relocated_section_contents \
1513                                 mn10200_elf_get_relocated_section_contents
1514
1515 #define elf_symbol_leading_char '_'
1516
1517 #include "elf32-target.h"