fix set but unused variable warnings
[external/binutils.git] / bfd / elf-m10300.c
1 /* Matsushita 10300 specific support for 32-bit ELF
2    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3    2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/mn10300.h"
27 #include "libiberty.h"
28
29 /* The mn10300 linker needs to keep track of the number of relocs that
30    it decides to copy in check_relocs for each symbol.  This is so
31    that it can discard PC relative relocs if it doesn't need them when
32    linking with -Bsymbolic.  We store the information in a field
33    extending the regular ELF linker hash table.  */
34
35 struct elf32_mn10300_link_hash_entry
36 {
37   /* The basic elf link hash table entry.  */
38   struct elf_link_hash_entry root;
39
40   /* For function symbols, the number of times this function is
41      called directly (ie by name).  */
42   unsigned int direct_calls;
43
44   /* For function symbols, the size of this function's stack
45      (if <= 255 bytes).  We stuff this into "call" instructions
46      to this target when it's valid and profitable to do so.
47
48      This does not include stack allocated by movm!  */
49   unsigned char stack_size;
50
51   /* For function symbols, arguments (if any) for movm instruction
52      in the prologue.  We stuff this value into "call" instructions
53      to the target when it's valid and profitable to do so.  */
54   unsigned char movm_args;
55
56   /* For function symbols, the amount of stack space that would be allocated
57      by the movm instruction.  This is redundant with movm_args, but we
58      add it to the hash table to avoid computing it over and over.  */
59   unsigned char movm_stack_size;
60
61 /* When set, convert all "call" instructions to this target into "calls"
62    instructions.  */
63 #define MN10300_CONVERT_CALL_TO_CALLS 0x1
64
65 /* Used to mark functions which have had redundant parts of their
66    prologue deleted.  */
67 #define MN10300_DELETED_PROLOGUE_BYTES 0x2
68   unsigned char flags;
69
70   /* Calculated value.  */
71   bfd_vma value;
72 };
73
74 /* We derive a hash table from the main elf linker hash table so
75    we can store state variables and a secondary hash table without
76    resorting to global variables.  */
77 struct elf32_mn10300_link_hash_table
78 {
79   /* The main hash table.  */
80   struct elf_link_hash_table root;
81
82   /* A hash table for static functions.  We could derive a new hash table
83      instead of using the full elf32_mn10300_link_hash_table if we wanted
84      to save some memory.  */
85   struct elf32_mn10300_link_hash_table *static_hash_table;
86
87   /* Random linker state flags.  */
88 #define MN10300_HASH_ENTRIES_INITIALIZED 0x1
89   char flags;
90 };
91
92 #ifndef streq
93 #define streq(a, b) (strcmp ((a),(b)) == 0)
94 #endif
95
96 /* For MN10300 linker hash table.  */
97
98 /* Get the MN10300 ELF linker hash table from a link_info structure.  */
99
100 #define elf32_mn10300_hash_table(p) \
101   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
102   == MN10300_ELF_DATA ? ((struct elf32_mn10300_link_hash_table *) ((p)->hash)) : NULL)
103
104 #define elf32_mn10300_link_hash_traverse(table, func, info)             \
105   (elf_link_hash_traverse                                               \
106    (&(table)->root,                                                     \
107     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),    \
108     (info)))
109
110 static reloc_howto_type elf_mn10300_howto_table[] =
111 {
112   /* Dummy relocation.  Does nothing.  */
113   HOWTO (R_MN10300_NONE,
114          0,
115          2,
116          16,
117          FALSE,
118          0,
119          complain_overflow_bitfield,
120          bfd_elf_generic_reloc,
121          "R_MN10300_NONE",
122          FALSE,
123          0,
124          0,
125          FALSE),
126   /* Standard 32 bit reloc.  */
127   HOWTO (R_MN10300_32,
128          0,
129          2,
130          32,
131          FALSE,
132          0,
133          complain_overflow_bitfield,
134          bfd_elf_generic_reloc,
135          "R_MN10300_32",
136          FALSE,
137          0xffffffff,
138          0xffffffff,
139          FALSE),
140   /* Standard 16 bit reloc.  */
141   HOWTO (R_MN10300_16,
142          0,
143          1,
144          16,
145          FALSE,
146          0,
147          complain_overflow_bitfield,
148          bfd_elf_generic_reloc,
149          "R_MN10300_16",
150          FALSE,
151          0xffff,
152          0xffff,
153          FALSE),
154   /* Standard 8 bit reloc.  */
155   HOWTO (R_MN10300_8,
156          0,
157          0,
158          8,
159          FALSE,
160          0,
161          complain_overflow_bitfield,
162          bfd_elf_generic_reloc,
163          "R_MN10300_8",
164          FALSE,
165          0xff,
166          0xff,
167          FALSE),
168   /* Standard 32bit pc-relative reloc.  */
169   HOWTO (R_MN10300_PCREL32,
170          0,
171          2,
172          32,
173          TRUE,
174          0,
175          complain_overflow_bitfield,
176          bfd_elf_generic_reloc,
177          "R_MN10300_PCREL32",
178          FALSE,
179          0xffffffff,
180          0xffffffff,
181          TRUE),
182   /* Standard 16bit pc-relative reloc.  */
183   HOWTO (R_MN10300_PCREL16,
184          0,
185          1,
186          16,
187          TRUE,
188          0,
189          complain_overflow_bitfield,
190          bfd_elf_generic_reloc,
191          "R_MN10300_PCREL16",
192          FALSE,
193          0xffff,
194          0xffff,
195          TRUE),
196   /* Standard 8 pc-relative reloc.  */
197   HOWTO (R_MN10300_PCREL8,
198          0,
199          0,
200          8,
201          TRUE,
202          0,
203          complain_overflow_bitfield,
204          bfd_elf_generic_reloc,
205          "R_MN10300_PCREL8",
206          FALSE,
207          0xff,
208          0xff,
209          TRUE),
210
211   /* GNU extension to record C++ vtable hierarchy.  */
212   HOWTO (R_MN10300_GNU_VTINHERIT, /* type */
213          0,                     /* rightshift */
214          0,                     /* size (0 = byte, 1 = short, 2 = long) */
215          0,                     /* bitsize */
216          FALSE,                 /* pc_relative */
217          0,                     /* bitpos */
218          complain_overflow_dont, /* complain_on_overflow */
219          NULL,                  /* special_function */
220          "R_MN10300_GNU_VTINHERIT", /* name */
221          FALSE,                 /* partial_inplace */
222          0,                     /* src_mask */
223          0,                     /* dst_mask */
224          FALSE),                /* pcrel_offset */
225
226   /* GNU extension to record C++ vtable member usage */
227   HOWTO (R_MN10300_GNU_VTENTRY, /* type */
228          0,                     /* rightshift */
229          0,                     /* size (0 = byte, 1 = short, 2 = long) */
230          0,                     /* bitsize */
231          FALSE,                 /* pc_relative */
232          0,                     /* bitpos */
233          complain_overflow_dont, /* complain_on_overflow */
234          NULL,                  /* special_function */
235          "R_MN10300_GNU_VTENTRY", /* name */
236          FALSE,                 /* partial_inplace */
237          0,                     /* src_mask */
238          0,                     /* dst_mask */
239          FALSE),                /* pcrel_offset */
240
241   /* Standard 24 bit reloc.  */
242   HOWTO (R_MN10300_24,
243          0,
244          2,
245          24,
246          FALSE,
247          0,
248          complain_overflow_bitfield,
249          bfd_elf_generic_reloc,
250          "R_MN10300_24",
251          FALSE,
252          0xffffff,
253          0xffffff,
254          FALSE),
255   HOWTO (R_MN10300_GOTPC32,     /* type */
256          0,                     /* rightshift */
257          2,                     /* size (0 = byte, 1 = short, 2 = long) */
258          32,                    /* bitsize */
259          TRUE,                  /* pc_relative */
260          0,                     /* bitpos */
261          complain_overflow_bitfield, /* complain_on_overflow */
262          bfd_elf_generic_reloc, /* */
263          "R_MN10300_GOTPC32",   /* name */
264          FALSE,                 /* partial_inplace */
265          0xffffffff,            /* src_mask */
266          0xffffffff,            /* dst_mask */
267          TRUE),                 /* pcrel_offset */
268
269   HOWTO (R_MN10300_GOTPC16,     /* type */
270          0,                     /* rightshift */
271          1,                     /* size (0 = byte, 1 = short, 2 = long) */
272          16,                    /* bitsize */
273          TRUE,                  /* pc_relative */
274          0,                     /* bitpos */
275          complain_overflow_bitfield, /* complain_on_overflow */
276          bfd_elf_generic_reloc, /* */
277          "R_MN10300_GOTPC16",   /* name */
278          FALSE,                 /* partial_inplace */
279          0xffff,                /* src_mask */
280          0xffff,                /* dst_mask */
281          TRUE),                 /* pcrel_offset */
282
283   HOWTO (R_MN10300_GOTOFF32,    /* type */
284          0,                     /* rightshift */
285          2,                     /* size (0 = byte, 1 = short, 2 = long) */
286          32,                    /* bitsize */
287          FALSE,                 /* pc_relative */
288          0,                     /* bitpos */
289          complain_overflow_bitfield, /* complain_on_overflow */
290          bfd_elf_generic_reloc, /* */
291          "R_MN10300_GOTOFF32",  /* name */
292          FALSE,                 /* partial_inplace */
293          0xffffffff,            /* src_mask */
294          0xffffffff,            /* dst_mask */
295          FALSE),                /* pcrel_offset */
296
297   HOWTO (R_MN10300_GOTOFF24,    /* type */
298          0,                     /* rightshift */
299          2,                     /* size (0 = byte, 1 = short, 2 = long) */
300          24,                    /* bitsize */
301          FALSE,                 /* pc_relative */
302          0,                     /* bitpos */
303          complain_overflow_bitfield, /* complain_on_overflow */
304          bfd_elf_generic_reloc, /* */
305          "R_MN10300_GOTOFF24",  /* name */
306          FALSE,                 /* partial_inplace */
307          0xffffff,              /* src_mask */
308          0xffffff,              /* dst_mask */
309          FALSE),                /* pcrel_offset */
310
311   HOWTO (R_MN10300_GOTOFF16,    /* type */
312          0,                     /* rightshift */
313          1,                     /* size (0 = byte, 1 = short, 2 = long) */
314          16,                    /* bitsize */
315          FALSE,                 /* pc_relative */
316          0,                     /* bitpos */
317          complain_overflow_bitfield, /* complain_on_overflow */
318          bfd_elf_generic_reloc, /* */
319          "R_MN10300_GOTOFF16",  /* name */
320          FALSE,                 /* partial_inplace */
321          0xffff,                /* src_mask */
322          0xffff,                /* dst_mask */
323          FALSE),                /* pcrel_offset */
324
325   HOWTO (R_MN10300_PLT32,       /* type */
326          0,                     /* rightshift */
327          2,                     /* size (0 = byte, 1 = short, 2 = long) */
328          32,                    /* bitsize */
329          TRUE,                  /* pc_relative */
330          0,                     /* bitpos */
331          complain_overflow_bitfield, /* complain_on_overflow */
332          bfd_elf_generic_reloc, /* */
333          "R_MN10300_PLT32",     /* name */
334          FALSE,                 /* partial_inplace */
335          0xffffffff,            /* src_mask */
336          0xffffffff,            /* dst_mask */
337          TRUE),                 /* pcrel_offset */
338
339   HOWTO (R_MN10300_PLT16,       /* type */
340          0,                     /* rightshift */
341          1,                     /* size (0 = byte, 1 = short, 2 = long) */
342          16,                    /* bitsize */
343          TRUE,                  /* pc_relative */
344          0,                     /* bitpos */
345          complain_overflow_bitfield, /* complain_on_overflow */
346          bfd_elf_generic_reloc, /* */
347          "R_MN10300_PLT16",     /* name */
348          FALSE,                 /* partial_inplace */
349          0xffff,                /* src_mask */
350          0xffff,                /* dst_mask */
351          TRUE),                 /* pcrel_offset */
352
353   HOWTO (R_MN10300_GOT32,       /* type */
354          0,                     /* rightshift */
355          2,                     /* size (0 = byte, 1 = short, 2 = long) */
356          32,                    /* bitsize */
357          FALSE,                 /* pc_relative */
358          0,                     /* bitpos */
359          complain_overflow_bitfield, /* complain_on_overflow */
360          bfd_elf_generic_reloc, /* */
361          "R_MN10300_GOT32",     /* name */
362          FALSE,                 /* partial_inplace */
363          0xffffffff,            /* src_mask */
364          0xffffffff,            /* dst_mask */
365          FALSE),                /* pcrel_offset */
366
367   HOWTO (R_MN10300_GOT24,       /* type */
368          0,                     /* rightshift */
369          2,                     /* size (0 = byte, 1 = short, 2 = long) */
370          24,                    /* bitsize */
371          FALSE,                 /* pc_relative */
372          0,                     /* bitpos */
373          complain_overflow_bitfield, /* complain_on_overflow */
374          bfd_elf_generic_reloc, /* */
375          "R_MN10300_GOT24",     /* name */
376          FALSE,                 /* partial_inplace */
377          0xffffffff,            /* src_mask */
378          0xffffffff,            /* dst_mask */
379          FALSE),                /* pcrel_offset */
380
381   HOWTO (R_MN10300_GOT16,       /* type */
382          0,                     /* rightshift */
383          1,                     /* size (0 = byte, 1 = short, 2 = long) */
384          16,                    /* bitsize */
385          FALSE,                 /* pc_relative */
386          0,                     /* bitpos */
387          complain_overflow_bitfield, /* complain_on_overflow */
388          bfd_elf_generic_reloc, /* */
389          "R_MN10300_GOT16",     /* name */
390          FALSE,                 /* partial_inplace */
391          0xffffffff,            /* src_mask */
392          0xffffffff,            /* dst_mask */
393          FALSE),                /* pcrel_offset */
394
395   HOWTO (R_MN10300_COPY,        /* type */
396          0,                     /* rightshift */
397          2,                     /* size (0 = byte, 1 = short, 2 = long) */
398          32,                    /* bitsize */
399          FALSE,                 /* pc_relative */
400          0,                     /* bitpos */
401          complain_overflow_bitfield, /* complain_on_overflow */
402          bfd_elf_generic_reloc, /* */
403          "R_MN10300_COPY",              /* name */
404          FALSE,                 /* partial_inplace */
405          0xffffffff,            /* src_mask */
406          0xffffffff,            /* dst_mask */
407          FALSE),                /* pcrel_offset */
408
409   HOWTO (R_MN10300_GLOB_DAT,    /* type */
410          0,                     /* rightshift */
411          2,                     /* size (0 = byte, 1 = short, 2 = long) */
412          32,                    /* bitsize */
413          FALSE,                 /* pc_relative */
414          0,                     /* bitpos */
415          complain_overflow_bitfield, /* complain_on_overflow */
416          bfd_elf_generic_reloc, /* */
417          "R_MN10300_GLOB_DAT",  /* name */
418          FALSE,                 /* partial_inplace */
419          0xffffffff,            /* src_mask */
420          0xffffffff,            /* dst_mask */
421          FALSE),                /* pcrel_offset */
422
423   HOWTO (R_MN10300_JMP_SLOT,    /* type */
424          0,                     /* rightshift */
425          2,                     /* size (0 = byte, 1 = short, 2 = long) */
426          32,                    /* bitsize */
427          FALSE,                 /* pc_relative */
428          0,                     /* bitpos */
429          complain_overflow_bitfield, /* complain_on_overflow */
430          bfd_elf_generic_reloc, /* */
431          "R_MN10300_JMP_SLOT",  /* name */
432          FALSE,                 /* partial_inplace */
433          0xffffffff,            /* src_mask */
434          0xffffffff,            /* dst_mask */
435          FALSE),                /* pcrel_offset */
436
437   HOWTO (R_MN10300_RELATIVE,    /* type */
438          0,                     /* rightshift */
439          2,                     /* size (0 = byte, 1 = short, 2 = long) */
440          32,                    /* bitsize */
441          FALSE,                 /* pc_relative */
442          0,                     /* bitpos */
443          complain_overflow_bitfield, /* complain_on_overflow */
444          bfd_elf_generic_reloc, /* */
445          "R_MN10300_RELATIVE",  /* name */
446          FALSE,                 /* partial_inplace */
447          0xffffffff,            /* src_mask */
448          0xffffffff,            /* dst_mask */
449          FALSE),                /* pcrel_offset */
450
451   EMPTY_HOWTO (24),
452   EMPTY_HOWTO (25),
453   EMPTY_HOWTO (26),
454   EMPTY_HOWTO (27),
455   EMPTY_HOWTO (28),
456   EMPTY_HOWTO (29),
457   EMPTY_HOWTO (30),
458   EMPTY_HOWTO (31),
459   EMPTY_HOWTO (32),
460   
461   HOWTO (R_MN10300_SYM_DIFF,    /* type */
462          0,                     /* rightshift */
463          2,                     /* size (0 = byte, 1 = short, 2 = long) */
464          32,                    /* bitsize */
465          FALSE,                 /* pc_relative */
466          0,                     /* bitpos */
467          complain_overflow_dont,/* complain_on_overflow */
468          NULL,                  /* special handler.  */
469          "R_MN10300_SYM_DIFF",  /* name */
470          FALSE,                 /* partial_inplace */
471          0xffffffff,            /* src_mask */
472          0xffffffff,            /* dst_mask */
473          FALSE),                /* pcrel_offset */
474
475   HOWTO (R_MN10300_ALIGN,       /* type */
476          0,                     /* rightshift */
477          0,                     /* size (0 = byte, 1 = short, 2 = long) */
478          32,                    /* bitsize */
479          FALSE,                 /* pc_relative */
480          0,                     /* bitpos */
481          complain_overflow_dont,/* complain_on_overflow */
482          NULL,                  /* special handler.  */
483          "R_MN10300_ALIGN",     /* name */
484          FALSE,                 /* partial_inplace */
485          0,                     /* src_mask */
486          0,                     /* dst_mask */
487          FALSE)                 /* pcrel_offset */
488 };
489
490 struct mn10300_reloc_map
491 {
492   bfd_reloc_code_real_type bfd_reloc_val;
493   unsigned char elf_reloc_val;
494 };
495
496 static const struct mn10300_reloc_map mn10300_reloc_map[] =
497 {
498   { BFD_RELOC_NONE, R_MN10300_NONE, },
499   { BFD_RELOC_32, R_MN10300_32, },
500   { BFD_RELOC_16, R_MN10300_16, },
501   { BFD_RELOC_8, R_MN10300_8, },
502   { BFD_RELOC_32_PCREL, R_MN10300_PCREL32, },
503   { BFD_RELOC_16_PCREL, R_MN10300_PCREL16, },
504   { BFD_RELOC_8_PCREL, R_MN10300_PCREL8, },
505   { BFD_RELOC_24, R_MN10300_24, },
506   { BFD_RELOC_VTABLE_INHERIT, R_MN10300_GNU_VTINHERIT },
507   { BFD_RELOC_VTABLE_ENTRY, R_MN10300_GNU_VTENTRY },
508   { BFD_RELOC_32_GOT_PCREL, R_MN10300_GOTPC32 },
509   { BFD_RELOC_16_GOT_PCREL, R_MN10300_GOTPC16 },
510   { BFD_RELOC_32_GOTOFF, R_MN10300_GOTOFF32 },
511   { BFD_RELOC_MN10300_GOTOFF24, R_MN10300_GOTOFF24 },
512   { BFD_RELOC_16_GOTOFF, R_MN10300_GOTOFF16 },
513   { BFD_RELOC_32_PLT_PCREL, R_MN10300_PLT32 },
514   { BFD_RELOC_16_PLT_PCREL, R_MN10300_PLT16 },
515   { BFD_RELOC_MN10300_GOT32, R_MN10300_GOT32 },
516   { BFD_RELOC_MN10300_GOT24, R_MN10300_GOT24 },
517   { BFD_RELOC_MN10300_GOT16, R_MN10300_GOT16 },
518   { BFD_RELOC_MN10300_COPY, R_MN10300_COPY },
519   { BFD_RELOC_MN10300_GLOB_DAT, R_MN10300_GLOB_DAT },
520   { BFD_RELOC_MN10300_JMP_SLOT, R_MN10300_JMP_SLOT },
521   { BFD_RELOC_MN10300_RELATIVE, R_MN10300_RELATIVE },
522   { BFD_RELOC_MN10300_SYM_DIFF, R_MN10300_SYM_DIFF },
523   { BFD_RELOC_MN10300_ALIGN, R_MN10300_ALIGN }
524 };
525
526 /* Create the GOT section.  */
527
528 static bfd_boolean
529 _bfd_mn10300_elf_create_got_section (bfd * abfd,
530                                      struct bfd_link_info * info)
531 {
532   flagword   flags;
533   flagword   pltflags;
534   asection * s;
535   struct elf_link_hash_entry * h;
536   const struct elf_backend_data * bed = get_elf_backend_data (abfd);
537   int ptralign;
538
539   /* This function may be called more than once.  */
540   if (bfd_get_section_by_name (abfd, ".got") != NULL)
541     return TRUE;
542
543   switch (bed->s->arch_size)
544     {
545     case 32:
546       ptralign = 2;
547       break;
548
549     case 64:
550       ptralign = 3;
551       break;
552
553     default:
554       bfd_set_error (bfd_error_bad_value);
555       return FALSE;
556     }
557
558   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
559            | SEC_LINKER_CREATED);
560
561   pltflags = flags;
562   pltflags |= SEC_CODE;
563   if (bed->plt_not_loaded)
564     pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
565   if (bed->plt_readonly)
566     pltflags |= SEC_READONLY;
567
568   s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
569   if (s == NULL
570       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
571     return FALSE;
572
573   /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
574      .plt section.  */
575   if (bed->want_plt_sym)
576     {
577       h = _bfd_elf_define_linkage_sym (abfd, info, s,
578                                        "_PROCEDURE_LINKAGE_TABLE_");
579       elf_hash_table (info)->hplt = h;
580       if (h == NULL)
581         return FALSE;
582     }
583
584   s = bfd_make_section_with_flags (abfd, ".got", flags);
585   if (s == NULL
586       || ! bfd_set_section_alignment (abfd, s, ptralign))
587     return FALSE;
588
589   if (bed->want_got_plt)
590     {
591       s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
592       if (s == NULL
593           || ! bfd_set_section_alignment (abfd, s, ptralign))
594         return FALSE;
595     }
596
597   /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
598      (or .got.plt) section.  We don't do this in the linker script
599      because we don't want to define the symbol if we are not creating
600      a global offset table.  */
601   h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
602   elf_hash_table (info)->hgot = h;
603   if (h == NULL)
604     return FALSE;
605
606   /* The first bit of the global offset table is the header.  */
607   s->size += bed->got_header_size;
608
609   return TRUE;
610 }
611
612 static reloc_howto_type *
613 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
614                                  bfd_reloc_code_real_type code)
615 {
616   unsigned int i;
617
618   for (i = ARRAY_SIZE (mn10300_reloc_map); i--;)
619     if (mn10300_reloc_map[i].bfd_reloc_val == code)
620       return &elf_mn10300_howto_table[mn10300_reloc_map[i].elf_reloc_val];
621
622   return NULL;
623 }
624
625 static reloc_howto_type *
626 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
627                                  const char *r_name)
628 {
629   unsigned int i;
630
631   for (i = ARRAY_SIZE (elf_mn10300_howto_table); i--;)
632     if (elf_mn10300_howto_table[i].name != NULL
633         && strcasecmp (elf_mn10300_howto_table[i].name, r_name) == 0)
634       return elf_mn10300_howto_table + i;
635
636   return NULL;
637 }
638
639 /* Set the howto pointer for an MN10300 ELF reloc.  */
640
641 static void
642 mn10300_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
643                        arelent *cache_ptr,
644                        Elf_Internal_Rela *dst)
645 {
646   unsigned int r_type;
647
648   r_type = ELF32_R_TYPE (dst->r_info);
649   BFD_ASSERT (r_type < (unsigned int) R_MN10300_MAX);
650   cache_ptr->howto = elf_mn10300_howto_table + r_type;
651 }
652
653 /* Look through the relocs for a section during the first phase.
654    Since we don't do .gots or .plts, we just need to consider the
655    virtual table relocs for gc.  */
656
657 static bfd_boolean
658 mn10300_elf_check_relocs (bfd *abfd,
659                           struct bfd_link_info *info,
660                           asection *sec,
661                           const Elf_Internal_Rela *relocs)
662 {
663   bfd_boolean sym_diff_reloc_seen;
664   Elf_Internal_Shdr *symtab_hdr;
665   Elf_Internal_Sym * isymbuf = NULL;
666   struct elf_link_hash_entry **sym_hashes;
667   const Elf_Internal_Rela *rel;
668   const Elf_Internal_Rela *rel_end;
669   bfd *      dynobj;
670   bfd_vma *  local_got_offsets;
671   asection * sgot;
672   asection * srelgot;
673   asection * sreloc;
674   bfd_boolean result = FALSE;
675
676   sgot    = NULL;
677   srelgot = NULL;
678   sreloc  = NULL;
679
680   if (info->relocatable)
681     return TRUE;
682
683   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
684   isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
685   sym_hashes = elf_sym_hashes (abfd);
686
687   dynobj = elf_hash_table (info)->dynobj;
688   local_got_offsets = elf_local_got_offsets (abfd);
689   rel_end = relocs + sec->reloc_count;
690   sym_diff_reloc_seen = FALSE;
691
692   for (rel = relocs; rel < rel_end; rel++)
693     {
694       struct elf_link_hash_entry *h;
695       unsigned long r_symndx;
696       unsigned int r_type;
697
698       r_symndx = ELF32_R_SYM (rel->r_info);
699       if (r_symndx < symtab_hdr->sh_info)
700         h = NULL;
701       else
702         {
703           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
704           while (h->root.type == bfd_link_hash_indirect
705                  || h->root.type == bfd_link_hash_warning)
706             h = (struct elf_link_hash_entry *) h->root.u.i.link;
707         }
708
709       r_type = ELF32_R_TYPE (rel->r_info);
710
711       /* Some relocs require a global offset table.  */
712       if (dynobj == NULL)
713         {
714           switch (r_type)
715             {
716             case R_MN10300_GOT32:
717             case R_MN10300_GOT24:
718             case R_MN10300_GOT16:
719             case R_MN10300_GOTOFF32:
720             case R_MN10300_GOTOFF24:
721             case R_MN10300_GOTOFF16:
722             case R_MN10300_GOTPC32:
723             case R_MN10300_GOTPC16:
724               elf_hash_table (info)->dynobj = dynobj = abfd;
725               if (! _bfd_mn10300_elf_create_got_section (dynobj, info))
726                 goto fail;
727               break;
728
729             default:
730               break;
731             }
732         }
733
734       switch (r_type)
735         {
736         /* This relocation describes the C++ object vtable hierarchy.
737            Reconstruct it for later use during GC.  */
738         case R_MN10300_GNU_VTINHERIT:
739           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
740             goto fail;
741           break;
742
743         /* This relocation describes which C++ vtable entries are actually
744            used.  Record for later use during GC.  */
745         case R_MN10300_GNU_VTENTRY:
746           BFD_ASSERT (h != NULL);
747           if (h != NULL
748               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
749             goto fail;
750           break;
751
752         case R_MN10300_GOT32:
753         case R_MN10300_GOT24:
754         case R_MN10300_GOT16:
755           /* This symbol requires a global offset table entry.  */
756
757           if (sgot == NULL)
758             {
759               sgot = bfd_get_section_by_name (dynobj, ".got");
760               BFD_ASSERT (sgot != NULL);
761             }
762
763           if (srelgot == NULL
764               && (h != NULL || info->shared))
765             {
766               srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
767               if (srelgot == NULL)
768                 {
769                   srelgot = bfd_make_section_with_flags (dynobj,
770                                                          ".rela.got",
771                                                          (SEC_ALLOC
772                                                           | SEC_LOAD
773                                                           | SEC_HAS_CONTENTS
774                                                           | SEC_IN_MEMORY
775                                                           | SEC_LINKER_CREATED
776                                                           | SEC_READONLY));
777                   if (srelgot == NULL
778                       || ! bfd_set_section_alignment (dynobj, srelgot, 2))
779                     goto fail;
780                 }
781             }
782
783           if (h != NULL)
784             {
785               if (h->got.offset != (bfd_vma) -1)
786                 /* We have already allocated space in the .got.  */
787                 break;
788
789               h->got.offset = sgot->size;
790
791               /* Make sure this symbol is output as a dynamic symbol.  */
792               if (h->dynindx == -1)
793                 {
794                   if (! bfd_elf_link_record_dynamic_symbol (info, h))
795                     goto fail;
796                 }
797
798               srelgot->size += sizeof (Elf32_External_Rela);
799             }
800           else
801             {
802               /* This is a global offset table entry for a local
803                  symbol.  */
804               if (local_got_offsets == NULL)
805                 {
806                   size_t       size;
807                   unsigned int i;
808
809                   size = symtab_hdr->sh_info * sizeof (bfd_vma);
810                   local_got_offsets = bfd_alloc (abfd, size);
811
812                   if (local_got_offsets == NULL)
813                     goto fail;
814
815                   elf_local_got_offsets (abfd) = local_got_offsets;
816
817                   for (i = 0; i < symtab_hdr->sh_info; i++)
818                     local_got_offsets[i] = (bfd_vma) -1;
819                 }
820
821               if (local_got_offsets[r_symndx] != (bfd_vma) -1)
822                 /* We have already allocated space in the .got.  */
823                 break;
824
825               local_got_offsets[r_symndx] = sgot->size;
826
827               if (info->shared)
828                 /* If we are generating a shared object, we need to
829                    output a R_MN10300_RELATIVE reloc so that the dynamic
830                    linker can adjust this GOT entry.  */
831                 srelgot->size += sizeof (Elf32_External_Rela);
832             }
833
834           sgot->size += 4;
835           break;
836
837         case R_MN10300_PLT32:
838         case R_MN10300_PLT16:
839           /* This symbol requires a procedure linkage table entry.  We
840              actually build the entry in adjust_dynamic_symbol,
841              because this might be a case of linking PIC code which is
842              never referenced by a dynamic object, in which case we
843              don't need to generate a procedure linkage table entry
844              after all.  */
845
846           /* If this is a local symbol, we resolve it directly without
847              creating a procedure linkage table entry.  */
848           if (h == NULL)
849             continue;
850
851           if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
852               || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
853             break;
854
855           h->needs_plt = 1;
856           break;
857
858         case R_MN10300_24:
859         case R_MN10300_16:
860         case R_MN10300_8:
861         case R_MN10300_PCREL32:
862         case R_MN10300_PCREL16:
863         case R_MN10300_PCREL8:
864           if (h != NULL)
865             h->non_got_ref = 1;
866           break;
867
868         case R_MN10300_SYM_DIFF:
869           sym_diff_reloc_seen = TRUE;
870           break;
871
872         case R_MN10300_32:
873           if (h != NULL)
874             h->non_got_ref = 1;
875
876           /* If we are creating a shared library, then we
877              need to copy the reloc into the shared library.  */
878           if (info->shared
879               && (sec->flags & SEC_ALLOC) != 0
880               /* Do not generate a dynamic reloc for a
881                  reloc associated with a SYM_DIFF operation.  */
882               && ! sym_diff_reloc_seen)
883             {
884               asection * sym_section = NULL;
885
886               /* Find the section containing the
887                  symbol involved in the relocation.  */
888               if (h == NULL)
889                 {
890                   Elf_Internal_Sym * isym;
891
892                   if (isymbuf == NULL)
893                     isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
894                                                     symtab_hdr->sh_info, 0,
895                                                     NULL, NULL, NULL);
896                   if (isymbuf)
897                     {
898                       isym = isymbuf + r_symndx;
899                       /* All we care about is whether this local symbol is absolute.  */
900                       if (isym->st_shndx == SHN_ABS)
901                         sym_section = bfd_abs_section_ptr;
902                     }
903                 }
904               else
905                 {
906                   if (h->root.type == bfd_link_hash_defined
907                       || h->root.type == bfd_link_hash_defweak)
908                     sym_section = h->root.u.def.section;
909                 }
910
911               /* If the symbol is absolute then the relocation can
912                  be resolved during linking and there is no need for
913                  a dynamic reloc.  */
914               if (sym_section != bfd_abs_section_ptr)
915                 {
916                   /* When creating a shared object, we must copy these
917                      reloc types into the output file.  We create a reloc
918                      section in dynobj and make room for this reloc.  */
919                   if (sreloc == NULL)
920                     {
921                       sreloc = _bfd_elf_make_dynamic_reloc_section
922                         (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
923                       if (sreloc == NULL)
924                         goto fail;
925                     }
926
927                   sreloc->size += sizeof (Elf32_External_Rela);
928                 }
929             }
930
931           break;
932         }
933
934       if (ELF32_R_TYPE (rel->r_info) != R_MN10300_SYM_DIFF)
935         sym_diff_reloc_seen = FALSE;
936     }
937
938   result = TRUE;
939  fail:
940   if (isymbuf != NULL)
941     free (isymbuf);
942
943   return result;
944 }
945
946 /* Return the section that should be marked against GC for a given
947    relocation.  */
948
949 static asection *
950 mn10300_elf_gc_mark_hook (asection *sec,
951                           struct bfd_link_info *info,
952                           Elf_Internal_Rela *rel,
953                           struct elf_link_hash_entry *h,
954                           Elf_Internal_Sym *sym)
955 {
956   if (h != NULL)
957     switch (ELF32_R_TYPE (rel->r_info))
958       {
959       case R_MN10300_GNU_VTINHERIT:
960       case R_MN10300_GNU_VTENTRY:
961         return NULL;
962       }
963
964   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
965 }
966
967 /* Perform a relocation as part of a final link.  */
968
969 static bfd_reloc_status_type
970 mn10300_elf_final_link_relocate (reloc_howto_type *howto,
971                                  bfd *input_bfd,
972                                  bfd *output_bfd ATTRIBUTE_UNUSED,
973                                  asection *input_section,
974                                  bfd_byte *contents,
975                                  bfd_vma offset,
976                                  bfd_vma value,
977                                  bfd_vma addend,
978                                  struct elf_link_hash_entry * h,
979                                  unsigned long symndx,
980                                  struct bfd_link_info *info,
981                                  asection *sym_sec ATTRIBUTE_UNUSED,
982                                  int is_local ATTRIBUTE_UNUSED)
983 {
984   static asection *  sym_diff_section;
985   static bfd_vma     sym_diff_value;
986   bfd_boolean is_sym_diff_reloc;
987   unsigned long r_type = howto->type;
988   bfd_byte * hit_data = contents + offset;
989   bfd *      dynobj;
990   asection * sgot;
991   asection * splt;
992   asection * sreloc;
993
994   dynobj = elf_hash_table (info)->dynobj;
995   sgot   = NULL;
996   splt   = NULL;
997   sreloc = NULL;
998
999   switch (r_type)
1000     {
1001     case R_MN10300_24:
1002     case R_MN10300_16:
1003     case R_MN10300_8:
1004     case R_MN10300_PCREL8:
1005     case R_MN10300_PCREL16:
1006     case R_MN10300_PCREL32:
1007     case R_MN10300_GOTOFF32:
1008     case R_MN10300_GOTOFF24:
1009     case R_MN10300_GOTOFF16:
1010       if (info->shared
1011           && (input_section->flags & SEC_ALLOC) != 0
1012           && h != NULL
1013           && ! SYMBOL_REFERENCES_LOCAL (info, h))
1014         return bfd_reloc_dangerous;
1015     }
1016
1017   is_sym_diff_reloc = FALSE;
1018   if (sym_diff_section != NULL)
1019     {
1020       BFD_ASSERT (sym_diff_section == input_section);
1021
1022       switch (r_type)
1023         {
1024         case R_MN10300_32:
1025         case R_MN10300_24:
1026         case R_MN10300_16:
1027         case R_MN10300_8:
1028           value -= sym_diff_value;
1029           /* If we are computing a 32-bit value for the location lists
1030              and the result is 0 then we add one to the value.  A zero
1031              value can result because of linker relaxation deleteing
1032              prologue instructions and using a value of 1 (for the begin
1033              and end offsets in the location list entry) results in a
1034              nul entry which does not prevent the following entries from
1035              being parsed.  */
1036           if (r_type == R_MN10300_32
1037               && value == 0
1038               && strcmp (input_section->name, ".debug_loc") == 0)
1039             value = 1;
1040           sym_diff_section = NULL;
1041           is_sym_diff_reloc = TRUE;
1042           break;
1043
1044         default:
1045           sym_diff_section = NULL;
1046           break;
1047         }
1048     }
1049
1050   switch (r_type)
1051     {
1052     case R_MN10300_SYM_DIFF:
1053       BFD_ASSERT (addend == 0);
1054       /* Cache the input section and value.
1055          The offset is unreliable, since relaxation may
1056          have reduced the following reloc's offset.  */
1057       sym_diff_section = input_section;
1058       sym_diff_value = value;
1059       return bfd_reloc_ok;
1060
1061     case R_MN10300_ALIGN:
1062     case R_MN10300_NONE:
1063       return bfd_reloc_ok;
1064
1065     case R_MN10300_32:
1066       if (info->shared
1067           /* Do not generate relocs when an R_MN10300_32 has been used
1068              with an R_MN10300_SYM_DIFF to compute a difference of two
1069              symbols.  */
1070           && is_sym_diff_reloc == FALSE
1071           /* Also, do not generate a reloc when the symbol associated
1072              with the R_MN10300_32 reloc is absolute - there is no
1073              need for a run time computation in this case.  */
1074           && sym_sec != bfd_abs_section_ptr
1075           /* If the section is not going to be allocated at load time
1076              then there is no need to generate relocs for it.  */
1077           && (input_section->flags & SEC_ALLOC) != 0)
1078         {
1079           Elf_Internal_Rela outrel;
1080           bfd_boolean skip, relocate;
1081
1082           /* When generating a shared object, these relocations are
1083              copied into the output file to be resolved at run
1084              time.  */
1085           if (sreloc == NULL)
1086             {
1087               sreloc = _bfd_elf_get_dynamic_reloc_section
1088                 (input_bfd, input_section, /*rela?*/ TRUE);
1089               if (sreloc == NULL)
1090                 return FALSE;
1091             }
1092
1093           skip = FALSE;
1094
1095           outrel.r_offset = _bfd_elf_section_offset (input_bfd, info,
1096                                                      input_section, offset);
1097           if (outrel.r_offset == (bfd_vma) -1)
1098             skip = TRUE;
1099
1100           outrel.r_offset += (input_section->output_section->vma
1101                               + input_section->output_offset);
1102
1103           if (skip)
1104             {
1105               memset (&outrel, 0, sizeof outrel);
1106               relocate = FALSE;
1107             }
1108           else
1109             {
1110               /* h->dynindx may be -1 if this symbol was marked to
1111                  become local.  */
1112               if (h == NULL
1113                   || SYMBOL_REFERENCES_LOCAL (info, h))
1114                 {
1115                   relocate = TRUE;
1116                   outrel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
1117                   outrel.r_addend = value + addend;
1118                 }
1119               else
1120                 {
1121                   BFD_ASSERT (h->dynindx != -1);
1122                   relocate = FALSE;
1123                   outrel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_32);
1124                   outrel.r_addend = value + addend;
1125                 }
1126             }
1127
1128           bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1129                                      (bfd_byte *) (((Elf32_External_Rela *) sreloc->contents)
1130                                                    + sreloc->reloc_count));
1131           ++sreloc->reloc_count;
1132
1133           /* If this reloc is against an external symbol, we do
1134              not want to fiddle with the addend.  Otherwise, we
1135              need to include the symbol value so that it becomes
1136              an addend for the dynamic reloc.  */
1137           if (! relocate)
1138             return bfd_reloc_ok;
1139         }
1140       value += addend;
1141       bfd_put_32 (input_bfd, value, hit_data);
1142       return bfd_reloc_ok;
1143
1144     case R_MN10300_24:
1145       value += addend;
1146
1147       if ((long) value > 0x7fffff || (long) value < -0x800000)
1148         return bfd_reloc_overflow;
1149
1150       bfd_put_8 (input_bfd, value & 0xff, hit_data);
1151       bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
1152       bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
1153       return bfd_reloc_ok;
1154
1155     case R_MN10300_16:
1156       value += addend;
1157
1158       if ((long) value > 0x7fff || (long) value < -0x8000)
1159         return bfd_reloc_overflow;
1160
1161       bfd_put_16 (input_bfd, value, hit_data);
1162       return bfd_reloc_ok;
1163
1164     case R_MN10300_8:
1165       value += addend;
1166
1167       if ((long) value > 0x7f || (long) value < -0x80)
1168         return bfd_reloc_overflow;
1169
1170       bfd_put_8 (input_bfd, value, hit_data);
1171       return bfd_reloc_ok;
1172
1173     case R_MN10300_PCREL8:
1174       value -= (input_section->output_section->vma
1175                 + input_section->output_offset);
1176       value -= offset;
1177       value += addend;
1178
1179       if ((long) value > 0x7f || (long) value < -0x80)
1180         return bfd_reloc_overflow;
1181
1182       bfd_put_8 (input_bfd, value, hit_data);
1183       return bfd_reloc_ok;
1184
1185     case R_MN10300_PCREL16:
1186       value -= (input_section->output_section->vma
1187                 + input_section->output_offset);
1188       value -= offset;
1189       value += addend;
1190
1191       if ((long) value > 0x7fff || (long) value < -0x8000)
1192         return bfd_reloc_overflow;
1193
1194       bfd_put_16 (input_bfd, value, hit_data);
1195       return bfd_reloc_ok;
1196
1197     case R_MN10300_PCREL32:
1198       value -= (input_section->output_section->vma
1199                 + input_section->output_offset);
1200       value -= offset;
1201       value += addend;
1202
1203       bfd_put_32 (input_bfd, value, hit_data);
1204       return bfd_reloc_ok;
1205
1206     case R_MN10300_GNU_VTINHERIT:
1207     case R_MN10300_GNU_VTENTRY:
1208       return bfd_reloc_ok;
1209
1210     case R_MN10300_GOTPC32:
1211       /* Use global offset table as symbol value.  */
1212       value = bfd_get_section_by_name (dynobj,
1213                                        ".got")->output_section->vma;
1214       value -= (input_section->output_section->vma
1215                 + input_section->output_offset);
1216       value -= offset;
1217       value += addend;
1218
1219       bfd_put_32 (input_bfd, value, hit_data);
1220       return bfd_reloc_ok;
1221
1222     case R_MN10300_GOTPC16:
1223       /* Use global offset table as symbol value.  */
1224       value = bfd_get_section_by_name (dynobj,
1225                                        ".got")->output_section->vma;
1226       value -= (input_section->output_section->vma
1227                 + input_section->output_offset);
1228       value -= offset;
1229       value += addend;
1230
1231       if ((long) value > 0x7fff || (long) value < -0x8000)
1232         return bfd_reloc_overflow;
1233
1234       bfd_put_16 (input_bfd, value, hit_data);
1235       return bfd_reloc_ok;
1236
1237     case R_MN10300_GOTOFF32:
1238       value -= bfd_get_section_by_name (dynobj,
1239                                         ".got")->output_section->vma;
1240       value += addend;
1241
1242       bfd_put_32 (input_bfd, value, hit_data);
1243       return bfd_reloc_ok;
1244
1245     case R_MN10300_GOTOFF24:
1246       value -= bfd_get_section_by_name (dynobj,
1247                                         ".got")->output_section->vma;
1248       value += addend;
1249
1250       if ((long) value > 0x7fffff || (long) value < -0x800000)
1251         return bfd_reloc_overflow;
1252
1253       bfd_put_8 (input_bfd, value, hit_data);
1254       bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
1255       bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
1256       return bfd_reloc_ok;
1257
1258     case R_MN10300_GOTOFF16:
1259       value -= bfd_get_section_by_name (dynobj,
1260                                         ".got")->output_section->vma;
1261       value += addend;
1262
1263       if ((long) value > 0x7fff || (long) value < -0x8000)
1264         return bfd_reloc_overflow;
1265
1266       bfd_put_16 (input_bfd, value, hit_data);
1267       return bfd_reloc_ok;
1268
1269     case R_MN10300_PLT32:
1270       if (h != NULL
1271           && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
1272           && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
1273           && h->plt.offset != (bfd_vma) -1)
1274         {
1275           splt = bfd_get_section_by_name (dynobj, ".plt");
1276
1277           value = (splt->output_section->vma
1278                    + splt->output_offset
1279                    + h->plt.offset) - value;
1280         }
1281
1282       value -= (input_section->output_section->vma
1283                 + input_section->output_offset);
1284       value -= offset;
1285       value += addend;
1286
1287       bfd_put_32 (input_bfd, value, hit_data);
1288       return bfd_reloc_ok;
1289
1290     case R_MN10300_PLT16:
1291       if (h != NULL
1292           && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
1293           && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
1294           && h->plt.offset != (bfd_vma) -1)
1295         {
1296           splt = bfd_get_section_by_name (dynobj, ".plt");
1297
1298           value = (splt->output_section->vma
1299                    + splt->output_offset
1300                    + h->plt.offset) - value;
1301         }
1302
1303       value -= (input_section->output_section->vma
1304                 + input_section->output_offset);
1305       value -= offset;
1306       value += addend;
1307
1308       if ((long) value > 0x7fff || (long) value < -0x8000)
1309         return bfd_reloc_overflow;
1310
1311       bfd_put_16 (input_bfd, value, hit_data);
1312       return bfd_reloc_ok;
1313
1314     case R_MN10300_GOT32:
1315     case R_MN10300_GOT24:
1316     case R_MN10300_GOT16:
1317       {
1318         sgot = bfd_get_section_by_name (dynobj, ".got");
1319
1320           if (h != NULL)
1321             {
1322               bfd_vma off;
1323
1324               off = h->got.offset;
1325               BFD_ASSERT (off != (bfd_vma) -1);
1326
1327               if (! elf_hash_table (info)->dynamic_sections_created
1328                   || SYMBOL_REFERENCES_LOCAL (info, h))
1329                 /* This is actually a static link, or it is a
1330                    -Bsymbolic link and the symbol is defined
1331                    locally, or the symbol was forced to be local
1332                    because of a version file.  We must initialize
1333                    this entry in the global offset table.
1334
1335                    When doing a dynamic link, we create a .rela.got
1336                    relocation entry to initialize the value.  This
1337                    is done in the finish_dynamic_symbol routine.  */
1338                 bfd_put_32 (output_bfd, value,
1339                             sgot->contents + off);
1340
1341               value = sgot->output_offset + off;
1342             }
1343           else
1344             {
1345               bfd_vma off;
1346
1347               off = elf_local_got_offsets (input_bfd)[symndx];
1348
1349               bfd_put_32 (output_bfd, value, sgot->contents + off);
1350
1351               if (info->shared)
1352                 {
1353                   asection * srelgot;
1354                   Elf_Internal_Rela outrel;
1355
1356                   srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1357                   BFD_ASSERT (srelgot != NULL);
1358
1359                   outrel.r_offset = (sgot->output_section->vma
1360                                      + sgot->output_offset
1361                                      + off);
1362                   outrel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
1363                   outrel.r_addend = value;
1364                   bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1365                                              (bfd_byte *) (((Elf32_External_Rela *)
1366                                                             srelgot->contents)
1367                                                            + srelgot->reloc_count));
1368                   ++ srelgot->reloc_count;
1369                 }
1370
1371               value = sgot->output_offset + off;
1372             }
1373       }
1374
1375       value += addend;
1376
1377       if (r_type == R_MN10300_GOT32)
1378         {
1379           bfd_put_32 (input_bfd, value, hit_data);
1380           return bfd_reloc_ok;
1381         }
1382       else if (r_type == R_MN10300_GOT24)
1383         {
1384           if ((long) value > 0x7fffff || (long) value < -0x800000)
1385             return bfd_reloc_overflow;
1386
1387           bfd_put_8 (input_bfd, value & 0xff, hit_data);
1388           bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
1389           bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
1390           return bfd_reloc_ok;
1391         }
1392       else if (r_type == R_MN10300_GOT16)
1393         {
1394           if ((long) value > 0x7fff || (long) value < -0x8000)
1395             return bfd_reloc_overflow;
1396
1397           bfd_put_16 (input_bfd, value, hit_data);
1398           return bfd_reloc_ok;
1399         }
1400       /* Fall through.  */
1401
1402     default:
1403       return bfd_reloc_notsupported;
1404     }
1405 }
1406 \f
1407 /* Relocate an MN10300 ELF section.  */
1408
1409 static bfd_boolean
1410 mn10300_elf_relocate_section (bfd *output_bfd,
1411                               struct bfd_link_info *info,
1412                               bfd *input_bfd,
1413                               asection *input_section,
1414                               bfd_byte *contents,
1415                               Elf_Internal_Rela *relocs,
1416                               Elf_Internal_Sym *local_syms,
1417                               asection **local_sections)
1418 {
1419   Elf_Internal_Shdr *symtab_hdr;
1420   struct elf_link_hash_entry **sym_hashes;
1421   Elf_Internal_Rela *rel, *relend;
1422
1423   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1424   sym_hashes = elf_sym_hashes (input_bfd);
1425
1426   rel = relocs;
1427   relend = relocs + input_section->reloc_count;
1428   for (; rel < relend; rel++)
1429     {
1430       int r_type;
1431       reloc_howto_type *howto;
1432       unsigned long r_symndx;
1433       Elf_Internal_Sym *sym;
1434       asection *sec;
1435       struct elf32_mn10300_link_hash_entry *h;
1436       bfd_vma relocation;
1437       bfd_reloc_status_type r;
1438
1439       r_symndx = ELF32_R_SYM (rel->r_info);
1440       r_type = ELF32_R_TYPE (rel->r_info);
1441       howto = elf_mn10300_howto_table + r_type;
1442
1443       /* Just skip the vtable gc relocs.  */
1444       if (r_type == R_MN10300_GNU_VTINHERIT
1445           || r_type == R_MN10300_GNU_VTENTRY)
1446         continue;
1447
1448       h = NULL;
1449       sym = NULL;
1450       sec = NULL;
1451       if (r_symndx < symtab_hdr->sh_info)
1452         {
1453           sym = local_syms + r_symndx;
1454           sec = local_sections[r_symndx];
1455           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1456         }
1457       else
1458         {
1459           bfd_boolean unresolved_reloc;
1460           bfd_boolean warned;
1461           struct elf_link_hash_entry *hh;
1462
1463           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1464                                    r_symndx, symtab_hdr, sym_hashes,
1465                                    hh, sec, relocation,
1466                                    unresolved_reloc, warned);
1467
1468           h = (struct elf32_mn10300_link_hash_entry *) hh;
1469
1470           if ((h->root.root.type == bfd_link_hash_defined
1471               || h->root.root.type == bfd_link_hash_defweak)
1472               && (   r_type == R_MN10300_GOTPC32
1473                   || r_type == R_MN10300_GOTPC16
1474                   || ((   r_type == R_MN10300_PLT32
1475                        || r_type == R_MN10300_PLT16)
1476                       && ELF_ST_VISIBILITY (h->root.other) != STV_INTERNAL
1477                       && ELF_ST_VISIBILITY (h->root.other) != STV_HIDDEN
1478                       && h->root.plt.offset != (bfd_vma) -1)
1479                   || ((   r_type == R_MN10300_GOT32
1480                        || r_type == R_MN10300_GOT24
1481                        || r_type == R_MN10300_GOT16)
1482                       && elf_hash_table (info)->dynamic_sections_created
1483                       && !SYMBOL_REFERENCES_LOCAL (info, hh))
1484                   || (r_type == R_MN10300_32
1485                       /* _32 relocs in executables force _COPY relocs,
1486                          such that the address of the symbol ends up
1487                          being local.  */
1488                       && !info->executable
1489                       && !SYMBOL_REFERENCES_LOCAL (info, hh)
1490                       && ((input_section->flags & SEC_ALLOC) != 0
1491                           /* DWARF will emit R_MN10300_32 relocations
1492                              in its sections against symbols defined
1493                              externally in shared libraries.  We can't
1494                              do anything with them here.  */
1495                           || ((input_section->flags & SEC_DEBUGGING) != 0
1496                               && h->root.def_dynamic)))))
1497             /* In these cases, we don't need the relocation
1498                value.  We check specially because in some
1499                obscure cases sec->output_section will be NULL.  */
1500             relocation = 0;
1501
1502           else if (!info->relocatable && unresolved_reloc)
1503             (*_bfd_error_handler)
1504               (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
1505                input_bfd,
1506                input_section,
1507                (long) rel->r_offset,
1508                howto->name,
1509                h->root.root.root.string);
1510         }
1511
1512       if (sec != NULL && elf_discarded_section (sec))
1513         {
1514           /* For relocs against symbols from removed linkonce sections,
1515              or sections discarded by a linker script, we just want the
1516              section contents zeroed.  Avoid any special processing.  */
1517           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1518           rel->r_info = 0;
1519           rel->r_addend = 0;
1520           continue;
1521         }
1522
1523       if (info->relocatable)
1524         continue;
1525
1526       r = mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
1527                                            input_section,
1528                                            contents, rel->r_offset,
1529                                            relocation, rel->r_addend,
1530                                            (struct elf_link_hash_entry *) h,
1531                                            r_symndx,
1532                                            info, sec, h == NULL);
1533
1534       if (r != bfd_reloc_ok)
1535         {
1536           const char *name;
1537           const char *msg = NULL;
1538
1539           if (h != NULL)
1540             name = h->root.root.root.string;
1541           else
1542             {
1543               name = (bfd_elf_string_from_elf_section
1544                       (input_bfd, symtab_hdr->sh_link, sym->st_name));
1545               if (name == NULL || *name == '\0')
1546                 name = bfd_section_name (input_bfd, sec);
1547             }
1548
1549           switch (r)
1550             {
1551             case bfd_reloc_overflow:
1552               if (! ((*info->callbacks->reloc_overflow)
1553                      (info, (h ? &h->root.root : NULL), name,
1554                       howto->name, (bfd_vma) 0, input_bfd,
1555                       input_section, rel->r_offset)))
1556                 return FALSE;
1557               break;
1558
1559             case bfd_reloc_undefined:
1560               if (! ((*info->callbacks->undefined_symbol)
1561                      (info, name, input_bfd, input_section,
1562                       rel->r_offset, TRUE)))
1563                 return FALSE;
1564               break;
1565
1566             case bfd_reloc_outofrange:
1567               msg = _("internal error: out of range error");
1568               goto common_error;
1569
1570             case bfd_reloc_notsupported:
1571               msg = _("internal error: unsupported relocation error");
1572               goto common_error;
1573
1574             case bfd_reloc_dangerous:
1575               if (r_type == R_MN10300_PCREL32)
1576                 msg = _("error: inappropriate relocation type for shared"
1577                         " library (did you forget -fpic?)");
1578               else
1579                 msg = _("internal error: suspicious relocation type used"
1580                         " in shared library");
1581               goto common_error;
1582
1583             default:
1584               msg = _("internal error: unknown error");
1585               /* Fall through.  */
1586
1587             common_error:
1588               if (!((*info->callbacks->warning)
1589                     (info, msg, name, input_bfd, input_section,
1590                      rel->r_offset)))
1591                 return FALSE;
1592               break;
1593             }
1594         }
1595     }
1596
1597   return TRUE;
1598 }
1599
1600 /* Finish initializing one hash table entry.  */
1601
1602 static bfd_boolean
1603 elf32_mn10300_finish_hash_table_entry (struct bfd_hash_entry *gen_entry,
1604                                        void * in_args)
1605 {
1606   struct elf32_mn10300_link_hash_entry *entry;
1607   struct bfd_link_info *link_info = (struct bfd_link_info *) in_args;
1608   unsigned int byte_count = 0;
1609
1610   entry = (struct elf32_mn10300_link_hash_entry *) gen_entry;
1611
1612   if (entry->root.root.type == bfd_link_hash_warning)
1613     entry = (struct elf32_mn10300_link_hash_entry *) entry->root.root.u.i.link;
1614
1615   /* If we already know we want to convert "call" to "calls" for calls
1616      to this symbol, then return now.  */
1617   if (entry->flags == MN10300_CONVERT_CALL_TO_CALLS)
1618     return TRUE;
1619
1620   /* If there are no named calls to this symbol, or there's nothing we
1621      can move from the function itself into the "call" instruction,
1622      then note that all "call" instructions should be converted into
1623      "calls" instructions and return.  If a symbol is available for
1624      dynamic symbol resolution (overridable or overriding), avoid
1625      custom calling conventions.  */
1626   if (entry->direct_calls == 0
1627       || (entry->stack_size == 0 && entry->movm_args == 0)
1628       || (elf_hash_table (link_info)->dynamic_sections_created
1629           && ELF_ST_VISIBILITY (entry->root.other) != STV_INTERNAL
1630           && ELF_ST_VISIBILITY (entry->root.other) != STV_HIDDEN))
1631     {
1632       /* Make a note that we should convert "call" instructions to "calls"
1633          instructions for calls to this symbol.  */
1634       entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
1635       return TRUE;
1636     }
1637
1638   /* We may be able to move some instructions from the function itself into
1639      the "call" instruction.  Count how many bytes we might be able to
1640      eliminate in the function itself.  */
1641
1642   /* A movm instruction is two bytes.  */
1643   if (entry->movm_args)
1644     byte_count += 2;
1645
1646   /* Count the insn to allocate stack space too.  */
1647   if (entry->stack_size > 0)
1648     {
1649       if (entry->stack_size <= 128)
1650         byte_count += 3;
1651       else
1652         byte_count += 4;
1653     }
1654
1655   /* If using "call" will result in larger code, then turn all
1656      the associated "call" instructions into "calls" instructions.  */
1657   if (byte_count < entry->direct_calls)
1658     entry->flags |= MN10300_CONVERT_CALL_TO_CALLS;
1659
1660   /* This routine never fails.  */
1661   return TRUE;
1662 }
1663
1664 /* Used to count hash table entries.  */
1665
1666 static bfd_boolean
1667 elf32_mn10300_count_hash_table_entries (struct bfd_hash_entry *gen_entry ATTRIBUTE_UNUSED,
1668                                         void * in_args)
1669 {
1670   int *count = (int *) in_args;
1671
1672   (*count) ++;
1673   return TRUE;
1674 }
1675
1676 /* Used to enumerate hash table entries into a linear array.  */
1677
1678 static bfd_boolean
1679 elf32_mn10300_list_hash_table_entries (struct bfd_hash_entry *gen_entry,
1680                                        void * in_args)
1681 {
1682   struct bfd_hash_entry ***ptr = (struct bfd_hash_entry ***) in_args;
1683
1684   **ptr = gen_entry;
1685   (*ptr) ++;
1686   return TRUE;
1687 }
1688
1689 /* Used to sort the array created by the above.  */
1690
1691 static int
1692 sort_by_value (const void *va, const void *vb)
1693 {
1694   struct elf32_mn10300_link_hash_entry *a
1695     = *(struct elf32_mn10300_link_hash_entry **) va;
1696   struct elf32_mn10300_link_hash_entry *b
1697     = *(struct elf32_mn10300_link_hash_entry **) vb;
1698
1699   return a->value - b->value;
1700 }
1701
1702 /* Compute the stack size and movm arguments for the function
1703    referred to by HASH at address ADDR in section with
1704    contents CONTENTS, store the information in the hash table.  */
1705
1706 static void
1707 compute_function_info (bfd *abfd,
1708                        struct elf32_mn10300_link_hash_entry *hash,
1709                        bfd_vma addr,
1710                        unsigned char *contents)
1711 {
1712   unsigned char byte1, byte2;
1713   /* We only care about a very small subset of the possible prologue
1714      sequences here.  Basically we look for:
1715
1716      movm [d2,d3,a2,a3],sp (optional)
1717      add <size>,sp (optional, and only for sizes which fit in an unsigned
1718                     8 bit number)
1719
1720      If we find anything else, we quit.  */
1721
1722   /* Look for movm [regs],sp.  */
1723   byte1 = bfd_get_8 (abfd, contents + addr);
1724   byte2 = bfd_get_8 (abfd, contents + addr + 1);
1725
1726   if (byte1 == 0xcf)
1727     {
1728       hash->movm_args = byte2;
1729       addr += 2;
1730       byte1 = bfd_get_8 (abfd, contents + addr);
1731       byte2 = bfd_get_8 (abfd, contents + addr + 1);
1732     }
1733
1734   /* Now figure out how much stack space will be allocated by the movm
1735      instruction.  We need this kept separate from the function's normal
1736      stack space.  */
1737   if (hash->movm_args)
1738     {
1739       /* Space for d2.  */
1740       if (hash->movm_args & 0x80)
1741         hash->movm_stack_size += 4;
1742
1743       /* Space for d3.  */
1744       if (hash->movm_args & 0x40)
1745         hash->movm_stack_size += 4;
1746
1747       /* Space for a2.  */
1748       if (hash->movm_args & 0x20)
1749         hash->movm_stack_size += 4;
1750
1751       /* Space for a3.  */
1752       if (hash->movm_args & 0x10)
1753         hash->movm_stack_size += 4;
1754
1755       /* "other" space.  d0, d1, a0, a1, mdr, lir, lar, 4 byte pad.  */
1756       if (hash->movm_args & 0x08)
1757         hash->movm_stack_size += 8 * 4;
1758
1759       if (bfd_get_mach (abfd) == bfd_mach_am33
1760           || bfd_get_mach (abfd) == bfd_mach_am33_2)
1761         {
1762           /* "exother" space.  e0, e1, mdrq, mcrh, mcrl, mcvf */
1763           if (hash->movm_args & 0x1)
1764             hash->movm_stack_size += 6 * 4;
1765
1766           /* exreg1 space.  e4, e5, e6, e7 */
1767           if (hash->movm_args & 0x2)
1768             hash->movm_stack_size += 4 * 4;
1769
1770           /* exreg0 space.  e2, e3  */
1771           if (hash->movm_args & 0x4)
1772             hash->movm_stack_size += 2 * 4;
1773         }
1774     }
1775
1776   /* Now look for the two stack adjustment variants.  */
1777   if (byte1 == 0xf8 && byte2 == 0xfe)
1778     {
1779       int temp = bfd_get_8 (abfd, contents + addr + 2);
1780       temp = ((temp & 0xff) ^ (~0x7f)) + 0x80;
1781
1782       hash->stack_size = -temp;
1783     }
1784   else if (byte1 == 0xfa && byte2 == 0xfe)
1785     {
1786       int temp = bfd_get_16 (abfd, contents + addr + 2);
1787       temp = ((temp & 0xffff) ^ (~0x7fff)) + 0x8000;
1788       temp = -temp;
1789
1790       if (temp < 255)
1791         hash->stack_size = temp;
1792     }
1793
1794   /* If the total stack to be allocated by the call instruction is more
1795      than 255 bytes, then we can't remove the stack adjustment by using
1796      "call" (we might still be able to remove the "movm" instruction.  */
1797   if (hash->stack_size + hash->movm_stack_size > 255)
1798     hash->stack_size = 0;
1799 }
1800
1801 /* Delete some bytes from a section while relaxing.  */
1802
1803 static bfd_boolean
1804 mn10300_elf_relax_delete_bytes (bfd *abfd,
1805                                 asection *sec,
1806                                 bfd_vma addr,
1807                                 int count)
1808 {
1809   Elf_Internal_Shdr *symtab_hdr;
1810   unsigned int sec_shndx;
1811   bfd_byte *contents;
1812   Elf_Internal_Rela *irel, *irelend;
1813   Elf_Internal_Rela *irelalign;
1814   bfd_vma toaddr;
1815   Elf_Internal_Sym *isym, *isymend;
1816   struct elf_link_hash_entry **sym_hashes;
1817   struct elf_link_hash_entry **end_hashes;
1818   unsigned int symcount;
1819
1820   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1821
1822   contents = elf_section_data (sec)->this_hdr.contents;
1823
1824   irelalign = NULL;
1825   toaddr = sec->size;
1826
1827   irel = elf_section_data (sec)->relocs;
1828   irelend = irel + sec->reloc_count;
1829
1830   if (sec->reloc_count > 0)
1831     {
1832       /* If there is an align reloc at the end of the section ignore it.
1833          GAS creates these relocs for reasons of its own, and they just
1834          serve to keep the section artifically inflated.  */
1835       if (ELF32_R_TYPE ((irelend - 1)->r_info) == (int) R_MN10300_ALIGN)
1836         --irelend;
1837       
1838       /* The deletion must stop at the next ALIGN reloc for an aligment
1839          power larger than, or not a multiple of, the number of bytes we
1840          are deleting.  */
1841       for (; irel < irelend; irel++)
1842         {
1843           int alignment = 1 << irel->r_addend;
1844
1845           if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
1846               && irel->r_offset > addr
1847               && irel->r_offset < toaddr
1848               && (count < alignment
1849                   || alignment % count != 0))
1850             {
1851               irelalign = irel;
1852               toaddr = irel->r_offset;
1853               break;
1854             }
1855         }
1856     }
1857
1858   /* Actually delete the bytes.  */
1859   memmove (contents + addr, contents + addr + count,
1860            (size_t) (toaddr - addr - count));
1861
1862   /* Adjust the section's size if we are shrinking it, or else
1863      pad the bytes between the end of the shrunken region and
1864      the start of the next region with NOP codes.  */
1865   if (irelalign == NULL)
1866     {
1867       sec->size -= count;
1868       /* Include symbols at the end of the section, but
1869          not at the end of a sub-region of the section.  */
1870       toaddr ++;
1871     }
1872   else
1873     {
1874       int i;
1875
1876 #define NOP_OPCODE 0xcb
1877
1878       for (i = 0; i < count; i ++)
1879         bfd_put_8 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i);
1880     }
1881
1882   /* Adjust all the relocs.  */
1883   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1884     {
1885       /* Get the new reloc address.  */
1886       if ((irel->r_offset > addr
1887            && irel->r_offset < toaddr)
1888           || (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN
1889               && irel->r_offset == toaddr))
1890         irel->r_offset -= count;
1891     }
1892
1893   /* Adjust the local symbols in the section, reducing their value
1894      by the number of bytes deleted.  Note - symbols within the deleted
1895      region are moved to the address of the start of the region, which
1896      actually means that they will address the byte beyond the end of
1897      the region once the deletion has been completed.  */
1898   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1899   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1900   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
1901     {
1902       if (isym->st_shndx == sec_shndx
1903           && isym->st_value > addr
1904           && isym->st_value < toaddr)
1905         {
1906           if (isym->st_value < addr + count)
1907             isym->st_value = addr;
1908           else
1909             isym->st_value -= count;
1910         }
1911       /* Adjust the function symbol's size as well.  */
1912       else if (isym->st_shndx == sec_shndx
1913                && ELF_ST_TYPE (isym->st_info) == STT_FUNC
1914                && isym->st_value + isym->st_size > addr
1915                && isym->st_value + isym->st_size < toaddr)
1916         isym->st_size -= count;
1917     }
1918
1919   /* Now adjust the global symbols defined in this section.  */
1920   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1921               - symtab_hdr->sh_info);
1922   sym_hashes = elf_sym_hashes (abfd);
1923   end_hashes = sym_hashes + symcount;
1924   for (; sym_hashes < end_hashes; sym_hashes++)
1925     {
1926       struct elf_link_hash_entry *sym_hash = *sym_hashes;
1927
1928       if ((sym_hash->root.type == bfd_link_hash_defined
1929            || sym_hash->root.type == bfd_link_hash_defweak)
1930           && sym_hash->root.u.def.section == sec
1931           && sym_hash->root.u.def.value > addr
1932           && sym_hash->root.u.def.value < toaddr)
1933         {
1934           if (sym_hash->root.u.def.value < addr + count)
1935             sym_hash->root.u.def.value = addr;
1936           else
1937             sym_hash->root.u.def.value -= count;
1938         }
1939       /* Adjust the function symbol's size as well.  */
1940       else if (sym_hash->root.type == bfd_link_hash_defined
1941                && sym_hash->root.u.def.section == sec
1942                && sym_hash->type == STT_FUNC
1943                && sym_hash->root.u.def.value + sym_hash->size > addr
1944                && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1945         sym_hash->size -= count;
1946     }
1947
1948   /* See if we can move the ALIGN reloc forward.
1949      We have adjusted r_offset for it already.  */
1950   if (irelalign != NULL)
1951     {
1952       bfd_vma alignto, alignaddr;
1953
1954       if ((int) irelalign->r_addend > 0)
1955         {
1956           /* This is the old address.  */
1957           alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
1958           /* This is where the align points to now.  */
1959           alignaddr = BFD_ALIGN (irelalign->r_offset,
1960                                  1 << irelalign->r_addend);
1961           if (alignaddr < alignto)
1962             /* Tail recursion.  */
1963             return mn10300_elf_relax_delete_bytes (abfd, sec, alignaddr,
1964                                                    (int) (alignto - alignaddr));
1965         }
1966     }
1967
1968   return TRUE;
1969 }
1970
1971 /* Return TRUE if a symbol exists at the given address, else return
1972    FALSE.  */
1973
1974 static bfd_boolean
1975 mn10300_elf_symbol_address_p (bfd *abfd,
1976                               asection *sec,
1977                               Elf_Internal_Sym *isym,
1978                               bfd_vma addr)
1979 {
1980   Elf_Internal_Shdr *symtab_hdr;
1981   unsigned int sec_shndx;
1982   Elf_Internal_Sym *isymend;
1983   struct elf_link_hash_entry **sym_hashes;
1984   struct elf_link_hash_entry **end_hashes;
1985   unsigned int symcount;
1986
1987   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1988
1989   /* Examine all the symbols.  */
1990   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1991   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
1992     if (isym->st_shndx == sec_shndx
1993         && isym->st_value == addr)
1994       return TRUE;
1995
1996   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1997               - symtab_hdr->sh_info);
1998   sym_hashes = elf_sym_hashes (abfd);
1999   end_hashes = sym_hashes + symcount;
2000   for (; sym_hashes < end_hashes; sym_hashes++)
2001     {
2002       struct elf_link_hash_entry *sym_hash = *sym_hashes;
2003
2004       if ((sym_hash->root.type == bfd_link_hash_defined
2005            || sym_hash->root.type == bfd_link_hash_defweak)
2006           && sym_hash->root.u.def.section == sec
2007           && sym_hash->root.u.def.value == addr)
2008         return TRUE;
2009     }
2010
2011   return FALSE;
2012 }
2013
2014 /* This function handles relaxing for the mn10300.
2015
2016    There are quite a few relaxing opportunities available on the mn10300:
2017
2018         * calls:32 -> calls:16                                     2 bytes
2019         * call:32  -> call:16                                      2 bytes
2020
2021         * call:32 -> calls:32                                      1 byte
2022         * call:16 -> calls:16                                      1 byte
2023                 * These are done anytime using "calls" would result
2024                 in smaller code, or when necessary to preserve the
2025                 meaning of the program.
2026
2027         * call:32                                                  varies
2028         * call:16
2029                 * In some circumstances we can move instructions
2030                 from a function prologue into a "call" instruction.
2031                 This is only done if the resulting code is no larger
2032                 than the original code.
2033
2034         * jmp:32 -> jmp:16                                         2 bytes
2035         * jmp:16 -> bra:8                                          1 byte
2036
2037                 * If the previous instruction is a conditional branch
2038                 around the jump/bra, we may be able to reverse its condition
2039                 and change its target to the jump's target.  The jump/bra
2040                 can then be deleted.                               2 bytes
2041
2042         * mov abs32 -> mov abs16                                   1 or 2 bytes
2043
2044         * Most instructions which accept imm32 can relax to imm16  1 or 2 bytes
2045         - Most instructions which accept imm16 can relax to imm8   1 or 2 bytes
2046
2047         * Most instructions which accept d32 can relax to d16      1 or 2 bytes
2048         - Most instructions which accept d16 can relax to d8       1 or 2 bytes
2049
2050         We don't handle imm16->imm8 or d16->d8 as they're very rare
2051         and somewhat more difficult to support.  */
2052
2053 static bfd_boolean
2054 mn10300_elf_relax_section (bfd *abfd,
2055                            asection *sec,
2056                            struct bfd_link_info *link_info,
2057                            bfd_boolean *again)
2058 {
2059   Elf_Internal_Shdr *symtab_hdr;
2060   Elf_Internal_Rela *internal_relocs = NULL;
2061   Elf_Internal_Rela *irel, *irelend;
2062   bfd_byte *contents = NULL;
2063   Elf_Internal_Sym *isymbuf = NULL;
2064   struct elf32_mn10300_link_hash_table *hash_table;
2065   asection *section = sec;
2066   bfd_vma align_gap_adjustment;
2067
2068   if (link_info->relocatable)
2069     (*link_info->callbacks->einfo)
2070       (_("%P%F: --relax and -r may not be used together\n"));
2071
2072   /* Assume nothing changes.  */
2073   *again = FALSE;
2074
2075   /* We need a pointer to the mn10300 specific hash table.  */
2076   hash_table = elf32_mn10300_hash_table (link_info);
2077   if (hash_table == NULL)
2078     return FALSE;
2079
2080   /* Initialize fields in each hash table entry the first time through.  */
2081   if ((hash_table->flags & MN10300_HASH_ENTRIES_INITIALIZED) == 0)
2082     {
2083       bfd *input_bfd;
2084
2085       /* Iterate over all the input bfds.  */
2086       for (input_bfd = link_info->input_bfds;
2087            input_bfd != NULL;
2088            input_bfd = input_bfd->link_next)
2089         {
2090           /* We're going to need all the symbols for each bfd.  */
2091           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2092           if (symtab_hdr->sh_info != 0)
2093             {
2094               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2095               if (isymbuf == NULL)
2096                 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2097                                                 symtab_hdr->sh_info, 0,
2098                                                 NULL, NULL, NULL);
2099               if (isymbuf == NULL)
2100                 goto error_return;
2101             }
2102
2103           /* Iterate over each section in this bfd.  */
2104           for (section = input_bfd->sections;
2105                section != NULL;
2106                section = section->next)
2107             {
2108               struct elf32_mn10300_link_hash_entry *hash;
2109               asection *sym_sec = NULL;
2110               const char *sym_name;
2111               char *new_name;
2112
2113               /* If there's nothing to do in this section, skip it.  */
2114               if (! ((section->flags & SEC_RELOC) != 0
2115                      && section->reloc_count != 0))
2116                 continue;
2117               if ((section->flags & SEC_ALLOC) == 0)
2118                 continue;
2119
2120               /* Get cached copy of section contents if it exists.  */
2121               if (elf_section_data (section)->this_hdr.contents != NULL)
2122                 contents = elf_section_data (section)->this_hdr.contents;
2123               else if (section->size != 0)
2124                 {
2125                   /* Go get them off disk.  */
2126                   if (!bfd_malloc_and_get_section (input_bfd, section,
2127                                                    &contents))
2128                     goto error_return;
2129                 }
2130               else
2131                 contents = NULL;
2132
2133               /* If there aren't any relocs, then there's nothing to do.  */
2134               if ((section->flags & SEC_RELOC) != 0
2135                   && section->reloc_count != 0)
2136                 {
2137                   /* Get a copy of the native relocations.  */
2138                   internal_relocs = _bfd_elf_link_read_relocs (input_bfd, section,
2139                                                                NULL, NULL,
2140                                                                link_info->keep_memory);
2141                   if (internal_relocs == NULL)
2142                     goto error_return;
2143
2144                   /* Now examine each relocation.  */
2145                   irel = internal_relocs;
2146                   irelend = irel + section->reloc_count;
2147                   for (; irel < irelend; irel++)
2148                     {
2149                       long r_type;
2150                       unsigned long r_index;
2151                       unsigned char code;
2152
2153                       r_type = ELF32_R_TYPE (irel->r_info);
2154                       r_index = ELF32_R_SYM (irel->r_info);
2155
2156                       if (r_type < 0 || r_type >= (int) R_MN10300_MAX)
2157                         goto error_return;
2158
2159                       /* We need the name and hash table entry of the target
2160                          symbol!  */
2161                       hash = NULL;
2162                       sym_sec = NULL;
2163
2164                       if (r_index < symtab_hdr->sh_info)
2165                         {
2166                           /* A local symbol.  */
2167                           Elf_Internal_Sym *isym;
2168                           struct elf_link_hash_table *elftab;
2169                           bfd_size_type amt;
2170
2171                           isym = isymbuf + r_index;
2172                           if (isym->st_shndx == SHN_UNDEF)
2173                             sym_sec = bfd_und_section_ptr;
2174                           else if (isym->st_shndx == SHN_ABS)
2175                             sym_sec = bfd_abs_section_ptr;
2176                           else if (isym->st_shndx == SHN_COMMON)
2177                             sym_sec = bfd_com_section_ptr;
2178                           else
2179                             sym_sec
2180                               = bfd_section_from_elf_index (input_bfd,
2181                                                             isym->st_shndx);
2182
2183                           sym_name
2184                             = bfd_elf_string_from_elf_section (input_bfd,
2185                                                                (symtab_hdr
2186                                                                 ->sh_link),
2187                                                                isym->st_name);
2188
2189                           /* If it isn't a function, then we don't care
2190                              about it.  */
2191                           if (ELF_ST_TYPE (isym->st_info) != STT_FUNC)
2192                             continue;
2193
2194                           /* Tack on an ID so we can uniquely identify this
2195                              local symbol in the global hash table.  */
2196                           amt = strlen (sym_name) + 10;
2197                           new_name = bfd_malloc (amt);
2198                           if (new_name == NULL)
2199                             goto error_return;
2200
2201                           sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
2202                           sym_name = new_name;
2203
2204                           elftab = &hash_table->static_hash_table->root;
2205                           hash = ((struct elf32_mn10300_link_hash_entry *)
2206                                   elf_link_hash_lookup (elftab, sym_name,
2207                                                         TRUE, TRUE, FALSE));
2208                           free (new_name);
2209                         }
2210                       else
2211                         {
2212                           r_index -= symtab_hdr->sh_info;
2213                           hash = (struct elf32_mn10300_link_hash_entry *)
2214                                    elf_sym_hashes (input_bfd)[r_index];
2215                         }
2216
2217                       sym_name = hash->root.root.root.string;
2218                       if ((section->flags & SEC_CODE) != 0)
2219                         {
2220                           /* If this is not a "call" instruction, then we
2221                              should convert "call" instructions to "calls"
2222                              instructions.  */
2223                           code = bfd_get_8 (input_bfd,
2224                                             contents + irel->r_offset - 1);
2225                           if (code != 0xdd && code != 0xcd)
2226                             hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
2227                         }
2228
2229                       /* If this is a jump/call, then bump the
2230                          direct_calls counter.  Else force "call" to
2231                          "calls" conversions.  */
2232                       if (r_type == R_MN10300_PCREL32
2233                           || r_type == R_MN10300_PLT32
2234                           || r_type == R_MN10300_PLT16
2235                           || r_type == R_MN10300_PCREL16)
2236                         hash->direct_calls++;
2237                       else
2238                         hash->flags |= MN10300_CONVERT_CALL_TO_CALLS;
2239                     }
2240                 }
2241
2242               /* Now look at the actual contents to get the stack size,
2243                  and a list of what registers were saved in the prologue
2244                  (ie movm_args).  */
2245               if ((section->flags & SEC_CODE) != 0)
2246                 {
2247                   Elf_Internal_Sym *isym, *isymend;
2248                   unsigned int sec_shndx;
2249                   struct elf_link_hash_entry **hashes;
2250                   struct elf_link_hash_entry **end_hashes;
2251                   unsigned int symcount;
2252
2253                   sec_shndx = _bfd_elf_section_from_bfd_section (input_bfd,
2254                                                                  section);
2255
2256                   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2257                               - symtab_hdr->sh_info);
2258                   hashes = elf_sym_hashes (input_bfd);
2259                   end_hashes = hashes + symcount;
2260
2261                   /* Look at each function defined in this section and
2262                      update info for that function.  */
2263                   isymend = isymbuf + symtab_hdr->sh_info;
2264                   for (isym = isymbuf; isym < isymend; isym++)
2265                     {
2266                       if (isym->st_shndx == sec_shndx
2267                           && ELF_ST_TYPE (isym->st_info) == STT_FUNC)
2268                         {
2269                           struct elf_link_hash_table *elftab;
2270                           bfd_size_type amt;
2271                           struct elf_link_hash_entry **lhashes = hashes;
2272
2273                           /* Skip a local symbol if it aliases a
2274                              global one.  */
2275                           for (; lhashes < end_hashes; lhashes++)
2276                             {
2277                               hash = (struct elf32_mn10300_link_hash_entry *) *lhashes;
2278                               if ((hash->root.root.type == bfd_link_hash_defined
2279                                    || hash->root.root.type == bfd_link_hash_defweak)
2280                                   && hash->root.root.u.def.section == section
2281                                   && hash->root.type == STT_FUNC
2282                                   && hash->root.root.u.def.value == isym->st_value)
2283                                 break;
2284                             }
2285                           if (lhashes != end_hashes)
2286                             continue;
2287
2288                           if (isym->st_shndx == SHN_UNDEF)
2289                             sym_sec = bfd_und_section_ptr;
2290                           else if (isym->st_shndx == SHN_ABS)
2291                             sym_sec = bfd_abs_section_ptr;
2292                           else if (isym->st_shndx == SHN_COMMON)
2293                             sym_sec = bfd_com_section_ptr;
2294                           else
2295                             sym_sec
2296                               = bfd_section_from_elf_index (input_bfd,
2297                                                             isym->st_shndx);
2298
2299                           sym_name = (bfd_elf_string_from_elf_section
2300                                       (input_bfd, symtab_hdr->sh_link,
2301                                        isym->st_name));
2302
2303                           /* Tack on an ID so we can uniquely identify this
2304                              local symbol in the global hash table.  */
2305                           amt = strlen (sym_name) + 10;
2306                           new_name = bfd_malloc (amt);
2307                           if (new_name == NULL)
2308                             goto error_return;
2309
2310                           sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
2311                           sym_name = new_name;
2312
2313                           elftab = &hash_table->static_hash_table->root;
2314                           hash = ((struct elf32_mn10300_link_hash_entry *)
2315                                   elf_link_hash_lookup (elftab, sym_name,
2316                                                         TRUE, TRUE, FALSE));
2317                           free (new_name);
2318                           compute_function_info (input_bfd, hash,
2319                                                  isym->st_value, contents);
2320                           hash->value = isym->st_value;
2321                         }
2322                     }
2323
2324                   for (; hashes < end_hashes; hashes++)
2325                     {
2326                       hash = (struct elf32_mn10300_link_hash_entry *) *hashes;
2327                       if ((hash->root.root.type == bfd_link_hash_defined
2328                            || hash->root.root.type == bfd_link_hash_defweak)
2329                           && hash->root.root.u.def.section == section
2330                           && hash->root.type == STT_FUNC)
2331                         compute_function_info (input_bfd, hash,
2332                                                (hash)->root.root.u.def.value,
2333                                                contents);
2334                     }
2335                 }
2336
2337               /* Cache or free any memory we allocated for the relocs.  */
2338               if (internal_relocs != NULL
2339                   && elf_section_data (section)->relocs != internal_relocs)
2340                 free (internal_relocs);
2341               internal_relocs = NULL;
2342
2343               /* Cache or free any memory we allocated for the contents.  */
2344               if (contents != NULL
2345                   && elf_section_data (section)->this_hdr.contents != contents)
2346                 {
2347                   if (! link_info->keep_memory)
2348                     free (contents);
2349                   else
2350                     {
2351                       /* Cache the section contents for elf_link_input_bfd.  */
2352                       elf_section_data (section)->this_hdr.contents = contents;
2353                     }
2354                 }
2355               contents = NULL;
2356             }
2357
2358           /* Cache or free any memory we allocated for the symbols.  */
2359           if (isymbuf != NULL
2360               && symtab_hdr->contents != (unsigned char *) isymbuf)
2361             {
2362               if (! link_info->keep_memory)
2363                 free (isymbuf);
2364               else
2365                 {
2366                   /* Cache the symbols for elf_link_input_bfd.  */
2367                   symtab_hdr->contents = (unsigned char *) isymbuf;
2368                 }
2369             }
2370           isymbuf = NULL;
2371         }
2372
2373       /* Now iterate on each symbol in the hash table and perform
2374          the final initialization steps on each.  */
2375       elf32_mn10300_link_hash_traverse (hash_table,
2376                                         elf32_mn10300_finish_hash_table_entry,
2377                                         link_info);
2378       elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
2379                                         elf32_mn10300_finish_hash_table_entry,
2380                                         link_info);
2381
2382       {
2383         /* This section of code collects all our local symbols, sorts
2384            them by value, and looks for multiple symbols referring to
2385            the same address.  For those symbols, the flags are merged.
2386            At this point, the only flag that can be set is
2387            MN10300_CONVERT_CALL_TO_CALLS, so we simply OR the flags
2388            together.  */
2389         int static_count = 0, i;
2390         struct elf32_mn10300_link_hash_entry **entries;
2391         struct elf32_mn10300_link_hash_entry **ptr;
2392
2393         elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
2394                                           elf32_mn10300_count_hash_table_entries,
2395                                           &static_count);
2396
2397         entries = bfd_malloc (static_count * sizeof (* ptr));
2398
2399         ptr = entries;
2400         elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
2401                                           elf32_mn10300_list_hash_table_entries,
2402                                           & ptr);
2403
2404         qsort (entries, static_count, sizeof (entries[0]), sort_by_value);
2405
2406         for (i = 0; i < static_count - 1; i++)
2407           if (entries[i]->value && entries[i]->value == entries[i+1]->value)
2408             {
2409               int v = entries[i]->flags;
2410               int j;
2411
2412               for (j = i + 1; j < static_count && entries[j]->value == entries[i]->value; j++)
2413                 v |= entries[j]->flags;
2414
2415               for (j = i; j < static_count && entries[j]->value == entries[i]->value; j++)
2416                 entries[j]->flags = v;
2417
2418               i = j - 1;
2419             }
2420       }
2421
2422       /* All entries in the hash table are fully initialized.  */
2423       hash_table->flags |= MN10300_HASH_ENTRIES_INITIALIZED;
2424
2425       /* Now that everything has been initialized, go through each
2426          code section and delete any prologue insns which will be
2427          redundant because their operations will be performed by
2428          a "call" instruction.  */
2429       for (input_bfd = link_info->input_bfds;
2430            input_bfd != NULL;
2431            input_bfd = input_bfd->link_next)
2432         {
2433           /* We're going to need all the local symbols for each bfd.  */
2434           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2435           if (symtab_hdr->sh_info != 0)
2436             {
2437               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2438               if (isymbuf == NULL)
2439                 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2440                                                 symtab_hdr->sh_info, 0,
2441                                                 NULL, NULL, NULL);
2442               if (isymbuf == NULL)
2443                 goto error_return;
2444             }
2445
2446           /* Walk over each section in this bfd.  */
2447           for (section = input_bfd->sections;
2448                section != NULL;
2449                section = section->next)
2450             {
2451               unsigned int sec_shndx;
2452               Elf_Internal_Sym *isym, *isymend;
2453               struct elf_link_hash_entry **hashes;
2454               struct elf_link_hash_entry **end_hashes;
2455               unsigned int symcount;
2456
2457               /* Skip non-code sections and empty sections.  */
2458               if ((section->flags & SEC_CODE) == 0 || section->size == 0)
2459                 continue;
2460
2461               if (section->reloc_count != 0)
2462                 {
2463                   /* Get a copy of the native relocations.  */
2464                   internal_relocs = _bfd_elf_link_read_relocs (input_bfd, section,
2465                                                                NULL, NULL,
2466                                                                link_info->keep_memory);
2467                   if (internal_relocs == NULL)
2468                     goto error_return;
2469                 }
2470
2471               /* Get cached copy of section contents if it exists.  */
2472               if (elf_section_data (section)->this_hdr.contents != NULL)
2473                 contents = elf_section_data (section)->this_hdr.contents;
2474               else
2475                 {
2476                   /* Go get them off disk.  */
2477                   if (!bfd_malloc_and_get_section (input_bfd, section,
2478                                                    &contents))
2479                     goto error_return;
2480                 }
2481
2482               sec_shndx = _bfd_elf_section_from_bfd_section (input_bfd,
2483                                                              section);
2484
2485               /* Now look for any function in this section which needs
2486                  insns deleted from its prologue.  */
2487               isymend = isymbuf + symtab_hdr->sh_info;
2488               for (isym = isymbuf; isym < isymend; isym++)
2489                 {
2490                   struct elf32_mn10300_link_hash_entry *sym_hash;
2491                   asection *sym_sec = NULL;
2492                   const char *sym_name;
2493                   char *new_name;
2494                   struct elf_link_hash_table *elftab;
2495                   bfd_size_type amt;
2496
2497                   if (isym->st_shndx != sec_shndx)
2498                     continue;
2499
2500                   if (isym->st_shndx == SHN_UNDEF)
2501                     sym_sec = bfd_und_section_ptr;
2502                   else if (isym->st_shndx == SHN_ABS)
2503                     sym_sec = bfd_abs_section_ptr;
2504                   else if (isym->st_shndx == SHN_COMMON)
2505                     sym_sec = bfd_com_section_ptr;
2506                   else
2507                     sym_sec
2508                       = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
2509
2510                   sym_name
2511                     = bfd_elf_string_from_elf_section (input_bfd,
2512                                                        symtab_hdr->sh_link,
2513                                                        isym->st_name);
2514
2515                   /* Tack on an ID so we can uniquely identify this
2516                      local symbol in the global hash table.  */
2517                   amt = strlen (sym_name) + 10;
2518                   new_name = bfd_malloc (amt);
2519                   if (new_name == NULL)
2520                     goto error_return;
2521                   sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
2522                   sym_name = new_name;
2523
2524                   elftab = & hash_table->static_hash_table->root;
2525                   sym_hash = (struct elf32_mn10300_link_hash_entry *)
2526                     elf_link_hash_lookup (elftab, sym_name,
2527                                           FALSE, FALSE, FALSE);
2528
2529                   free (new_name);
2530                   if (sym_hash == NULL)
2531                     continue;
2532
2533                   if (! (sym_hash->flags & MN10300_CONVERT_CALL_TO_CALLS)
2534                       && ! (sym_hash->flags & MN10300_DELETED_PROLOGUE_BYTES))
2535                     {
2536                       int bytes = 0;
2537
2538                       /* Note that we've changed things.  */
2539                       elf_section_data (section)->relocs = internal_relocs;
2540                       elf_section_data (section)->this_hdr.contents = contents;
2541                       symtab_hdr->contents = (unsigned char *) isymbuf;
2542
2543                       /* Count how many bytes we're going to delete.  */
2544                       if (sym_hash->movm_args)
2545                         bytes += 2;
2546
2547                       if (sym_hash->stack_size > 0)
2548                         {
2549                           if (sym_hash->stack_size <= 128)
2550                             bytes += 3;
2551                           else
2552                             bytes += 4;
2553                         }
2554
2555                       /* Note that we've deleted prologue bytes for this
2556                          function.  */
2557                       sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
2558
2559                       /* Actually delete the bytes.  */
2560                       if (!mn10300_elf_relax_delete_bytes (input_bfd,
2561                                                            section,
2562                                                            isym->st_value,
2563                                                            bytes))
2564                         goto error_return;
2565
2566                       /* Something changed.  Not strictly necessary, but
2567                          may lead to more relaxing opportunities.  */
2568                       *again = TRUE;
2569                     }
2570                 }
2571
2572               /* Look for any global functions in this section which
2573                  need insns deleted from their prologues.  */
2574               symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2575                           - symtab_hdr->sh_info);
2576               hashes = elf_sym_hashes (input_bfd);
2577               end_hashes = hashes + symcount;
2578               for (; hashes < end_hashes; hashes++)
2579                 {
2580                   struct elf32_mn10300_link_hash_entry *sym_hash;
2581
2582                   sym_hash = (struct elf32_mn10300_link_hash_entry *) *hashes;
2583                   if ((sym_hash->root.root.type == bfd_link_hash_defined
2584                        || sym_hash->root.root.type == bfd_link_hash_defweak)
2585                       && sym_hash->root.root.u.def.section == section
2586                       && ! (sym_hash->flags & MN10300_CONVERT_CALL_TO_CALLS)
2587                       && ! (sym_hash->flags & MN10300_DELETED_PROLOGUE_BYTES))
2588                     {
2589                       int bytes = 0;
2590                       bfd_vma symval;
2591
2592                       /* Note that we've changed things.  */
2593                       elf_section_data (section)->relocs = internal_relocs;
2594                       elf_section_data (section)->this_hdr.contents = contents;
2595                       symtab_hdr->contents = (unsigned char *) isymbuf;
2596
2597                       /* Count how many bytes we're going to delete.  */
2598                       if (sym_hash->movm_args)
2599                         bytes += 2;
2600
2601                       if (sym_hash->stack_size > 0)
2602                         {
2603                           if (sym_hash->stack_size <= 128)
2604                             bytes += 3;
2605                           else
2606                             bytes += 4;
2607                         }
2608
2609                       /* Note that we've deleted prologue bytes for this
2610                          function.  */
2611                       sym_hash->flags |= MN10300_DELETED_PROLOGUE_BYTES;
2612
2613                       /* Actually delete the bytes.  */
2614                       symval = sym_hash->root.root.u.def.value;
2615                       if (!mn10300_elf_relax_delete_bytes (input_bfd,
2616                                                            section,
2617                                                            symval,
2618                                                            bytes))
2619                         goto error_return;
2620
2621                       /* Something changed.  Not strictly necessary, but
2622                          may lead to more relaxing opportunities.  */
2623                       *again = TRUE;
2624                     }
2625                 }
2626
2627               /* Cache or free any memory we allocated for the relocs.  */
2628               if (internal_relocs != NULL
2629                   && elf_section_data (section)->relocs != internal_relocs)
2630                 free (internal_relocs);
2631               internal_relocs = NULL;
2632
2633               /* Cache or free any memory we allocated for the contents.  */
2634               if (contents != NULL
2635                   && elf_section_data (section)->this_hdr.contents != contents)
2636                 {
2637                   if (! link_info->keep_memory)
2638                     free (contents);
2639                   else
2640                     /* Cache the section contents for elf_link_input_bfd.  */
2641                     elf_section_data (section)->this_hdr.contents = contents;
2642                 }
2643               contents = NULL;
2644             }
2645
2646           /* Cache or free any memory we allocated for the symbols.  */
2647           if (isymbuf != NULL
2648               && symtab_hdr->contents != (unsigned char *) isymbuf)
2649             {
2650               if (! link_info->keep_memory)
2651                 free (isymbuf);
2652               else
2653                 /* Cache the symbols for elf_link_input_bfd.  */
2654                 symtab_hdr->contents = (unsigned char *) isymbuf;
2655             }
2656           isymbuf = NULL;
2657         }
2658     }
2659
2660   /* (Re)initialize for the basic instruction shortening/relaxing pass.  */
2661   contents = NULL;
2662   internal_relocs = NULL;
2663   isymbuf = NULL;
2664   /* For error_return.  */
2665   section = sec;
2666
2667   /* We don't have to do anything for a relocatable link, if
2668      this section does not have relocs, or if this is not a
2669      code section.  */
2670   if (link_info->relocatable
2671       || (sec->flags & SEC_RELOC) == 0
2672       || sec->reloc_count == 0
2673       || (sec->flags & SEC_CODE) == 0)
2674     return TRUE;
2675
2676   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2677
2678   /* Get a copy of the native relocations.  */
2679   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
2680                                                link_info->keep_memory);
2681   if (internal_relocs == NULL)
2682     goto error_return;
2683
2684   /* Scan for worst case alignment gap changes.  Note that this logic
2685      is not ideal; what we should do is run this scan for every
2686      opcode/address range and adjust accordingly, but that's
2687      expensive.  Worst case is that for an alignment of N bytes, we
2688      move by 2*N-N-1 bytes, assuming we have aligns of 1, 2, 4, 8, etc
2689      all before it.  Plus, this still doesn't cover cross-section
2690      jumps with section alignment.  */
2691   irelend = internal_relocs + sec->reloc_count;
2692   align_gap_adjustment = 0;
2693   for (irel = internal_relocs; irel < irelend; irel++)
2694     {
2695       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN)
2696         {
2697           bfd_vma adj = 1 << irel->r_addend;
2698           bfd_vma aend = irel->r_offset;
2699
2700           aend = BFD_ALIGN (aend, 1 << irel->r_addend);
2701           adj = 2 * adj - adj - 1;
2702
2703           /* Record the biggest adjustmnet.  Skip any alignment at the
2704              end of our section.  */
2705           if (align_gap_adjustment < adj
2706               && aend < sec->output_section->vma + sec->output_offset + sec->size)
2707             align_gap_adjustment = adj;
2708         }
2709     }
2710
2711   /* Walk through them looking for relaxing opportunities.  */
2712   irelend = internal_relocs + sec->reloc_count;
2713   for (irel = internal_relocs; irel < irelend; irel++)
2714     {
2715       bfd_vma symval;
2716       bfd_signed_vma jump_offset;
2717       asection *sym_sec = NULL;
2718       struct elf32_mn10300_link_hash_entry *h = NULL;
2719
2720       /* If this isn't something that can be relaxed, then ignore
2721          this reloc.  */
2722       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_NONE
2723           || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_8
2724           || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_MAX)
2725         continue;
2726
2727       /* Get the section contents if we haven't done so already.  */
2728       if (contents == NULL)
2729         {
2730           /* Get cached copy if it exists.  */
2731           if (elf_section_data (sec)->this_hdr.contents != NULL)
2732             contents = elf_section_data (sec)->this_hdr.contents;
2733           else
2734             {
2735               /* Go get them off disk.  */
2736               if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2737                 goto error_return;
2738             }
2739         }
2740
2741       /* Read this BFD's symbols if we haven't done so already.  */
2742       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2743         {
2744           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2745           if (isymbuf == NULL)
2746             isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2747                                             symtab_hdr->sh_info, 0,
2748                                             NULL, NULL, NULL);
2749           if (isymbuf == NULL)
2750             goto error_return;
2751         }
2752
2753       /* Get the value of the symbol referred to by the reloc.  */
2754       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2755         {
2756           Elf_Internal_Sym *isym;
2757           const char *sym_name;
2758           char *new_name;
2759
2760           /* A local symbol.  */
2761           isym = isymbuf + ELF32_R_SYM (irel->r_info);
2762           if (isym->st_shndx == SHN_UNDEF)
2763             sym_sec = bfd_und_section_ptr;
2764           else if (isym->st_shndx == SHN_ABS)
2765             sym_sec = bfd_abs_section_ptr;
2766           else if (isym->st_shndx == SHN_COMMON)
2767             sym_sec = bfd_com_section_ptr;
2768           else
2769             sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2770
2771           sym_name = bfd_elf_string_from_elf_section (abfd,
2772                                                       symtab_hdr->sh_link,
2773                                                       isym->st_name);
2774
2775           if ((sym_sec->flags & SEC_MERGE)
2776               && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE)
2777             {
2778               symval = isym->st_value;
2779
2780               /* GAS may reduce relocations against symbols in SEC_MERGE
2781                  sections to a relocation against the section symbol when
2782                  the original addend was zero.  When the reloc is against
2783                  a section symbol we should include the addend in the
2784                  offset passed to _bfd_merged_section_offset, since the
2785                  location of interest is the original symbol.  On the
2786                  other hand, an access to "sym+addend" where "sym" is not
2787                  a section symbol should not include the addend;  Such an
2788                  access is presumed to be an offset from "sym";  The
2789                  location of interest is just "sym".  */
2790               if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
2791                 symval += irel->r_addend;
2792
2793               symval = _bfd_merged_section_offset (abfd, & sym_sec,
2794                                                    elf_section_data (sym_sec)->sec_info,
2795                                                    symval);
2796
2797               if (ELF_ST_TYPE (isym->st_info) != STT_SECTION)
2798                 symval += irel->r_addend;
2799
2800               symval += sym_sec->output_section->vma
2801                 + sym_sec->output_offset - irel->r_addend;
2802             }
2803           else
2804             symval = (isym->st_value
2805                       + sym_sec->output_section->vma
2806                       + sym_sec->output_offset);
2807
2808           /* Tack on an ID so we can uniquely identify this
2809              local symbol in the global hash table.  */
2810           new_name = bfd_malloc ((bfd_size_type) strlen (sym_name) + 10);
2811           if (new_name == NULL)
2812             goto error_return;
2813           sprintf (new_name, "%s_%08x", sym_name, sym_sec->id);
2814           sym_name = new_name;
2815
2816           h = (struct elf32_mn10300_link_hash_entry *)
2817                 elf_link_hash_lookup (&hash_table->static_hash_table->root,
2818                                       sym_name, FALSE, FALSE, FALSE);
2819           free (new_name);
2820         }
2821       else
2822         {
2823           unsigned long indx;
2824
2825           /* An external symbol.  */
2826           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2827           h = (struct elf32_mn10300_link_hash_entry *)
2828                 (elf_sym_hashes (abfd)[indx]);
2829           BFD_ASSERT (h != NULL);
2830           if (h->root.root.type != bfd_link_hash_defined
2831               && h->root.root.type != bfd_link_hash_defweak)
2832             /* This appears to be a reference to an undefined
2833                symbol.  Just ignore it--it will be caught by the
2834                regular reloc processing.  */
2835             continue;
2836
2837           /* Check for a reference to a discarded symbol and ignore it.  */
2838           if (h->root.root.u.def.section->output_section == NULL)
2839             continue;
2840
2841           sym_sec = h->root.root.u.def.section->output_section;
2842
2843           symval = (h->root.root.u.def.value
2844                     + h->root.root.u.def.section->output_section->vma
2845                     + h->root.root.u.def.section->output_offset);
2846         }
2847
2848       /* For simplicity of coding, we are going to modify the section
2849          contents, the section relocs, and the BFD symbol table.  We
2850          must tell the rest of the code not to free up this
2851          information.  It would be possible to instead create a table
2852          of changes which have to be made, as is done in coff-mips.c;
2853          that would be more work, but would require less memory when
2854          the linker is run.  */
2855
2856       /* Try to turn a 32bit pc-relative branch/call into a 16bit pc-relative
2857          branch/call, also deal with "call" -> "calls" conversions and
2858          insertion of prologue data into "call" instructions.  */
2859       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL32
2860           || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PLT32)
2861         {
2862           bfd_vma value = symval;
2863
2864           if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PLT32
2865               && h != NULL
2866               && ELF_ST_VISIBILITY (h->root.other) != STV_INTERNAL
2867               && ELF_ST_VISIBILITY (h->root.other) != STV_HIDDEN
2868               && h->root.plt.offset != (bfd_vma) -1)
2869             {
2870               asection * splt;
2871
2872               splt = bfd_get_section_by_name (elf_hash_table (link_info)
2873                                               ->dynobj, ".plt");
2874
2875               value = ((splt->output_section->vma
2876                         + splt->output_offset
2877                         + h->root.plt.offset)
2878                        - (sec->output_section->vma
2879                           + sec->output_offset
2880                           + irel->r_offset));
2881             }
2882
2883           /* If we've got a "call" instruction that needs to be turned
2884              into a "calls" instruction, do so now.  It saves a byte.  */
2885           if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
2886             {
2887               unsigned char code;
2888
2889               /* Get the opcode.  */
2890               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
2891
2892               /* Make sure we're working with a "call" instruction!  */
2893               if (code == 0xdd)
2894                 {
2895                   /* Note that we've changed the relocs, section contents,
2896                      etc.  */
2897                   elf_section_data (sec)->relocs = internal_relocs;
2898                   elf_section_data (sec)->this_hdr.contents = contents;
2899                   symtab_hdr->contents = (unsigned char *) isymbuf;
2900
2901                   /* Fix the opcode.  */
2902                   bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 1);
2903                   bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
2904
2905                   /* Fix irel->r_offset and irel->r_addend.  */
2906                   irel->r_offset += 1;
2907                   irel->r_addend += 1;
2908
2909                   /* Delete one byte of data.  */
2910                   if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2911                                                        irel->r_offset + 3, 1))
2912                     goto error_return;
2913
2914                   /* That will change things, so, we should relax again.
2915                      Note that this is not required, and it may be slow.  */
2916                   *again = TRUE;
2917                 }
2918             }
2919           else if (h)
2920             {
2921               /* We've got a "call" instruction which needs some data
2922                  from target function filled in.  */
2923               unsigned char code;
2924
2925               /* Get the opcode.  */
2926               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
2927
2928               /* Insert data from the target function into the "call"
2929                  instruction if needed.  */
2930               if (code == 0xdd)
2931                 {
2932                   bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 4);
2933                   bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
2934                              contents + irel->r_offset + 5);
2935                 }
2936             }
2937
2938           /* Deal with pc-relative gunk.  */
2939           value -= (sec->output_section->vma + sec->output_offset);
2940           value -= irel->r_offset;
2941           value += irel->r_addend;
2942
2943           /* See if the value will fit in 16 bits, note the high value is
2944              0x7fff + 2 as the target will be two bytes closer if we are
2945              able to relax, if it's in the same section.  */
2946           if (sec->output_section == sym_sec->output_section)
2947             jump_offset = 0x8001;
2948           else
2949             jump_offset = 0x7fff;
2950
2951           /* Account for jumps across alignment boundaries using
2952              align_gap_adjustment.  */
2953           if ((bfd_signed_vma) value < jump_offset - (bfd_signed_vma) align_gap_adjustment
2954               && ((bfd_signed_vma) value > -0x8000 + (bfd_signed_vma) align_gap_adjustment))
2955             {
2956               unsigned char code;
2957
2958               /* Get the opcode.  */
2959               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
2960
2961               if (code != 0xdc && code != 0xdd && code != 0xff)
2962                 continue;
2963
2964               /* Note that we've changed the relocs, section contents, etc.  */
2965               elf_section_data (sec)->relocs = internal_relocs;
2966               elf_section_data (sec)->this_hdr.contents = contents;
2967               symtab_hdr->contents = (unsigned char *) isymbuf;
2968
2969               /* Fix the opcode.  */
2970               if (code == 0xdc)
2971                 bfd_put_8 (abfd, 0xcc, contents + irel->r_offset - 1);
2972               else if (code == 0xdd)
2973                 bfd_put_8 (abfd, 0xcd, contents + irel->r_offset - 1);
2974               else if (code == 0xff)
2975                 bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
2976
2977               /* Fix the relocation's type.  */
2978               irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2979                                            (ELF32_R_TYPE (irel->r_info)
2980                                             == (int) R_MN10300_PLT32)
2981                                            ? R_MN10300_PLT16 :
2982                                            R_MN10300_PCREL16);
2983
2984               /* Delete two bytes of data.  */
2985               if (!mn10300_elf_relax_delete_bytes (abfd, sec,
2986                                                    irel->r_offset + 1, 2))
2987                 goto error_return;
2988
2989               /* That will change things, so, we should relax again.
2990                  Note that this is not required, and it may be slow.  */
2991               *again = TRUE;
2992             }
2993         }
2994
2995       /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
2996          branch.  */
2997       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL16)
2998         {
2999           bfd_vma value = symval;
3000
3001           /* If we've got a "call" instruction that needs to be turned
3002              into a "calls" instruction, do so now.  It saves a byte.  */
3003           if (h && (h->flags & MN10300_CONVERT_CALL_TO_CALLS))
3004             {
3005               unsigned char code;
3006
3007               /* Get the opcode.  */
3008               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3009
3010               /* Make sure we're working with a "call" instruction!  */
3011               if (code == 0xcd)
3012                 {
3013                   /* Note that we've changed the relocs, section contents,
3014                      etc.  */
3015                   elf_section_data (sec)->relocs = internal_relocs;
3016                   elf_section_data (sec)->this_hdr.contents = contents;
3017                   symtab_hdr->contents = (unsigned char *) isymbuf;
3018
3019                   /* Fix the opcode.  */
3020                   bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 1);
3021                   bfd_put_8 (abfd, 0xff, contents + irel->r_offset);
3022
3023                   /* Fix irel->r_offset and irel->r_addend.  */
3024                   irel->r_offset += 1;
3025                   irel->r_addend += 1;
3026
3027                   /* Delete one byte of data.  */
3028                   if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3029                                                        irel->r_offset + 1, 1))
3030                     goto error_return;
3031
3032                   /* That will change things, so, we should relax again.
3033                      Note that this is not required, and it may be slow.  */
3034                   *again = TRUE;
3035                 }
3036             }
3037           else if (h)
3038             {
3039               unsigned char code;
3040
3041               /* Get the opcode.  */
3042               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3043
3044               /* Insert data from the target function into the "call"
3045                  instruction if needed.  */
3046               if (code == 0xcd)
3047                 {
3048                   bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 2);
3049                   bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
3050                              contents + irel->r_offset + 3);
3051                 }
3052             }
3053
3054           /* Deal with pc-relative gunk.  */
3055           value -= (sec->output_section->vma + sec->output_offset);
3056           value -= irel->r_offset;
3057           value += irel->r_addend;
3058
3059           /* See if the value will fit in 8 bits, note the high value is
3060              0x7f + 1 as the target will be one bytes closer if we are
3061              able to relax.  */
3062           if ((long) value < 0x80 && (long) value > -0x80)
3063             {
3064               unsigned char code;
3065
3066               /* Get the opcode.  */
3067               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3068
3069               if (code != 0xcc)
3070                 continue;
3071
3072               /* Note that we've changed the relocs, section contents, etc.  */
3073               elf_section_data (sec)->relocs = internal_relocs;
3074               elf_section_data (sec)->this_hdr.contents = contents;
3075               symtab_hdr->contents = (unsigned char *) isymbuf;
3076
3077               /* Fix the opcode.  */
3078               bfd_put_8 (abfd, 0xca, contents + irel->r_offset - 1);
3079
3080               /* Fix the relocation's type.  */
3081               irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3082                                            R_MN10300_PCREL8);
3083
3084               /* Delete one byte of data.  */
3085               if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3086                                                    irel->r_offset + 1, 1))
3087                 goto error_return;
3088
3089               /* That will change things, so, we should relax again.
3090                  Note that this is not required, and it may be slow.  */
3091               *again = TRUE;
3092             }
3093         }
3094
3095       /* Try to eliminate an unconditional 8 bit pc-relative branch
3096          which immediately follows a conditional 8 bit pc-relative
3097          branch around the unconditional branch.
3098
3099             original:           new:
3100             bCC lab1            bCC' lab2
3101             bra lab2
3102            lab1:               lab1:
3103
3104          This happens when the bCC can't reach lab2 at assembly time,
3105          but due to other relaxations it can reach at link time.  */
3106       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_PCREL8)
3107         {
3108           Elf_Internal_Rela *nrel;
3109           bfd_vma value = symval;
3110           unsigned char code;
3111
3112           /* Deal with pc-relative gunk.  */
3113           value -= (sec->output_section->vma + sec->output_offset);
3114           value -= irel->r_offset;
3115           value += irel->r_addend;
3116
3117           /* Do nothing if this reloc is the last byte in the section.  */
3118           if (irel->r_offset == sec->size)
3119             continue;
3120
3121           /* See if the next instruction is an unconditional pc-relative
3122              branch, more often than not this test will fail, so we
3123              test it first to speed things up.  */
3124           code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
3125           if (code != 0xca)
3126             continue;
3127
3128           /* Also make sure the next relocation applies to the next
3129              instruction and that it's a pc-relative 8 bit branch.  */
3130           nrel = irel + 1;
3131           if (nrel == irelend
3132               || irel->r_offset + 2 != nrel->r_offset
3133               || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10300_PCREL8)
3134             continue;
3135
3136           /* Make sure our destination immediately follows the
3137              unconditional branch.  */
3138           if (symval != (sec->output_section->vma + sec->output_offset
3139                          + irel->r_offset + 3))
3140             continue;
3141
3142           /* Now make sure we are a conditional branch.  This may not
3143              be necessary, but why take the chance.
3144
3145              Note these checks assume that R_MN10300_PCREL8 relocs
3146              only occur on bCC and bCCx insns.  If they occured
3147              elsewhere, we'd need to know the start of this insn
3148              for this check to be accurate.  */
3149           code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3150           if (code != 0xc0 && code != 0xc1 && code != 0xc2
3151               && code != 0xc3 && code != 0xc4 && code != 0xc5
3152               && code != 0xc6 && code != 0xc7 && code != 0xc8
3153               && code != 0xc9 && code != 0xe8 && code != 0xe9
3154               && code != 0xea && code != 0xeb)
3155             continue;
3156
3157           /* We also have to be sure there is no symbol/label
3158              at the unconditional branch.  */
3159           if (mn10300_elf_symbol_address_p (abfd, sec, isymbuf,
3160                                             irel->r_offset + 1))
3161             continue;
3162
3163           /* Note that we've changed the relocs, section contents, etc.  */
3164           elf_section_data (sec)->relocs = internal_relocs;
3165           elf_section_data (sec)->this_hdr.contents = contents;
3166           symtab_hdr->contents = (unsigned char *) isymbuf;
3167
3168           /* Reverse the condition of the first branch.  */
3169           switch (code)
3170             {
3171             case 0xc8:
3172               code = 0xc9;
3173               break;
3174             case 0xc9:
3175               code = 0xc8;
3176               break;
3177             case 0xc0:
3178               code = 0xc2;
3179               break;
3180             case 0xc2:
3181               code = 0xc0;
3182               break;
3183             case 0xc3:
3184               code = 0xc1;
3185               break;
3186             case 0xc1:
3187               code = 0xc3;
3188               break;
3189             case 0xc4:
3190               code = 0xc6;
3191               break;
3192             case 0xc6:
3193               code = 0xc4;
3194               break;
3195             case 0xc7:
3196               code = 0xc5;
3197               break;
3198             case 0xc5:
3199               code = 0xc7;
3200               break;
3201             case 0xe8:
3202               code = 0xe9;
3203               break;
3204             case 0x9d:
3205               code = 0xe8;
3206               break;
3207             case 0xea:
3208               code = 0xeb;
3209               break;
3210             case 0xeb:
3211               code = 0xea;
3212               break;
3213             }
3214           bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
3215
3216           /* Set the reloc type and symbol for the first branch
3217              from the second branch.  */
3218           irel->r_info = nrel->r_info;
3219
3220           /* Make the reloc for the second branch a null reloc.  */
3221           nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
3222                                        R_MN10300_NONE);
3223
3224           /* Delete two bytes of data.  */
3225           if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3226                                                irel->r_offset + 1, 2))
3227             goto error_return;
3228
3229           /* That will change things, so, we should relax again.
3230              Note that this is not required, and it may be slow.  */
3231           *again = TRUE;
3232         }
3233
3234       /* Try to turn a 24 immediate, displacement or absolute address
3235          into a 8 immediate, displacement or absolute address.  */
3236       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_24)
3237         {
3238           bfd_vma value = symval;
3239           value += irel->r_addend;
3240
3241           /* See if the value will fit in 8 bits.  */
3242           if ((long) value < 0x7f && (long) value > -0x80)
3243             {
3244               unsigned char code;
3245
3246               /* AM33 insns which have 24 operands are 6 bytes long and
3247                  will have 0xfd as the first byte.  */
3248
3249               /* Get the first opcode.  */
3250               code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
3251
3252               if (code == 0xfd)
3253                 {
3254                   /* Get the second opcode.  */
3255                   code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
3256
3257                   /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
3258                      equivalent instructions exists.  */
3259                   if (code != 0x6b && code != 0x7b
3260                       && code != 0x8b && code != 0x9b
3261                       && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
3262                           || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
3263                           || (code & 0x0f) == 0x0e))
3264                     {
3265                       /* Not safe if the high bit is on as relaxing may
3266                          move the value out of high mem and thus not fit
3267                          in a signed 8bit value.  This is currently over
3268                          conservative.  */
3269                       if ((value & 0x80) == 0)
3270                         {
3271                           /* Note that we've changed the relocation contents,
3272                              etc.  */
3273                           elf_section_data (sec)->relocs = internal_relocs;
3274                           elf_section_data (sec)->this_hdr.contents = contents;
3275                           symtab_hdr->contents = (unsigned char *) isymbuf;
3276
3277                           /* Fix the opcode.  */
3278                           bfd_put_8 (abfd, 0xfb, contents + irel->r_offset - 3);
3279                           bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
3280
3281                           /* Fix the relocation's type.  */
3282                           irel->r_info =
3283                             ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3284                                           R_MN10300_8);
3285
3286                           /* Delete two bytes of data.  */
3287                           if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3288                                                                irel->r_offset + 1, 2))
3289                             goto error_return;
3290
3291                           /* That will change things, so, we should relax
3292                              again.  Note that this is not required, and it
3293                              may be slow.  */
3294                           *again = TRUE;
3295                           break;
3296                         }
3297                     }
3298                 }
3299             }
3300         }
3301
3302       /* Try to turn a 32bit immediate, displacement or absolute address
3303          into a 16bit immediate, displacement or absolute address.  */
3304       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_32
3305           || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOT32
3306           || ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTOFF32)
3307         {
3308           bfd_vma value = symval;
3309
3310           if (ELF32_R_TYPE (irel->r_info) != (int) R_MN10300_32)
3311             {
3312               asection * sgot;
3313
3314               sgot = bfd_get_section_by_name (elf_hash_table (link_info)
3315                                               ->dynobj, ".got");
3316
3317               if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOT32)
3318                 {
3319                   value = sgot->output_offset;
3320
3321                   if (h)
3322                     value += h->root.got.offset;
3323                   else
3324                     value += (elf_local_got_offsets
3325                               (abfd)[ELF32_R_SYM (irel->r_info)]);
3326                 }
3327               else if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTOFF32)
3328                 value -= sgot->output_section->vma;
3329               else if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOTPC32)
3330                 value = (sgot->output_section->vma
3331                          - (sec->output_section->vma
3332                             + sec->output_offset
3333                             + irel->r_offset));
3334               else
3335                 abort ();
3336             }
3337
3338           value += irel->r_addend;
3339
3340           /* See if the value will fit in 24 bits.
3341              We allow any 16bit match here.  We prune those we can't
3342              handle below.  */
3343           if ((long) value < 0x7fffff && (long) value > -0x800000)
3344             {
3345               unsigned char code;
3346
3347               /* AM33 insns which have 32bit operands are 7 bytes long and
3348                  will have 0xfe as the first byte.  */
3349
3350               /* Get the first opcode.  */
3351               code = bfd_get_8 (abfd, contents + irel->r_offset - 3);
3352
3353               if (code == 0xfe)
3354                 {
3355                   /* Get the second opcode.  */
3356                   code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
3357
3358                   /* All the am33 32 -> 24 relaxing possibilities.  */
3359                   /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit
3360                      equivalent instructions exists.  */
3361                   if (code != 0x6b && code != 0x7b
3362                       && code != 0x8b && code != 0x9b
3363                       && (ELF32_R_TYPE (irel->r_info)
3364                           != (int) R_MN10300_GOTPC32)
3365                       && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08
3366                           || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b
3367                           || (code & 0x0f) == 0x0e))
3368                     {
3369                       /* Not safe if the high bit is on as relaxing may
3370                          move the value out of high mem and thus not fit
3371                          in a signed 16bit value.  This is currently over
3372                          conservative.  */
3373                       if ((value & 0x8000) == 0)
3374                         {
3375                           /* Note that we've changed the relocation contents,
3376                              etc.  */
3377                           elf_section_data (sec)->relocs = internal_relocs;
3378                           elf_section_data (sec)->this_hdr.contents = contents;
3379                           symtab_hdr->contents = (unsigned char *) isymbuf;
3380
3381                           /* Fix the opcode.  */
3382                           bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 3);
3383                           bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
3384
3385                           /* Fix the relocation's type.  */
3386                           irel->r_info =
3387                             ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3388                                           (ELF32_R_TYPE (irel->r_info)
3389                                            == (int) R_MN10300_GOTOFF32)
3390                                           ? R_MN10300_GOTOFF24
3391                                           : (ELF32_R_TYPE (irel->r_info)
3392                                              == (int) R_MN10300_GOT32)
3393                                           ? R_MN10300_GOT24 :
3394                                           R_MN10300_24);
3395
3396                           /* Delete one byte of data.  */
3397                           if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3398                                                                irel->r_offset + 3, 1))
3399                             goto error_return;
3400
3401                           /* That will change things, so, we should relax
3402                              again.  Note that this is not required, and it
3403                              may be slow.  */
3404                           *again = TRUE;
3405                           break;
3406                         }
3407                     }
3408                 }
3409             }
3410
3411           /* See if the value will fit in 16 bits.
3412              We allow any 16bit match here.  We prune those we can't
3413              handle below.  */
3414           if ((long) value < 0x7fff && (long) value > -0x8000)
3415             {
3416               unsigned char code;
3417
3418               /* Most insns which have 32bit operands are 6 bytes long;
3419                  exceptions are pcrel insns and bit insns.
3420
3421                  We handle pcrel insns above.  We don't bother trying
3422                  to handle the bit insns here.
3423
3424                  The first byte of the remaining insns will be 0xfc.  */
3425
3426               /* Get the first opcode.  */
3427               code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
3428
3429               if (code != 0xfc)
3430                 continue;
3431
3432               /* Get the second opcode.  */
3433               code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
3434
3435               if ((code & 0xf0) < 0x80)
3436                 switch (code & 0xf0)
3437                   {
3438                   /* mov (d32,am),dn   -> mov (d32,am),dn
3439                      mov dm,(d32,am)   -> mov dn,(d32,am)
3440                      mov (d32,am),an   -> mov (d32,am),an
3441                      mov dm,(d32,am)   -> mov dn,(d32,am)
3442                      movbu (d32,am),dn -> movbu (d32,am),dn
3443                      movbu dm,(d32,am) -> movbu dn,(d32,am)
3444                      movhu (d32,am),dn -> movhu (d32,am),dn
3445                      movhu dm,(d32,am) -> movhu dn,(d32,am) */
3446                   case 0x00:
3447                   case 0x10:
3448                   case 0x20:
3449                   case 0x30:
3450                   case 0x40:
3451                   case 0x50:
3452                   case 0x60:
3453                   case 0x70:
3454                     /* Not safe if the high bit is on as relaxing may
3455                        move the value out of high mem and thus not fit
3456                        in a signed 16bit value.  */
3457                     if (code == 0xcc
3458                         && (value & 0x8000))
3459                       continue;
3460
3461                     /* Note that we've changed the relocation contents, etc.  */
3462                     elf_section_data (sec)->relocs = internal_relocs;
3463                     elf_section_data (sec)->this_hdr.contents = contents;
3464                     symtab_hdr->contents = (unsigned char *) isymbuf;
3465
3466                     /* Fix the opcode.  */
3467                     bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
3468                     bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
3469
3470                     /* Fix the relocation's type.  */
3471                     irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3472                                                  (ELF32_R_TYPE (irel->r_info)
3473                                                   == (int) R_MN10300_GOTOFF32)
3474                                                  ? R_MN10300_GOTOFF16
3475                                                  : (ELF32_R_TYPE (irel->r_info)
3476                                                     == (int) R_MN10300_GOT32)
3477                                                  ? R_MN10300_GOT16
3478                                                  : (ELF32_R_TYPE (irel->r_info)
3479                                                     == (int) R_MN10300_GOTPC32)
3480                                                  ? R_MN10300_GOTPC16 :
3481                                                  R_MN10300_16);
3482
3483                     /* Delete two bytes of data.  */
3484                     if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3485                                                          irel->r_offset + 2, 2))
3486                       goto error_return;
3487
3488                     /* That will change things, so, we should relax again.
3489                        Note that this is not required, and it may be slow.  */
3490                     *again = TRUE;
3491                     break;
3492                   }
3493               else if ((code & 0xf0) == 0x80
3494                        || (code & 0xf0) == 0x90)
3495                 switch (code & 0xf3)
3496                   {
3497                   /* mov dn,(abs32)   -> mov dn,(abs16)
3498                      movbu dn,(abs32) -> movbu dn,(abs16)
3499                      movhu dn,(abs32) -> movhu dn,(abs16)  */
3500                   case 0x81:
3501                   case 0x82:
3502                   case 0x83:
3503                     /* Note that we've changed the relocation contents, etc.  */
3504                     elf_section_data (sec)->relocs = internal_relocs;
3505                     elf_section_data (sec)->this_hdr.contents = contents;
3506                     symtab_hdr->contents = (unsigned char *) isymbuf;
3507
3508                     if ((code & 0xf3) == 0x81)
3509                       code = 0x01 + (code & 0x0c);
3510                     else if ((code & 0xf3) == 0x82)
3511                       code = 0x02 + (code & 0x0c);
3512                     else if ((code & 0xf3) == 0x83)
3513                       code = 0x03 + (code & 0x0c);
3514                     else
3515                       abort ();
3516
3517                     /* Fix the opcode.  */
3518                     bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
3519
3520                     /* Fix the relocation's type.  */
3521                     irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3522                                                  (ELF32_R_TYPE (irel->r_info)
3523                                                   == (int) R_MN10300_GOTOFF32)
3524                                                  ? R_MN10300_GOTOFF16
3525                                                  : (ELF32_R_TYPE (irel->r_info)
3526                                                     == (int) R_MN10300_GOT32)
3527                                                  ? R_MN10300_GOT16
3528                                                  : (ELF32_R_TYPE (irel->r_info)
3529                                                     == (int) R_MN10300_GOTPC32)
3530                                                  ? R_MN10300_GOTPC16 :
3531                                                  R_MN10300_16);
3532
3533                     /* The opcode got shorter too, so we have to fix the
3534                        addend and offset too!  */
3535                     irel->r_offset -= 1;
3536
3537                     /* Delete three bytes of data.  */
3538                     if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3539                                                          irel->r_offset + 1, 3))
3540                       goto error_return;
3541
3542                     /* That will change things, so, we should relax again.
3543                        Note that this is not required, and it may be slow.  */
3544                     *again = TRUE;
3545                     break;
3546
3547                   /* mov am,(abs32)    -> mov am,(abs16)
3548                      mov am,(d32,sp)   -> mov am,(d16,sp)
3549                      mov dm,(d32,sp)   -> mov dm,(d32,sp)
3550                      movbu dm,(d32,sp) -> movbu dm,(d32,sp)
3551                      movhu dm,(d32,sp) -> movhu dm,(d32,sp) */
3552                   case 0x80:
3553                   case 0x90:
3554                   case 0x91:
3555                   case 0x92:
3556                   case 0x93:
3557                     /* sp-based offsets are zero-extended.  */
3558                     if (code >= 0x90 && code <= 0x93
3559                         && (long) value < 0)
3560                       continue;
3561
3562                     /* Note that we've changed the relocation contents, etc.  */
3563                     elf_section_data (sec)->relocs = internal_relocs;
3564                     elf_section_data (sec)->this_hdr.contents = contents;
3565                     symtab_hdr->contents = (unsigned char *) isymbuf;
3566
3567                     /* Fix the opcode.  */
3568                     bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
3569                     bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
3570
3571                     /* Fix the relocation's type.  */
3572                     irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3573                                                  (ELF32_R_TYPE (irel->r_info)
3574                                                   == (int) R_MN10300_GOTOFF32)
3575                                                  ? R_MN10300_GOTOFF16
3576                                                  : (ELF32_R_TYPE (irel->r_info)
3577                                                     == (int) R_MN10300_GOT32)
3578                                                  ? R_MN10300_GOT16
3579                                                  : (ELF32_R_TYPE (irel->r_info)
3580                                                     == (int) R_MN10300_GOTPC32)
3581                                                  ? R_MN10300_GOTPC16 :
3582                                                  R_MN10300_16);
3583
3584                     /* Delete two bytes of data.  */
3585                     if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3586                                                          irel->r_offset + 2, 2))
3587                       goto error_return;
3588
3589                     /* That will change things, so, we should relax again.
3590                        Note that this is not required, and it may be slow.  */
3591                     *again = TRUE;
3592                     break;
3593                   }
3594               else if ((code & 0xf0) < 0xf0)
3595                 switch (code & 0xfc)
3596                   {
3597                   /* mov imm32,dn     -> mov imm16,dn
3598                      mov imm32,an     -> mov imm16,an
3599                      mov (abs32),dn   -> mov (abs16),dn
3600                      movbu (abs32),dn -> movbu (abs16),dn
3601                      movhu (abs32),dn -> movhu (abs16),dn  */
3602                   case 0xcc:
3603                   case 0xdc:
3604                   case 0xa4:
3605                   case 0xa8:
3606                   case 0xac:
3607                     /* Not safe if the high bit is on as relaxing may
3608                        move the value out of high mem and thus not fit
3609                        in a signed 16bit value.  */
3610                     if (code == 0xcc
3611                         && (value & 0x8000))
3612                       continue;
3613
3614                     /* mov imm16, an zero-extends the immediate.  */
3615                     if (code == 0xdc
3616                         && (long) value < 0)
3617                       continue;
3618
3619                     /* Note that we've changed the relocation contents, etc.  */
3620                     elf_section_data (sec)->relocs = internal_relocs;
3621                     elf_section_data (sec)->this_hdr.contents = contents;
3622                     symtab_hdr->contents = (unsigned char *) isymbuf;
3623
3624                     if ((code & 0xfc) == 0xcc)
3625                       code = 0x2c + (code & 0x03);
3626                     else if ((code & 0xfc) == 0xdc)
3627                       code = 0x24 + (code & 0x03);
3628                     else if ((code & 0xfc) == 0xa4)
3629                       code = 0x30 + (code & 0x03);
3630                     else if ((code & 0xfc) == 0xa8)
3631                       code = 0x34 + (code & 0x03);
3632                     else if ((code & 0xfc) == 0xac)
3633                       code = 0x38 + (code & 0x03);
3634                     else
3635                       abort ();
3636
3637                     /* Fix the opcode.  */
3638                     bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
3639
3640                     /* Fix the relocation's type.  */
3641                     irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3642                                                  (ELF32_R_TYPE (irel->r_info)
3643                                                   == (int) R_MN10300_GOTOFF32)
3644                                                  ? R_MN10300_GOTOFF16
3645                                                  : (ELF32_R_TYPE (irel->r_info)
3646                                                     == (int) R_MN10300_GOT32)
3647                                                  ? R_MN10300_GOT16
3648                                                  : (ELF32_R_TYPE (irel->r_info)
3649                                                     == (int) R_MN10300_GOTPC32)
3650                                                  ? R_MN10300_GOTPC16 :
3651                                                  R_MN10300_16);
3652
3653                     /* The opcode got shorter too, so we have to fix the
3654                        addend and offset too!  */
3655                     irel->r_offset -= 1;
3656
3657                     /* Delete three bytes of data.  */
3658                     if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3659                                                          irel->r_offset + 1, 3))
3660                       goto error_return;
3661
3662                     /* That will change things, so, we should relax again.
3663                        Note that this is not required, and it may be slow.  */
3664                     *again = TRUE;
3665                     break;
3666
3667                   /* mov (abs32),an    -> mov (abs16),an
3668                      mov (d32,sp),an   -> mov (d16,sp),an
3669                      mov (d32,sp),dn   -> mov (d16,sp),dn
3670                      movbu (d32,sp),dn -> movbu (d16,sp),dn
3671                      movhu (d32,sp),dn -> movhu (d16,sp),dn
3672                      add imm32,dn      -> add imm16,dn
3673                      cmp imm32,dn      -> cmp imm16,dn
3674                      add imm32,an      -> add imm16,an
3675                      cmp imm32,an      -> cmp imm16,an
3676                      and imm32,dn      -> and imm16,dn
3677                      or imm32,dn       -> or imm16,dn
3678                      xor imm32,dn      -> xor imm16,dn
3679                      btst imm32,dn     -> btst imm16,dn */
3680
3681                   case 0xa0:
3682                   case 0xb0:
3683                   case 0xb1:
3684                   case 0xb2:
3685                   case 0xb3:
3686                   case 0xc0:
3687                   case 0xc8:
3688
3689                   case 0xd0:
3690                   case 0xd8:
3691                   case 0xe0:
3692                   case 0xe1:
3693                   case 0xe2:
3694                   case 0xe3:
3695                     /* cmp imm16, an zero-extends the immediate.  */
3696                     if (code == 0xdc
3697                         && (long) value < 0)
3698                       continue;
3699
3700                     /* So do sp-based offsets.  */
3701                     if (code >= 0xb0 && code <= 0xb3
3702                         && (long) value < 0)
3703                       continue;
3704
3705                     /* Note that we've changed the relocation contents, etc.  */
3706                     elf_section_data (sec)->relocs = internal_relocs;
3707                     elf_section_data (sec)->this_hdr.contents = contents;
3708                     symtab_hdr->contents = (unsigned char *) isymbuf;
3709
3710                     /* Fix the opcode.  */
3711                     bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
3712                     bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
3713
3714                     /* Fix the relocation's type.  */
3715                     irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3716                                                  (ELF32_R_TYPE (irel->r_info)
3717                                                   == (int) R_MN10300_GOTOFF32)
3718                                                  ? R_MN10300_GOTOFF16
3719                                                  : (ELF32_R_TYPE (irel->r_info)
3720                                                     == (int) R_MN10300_GOT32)
3721                                                  ? R_MN10300_GOT16
3722                                                  : (ELF32_R_TYPE (irel->r_info)
3723                                                     == (int) R_MN10300_GOTPC32)
3724                                                  ? R_MN10300_GOTPC16 :
3725                                                  R_MN10300_16);
3726
3727                     /* Delete two bytes of data.  */
3728                     if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3729                                                          irel->r_offset + 2, 2))
3730                       goto error_return;
3731
3732                     /* That will change things, so, we should relax again.
3733                        Note that this is not required, and it may be slow.  */
3734                     *again = TRUE;
3735                     break;
3736                   }
3737               else if (code == 0xfe)
3738                 {
3739                   /* add imm32,sp -> add imm16,sp  */
3740
3741                   /* Note that we've changed the relocation contents, etc.  */
3742                   elf_section_data (sec)->relocs = internal_relocs;
3743                   elf_section_data (sec)->this_hdr.contents = contents;
3744                   symtab_hdr->contents = (unsigned char *) isymbuf;
3745
3746                   /* Fix the opcode.  */
3747                   bfd_put_8 (abfd, 0xfa, contents + irel->r_offset - 2);
3748                   bfd_put_8 (abfd, 0xfe, contents + irel->r_offset - 1);
3749
3750                   /* Fix the relocation's type.  */
3751                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
3752                                                (ELF32_R_TYPE (irel->r_info)
3753                                                 == (int) R_MN10300_GOT32)
3754                                                ? R_MN10300_GOT16
3755                                                : (ELF32_R_TYPE (irel->r_info)
3756                                                   == (int) R_MN10300_GOTOFF32)
3757                                                ? R_MN10300_GOTOFF16
3758                                                : (ELF32_R_TYPE (irel->r_info)
3759                                                   == (int) R_MN10300_GOTPC32)
3760                                                ? R_MN10300_GOTPC16 :
3761                                                R_MN10300_16);
3762
3763                   /* Delete two bytes of data.  */
3764                   if (!mn10300_elf_relax_delete_bytes (abfd, sec,
3765                                                        irel->r_offset + 2, 2))
3766                     goto error_return;
3767
3768                   /* That will change things, so, we should relax again.
3769                      Note that this is not required, and it may be slow.  */
3770                   *again = TRUE;
3771                   break;
3772                 }
3773             }
3774         }
3775     }
3776
3777   if (isymbuf != NULL
3778       && symtab_hdr->contents != (unsigned char *) isymbuf)
3779     {
3780       if (! link_info->keep_memory)
3781         free (isymbuf);
3782       else
3783         {
3784           /* Cache the symbols for elf_link_input_bfd.  */
3785           symtab_hdr->contents = (unsigned char *) isymbuf;
3786         }
3787     }
3788
3789   if (contents != NULL
3790       && elf_section_data (sec)->this_hdr.contents != contents)
3791     {
3792       if (! link_info->keep_memory)
3793         free (contents);
3794       else
3795         {
3796           /* Cache the section contents for elf_link_input_bfd.  */
3797           elf_section_data (sec)->this_hdr.contents = contents;
3798         }
3799     }
3800
3801   if (internal_relocs != NULL
3802       && elf_section_data (sec)->relocs != internal_relocs)
3803     free (internal_relocs);
3804
3805   return TRUE;
3806
3807  error_return:
3808   if (isymbuf != NULL
3809       && symtab_hdr->contents != (unsigned char *) isymbuf)
3810     free (isymbuf);
3811   if (contents != NULL
3812       && elf_section_data (section)->this_hdr.contents != contents)
3813     free (contents);
3814   if (internal_relocs != NULL
3815       && elf_section_data (section)->relocs != internal_relocs)
3816     free (internal_relocs);
3817
3818   return FALSE;
3819 }
3820
3821 /* This is a version of bfd_generic_get_relocated_section_contents
3822    which uses mn10300_elf_relocate_section.  */
3823
3824 static bfd_byte *
3825 mn10300_elf_get_relocated_section_contents (bfd *output_bfd,
3826                                             struct bfd_link_info *link_info,
3827                                             struct bfd_link_order *link_order,
3828                                             bfd_byte *data,
3829                                             bfd_boolean relocatable,
3830                                             asymbol **symbols)
3831 {
3832   Elf_Internal_Shdr *symtab_hdr;
3833   asection *input_section = link_order->u.indirect.section;
3834   bfd *input_bfd = input_section->owner;
3835   asection **sections = NULL;
3836   Elf_Internal_Rela *internal_relocs = NULL;
3837   Elf_Internal_Sym *isymbuf = NULL;
3838
3839   /* We only need to handle the case of relaxing, or of having a
3840      particular set of section contents, specially.  */
3841   if (relocatable
3842       || elf_section_data (input_section)->this_hdr.contents == NULL)
3843     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
3844                                                        link_order, data,
3845                                                        relocatable,
3846                                                        symbols);
3847
3848   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3849
3850   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
3851           (size_t) input_section->size);
3852
3853   if ((input_section->flags & SEC_RELOC) != 0
3854       && input_section->reloc_count > 0)
3855     {
3856       asection **secpp;
3857       Elf_Internal_Sym *isym, *isymend;
3858       bfd_size_type amt;
3859
3860       internal_relocs = _bfd_elf_link_read_relocs (input_bfd, input_section,
3861                                                    NULL, NULL, FALSE);
3862       if (internal_relocs == NULL)
3863         goto error_return;
3864
3865       if (symtab_hdr->sh_info != 0)
3866         {
3867           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3868           if (isymbuf == NULL)
3869             isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
3870                                             symtab_hdr->sh_info, 0,
3871                                             NULL, NULL, NULL);
3872           if (isymbuf == NULL)
3873             goto error_return;
3874         }
3875
3876       amt = symtab_hdr->sh_info;
3877       amt *= sizeof (asection *);
3878       sections = bfd_malloc (amt);
3879       if (sections == NULL && amt != 0)
3880         goto error_return;
3881
3882       isymend = isymbuf + symtab_hdr->sh_info;
3883       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
3884         {
3885           asection *isec;
3886
3887           if (isym->st_shndx == SHN_UNDEF)
3888             isec = bfd_und_section_ptr;
3889           else if (isym->st_shndx == SHN_ABS)
3890             isec = bfd_abs_section_ptr;
3891           else if (isym->st_shndx == SHN_COMMON)
3892             isec = bfd_com_section_ptr;
3893           else
3894             isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
3895
3896           *secpp = isec;
3897         }
3898
3899       if (! mn10300_elf_relocate_section (output_bfd, link_info, input_bfd,
3900                                           input_section, data, internal_relocs,
3901                                           isymbuf, sections))
3902         goto error_return;
3903
3904       if (sections != NULL)
3905         free (sections);
3906       if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
3907         free (isymbuf);
3908       if (internal_relocs != elf_section_data (input_section)->relocs)
3909         free (internal_relocs);
3910     }
3911
3912   return data;
3913
3914  error_return:
3915   if (sections != NULL)
3916     free (sections);
3917   if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
3918     free (isymbuf);
3919   if (internal_relocs != NULL
3920       && internal_relocs != elf_section_data (input_section)->relocs)
3921     free (internal_relocs);
3922   return NULL;
3923 }
3924
3925 /* Assorted hash table functions.  */
3926
3927 /* Initialize an entry in the link hash table.  */
3928
3929 /* Create an entry in an MN10300 ELF linker hash table.  */
3930
3931 static struct bfd_hash_entry *
3932 elf32_mn10300_link_hash_newfunc (struct bfd_hash_entry *entry,
3933                                  struct bfd_hash_table *table,
3934                                  const char *string)
3935 {
3936   struct elf32_mn10300_link_hash_entry *ret =
3937     (struct elf32_mn10300_link_hash_entry *) entry;
3938
3939   /* Allocate the structure if it has not already been allocated by a
3940      subclass.  */
3941   if (ret == NULL)
3942     ret = (struct elf32_mn10300_link_hash_entry *)
3943            bfd_hash_allocate (table, sizeof (* ret));
3944   if (ret == NULL)
3945     return (struct bfd_hash_entry *) ret;
3946
3947   /* Call the allocation method of the superclass.  */
3948   ret = (struct elf32_mn10300_link_hash_entry *)
3949          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3950                                      table, string);
3951   if (ret != NULL)
3952     {
3953       ret->direct_calls = 0;
3954       ret->stack_size = 0;
3955       ret->movm_args = 0;
3956       ret->movm_stack_size = 0;
3957       ret->flags = 0;
3958       ret->value = 0;
3959     }
3960
3961   return (struct bfd_hash_entry *) ret;
3962 }
3963
3964 /* Create an mn10300 ELF linker hash table.  */
3965
3966 static struct bfd_link_hash_table *
3967 elf32_mn10300_link_hash_table_create (bfd *abfd)
3968 {
3969   struct elf32_mn10300_link_hash_table *ret;
3970   bfd_size_type amt = sizeof (* ret);
3971
3972   ret = bfd_malloc (amt);
3973   if (ret == NULL)
3974     return NULL;
3975
3976   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3977                                       elf32_mn10300_link_hash_newfunc,
3978                                       sizeof (struct elf32_mn10300_link_hash_entry),
3979                                       MN10300_ELF_DATA))
3980     {
3981       free (ret);
3982       return NULL;
3983     }
3984
3985   ret->flags = 0;
3986   amt = sizeof (struct elf_link_hash_table);
3987   ret->static_hash_table = bfd_malloc (amt);
3988   if (ret->static_hash_table == NULL)
3989     {
3990       free (ret);
3991       return NULL;
3992     }
3993
3994   if (!_bfd_elf_link_hash_table_init (&ret->static_hash_table->root, abfd,
3995                                       elf32_mn10300_link_hash_newfunc,
3996                                       sizeof (struct elf32_mn10300_link_hash_entry),
3997                                       MN10300_ELF_DATA))
3998     {
3999       free (ret->static_hash_table);
4000       free (ret);
4001       return NULL;
4002     }
4003   return & ret->root.root;
4004 }
4005
4006 /* Free an mn10300 ELF linker hash table.  */
4007
4008 static void
4009 elf32_mn10300_link_hash_table_free (struct bfd_link_hash_table *hash)
4010 {
4011   struct elf32_mn10300_link_hash_table *ret
4012     = (struct elf32_mn10300_link_hash_table *) hash;
4013
4014   _bfd_generic_link_hash_table_free
4015     ((struct bfd_link_hash_table *) ret->static_hash_table);
4016   _bfd_generic_link_hash_table_free
4017     ((struct bfd_link_hash_table *) ret);
4018 }
4019
4020 static unsigned long
4021 elf_mn10300_mach (flagword flags)
4022 {
4023   switch (flags & EF_MN10300_MACH)
4024     {
4025     case E_MN10300_MACH_MN10300:
4026     default:
4027       return bfd_mach_mn10300;
4028
4029     case E_MN10300_MACH_AM33:
4030       return bfd_mach_am33;
4031
4032     case E_MN10300_MACH_AM33_2:
4033       return bfd_mach_am33_2;
4034     }
4035 }
4036
4037 /* The final processing done just before writing out a MN10300 ELF object
4038    file.  This gets the MN10300 architecture right based on the machine
4039    number.  */
4040
4041 static void
4042 _bfd_mn10300_elf_final_write_processing (bfd *abfd,
4043                                          bfd_boolean linker ATTRIBUTE_UNUSED)
4044 {
4045   unsigned long val;
4046
4047   switch (bfd_get_mach (abfd))
4048     {
4049     default:
4050     case bfd_mach_mn10300:
4051       val = E_MN10300_MACH_MN10300;
4052       break;
4053
4054     case bfd_mach_am33:
4055       val = E_MN10300_MACH_AM33;
4056       break;
4057
4058     case bfd_mach_am33_2:
4059       val = E_MN10300_MACH_AM33_2;
4060       break;
4061     }
4062
4063   elf_elfheader (abfd)->e_flags &= ~ (EF_MN10300_MACH);
4064   elf_elfheader (abfd)->e_flags |= val;
4065 }
4066
4067 static bfd_boolean
4068 _bfd_mn10300_elf_object_p (bfd *abfd)
4069 {
4070   bfd_default_set_arch_mach (abfd, bfd_arch_mn10300,
4071                              elf_mn10300_mach (elf_elfheader (abfd)->e_flags));
4072   return TRUE;
4073 }
4074
4075 /* Merge backend specific data from an object file to the output
4076    object file when linking.  */
4077
4078 static bfd_boolean
4079 _bfd_mn10300_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
4080 {
4081   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4082       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4083     return TRUE;
4084
4085   if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4086       && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
4087     {
4088       if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
4089                                bfd_get_mach (ibfd)))
4090         return FALSE;
4091     }
4092
4093   return TRUE;
4094 }
4095
4096 #define PLT0_ENTRY_SIZE     15
4097 #define PLT_ENTRY_SIZE      20
4098 #define PIC_PLT_ENTRY_SIZE  24
4099
4100 static const bfd_byte elf_mn10300_plt0_entry[PLT0_ENTRY_SIZE] =
4101 {
4102   0xfc, 0xa0, 0, 0, 0, 0,       /* mov  (.got+8),a0 */
4103   0xfe, 0xe, 0x10, 0, 0, 0, 0,  /* mov  (.got+4),r1 */
4104   0xf0, 0xf4,                   /* jmp  (a0) */
4105 };
4106
4107 static const bfd_byte elf_mn10300_plt_entry[PLT_ENTRY_SIZE] =
4108 {
4109   0xfc, 0xa0, 0, 0, 0, 0,       /* mov  (nameN@GOT + .got),a0 */
4110   0xf0, 0xf4,                   /* jmp  (a0) */
4111   0xfe, 8, 0, 0, 0, 0, 0,       /* mov  reloc-table-address,r0 */
4112   0xdc, 0, 0, 0, 0,             /* jmp  .plt0 */
4113 };
4114
4115 static const bfd_byte elf_mn10300_pic_plt_entry[PIC_PLT_ENTRY_SIZE] =
4116 {
4117   0xfc, 0x22, 0, 0, 0, 0,       /* mov  (nameN@GOT,a2),a0 */
4118   0xf0, 0xf4,                   /* jmp  (a0) */
4119   0xfe, 8, 0, 0, 0, 0, 0,       /* mov  reloc-table-address,r0 */
4120   0xf8, 0x22, 8,                /* mov  (8,a2),a0 */
4121   0xfb, 0xa, 0x1a, 4,           /* mov  (4,a2),r1 */
4122   0xf0, 0xf4,                   /* jmp  (a0) */
4123 };
4124
4125 /* Return size of the first PLT entry.  */
4126 #define elf_mn10300_sizeof_plt0(info) \
4127   (info->shared ? PIC_PLT_ENTRY_SIZE : PLT0_ENTRY_SIZE)
4128
4129 /* Return size of a PLT entry.  */
4130 #define elf_mn10300_sizeof_plt(info) \
4131   (info->shared ? PIC_PLT_ENTRY_SIZE : PLT_ENTRY_SIZE)
4132
4133 /* Return offset of the PLT0 address in an absolute PLT entry.  */
4134 #define elf_mn10300_plt_plt0_offset(info) 16
4135
4136 /* Return offset of the linker in PLT0 entry.  */
4137 #define elf_mn10300_plt0_linker_offset(info) 2
4138
4139 /* Return offset of the GOT id in PLT0 entry.  */
4140 #define elf_mn10300_plt0_gotid_offset(info) 9
4141
4142 /* Return offset of the temporary in PLT entry.  */
4143 #define elf_mn10300_plt_temp_offset(info) 8
4144
4145 /* Return offset of the symbol in PLT entry.  */
4146 #define elf_mn10300_plt_symbol_offset(info) 2
4147
4148 /* Return offset of the relocation in PLT entry.  */
4149 #define elf_mn10300_plt_reloc_offset(info) 11
4150
4151 /* The name of the dynamic interpreter.  This is put in the .interp
4152    section.  */
4153
4154 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
4155
4156 /* Create dynamic sections when linking against a dynamic object.  */
4157
4158 static bfd_boolean
4159 _bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
4160 {
4161   flagword   flags;
4162   asection * s;
4163   const struct elf_backend_data * bed = get_elf_backend_data (abfd);
4164   int ptralign = 0;
4165
4166   switch (bed->s->arch_size)
4167     {
4168     case 32:
4169       ptralign = 2;
4170       break;
4171
4172     case 64:
4173       ptralign = 3;
4174       break;
4175
4176     default:
4177       bfd_set_error (bfd_error_bad_value);
4178       return FALSE;
4179     }
4180
4181   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
4182      .rel[a].bss sections.  */
4183   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4184            | SEC_LINKER_CREATED);
4185
4186   s = bfd_make_section_with_flags (abfd,
4187                                    (bed->default_use_rela_p
4188                                     ? ".rela.plt" : ".rel.plt"),
4189                                    flags | SEC_READONLY);
4190   if (s == NULL
4191       || ! bfd_set_section_alignment (abfd, s, ptralign))
4192     return FALSE;
4193
4194   if (! _bfd_mn10300_elf_create_got_section (abfd, info))
4195     return FALSE;
4196
4197   {
4198     const char * secname;
4199     char *       relname;
4200     flagword     secflags;
4201     asection *   sec;
4202
4203     for (sec = abfd->sections; sec; sec = sec->next)
4204       {
4205         secflags = bfd_get_section_flags (abfd, sec);
4206         if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
4207             || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
4208           continue;
4209
4210         secname = bfd_get_section_name (abfd, sec);
4211         relname = bfd_malloc (strlen (secname) + 6);
4212         strcpy (relname, ".rela");
4213         strcat (relname, secname);
4214
4215         s = bfd_make_section_with_flags (abfd, relname,
4216                                          flags | SEC_READONLY);
4217         if (s == NULL
4218             || ! bfd_set_section_alignment (abfd, s, ptralign))
4219           return FALSE;
4220       }
4221   }
4222
4223   if (bed->want_dynbss)
4224     {
4225       /* The .dynbss section is a place to put symbols which are defined
4226          by dynamic objects, are referenced by regular objects, and are
4227          not functions.  We must allocate space for them in the process
4228          image and use a R_*_COPY reloc to tell the dynamic linker to
4229          initialize them at run time.  The linker script puts the .dynbss
4230          section into the .bss section of the final image.  */
4231       s = bfd_make_section_with_flags (abfd, ".dynbss",
4232                                        SEC_ALLOC | SEC_LINKER_CREATED);
4233       if (s == NULL)
4234         return FALSE;
4235
4236       /* The .rel[a].bss section holds copy relocs.  This section is not
4237          normally needed.  We need to create it here, though, so that the
4238          linker will map it to an output section.  We can't just create it
4239          only if we need it, because we will not know whether we need it
4240          until we have seen all the input files, and the first time the
4241          main linker code calls BFD after examining all the input files
4242          (size_dynamic_sections) the input sections have already been
4243          mapped to the output sections.  If the section turns out not to
4244          be needed, we can discard it later.  We will never need this
4245          section when generating a shared object, since they do not use
4246          copy relocs.  */
4247       if (! info->shared)
4248         {
4249           s = bfd_make_section_with_flags (abfd,
4250                                            (bed->default_use_rela_p
4251                                             ? ".rela.bss" : ".rel.bss"),
4252                                            flags | SEC_READONLY);
4253           if (s == NULL
4254               || ! bfd_set_section_alignment (abfd, s, ptralign))
4255             return FALSE;
4256         }
4257     }
4258
4259   return TRUE;
4260 }
4261 \f
4262 /* Adjust a symbol defined by a dynamic object and referenced by a
4263    regular object.  The current definition is in some section of the
4264    dynamic object, but we're not including those sections.  We have to
4265    change the definition to something the rest of the link can
4266    understand.  */
4267
4268 static bfd_boolean
4269 _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
4270                                         struct elf_link_hash_entry * h)
4271 {
4272   bfd * dynobj;
4273   asection * s;
4274
4275   dynobj = elf_hash_table (info)->dynobj;
4276
4277   /* Make sure we know what is going on here.  */
4278   BFD_ASSERT (dynobj != NULL
4279               && (h->needs_plt
4280                   || h->u.weakdef != NULL
4281                   || (h->def_dynamic
4282                       && h->ref_regular
4283                       && !h->def_regular)));
4284
4285   /* If this is a function, put it in the procedure linkage table.  We
4286      will fill in the contents of the procedure linkage table later,
4287      when we know the address of the .got section.  */
4288   if (h->type == STT_FUNC
4289       || h->needs_plt)
4290     {
4291       if (! info->shared
4292           && !h->def_dynamic
4293           && !h->ref_dynamic)
4294         {
4295           /* This case can occur if we saw a PLT reloc in an input
4296              file, but the symbol was never referred to by a dynamic
4297              object.  In such a case, we don't actually need to build
4298              a procedure linkage table, and we can just do a REL32
4299              reloc instead.  */
4300           BFD_ASSERT (h->needs_plt);
4301           return TRUE;
4302         }
4303
4304       /* Make sure this symbol is output as a dynamic symbol.  */
4305       if (h->dynindx == -1)
4306         {
4307           if (! bfd_elf_link_record_dynamic_symbol (info, h))
4308             return FALSE;
4309         }
4310
4311       s = bfd_get_section_by_name (dynobj, ".plt");
4312       BFD_ASSERT (s != NULL);
4313
4314       /* If this is the first .plt entry, make room for the special
4315          first entry.  */
4316       if (s->size == 0)
4317         s->size += elf_mn10300_sizeof_plt0 (info);
4318
4319       /* If this symbol is not defined in a regular file, and we are
4320          not generating a shared library, then set the symbol to this
4321          location in the .plt.  This is required to make function
4322          pointers compare as equal between the normal executable and
4323          the shared library.  */
4324       if (! info->shared
4325           && !h->def_regular)
4326         {
4327           h->root.u.def.section = s;
4328           h->root.u.def.value = s->size;
4329         }
4330
4331       h->plt.offset = s->size;
4332
4333       /* Make room for this entry.  */
4334       s->size += elf_mn10300_sizeof_plt (info);
4335
4336       /* We also need to make an entry in the .got.plt section, which
4337          will be placed in the .got section by the linker script.  */
4338       s = bfd_get_section_by_name (dynobj, ".got.plt");
4339       BFD_ASSERT (s != NULL);
4340       s->size += 4;
4341
4342       /* We also need to make an entry in the .rela.plt section.  */
4343       s = bfd_get_section_by_name (dynobj, ".rela.plt");
4344       BFD_ASSERT (s != NULL);
4345       s->size += sizeof (Elf32_External_Rela);
4346
4347       return TRUE;
4348     }
4349
4350   /* If this is a weak symbol, and there is a real definition, the
4351      processor independent code will have arranged for us to see the
4352      real definition first, and we can just use the same value.  */
4353   if (h->u.weakdef != NULL)
4354     {
4355       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4356                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
4357       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4358       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4359       return TRUE;
4360     }
4361
4362   /* This is a reference to a symbol defined by a dynamic object which
4363      is not a function.  */
4364
4365   /* If we are creating a shared library, we must presume that the
4366      only references to the symbol are via the global offset table.
4367      For such cases we need not do anything here; the relocations will
4368      be handled correctly by relocate_section.  */
4369   if (info->shared)
4370     return TRUE;
4371
4372   /* If there are no references to this symbol that do not use the
4373      GOT, we don't need to generate a copy reloc.  */
4374   if (!h->non_got_ref)
4375     return TRUE;
4376
4377   if (h->size == 0)
4378     {
4379       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4380                              h->root.root.string);
4381       return TRUE;
4382     }
4383
4384   /* We must allocate the symbol in our .dynbss section, which will
4385      become part of the .bss section of the executable.  There will be
4386      an entry for this symbol in the .dynsym section.  The dynamic
4387      object will contain position independent code, so all references
4388      from the dynamic object to this symbol will go through the global
4389      offset table.  The dynamic linker will use the .dynsym entry to
4390      determine the address it must put in the global offset table, so
4391      both the dynamic object and the regular object will refer to the
4392      same memory location for the variable.  */
4393
4394   s = bfd_get_section_by_name (dynobj, ".dynbss");
4395   BFD_ASSERT (s != NULL);
4396
4397   /* We must generate a R_MN10300_COPY reloc to tell the dynamic linker to
4398      copy the initial value out of the dynamic object and into the
4399      runtime process image.  We need to remember the offset into the
4400      .rela.bss section we are going to use.  */
4401   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4402     {
4403       asection * srel;
4404
4405       srel = bfd_get_section_by_name (dynobj, ".rela.bss");
4406       BFD_ASSERT (srel != NULL);
4407       srel->size += sizeof (Elf32_External_Rela);
4408       h->needs_copy = 1;
4409     }
4410
4411   return _bfd_elf_adjust_dynamic_copy (h, s);
4412 }
4413
4414 /* Set the sizes of the dynamic sections.  */
4415
4416 static bfd_boolean
4417 _bfd_mn10300_elf_size_dynamic_sections (bfd * output_bfd,
4418                                         struct bfd_link_info * info)
4419 {
4420   bfd * dynobj;
4421   asection * s;
4422   bfd_boolean plt;
4423   bfd_boolean relocs;
4424   bfd_boolean reltext;
4425
4426   dynobj = elf_hash_table (info)->dynobj;
4427   BFD_ASSERT (dynobj != NULL);
4428
4429   if (elf_hash_table (info)->dynamic_sections_created)
4430     {
4431       /* Set the contents of the .interp section to the interpreter.  */
4432       if (info->executable)
4433         {
4434           s = bfd_get_section_by_name (dynobj, ".interp");
4435           BFD_ASSERT (s != NULL);
4436           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4437           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4438         }
4439     }
4440   else
4441     {
4442       /* We may have created entries in the .rela.got section.
4443          However, if we are not creating the dynamic sections, we will
4444          not actually use these entries.  Reset the size of .rela.got,
4445          which will cause it to get stripped from the output file
4446          below.  */
4447       s = bfd_get_section_by_name (dynobj, ".rela.got");
4448       if (s != NULL)
4449         s->size = 0;
4450     }
4451
4452   /* The check_relocs and adjust_dynamic_symbol entry points have
4453      determined the sizes of the various dynamic sections.  Allocate
4454      memory for them.  */
4455   plt = FALSE;
4456   relocs = FALSE;
4457   reltext = FALSE;
4458   for (s = dynobj->sections; s != NULL; s = s->next)
4459     {
4460       const char * name;
4461
4462       if ((s->flags & SEC_LINKER_CREATED) == 0)
4463         continue;
4464
4465       /* It's OK to base decisions on the section name, because none
4466          of the dynobj section names depend upon the input files.  */
4467       name = bfd_get_section_name (dynobj, s);
4468
4469       if (streq (name, ".plt"))
4470         {
4471           /* Remember whether there is a PLT.  */
4472           plt = s->size != 0;
4473         }
4474       else if (CONST_STRNEQ (name, ".rela"))
4475         {
4476           if (s->size != 0)
4477             {
4478               asection * target;
4479
4480               /* Remember whether there are any reloc sections other
4481                  than .rela.plt.  */
4482               if (! streq (name, ".rela.plt"))
4483                 {
4484                   const char * outname;
4485
4486                   relocs = TRUE;
4487
4488                   /* If this relocation section applies to a read only
4489                      section, then we probably need a DT_TEXTREL
4490                      entry.  The entries in the .rela.plt section
4491                      really apply to the .got section, which we
4492                      created ourselves and so know is not readonly.  */
4493                   outname = bfd_get_section_name (output_bfd,
4494                                                   s->output_section);
4495                   target = bfd_get_section_by_name (output_bfd, outname + 5);
4496                   if (target != NULL
4497                       && (target->flags & SEC_READONLY) != 0
4498                       && (target->flags & SEC_ALLOC) != 0)
4499                     reltext = TRUE;
4500                 }
4501
4502               /* We use the reloc_count field as a counter if we need
4503                  to copy relocs into the output file.  */
4504               s->reloc_count = 0;
4505             }
4506         }
4507       else if (! CONST_STRNEQ (name, ".got")
4508                && ! streq (name, ".dynbss"))
4509         /* It's not one of our sections, so don't allocate space.  */
4510         continue;
4511
4512       if (s->size == 0)
4513         {
4514           /* If we don't need this section, strip it from the
4515              output file.  This is mostly to handle .rela.bss and
4516              .rela.plt.  We must create both sections in
4517              create_dynamic_sections, because they must be created
4518              before the linker maps input sections to output
4519              sections.  The linker does that before
4520              adjust_dynamic_symbol is called, and it is that
4521              function which decides whether anything needs to go
4522              into these sections.  */
4523           s->flags |= SEC_EXCLUDE;
4524           continue;
4525         }
4526
4527         if ((s->flags & SEC_HAS_CONTENTS) == 0)
4528           continue;
4529
4530       /* Allocate memory for the section contents.  We use bfd_zalloc
4531          here in case unused entries are not reclaimed before the
4532          section's contents are written out.  This should not happen,
4533          but this way if it does, we get a R_MN10300_NONE reloc
4534          instead of garbage.  */
4535       s->contents = bfd_zalloc (dynobj, s->size);
4536       if (s->contents == NULL)
4537         return FALSE;
4538     }
4539
4540   if (elf_hash_table (info)->dynamic_sections_created)
4541     {
4542       /* Add some entries to the .dynamic section.  We fill in the
4543          values later, in _bfd_mn10300_elf_finish_dynamic_sections,
4544          but we must add the entries now so that we get the correct
4545          size for the .dynamic section.  The DT_DEBUG entry is filled
4546          in by the dynamic linker and used by the debugger.  */
4547       if (! info->shared)
4548         {
4549           if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0))
4550             return FALSE;
4551         }
4552
4553       if (plt)
4554         {
4555           if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)
4556               || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
4557               || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
4558               || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
4559             return FALSE;
4560         }
4561
4562       if (relocs)
4563         {
4564           if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
4565               || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
4566               || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
4567                                               sizeof (Elf32_External_Rela)))
4568             return FALSE;
4569         }
4570
4571       if (reltext)
4572         {
4573           if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0))
4574             return FALSE;
4575         }
4576     }
4577
4578   return TRUE;
4579 }
4580
4581 /* Finish up dynamic symbol handling.  We set the contents of various
4582    dynamic sections here.  */
4583
4584 static bfd_boolean
4585 _bfd_mn10300_elf_finish_dynamic_symbol (bfd * output_bfd,
4586                                         struct bfd_link_info * info,
4587                                         struct elf_link_hash_entry * h,
4588                                         Elf_Internal_Sym * sym)
4589 {
4590   bfd * dynobj;
4591
4592   dynobj = elf_hash_table (info)->dynobj;
4593
4594   if (h->plt.offset != (bfd_vma) -1)
4595     {
4596       asection *        splt;
4597       asection *        sgot;
4598       asection *        srel;
4599       bfd_vma           plt_index;
4600       bfd_vma           got_offset;
4601       Elf_Internal_Rela rel;
4602
4603       /* This symbol has an entry in the procedure linkage table.  Set
4604          it up.  */
4605
4606       BFD_ASSERT (h->dynindx != -1);
4607
4608       splt = bfd_get_section_by_name (dynobj, ".plt");
4609       sgot = bfd_get_section_by_name (dynobj, ".got.plt");
4610       srel = bfd_get_section_by_name (dynobj, ".rela.plt");
4611       BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
4612
4613       /* Get the index in the procedure linkage table which
4614          corresponds to this symbol.  This is the index of this symbol
4615          in all the symbols for which we are making plt entries.  The
4616          first entry in the procedure linkage table is reserved.  */
4617       plt_index = ((h->plt.offset - elf_mn10300_sizeof_plt0 (info))
4618                    / elf_mn10300_sizeof_plt (info));
4619
4620       /* Get the offset into the .got table of the entry that
4621          corresponds to this function.  Each .got entry is 4 bytes.
4622          The first three are reserved.  */
4623       got_offset = (plt_index + 3) * 4;
4624
4625       /* Fill in the entry in the procedure linkage table.  */
4626       if (! info->shared)
4627         {
4628           memcpy (splt->contents + h->plt.offset, elf_mn10300_plt_entry,
4629                   elf_mn10300_sizeof_plt (info));
4630           bfd_put_32 (output_bfd,
4631                       (sgot->output_section->vma
4632                        + sgot->output_offset
4633                        + got_offset),
4634                       (splt->contents + h->plt.offset
4635                        + elf_mn10300_plt_symbol_offset (info)));
4636
4637           bfd_put_32 (output_bfd,
4638                       (1 - h->plt.offset - elf_mn10300_plt_plt0_offset (info)),
4639                       (splt->contents + h->plt.offset
4640                        + elf_mn10300_plt_plt0_offset (info)));
4641         }
4642       else
4643         {
4644           memcpy (splt->contents + h->plt.offset, elf_mn10300_pic_plt_entry,
4645                   elf_mn10300_sizeof_plt (info));
4646
4647           bfd_put_32 (output_bfd, got_offset,
4648                       (splt->contents + h->plt.offset
4649                        + elf_mn10300_plt_symbol_offset (info)));
4650         }
4651
4652       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
4653                   (splt->contents + h->plt.offset
4654                    + elf_mn10300_plt_reloc_offset (info)));
4655
4656       /* Fill in the entry in the global offset table.  */
4657       bfd_put_32 (output_bfd,
4658                   (splt->output_section->vma
4659                    + splt->output_offset
4660                    + h->plt.offset
4661                    + elf_mn10300_plt_temp_offset (info)),
4662                   sgot->contents + got_offset);
4663
4664       /* Fill in the entry in the .rela.plt section.  */
4665       rel.r_offset = (sgot->output_section->vma
4666                       + sgot->output_offset
4667                       + got_offset);
4668       rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_JMP_SLOT);
4669       rel.r_addend = 0;
4670       bfd_elf32_swap_reloca_out (output_bfd, &rel,
4671                                  (bfd_byte *) ((Elf32_External_Rela *) srel->contents
4672                                                + plt_index));
4673
4674       if (!h->def_regular)
4675         /* Mark the symbol as undefined, rather than as defined in
4676            the .plt section.  Leave the value alone.  */
4677         sym->st_shndx = SHN_UNDEF;
4678     }
4679
4680   if (h->got.offset != (bfd_vma) -1)
4681     {
4682       asection *        sgot;
4683       asection *        srel;
4684       Elf_Internal_Rela rel;
4685
4686       /* This symbol has an entry in the global offset table.  Set it up.  */
4687       sgot = bfd_get_section_by_name (dynobj, ".got");
4688       srel = bfd_get_section_by_name (dynobj, ".rela.got");
4689       BFD_ASSERT (sgot != NULL && srel != NULL);
4690
4691       rel.r_offset = (sgot->output_section->vma
4692                       + sgot->output_offset
4693                       + (h->got.offset & ~1));
4694
4695       /* If this is a -Bsymbolic link, and the symbol is defined
4696          locally, we just want to emit a RELATIVE reloc.  Likewise if
4697          the symbol was forced to be local because of a version file.
4698          The entry in the global offset table will already have been
4699          initialized in the relocate_section function.  */
4700       if (info->shared
4701           && (info->symbolic || h->dynindx == -1)
4702           && h->def_regular)
4703         {
4704           rel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
4705           rel.r_addend = (h->root.u.def.value
4706                           + h->root.u.def.section->output_section->vma
4707                           + h->root.u.def.section->output_offset);
4708         }
4709       else
4710         {
4711           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
4712           rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_GLOB_DAT);
4713           rel.r_addend = 0;
4714         }
4715
4716       bfd_elf32_swap_reloca_out (output_bfd, &rel,
4717                                  (bfd_byte *) ((Elf32_External_Rela *) srel->contents
4718                                                + srel->reloc_count));
4719       ++ srel->reloc_count;
4720     }
4721
4722   if (h->needs_copy)
4723     {
4724       asection *        s;
4725       Elf_Internal_Rela rel;
4726
4727       /* This symbol needs a copy reloc.  Set it up.  */
4728       BFD_ASSERT (h->dynindx != -1
4729                   && (h->root.type == bfd_link_hash_defined
4730                       || h->root.type == bfd_link_hash_defweak));
4731
4732       s = bfd_get_section_by_name (h->root.u.def.section->owner,
4733                                    ".rela.bss");
4734       BFD_ASSERT (s != NULL);
4735
4736       rel.r_offset = (h->root.u.def.value
4737                       + h->root.u.def.section->output_section->vma
4738                       + h->root.u.def.section->output_offset);
4739       rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_COPY);
4740       rel.r_addend = 0;
4741       bfd_elf32_swap_reloca_out (output_bfd, & rel,
4742                                  (bfd_byte *) ((Elf32_External_Rela *) s->contents
4743                                                + s->reloc_count));
4744       ++ s->reloc_count;
4745     }
4746
4747   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4748   if (streq (h->root.root.string, "_DYNAMIC")
4749       || h == elf_hash_table (info)->hgot)
4750     sym->st_shndx = SHN_ABS;
4751
4752   return TRUE;
4753 }
4754
4755 /* Finish up the dynamic sections.  */
4756
4757 static bfd_boolean
4758 _bfd_mn10300_elf_finish_dynamic_sections (bfd * output_bfd,
4759                                           struct bfd_link_info * info)
4760 {
4761   bfd *      dynobj;
4762   asection * sgot;
4763   asection * sdyn;
4764
4765   dynobj = elf_hash_table (info)->dynobj;
4766
4767   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
4768   BFD_ASSERT (sgot != NULL);
4769   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4770
4771   if (elf_hash_table (info)->dynamic_sections_created)
4772     {
4773       asection *           splt;
4774       Elf32_External_Dyn * dyncon;
4775       Elf32_External_Dyn * dynconend;
4776
4777       BFD_ASSERT (sdyn != NULL);
4778
4779       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4780       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4781
4782       for (; dyncon < dynconend; dyncon++)
4783         {
4784           Elf_Internal_Dyn dyn;
4785           const char * name;
4786           asection * s;
4787
4788           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4789
4790           switch (dyn.d_tag)
4791             {
4792             default:
4793               break;
4794
4795             case DT_PLTGOT:
4796               name = ".got";
4797               goto get_vma;
4798
4799             case DT_JMPREL:
4800               name = ".rela.plt";
4801             get_vma:
4802               s = bfd_get_section_by_name (output_bfd, name);
4803               BFD_ASSERT (s != NULL);
4804               dyn.d_un.d_ptr = s->vma;
4805               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4806               break;
4807
4808             case DT_PLTRELSZ:
4809               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
4810               BFD_ASSERT (s != NULL);
4811               dyn.d_un.d_val = s->size;
4812               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4813               break;
4814
4815             case DT_RELASZ:
4816               /* My reading of the SVR4 ABI indicates that the
4817                  procedure linkage table relocs (DT_JMPREL) should be
4818                  included in the overall relocs (DT_RELA).  This is
4819                  what Solaris does.  However, UnixWare can not handle
4820                  that case.  Therefore, we override the DT_RELASZ entry
4821                  here to make it not include the JMPREL relocs.  Since
4822                  the linker script arranges for .rela.plt to follow all
4823                  other relocation sections, we don't have to worry
4824                  about changing the DT_RELA entry.  */
4825               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
4826               if (s != NULL)
4827                 dyn.d_un.d_val -= s->size;
4828               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4829               break;
4830             }
4831         }
4832
4833       /* Fill in the first entry in the procedure linkage table.  */
4834       splt = bfd_get_section_by_name (dynobj, ".plt");
4835       if (splt && splt->size > 0)
4836         {
4837           if (info->shared)
4838             {
4839               memcpy (splt->contents, elf_mn10300_pic_plt_entry,
4840                       elf_mn10300_sizeof_plt (info));
4841             }
4842           else
4843             {
4844               memcpy (splt->contents, elf_mn10300_plt0_entry, PLT0_ENTRY_SIZE);
4845               bfd_put_32 (output_bfd,
4846                           sgot->output_section->vma + sgot->output_offset + 4,
4847                           splt->contents + elf_mn10300_plt0_gotid_offset (info));
4848               bfd_put_32 (output_bfd,
4849                           sgot->output_section->vma + sgot->output_offset + 8,
4850                           splt->contents + elf_mn10300_plt0_linker_offset (info));
4851             }
4852
4853           /* UnixWare sets the entsize of .plt to 4, although that doesn't
4854              really seem like the right value.  */
4855           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
4856         }
4857     }
4858
4859   /* Fill in the first three entries in the global offset table.  */
4860   if (sgot->size > 0)
4861     {
4862       if (sdyn == NULL)
4863         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
4864       else
4865         bfd_put_32 (output_bfd,
4866                     sdyn->output_section->vma + sdyn->output_offset,
4867                     sgot->contents);
4868       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
4869       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
4870     }
4871
4872   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
4873
4874   return TRUE;
4875 }
4876
4877 /* Classify relocation types, such that combreloc can sort them
4878    properly.  */
4879
4880 static enum elf_reloc_type_class
4881 _bfd_mn10300_elf_reloc_type_class (const Elf_Internal_Rela *rela)
4882 {
4883   switch ((int) ELF32_R_TYPE (rela->r_info))
4884     {
4885     case R_MN10300_RELATIVE:    return reloc_class_relative;
4886     case R_MN10300_JMP_SLOT:    return reloc_class_plt;
4887     case R_MN10300_COPY:        return reloc_class_copy;
4888     default:                    return reloc_class_normal;
4889     }
4890 }
4891
4892 #ifndef ELF_ARCH
4893 #define TARGET_LITTLE_SYM       bfd_elf32_mn10300_vec
4894 #define TARGET_LITTLE_NAME      "elf32-mn10300"
4895 #define ELF_ARCH                bfd_arch_mn10300
4896 #define ELF_MACHINE_CODE        EM_MN10300
4897 #define ELF_MACHINE_ALT1        EM_CYGNUS_MN10300
4898 #define ELF_MAXPAGESIZE         0x1000
4899 #endif
4900
4901 #define elf_info_to_howto               mn10300_info_to_howto
4902 #define elf_info_to_howto_rel           0
4903 #define elf_backend_can_gc_sections     1
4904 #define elf_backend_rela_normal         1
4905 #define elf_backend_check_relocs        mn10300_elf_check_relocs
4906 #define elf_backend_gc_mark_hook        mn10300_elf_gc_mark_hook
4907 #define elf_backend_relocate_section    mn10300_elf_relocate_section
4908 #define bfd_elf32_bfd_relax_section     mn10300_elf_relax_section
4909 #define bfd_elf32_bfd_get_relocated_section_contents \
4910                                 mn10300_elf_get_relocated_section_contents
4911 #define bfd_elf32_bfd_link_hash_table_create \
4912                                 elf32_mn10300_link_hash_table_create
4913 #define bfd_elf32_bfd_link_hash_table_free \
4914                                 elf32_mn10300_link_hash_table_free
4915
4916 #ifndef elf_symbol_leading_char
4917 #define elf_symbol_leading_char '_'
4918 #endif
4919
4920 /* So we can set bits in e_flags.  */
4921 #define elf_backend_final_write_processing \
4922                                         _bfd_mn10300_elf_final_write_processing
4923 #define elf_backend_object_p            _bfd_mn10300_elf_object_p
4924
4925 #define bfd_elf32_bfd_merge_private_bfd_data \
4926                                         _bfd_mn10300_elf_merge_private_bfd_data
4927
4928 #define elf_backend_can_gc_sections     1
4929 #define elf_backend_create_dynamic_sections \
4930   _bfd_mn10300_elf_create_dynamic_sections
4931 #define elf_backend_adjust_dynamic_symbol \
4932   _bfd_mn10300_elf_adjust_dynamic_symbol
4933 #define elf_backend_size_dynamic_sections \
4934   _bfd_mn10300_elf_size_dynamic_sections
4935 #define elf_backend_omit_section_dynsym \
4936   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
4937 #define elf_backend_finish_dynamic_symbol \
4938   _bfd_mn10300_elf_finish_dynamic_symbol
4939 #define elf_backend_finish_dynamic_sections \
4940   _bfd_mn10300_elf_finish_dynamic_sections
4941
4942 #define elf_backend_reloc_type_class \
4943   _bfd_mn10300_elf_reloc_type_class
4944
4945 #define elf_backend_want_got_plt        1
4946 #define elf_backend_plt_readonly        1
4947 #define elf_backend_want_plt_sym        0
4948 #define elf_backend_got_header_size     12
4949
4950 #include "elf32-target.h"