* gas/config/tc-avr.c: Change ISA for devices with USB support to
[external/binutils.git] / bfd / elf32-m32c.c
1 /* M16C/M32C specific support for 32-bit ELF.
2    Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
3    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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/m32c.h"
26 #include "libiberty.h"
27
28 /* Forward declarations.  */
29 static reloc_howto_type * m32c_reloc_type_lookup
30   (bfd *, bfd_reloc_code_real_type);
31 static void m32c_info_to_howto_rela
32   (bfd *, arelent *, Elf_Internal_Rela *);
33 static bfd_boolean m32c_elf_relocate_section
34   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
35 static bfd_boolean m32c_elf_check_relocs
36   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
37 static bfd_boolean m32c_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int);
38 #ifdef DEBUG
39 char * m32c_get_reloc (long reloc);
40 void dump_symtab (bfd *, void *, void *);
41 #endif
42 static bfd_boolean m32c_elf_relax_section
43 (bfd *abfd, asection *sec, struct bfd_link_info *link_info, bfd_boolean *again);
44
45
46 static reloc_howto_type m32c_elf_howto_table [] =
47 {
48   /* This reloc does nothing.  */
49   HOWTO (R_M32C_NONE,           /* type */
50          0,                     /* rightshift */
51          0,                     /* size (0 = byte, 1 = short, 2 = long) */
52          32,                    /* bitsize */
53          FALSE,                 /* pc_relative */
54          0,                     /* bitpos */
55          complain_overflow_bitfield, /* complain_on_overflow */
56          bfd_elf_generic_reloc, /* special_function */
57          "R_M32C_NONE",         /* name */
58          FALSE,                 /* partial_inplace */
59          0,                     /* src_mask */
60          0,                     /* dst_mask */
61          FALSE),                /* pcrel_offset */
62
63   /* GCC intentionally overflows these next two in order to work
64      around limitations in the addressing modes, so don't complain
65      about overflow.  */
66   HOWTO (R_M32C_16,             /* type */
67          0,                     /* rightshift */
68          1,                     /* size (0 = byte, 1 = short, 2 = long) */
69          16,                    /* bitsize */
70          FALSE,                 /* pc_relative */
71          0,                     /* bitpos */
72          complain_overflow_dont, /* complain_on_overflow */
73          bfd_elf_generic_reloc, /* special_function */
74          "R_M32C_16",           /* name */
75          FALSE,                 /* partial_inplace */
76          0,                     /* src_mask */
77          0xffff,                /* dst_mask */
78          FALSE),                /* pcrel_offset */
79
80   HOWTO (R_M32C_24,             /* type */
81          0,                     /* rightshift */
82          2,                     /* size (0 = byte, 1 = short, 2 = long) */
83          24,                    /* bitsize */
84          FALSE,                 /* pc_relative */
85          0,                     /* bitpos */
86          complain_overflow_dont, /* complain_on_overflow */
87          bfd_elf_generic_reloc, /* special_function */
88          "R_M32C_24",           /* name */
89          FALSE,                 /* partial_inplace */
90          0,                     /* src_mask */
91          0xffffff,              /* dst_mask */
92          FALSE),                /* pcrel_offset */
93
94   HOWTO (R_M32C_32,             /* type */
95          0,                     /* rightshift */
96          2,                     /* size (0 = byte, 1 = short, 2 = long) */
97          32,                    /* bitsize */
98          FALSE,                 /* pc_relative */
99          0,                     /* bitpos */
100          complain_overflow_bitfield, /* complain_on_overflow */
101          bfd_elf_generic_reloc, /* special_function */
102          "R_M32C_32",           /* name */
103          FALSE,                 /* partial_inplace */
104          0,                     /* src_mask */
105          0xffffffff,            /* dst_mask */
106          FALSE),                /* pcrel_offset */
107
108   HOWTO (R_M32C_8_PCREL,        /* type */
109          0,                     /* rightshift */
110          0,                     /* size (0 = byte, 1 = short, 2 = long) */
111          8,                     /* bitsize */
112          TRUE,                  /* pc_relative */
113          0,                     /* bitpos */
114          complain_overflow_signed, /* complain_on_overflow */
115          bfd_elf_generic_reloc, /* special_function */
116          "R_M32C_8_PCREL",      /* name */
117          FALSE,                 /* partial_inplace */
118          0,                     /* src_mask */
119          0xff,                  /* dst_mask */
120          TRUE),                 /* pcrel_offset */
121
122   HOWTO (R_M32C_16_PCREL,       /* type */
123          0,                     /* rightshift */
124          1,                     /* size (0 = byte, 1 = short, 2 = long) */
125          16,                    /* bitsize */
126          TRUE,                  /* pc_relative */
127          0,                     /* bitpos */
128          complain_overflow_signed, /* complain_on_overflow */
129          bfd_elf_generic_reloc, /* special_function */
130          "R_M32C_16_PCREL",     /* name */
131          FALSE,                 /* partial_inplace */
132          0,                     /* src_mask */
133          0xffff,                /* dst_mask */
134          TRUE),                 /* pcrel_offset */
135
136   HOWTO (R_M32C_8,              /* type */
137          0,                     /* rightshift */
138          0,                     /* size (0 = byte, 1 = short, 2 = long) */
139          8,                     /* bitsize */
140          FALSE,                 /* pc_relative */
141          0,                     /* bitpos */
142          complain_overflow_unsigned, /* complain_on_overflow */
143          bfd_elf_generic_reloc, /* special_function */
144          "R_M32C_8",            /* name */
145          FALSE,                 /* partial_inplace */
146          0,                     /* src_mask */
147          0xff,                  /* dst_mask */
148          FALSE),                /* pcrel_offset */
149
150   HOWTO (R_M32C_LO16,           /* type */
151          0,                     /* rightshift */
152          1,                     /* size (0 = byte, 1 = short, 2 = long) */
153          16,                    /* bitsize */
154          FALSE,                 /* pc_relative */
155          0,                     /* bitpos */
156          complain_overflow_dont, /* complain_on_overflow */
157          bfd_elf_generic_reloc, /* special_function */
158          "R_M32C_LO16",         /* name */
159          FALSE,                 /* partial_inplace */
160          0,                     /* src_mask */
161          0xffff,                /* dst_mask */
162          FALSE),                /* pcrel_offset */
163
164   HOWTO (R_M32C_HI8,            /* type */
165          0,                     /* rightshift */
166          0,                     /* size (0 = byte, 1 = short, 2 = long) */
167          8,                     /* bitsize */
168          FALSE,                 /* pc_relative */
169          0,                     /* bitpos */
170          complain_overflow_dont, /* complain_on_overflow */
171          bfd_elf_generic_reloc, /* special_function */
172          "R_M32C_HI8",          /* name */
173          FALSE,                 /* partial_inplace */
174          0,                     /* src_mask */
175          0xff,                  /* dst_mask */
176          FALSE),                /* pcrel_offset */
177
178   HOWTO (R_M32C_HI16,           /* type */
179          0,                     /* rightshift */
180          1,                     /* size (0 = byte, 1 = short, 2 = long) */
181          16,                    /* bitsize */
182          FALSE,                 /* pc_relative */
183          0,                     /* bitpos */
184          complain_overflow_dont, /* complain_on_overflow */
185          bfd_elf_generic_reloc, /* special_function */
186          "R_M32C_HI16",         /* name */
187          FALSE,                 /* partial_inplace */
188          0,                     /* src_mask */
189          0xffff,                /* dst_mask */
190          FALSE),                /* pcrel_offset */
191
192   HOWTO (R_M32C_RL_JUMP,        /* type */
193          0,                     /* rightshift */
194          0,                     /* size (0 = byte, 1 = short, 2 = long) */
195          0,                     /* bitsize */
196          FALSE,                 /* pc_relative */
197          0,                     /* bitpos */
198          complain_overflow_signed, /* complain_on_overflow */
199          bfd_elf_generic_reloc, /* special_function */
200          "R_M32C_RL_JUMP",      /* name */
201          FALSE,                 /* partial_inplace */
202          0,                     /* src_mask */
203          0,                     /* dst_mask */
204          FALSE),                /* pcrel_offset */
205
206   HOWTO (R_M32C_RL_1ADDR,       /* type */
207          0,                     /* rightshift */
208          0,                     /* size (0 = byte, 1 = short, 2 = long) */
209          0,                     /* bitsize */
210          FALSE,                 /* pc_relative */
211          0,                     /* bitpos */
212          complain_overflow_signed, /* complain_on_overflow */
213          bfd_elf_generic_reloc, /* special_function */
214          "R_M32C_RL_1ADDR",     /* name */
215          FALSE,                 /* partial_inplace */
216          0,                     /* src_mask */
217          0,                     /* dst_mask */
218          FALSE),                /* pcrel_offset */
219
220   HOWTO (R_M32C_RL_2ADDR,       /* type */
221          0,                     /* rightshift */
222          0,                     /* size (0 = byte, 1 = short, 2 = long) */
223          0,                     /* bitsize */
224          FALSE,                 /* pc_relative */
225          0,                     /* bitpos */
226          complain_overflow_signed, /* complain_on_overflow */
227          bfd_elf_generic_reloc, /* special_function */
228          "R_M32C_RL_2ADDR",     /* name */
229          FALSE,                 /* partial_inplace */
230          0,                     /* src_mask */
231          0,                     /* dst_mask */
232          FALSE),                /* pcrel_offset */
233
234 };
235 \f
236 /* Map BFD reloc types to M32C ELF reloc types.  */
237
238 struct m32c_reloc_map
239 {
240   bfd_reloc_code_real_type bfd_reloc_val;
241   unsigned int m32c_reloc_val;
242 };
243
244 static const struct m32c_reloc_map m32c_reloc_map [] =
245 {
246   { BFD_RELOC_NONE,             R_M32C_NONE },
247   { BFD_RELOC_16,               R_M32C_16 },
248   { BFD_RELOC_24,               R_M32C_24 },
249   { BFD_RELOC_32,               R_M32C_32 },
250   { BFD_RELOC_8_PCREL,          R_M32C_8_PCREL },
251   { BFD_RELOC_16_PCREL,         R_M32C_16_PCREL },
252   { BFD_RELOC_8,                R_M32C_8 },
253   { BFD_RELOC_LO16,             R_M32C_LO16 },
254   { BFD_RELOC_HI16,             R_M32C_HI16 },
255   { BFD_RELOC_M32C_HI8,         R_M32C_HI8 },
256   { BFD_RELOC_M32C_RL_JUMP,     R_M32C_RL_JUMP },
257   { BFD_RELOC_M32C_RL_1ADDR,    R_M32C_RL_1ADDR },
258   { BFD_RELOC_M32C_RL_2ADDR,    R_M32C_RL_2ADDR }
259 };
260
261 static reloc_howto_type *
262 m32c_reloc_type_lookup
263     (bfd *                    abfd ATTRIBUTE_UNUSED,
264      bfd_reloc_code_real_type code)
265 {
266   unsigned int i;
267
268   for (i = ARRAY_SIZE (m32c_reloc_map); --i;)
269     if (m32c_reloc_map [i].bfd_reloc_val == code)
270       return & m32c_elf_howto_table [m32c_reloc_map[i].m32c_reloc_val];
271
272   return NULL;
273 }
274
275 static reloc_howto_type *
276 m32c_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
277 {
278   unsigned int i;
279
280   for (i = 0;
281        i < sizeof (m32c_elf_howto_table) / sizeof (m32c_elf_howto_table[0]);
282        i++)
283     if (m32c_elf_howto_table[i].name != NULL
284         && strcasecmp (m32c_elf_howto_table[i].name, r_name) == 0)
285       return &m32c_elf_howto_table[i];
286
287   return NULL;
288 }
289
290 /* Set the howto pointer for an M32C ELF reloc.  */
291
292 static void
293 m32c_info_to_howto_rela
294     (bfd *               abfd ATTRIBUTE_UNUSED,
295      arelent *           cache_ptr,
296      Elf_Internal_Rela * dst)
297 {
298   unsigned int r_type;
299
300   r_type = ELF32_R_TYPE (dst->r_info);
301   BFD_ASSERT (r_type < (unsigned int) R_M32C_max);
302   cache_ptr->howto = & m32c_elf_howto_table [r_type];
303 }
304
305 \f
306
307 /* Relocate an M32C ELF section.
308    There is some attempt to make this function usable for many architectures,
309    both USE_REL and USE_RELA ['twould be nice if such a critter existed],
310    if only to serve as a learning tool.
311
312    The RELOCATE_SECTION function is called by the new ELF backend linker
313    to handle the relocations for a section.
314
315    The relocs are always passed as Rela structures; if the section
316    actually uses Rel structures, the r_addend field will always be
317    zero.
318
319    This function is responsible for adjusting the section contents as
320    necessary, and (if using Rela relocs and generating a relocatable
321    output file) adjusting the reloc addend as necessary.
322
323    This function does not have to worry about setting the reloc
324    address or the reloc symbol index.
325
326    LOCAL_SYMS is a pointer to the swapped in local symbols.
327
328    LOCAL_SECTIONS is an array giving the section in the input file
329    corresponding to the st_shndx field of each local symbol.
330
331    The global hash table entry for the global symbols can be found
332    via elf_sym_hashes (input_bfd).
333
334    When generating relocatable output, this function must handle
335    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
336    going to be the section symbol corresponding to the output
337    section, which means that the addend must be adjusted
338    accordingly.  */
339
340 static bfd_boolean
341 m32c_elf_relocate_section
342     (bfd *                   output_bfd ATTRIBUTE_UNUSED,
343      struct bfd_link_info *  info,
344      bfd *                   input_bfd,
345      asection *              input_section,
346      bfd_byte *              contents,
347      Elf_Internal_Rela *     relocs,
348      Elf_Internal_Sym *      local_syms,
349      asection **             local_sections)
350 {
351   Elf_Internal_Shdr *           symtab_hdr;
352   struct elf_link_hash_entry ** sym_hashes;
353   Elf_Internal_Rela *           rel;
354   Elf_Internal_Rela *           relend;
355   bfd *dynobj;
356   asection *splt;
357
358   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
359   sym_hashes = elf_sym_hashes (input_bfd);
360   relend     = relocs + input_section->reloc_count;
361
362   dynobj = elf_hash_table (info)->dynobj;
363   splt = NULL;
364   if (dynobj != NULL)
365     splt = bfd_get_linker_section (dynobj, ".plt");
366
367   for (rel = relocs; rel < relend; rel ++)
368     {
369       reloc_howto_type *           howto;
370       unsigned long                r_symndx;
371       Elf_Internal_Sym *           sym;
372       asection *                   sec;
373       struct elf_link_hash_entry * h;
374       bfd_vma                      relocation;
375       bfd_reloc_status_type        r;
376       const char *                 name = NULL;
377       int                          r_type;
378
379       r_type = ELF32_R_TYPE (rel->r_info);
380
381       /* These are only used for relaxing; we don't actually relocate
382          anything with them, so skip them.  */
383       if (r_type == R_M32C_RL_JUMP
384           || r_type == R_M32C_RL_1ADDR
385           || r_type == R_M32C_RL_2ADDR)
386         continue;
387
388       r_symndx = ELF32_R_SYM (rel->r_info);
389
390       howto  = m32c_elf_howto_table + ELF32_R_TYPE (rel->r_info);
391       h      = NULL;
392       sym    = NULL;
393       sec    = NULL;
394       relocation = 0;
395
396       if (r_symndx < symtab_hdr->sh_info)
397         {
398           sym = local_syms + r_symndx;
399           sec = local_sections [r_symndx];
400           relocation = (sec->output_section->vma
401                         + sec->output_offset
402                         + sym->st_value);
403
404           name = bfd_elf_string_from_elf_section
405             (input_bfd, symtab_hdr->sh_link, sym->st_name);
406           name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
407         }
408       else
409         {
410           h = sym_hashes [r_symndx - symtab_hdr->sh_info];
411
412           while (h->root.type == bfd_link_hash_indirect
413                  || h->root.type == bfd_link_hash_warning)
414             h = (struct elf_link_hash_entry *) h->root.u.i.link;
415
416           name = h->root.root.string;
417
418           if (h->root.type == bfd_link_hash_defined
419               || h->root.type == bfd_link_hash_defweak)
420             {
421               sec = h->root.u.def.section;
422               relocation = (h->root.u.def.value
423                             + sec->output_section->vma
424                             + sec->output_offset);
425             }
426           else if (h->root.type == bfd_link_hash_undefweak)
427             ;
428           else if (!info->relocatable)
429             {
430               if (! ((*info->callbacks->undefined_symbol)
431                      (info, h->root.root.string, input_bfd,
432                       input_section, rel->r_offset, TRUE)))
433                 return FALSE;
434             }
435         }
436
437       if (sec != NULL && discarded_section (sec))
438         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
439                                          rel, 1, relend, howto, 0, contents);
440
441       if (info->relocatable)
442         {
443           /* This is a relocatable link.  We don't have to change
444              anything, unless the reloc is against a section symbol,
445              in which case we have to adjust according to where the
446              section symbol winds up in the output section.  */
447           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
448             rel->r_addend += sec->output_offset;
449           continue;
450         }
451
452       switch (ELF32_R_TYPE (rel->r_info))
453         {
454         case R_M32C_16:
455           {
456             bfd_vma *plt_offset;
457
458             if (h != NULL)
459               plt_offset = &h->plt.offset;
460             else
461               plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
462
463             /*      printf("%s: rel %x plt %d\n", h ? h->root.root.string : "(none)",
464                     relocation, *plt_offset);*/
465             if (relocation <= 0xffff)
466               {
467                 /* If the symbol is in range for a 16-bit address, we should
468                    have deallocated the plt entry in relax_section.  */
469                 BFD_ASSERT (*plt_offset == (bfd_vma) -1);
470               }
471             else
472               {
473                 /* If the symbol is out of range for a 16-bit address,
474                    we must have allocated a plt entry.  */
475                 BFD_ASSERT (*plt_offset != (bfd_vma) -1);
476
477                 /* If this is the first time we've processed this symbol,
478                    fill in the plt entry with the correct symbol address.  */
479                 if ((*plt_offset & 1) == 0)
480                   {
481                     unsigned int x;
482
483                     x = 0x000000fc;  /* jmpf */
484                     x |= (relocation << 8) & 0xffffff00;
485                     bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
486                     *plt_offset |= 1;
487                   }
488
489                 relocation = (splt->output_section->vma
490                               + splt->output_offset
491                               + (*plt_offset & -2));
492                 if (name)
493                 {
494                   char *newname = bfd_malloc (strlen(name)+5);
495                   strcpy (newname, name);
496                   strcat(newname, ".plt");
497                   _bfd_generic_link_add_one_symbol (info,
498                                                     input_bfd,
499                                                     newname,
500                                                     BSF_FUNCTION | BSF_WEAK,
501                                                     splt,
502                                                     (*plt_offset & -2),
503                                                     0,
504                                                     1,
505                                                     0,
506                                                     0);
507                 }
508               }
509           }
510           break;
511
512         case R_M32C_HI8:
513         case R_M32C_HI16:
514           relocation >>= 16;
515           break;
516         }
517
518 #if 0
519       printf ("relocate %s at %06lx relocation %06lx addend %ld  ",
520               m32c_elf_howto_table[ELF32_R_TYPE(rel->r_info)].name,
521               rel->r_offset + input_section->output_section->vma + input_section->output_offset,
522               relocation, rel->r_addend);
523       {
524         int i;
525         for (i=0; i<4; i++)
526           printf (" %02x", contents[rel->r_offset+i]);
527         printf ("\n");
528       }
529 #endif
530       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
531                                     contents, rel->r_offset, relocation,
532                                     rel->r_addend);
533
534       if (r != bfd_reloc_ok)
535         {
536           const char * msg = (const char *) NULL;
537
538           switch (r)
539             {
540             case bfd_reloc_overflow:
541               r = info->callbacks->reloc_overflow
542                 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
543                  input_bfd, input_section, rel->r_offset);
544               break;
545
546             case bfd_reloc_undefined:
547               r = info->callbacks->undefined_symbol
548                 (info, name, input_bfd, input_section, rel->r_offset,
549                  TRUE);
550               break;
551
552             case bfd_reloc_outofrange:
553               msg = _("internal error: out of range error");
554               break;
555
556             case bfd_reloc_notsupported:
557               msg = _("internal error: unsupported relocation error");
558               break;
559
560             case bfd_reloc_dangerous:
561               msg = _("internal error: dangerous relocation");
562               break;
563
564             default:
565               msg = _("internal error: unknown error");
566               break;
567             }
568
569           if (msg)
570             r = info->callbacks->warning
571               (info, msg, name, input_bfd, input_section, rel->r_offset);
572
573           if (! r)
574             return FALSE;
575         }
576     }
577
578   return TRUE;
579 }
580 \f
581 /* We support 16-bit pointers to code above 64k by generating a thunk
582    below 64k containing a JMP instruction to the final address.  */
583
584 static bfd_boolean
585 m32c_elf_check_relocs
586     (bfd *                     abfd,
587      struct bfd_link_info *    info,
588      asection *                sec,
589      const Elf_Internal_Rela * relocs)
590 {
591   Elf_Internal_Shdr *           symtab_hdr;
592   struct elf_link_hash_entry ** sym_hashes;
593   const Elf_Internal_Rela *     rel;
594   const Elf_Internal_Rela *     rel_end;
595   bfd_vma *local_plt_offsets;
596   asection *splt;
597   bfd *dynobj;
598
599   if (info->relocatable)
600     return TRUE;
601
602   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
603   sym_hashes = elf_sym_hashes (abfd);
604   local_plt_offsets = elf_local_got_offsets (abfd);
605   splt = NULL;
606   dynobj = elf_hash_table(info)->dynobj;
607
608   rel_end = relocs + sec->reloc_count;
609   for (rel = relocs; rel < rel_end; rel++)
610     {
611       struct elf_link_hash_entry *h;
612       unsigned long r_symndx;
613       bfd_vma *offset;
614
615       r_symndx = ELF32_R_SYM (rel->r_info);
616       if (r_symndx < symtab_hdr->sh_info)
617         h = NULL;
618       else
619         {
620           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
621           while (h->root.type == bfd_link_hash_indirect
622                  || h->root.type == bfd_link_hash_warning)
623             h = (struct elf_link_hash_entry *) h->root.u.i.link;
624
625           /* PR15323, ref flags aren't set for references in the same
626              object.  */
627           h->root.non_ir_ref = 1;
628         }
629
630       switch (ELF32_R_TYPE (rel->r_info))
631         {
632           /* This relocation describes a 16-bit pointer to a function.
633              We may need to allocate a thunk in low memory; reserve memory
634              for it now.  */
635         case R_M32C_16:
636           if (dynobj == NULL)
637             elf_hash_table (info)->dynobj = dynobj = abfd;
638           if (splt == NULL)
639             {
640               splt = bfd_get_linker_section (dynobj, ".plt");
641               if (splt == NULL)
642                 {
643                   flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
644                                     | SEC_IN_MEMORY | SEC_LINKER_CREATED
645                                     | SEC_READONLY | SEC_CODE);
646                   splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
647                                                              flags);
648                   if (splt == NULL
649                       || ! bfd_set_section_alignment (dynobj, splt, 1))
650                     return FALSE;
651                 }
652             }
653
654           if (h != NULL)
655             offset = &h->plt.offset;
656           else
657             {
658               if (local_plt_offsets == NULL)
659                 {
660                   size_t size;
661                   unsigned int i;
662
663                   size = symtab_hdr->sh_info * sizeof (bfd_vma);
664                   local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
665                   if (local_plt_offsets == NULL)
666                     return FALSE;
667                   elf_local_got_offsets (abfd) = local_plt_offsets;
668
669                   for (i = 0; i < symtab_hdr->sh_info; i++)
670                     local_plt_offsets[i] = (bfd_vma) -1;
671                 }
672               offset = &local_plt_offsets[r_symndx];
673             }
674
675           if (*offset == (bfd_vma) -1)
676             {
677               *offset = splt->size;
678               splt->size += 4;
679             }
680           break;
681         }
682     }
683
684   return TRUE;
685 }
686
687 /* This must exist if dynobj is ever set.  */
688
689 static bfd_boolean
690 m32c_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
691                                   struct bfd_link_info *info)
692 {
693   bfd *dynobj;
694   asection *splt;
695
696   /* As an extra sanity check, verify that all plt entries have
697      been filled in.  */
698
699   if ((dynobj = elf_hash_table (info)->dynobj) != NULL
700       && (splt = bfd_get_linker_section (dynobj, ".plt")) != NULL)
701     {
702       bfd_byte *contents = splt->contents;
703       unsigned int i, size = splt->size;
704       for (i = 0; i < size; i += 4)
705         {
706           unsigned int x = bfd_get_32 (dynobj, contents + i);
707           BFD_ASSERT (x != 0);
708         }
709     }
710
711   return TRUE;
712 }
713
714 static bfd_boolean
715 m32c_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
716                                struct bfd_link_info *info)
717 {
718   bfd *dynobj;
719   asection *splt;
720
721   if (info->relocatable)
722     return TRUE;
723
724   dynobj = elf_hash_table (info)->dynobj;
725   if (dynobj == NULL)
726     return TRUE;
727
728   splt = bfd_get_linker_section (dynobj, ".plt");
729   BFD_ASSERT (splt != NULL);
730
731   splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
732   if (splt->contents == NULL)
733     return FALSE;
734
735   return TRUE;
736 }
737 \f
738 /* Function to set the ELF flag bits.  */
739
740 static bfd_boolean
741 m32c_elf_set_private_flags (bfd *abfd, flagword flags)
742 {
743   elf_elfheader (abfd)->e_flags = flags;
744   elf_flags_init (abfd) = TRUE;
745   return TRUE;
746 }
747
748 /* Merge backend specific data from an object file to the output
749    object file when linking.  */
750
751 static bfd_boolean
752 m32c_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
753 {
754   flagword old_flags, old_partial;
755   flagword new_flags, new_partial;
756   bfd_boolean error = FALSE;
757   char new_opt[80];
758   char old_opt[80];
759
760   new_opt[0] = old_opt[0] = '\0';
761   new_flags = elf_elfheader (ibfd)->e_flags;
762   old_flags = elf_elfheader (obfd)->e_flags;
763
764 #ifdef DEBUG
765   (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
766                          old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
767                          bfd_get_filename (ibfd));
768 #endif
769
770   if (!elf_flags_init (obfd))
771     {
772       /* First call, no flags set.  */
773       elf_flags_init (obfd) = TRUE;
774       elf_elfheader (obfd)->e_flags = new_flags;
775     }
776
777   else if (new_flags == old_flags)
778     /* Compatible flags are ok.  */
779     ;
780
781   else          /* Possibly incompatible flags.  */
782     {
783       /* Warn if different cpu is used (allow a specific cpu to override
784          the generic cpu).  */
785       new_partial = (new_flags & EF_M32C_CPU_MASK);
786       old_partial = (old_flags & EF_M32C_CPU_MASK);
787       if (new_partial == old_partial)
788         ;
789
790       else
791         {
792           switch (new_partial)
793             {
794             default:              strcat (new_opt, " -m16c");   break;
795             case EF_M32C_CPU_M16C:      strcat (new_opt, " -m16c");  break;
796             case EF_M32C_CPU_M32C:  strcat (new_opt, " -m32c");  break;
797             }
798
799           switch (old_partial)
800             {
801             default:              strcat (old_opt, " -m16c");   break;
802             case EF_M32C_CPU_M16C:      strcat (old_opt, " -m16c");  break;
803             case EF_M32C_CPU_M32C:  strcat (old_opt, " -m32c");  break;
804             }
805         }
806
807       /* Print out any mismatches from above.  */
808       if (new_opt[0])
809         {
810           error = TRUE;
811           (*_bfd_error_handler)
812             (_("%s: compiled with %s and linked with modules compiled with %s"),
813              bfd_get_filename (ibfd), new_opt, old_opt);
814         }
815
816       new_flags &= ~ EF_M32C_ALL_FLAGS;
817       old_flags &= ~ EF_M32C_ALL_FLAGS;
818
819       /* Warn about any other mismatches.  */
820       if (new_flags != old_flags)
821         {
822           error = TRUE;
823           (*_bfd_error_handler)
824             (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
825              bfd_get_filename (ibfd), (long)new_flags, (long)old_flags);
826         }
827     }
828
829   if (error)
830     bfd_set_error (bfd_error_bad_value);
831
832   return !error;
833 }
834
835 \f
836 static bfd_boolean
837 m32c_elf_print_private_bfd_data (bfd *abfd, void *ptr)
838 {
839   FILE *file = (FILE *) ptr;
840   flagword flags;
841
842   BFD_ASSERT (abfd != NULL && ptr != NULL);
843
844   /* Print normal ELF private data.  */
845   _bfd_elf_print_private_bfd_data (abfd, ptr);
846
847   flags = elf_elfheader (abfd)->e_flags;
848   fprintf (file, _("private flags = 0x%lx:"), (unsigned long) flags);
849
850   switch (flags & EF_M32C_CPU_MASK)
851     {
852     default:                                                    break;
853     case EF_M32C_CPU_M16C:      fprintf (file, " -m16c");       break;
854     case EF_M32C_CPU_M32C:  fprintf (file, " -m32c");   break;
855     }
856
857   fputc ('\n', file);
858   return TRUE;
859 }
860
861 /* Return the MACH for an e_flags value.  */
862
863 static int
864 elf32_m32c_machine (bfd *abfd)
865 {
866   switch (elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK)
867     {
868     case EF_M32C_CPU_M16C:      return bfd_mach_m16c;
869     case EF_M32C_CPU_M32C:      return bfd_mach_m32c;
870     }
871
872   return bfd_mach_m16c;
873 }
874
875 static bfd_boolean
876 m32c_elf_object_p (bfd *abfd)
877 {
878   bfd_default_set_arch_mach (abfd, bfd_arch_m32c,
879                              elf32_m32c_machine (abfd));
880   return TRUE;
881 }
882  \f
883
884 #ifdef DEBUG
885 void
886 dump_symtab (bfd * abfd, void *internal_syms, void *external_syms)
887 {
888   size_t locsymcount;
889   Elf_Internal_Sym *isymbuf;
890   Elf_Internal_Sym *isymend;
891   Elf_Internal_Sym *isym;
892   Elf_Internal_Shdr *symtab_hdr;
893   bfd_boolean free_internal = 0, free_external = 0;
894   char * st_info_str;
895   char * st_info_stb_str;
896   char * st_other_str;
897   char * st_shndx_str;
898
899   if (! internal_syms)
900     {
901       internal_syms = bfd_malloc (1000);
902       free_internal = 1;
903     }
904   if (! external_syms)
905     {
906       external_syms = bfd_malloc (1000);
907       free_external = 1;
908     }
909
910   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
911   locsymcount = symtab_hdr->sh_size / get_elf_backend_data(abfd)->s->sizeof_sym;
912   if (free_internal)
913     isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
914                                     symtab_hdr->sh_info, 0,
915                                     internal_syms, external_syms, NULL);
916   else
917     isymbuf = internal_syms;
918   isymend = isymbuf + locsymcount;
919
920   for (isym = isymbuf ; isym < isymend ; isym++)
921     {
922       switch (ELF_ST_TYPE (isym->st_info))
923         {
924         case STT_FUNC: st_info_str = "STT_FUNC";
925         case STT_SECTION: st_info_str = "STT_SECTION";
926         case STT_FILE: st_info_str = "STT_FILE";
927         case STT_OBJECT: st_info_str = "STT_OBJECT";
928         case STT_TLS: st_info_str = "STT_TLS";
929         default: st_info_str = "";
930         }
931       switch (ELF_ST_BIND (isym->st_info))
932         {
933         case STB_LOCAL: st_info_stb_str = "STB_LOCAL";
934         case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL";
935         default: st_info_stb_str = "";
936         }
937       switch (ELF_ST_VISIBILITY (isym->st_other))
938         {
939         case STV_DEFAULT: st_other_str = "STV_DEFAULT";
940         case STV_INTERNAL: st_other_str = "STV_INTERNAL";
941         case STV_PROTECTED: st_other_str = "STV_PROTECTED";
942         default: st_other_str = "";
943         }
944       switch (isym->st_shndx)
945         {
946         case SHN_ABS: st_shndx_str = "SHN_ABS";
947         case SHN_COMMON: st_shndx_str = "SHN_COMMON";
948         case SHN_UNDEF: st_shndx_str = "SHN_UNDEF";
949         default: st_shndx_str = "";
950         }
951
952       printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
953               "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
954               isym,
955               (unsigned long) isym->st_value,
956               (unsigned long) isym->st_size,
957               isym->st_name,
958               bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
959                                                isym->st_name),
960               isym->st_info, st_info_str, st_info_stb_str,
961               isym->st_other, st_other_str,
962               isym->st_shndx, st_shndx_str);
963     }
964   if (free_internal)
965     free (internal_syms);
966   if (free_external)
967     free (external_syms);
968 }
969
970 char *
971 m32c_get_reloc (long reloc)
972 {
973   if (0 <= reloc && reloc < R_M32C_max)
974     return m32c_elf_howto_table[reloc].name;
975   else
976     return "";
977 }
978 #endif /* DEBUG */
979
980 /* Handle relaxing.  */
981
982 /* A subroutine of m32c_elf_relax_section.  If the global symbol H
983    is within the low 64k, remove any entry for it in the plt.  */
984
985 struct relax_plt_data
986 {
987   asection *splt;
988   bfd_boolean *again;
989 };
990
991 static bfd_boolean
992 m32c_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
993 {
994   struct relax_plt_data *data = (struct relax_plt_data *) xdata;
995
996   if (h->plt.offset != (bfd_vma) -1)
997     {
998       bfd_vma address;
999
1000       if (h->root.type == bfd_link_hash_undefined
1001           || h->root.type == bfd_link_hash_undefweak)
1002         address = 0;
1003       else
1004         address = (h->root.u.def.section->output_section->vma
1005                    + h->root.u.def.section->output_offset
1006                    + h->root.u.def.value);
1007
1008       if (address <= 0xffff)
1009         {
1010           h->plt.offset = -1;
1011           data->splt->size -= 4;
1012           *data->again = TRUE;
1013         }
1014     }
1015
1016   return TRUE;
1017 }
1018
1019 /* A subroutine of m32c_elf_relax_section.  If the global symbol H
1020    previously had a plt entry, give it a new entry offset.  */
1021
1022 static bfd_boolean
1023 m32c_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1024 {
1025   bfd_vma *entry = (bfd_vma *) xdata;
1026
1027   if (h->plt.offset != (bfd_vma) -1)
1028     {
1029       h->plt.offset = *entry;
1030       *entry += 4;
1031     }
1032
1033   return TRUE;
1034 }
1035
1036 static bfd_boolean
1037 m32c_elf_relax_plt_section (asection *splt,
1038                             struct bfd_link_info *info,
1039                             bfd_boolean *again)
1040 {
1041   struct relax_plt_data relax_plt_data;
1042   bfd *ibfd;
1043
1044   /* Assume nothing changes.  */
1045   *again = FALSE;
1046
1047   if (info->relocatable)
1048     return TRUE;
1049
1050   /* Quick check for an empty plt.  */
1051   if (splt->size == 0)
1052     return TRUE;
1053
1054   /* Map across all global symbols; see which ones happen to
1055      fall in the low 64k.  */
1056   relax_plt_data.splt = splt;
1057   relax_plt_data.again = again;
1058   elf_link_hash_traverse (elf_hash_table (info), m32c_relax_plt_check,
1059                           &relax_plt_data);
1060
1061   /* Likewise for local symbols, though that's somewhat less convenient
1062      as we have to walk the list of input bfds and swap in symbol data.  */
1063   for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link_next)
1064     {
1065       bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1066       Elf_Internal_Shdr *symtab_hdr;
1067       Elf_Internal_Sym *isymbuf = NULL;
1068       unsigned int idx;
1069
1070       if (! local_plt_offsets)
1071         continue;
1072
1073       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1074       if (symtab_hdr->sh_info != 0)
1075         {
1076           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1077           if (isymbuf == NULL)
1078             isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1079                                             symtab_hdr->sh_info, 0,
1080                                             NULL, NULL, NULL);
1081           if (isymbuf == NULL)
1082             return FALSE;
1083         }
1084
1085       for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1086         {
1087           Elf_Internal_Sym *isym;
1088           asection *tsec;
1089           bfd_vma address;
1090
1091           if (local_plt_offsets[idx] == (bfd_vma) -1)
1092             continue;
1093
1094           isym = &isymbuf[idx];
1095           if (isym->st_shndx == SHN_UNDEF)
1096             continue;
1097           else if (isym->st_shndx == SHN_ABS)
1098             tsec = bfd_abs_section_ptr;
1099           else if (isym->st_shndx == SHN_COMMON)
1100             tsec = bfd_com_section_ptr;
1101           else
1102             tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1103
1104           address = (tsec->output_section->vma
1105                      + tsec->output_offset
1106                      + isym->st_value);
1107           if (address <= 0xffff)
1108             {
1109               local_plt_offsets[idx] = -1;
1110               splt->size -= 4;
1111               *again = TRUE;
1112             }
1113         }
1114
1115       if (isymbuf != NULL
1116           && symtab_hdr->contents != (unsigned char *) isymbuf)
1117         {
1118           if (! info->keep_memory)
1119             free (isymbuf);
1120           else
1121             {
1122               /* Cache the symbols for elf_link_input_bfd.  */
1123               symtab_hdr->contents = (unsigned char *) isymbuf;
1124             }
1125         }
1126     }
1127
1128   /* If we changed anything, walk the symbols again to reallocate
1129      .plt entry addresses.  */
1130   if (*again && splt->size > 0)
1131     {
1132       bfd_vma entry = 0;
1133
1134       elf_link_hash_traverse (elf_hash_table (info),
1135                               m32c_relax_plt_realloc, &entry);
1136
1137       for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link_next)
1138         {
1139           bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1140           unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1141           unsigned int idx;
1142
1143           if (! local_plt_offsets)
1144             continue;
1145
1146           for (idx = 0; idx < nlocals; ++idx)
1147             if (local_plt_offsets[idx] != (bfd_vma) -1)
1148               {
1149                 local_plt_offsets[idx] = entry;
1150                 entry += 4;
1151               }
1152         }
1153     }
1154
1155   return TRUE;
1156 }
1157
1158 static int
1159 compare_reloc (const void *e1, const void *e2)
1160 {
1161   const Elf_Internal_Rela *i1 = (const Elf_Internal_Rela *) e1;
1162   const Elf_Internal_Rela *i2 = (const Elf_Internal_Rela *) e2;
1163
1164   if (i1->r_offset == i2->r_offset)
1165     return 0;
1166   else
1167     return i1->r_offset < i2->r_offset ? -1 : 1;
1168 }
1169
1170 #define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms)
1171 static bfd_vma
1172 m32c_offset_for_reloc (bfd *abfd,
1173                        Elf_Internal_Rela *rel,
1174                        Elf_Internal_Shdr *symtab_hdr,
1175                        Elf_External_Sym_Shndx *shndx_buf ATTRIBUTE_UNUSED,
1176                        Elf_Internal_Sym *intsyms)
1177 {
1178   bfd_vma symval;
1179
1180   /* Get the value of the symbol referred to by the reloc.  */
1181   if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1182     {
1183       /* A local symbol.  */
1184       Elf_Internal_Sym *isym;
1185       asection *ssec;
1186
1187       isym = intsyms + ELF32_R_SYM (rel->r_info);
1188       ssec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1189       symval = isym->st_value;
1190       if (ssec)
1191         symval += ssec->output_section->vma
1192           + ssec->output_offset;
1193     }
1194   else
1195     {
1196       unsigned long indx;
1197       struct elf_link_hash_entry *h;
1198
1199       /* An external symbol.  */
1200       indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1201       h = elf_sym_hashes (abfd)[indx];
1202       BFD_ASSERT (h != NULL);
1203
1204       if (h->root.type != bfd_link_hash_defined
1205           && h->root.type != bfd_link_hash_defweak)
1206         /* This appears to be a reference to an undefined
1207            symbol.  Just ignore it--it will be caught by the
1208            regular reloc processing.  */
1209         return 0;
1210
1211       symval = (h->root.u.def.value
1212                 + h->root.u.def.section->output_section->vma
1213                 + h->root.u.def.section->output_offset);
1214     }
1215   return symval;
1216 }
1217
1218 static int bytes_saved = 0;
1219
1220 static int bytes_to_reloc[] = {
1221   R_M32C_NONE,
1222   R_M32C_8,
1223   R_M32C_16,
1224   R_M32C_24,
1225   R_M32C_32
1226 };
1227
1228 /* What we use the bits in a relax reloc addend (R_M32C_RL_*) for.  */
1229
1230 /* Mask for the number of relocs associated with this insn.  */
1231 #define RLA_RELOCS              0x0000000f
1232 /* Number of bytes gas emitted (before gas's relaxing) */
1233 #define RLA_NBYTES              0x00000ff0
1234
1235 /* If the displacement is within the given range and the new encoding
1236    differs from the old encoding (the index), then the insn can be
1237    relaxed to the new encoding.  */
1238 typedef struct {
1239   int bytes;
1240   unsigned int max_disp;
1241   unsigned char new_encoding;
1242 } EncodingTable;
1243
1244 static EncodingTable m16c_addr_encodings[] = {
1245   { 0,   0,  0 }, /* R0 */
1246   { 0,   0,  1 }, /* R1 */
1247   { 0,   0,  2 }, /* R2 */
1248   { 0,   0,  3 }, /* R3 */
1249   { 0,   0,  4 }, /* A0 */
1250   { 0,   0,  5 }, /* A1 */
1251   { 0,   0,  6 }, /* [A0] */
1252   { 0,   0,  7 }, /* [A1] */
1253   { 1,   0,  6 }, /* udsp:8[A0] */
1254   { 1,   0,  7 }, /* udsp:8[A1] */
1255   { 1,   0, 10 }, /* udsp:8[SB] */
1256   { 1,   0, 11 }, /* sdsp:8[FB] */
1257   { 2, 255,  8 }, /* udsp:16[A0] */
1258   { 2, 255,  9 }, /* udsp:16[A1] */
1259   { 2, 255, 10 }, /* udsp:16[SB] */
1260   { 2,   0, 15 }, /* abs:16 */
1261 };
1262
1263 static EncodingTable m16c_jmpaddr_encodings[] = {
1264   { 0,   0,  0 }, /* R0 */
1265   { 0,   0,  1 }, /* R1 */
1266   { 0,   0,  2 }, /* R2 */
1267   { 0,   0,  3 }, /* R3 */
1268   { 0,   0,  4 }, /* A0 */
1269   { 0,   0,  5 }, /* A1 */
1270   { 0,   0,  6 }, /* [A0] */
1271   { 0,   0,  7 }, /* [A1] */
1272   { 1,   0,  6 }, /* udsp:8[A0] */
1273   { 1,   0,  7 }, /* udsp:8[A1] */
1274   { 1,   0, 10 }, /* udsp:8[SB] */
1275   { 1,   0, 11 }, /* sdsp:8[FB] */
1276   { 3, 255,  8 }, /* udsp:20[A0] */
1277   { 3, 255,  9 }, /* udsp:20[A1] */
1278   { 2, 255, 10 }, /* udsp:16[SB] */
1279   { 2,   0, 15 }, /* abs:16 */
1280 };
1281
1282 static EncodingTable m32c_addr_encodings[] = {
1283   { 0,     0,  0 }, /* [A0] */
1284   { 0,     0,  1 }, /* [A1] */
1285   { 0,     0,  2 }, /* A0 */
1286   { 0,     0,  3 }, /* A1 */
1287   { 1,     0,  0 }, /* udsp:8[A0] */
1288   { 1,     0,  1 }, /* udsp:8[A1] */
1289   { 1,     0,  6 }, /* udsp:8[SB] */
1290   { 1,     0,  7 }, /* sdsp:8[FB] */
1291   { 2,   255,  4 }, /* udsp:16[A0] */
1292   { 2,   255,  5 }, /* udsp:16[A1] */
1293   { 2,   255,  6 }, /* udsp:16[SB] */
1294   { 2,   127,  7 }, /* sdsp:16[FB] */
1295   { 3, 65535, 8 }, /* udsp:24[A0] */
1296   { 3, 65535, 9 }, /* udsp:24[A1] */
1297   { 3, 65535, 15 }, /* abs24 */
1298   { 2,     0, 15 }, /* abs16 */
1299   { 0,     0, 16 }, /* R2 */
1300   { 0,     0, 17 }, /* R3 */
1301   { 0,     0, 18 }, /* R0 */
1302   { 0,     0, 19 }, /* R1 */
1303   { 0,     0, 20 }, /*  */
1304   { 0,     0, 21 }, /*  */
1305   { 0,     0, 22 }, /*  */
1306   { 0,     0, 23 }, /*  */
1307   { 0,     0, 24 }, /*  */
1308   { 0,     0, 25 }, /*  */
1309   { 0,     0, 26 }, /*  */
1310   { 0,     0, 27 }, /*  */
1311   { 0,     0, 28 }, /*  */
1312   { 0,     0, 29 }, /*  */
1313   { 0,     0, 30 }, /*  */
1314   { 0,     0, 31 }, /*  */
1315 };
1316
1317 static bfd_boolean
1318 m32c_elf_relax_section
1319     (bfd *                  abfd,
1320      asection *             sec,
1321      struct bfd_link_info * link_info,
1322      bfd_boolean *          again)
1323 {
1324   Elf_Internal_Shdr *symtab_hdr;
1325   Elf_Internal_Shdr *shndx_hdr;
1326   Elf_Internal_Rela *internal_relocs;
1327   Elf_Internal_Rela *free_relocs = NULL;
1328   Elf_Internal_Rela *irel, *irelend, *srel;
1329   bfd_byte * contents = NULL;
1330   bfd_byte * free_contents = NULL;
1331   Elf_Internal_Sym *intsyms = NULL;
1332   Elf_Internal_Sym *free_intsyms = NULL;
1333   Elf_External_Sym_Shndx *shndx_buf = NULL;
1334   int machine;
1335
1336   if (abfd == elf_hash_table (link_info)->dynobj
1337       && (sec->flags & SEC_LINKER_CREATED) != 0
1338       && strcmp (sec->name, ".plt") == 0)
1339     return m32c_elf_relax_plt_section (sec, link_info, again);
1340
1341   /* Assume nothing changes.  */
1342   *again = FALSE;
1343
1344   machine = elf32_m32c_machine (abfd);
1345
1346   /* We don't have to do anything for a relocatable link, if
1347      this section does not have relocs, or if this is not a
1348      code section.  */
1349   if (link_info->relocatable
1350       || (sec->flags & SEC_RELOC) == 0
1351       || sec->reloc_count == 0
1352       || (sec->flags & SEC_CODE) == 0)
1353     return TRUE;
1354
1355   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1356   shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
1357
1358   /* Get the section contents.  */
1359   if (elf_section_data (sec)->this_hdr.contents != NULL)
1360     contents = elf_section_data (sec)->this_hdr.contents;
1361   /* Go get them off disk.  */
1362   else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1363     goto error_return;
1364
1365   /* Read this BFD's symbols.  */
1366   /* Get cached copy if it exists.  */
1367   if (symtab_hdr->contents != NULL)
1368     {
1369       intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1370     }
1371   else
1372     {
1373       intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
1374       symtab_hdr->contents = (bfd_byte *) intsyms;
1375     }
1376
1377   if (shndx_hdr->sh_size != 0)
1378     {
1379       bfd_size_type amt;
1380
1381       amt = symtab_hdr->sh_info;
1382       amt *= sizeof (Elf_External_Sym_Shndx);
1383       shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
1384       if (shndx_buf == NULL)
1385         goto error_return;
1386       if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
1387           || bfd_bread (shndx_buf, amt, abfd) != amt)
1388         goto error_return;
1389       shndx_hdr->contents = (bfd_byte *) shndx_buf;
1390     }
1391
1392   /* Get a copy of the native relocations.  */
1393   internal_relocs = (_bfd_elf_link_read_relocs
1394                      (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
1395                       link_info->keep_memory));
1396   if (internal_relocs == NULL)
1397     goto error_return;
1398   if (! link_info->keep_memory)
1399     free_relocs = internal_relocs;
1400
1401   /* The RL_ relocs must be just before the operand relocs they go
1402      with, so we must sort them to guarantee this.  */
1403   qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
1404          compare_reloc);
1405
1406   /* Walk through them looking for relaxing opportunities.  */
1407   irelend = internal_relocs + sec->reloc_count;
1408
1409   for (irel = internal_relocs; irel < irelend; irel++)
1410     {
1411       bfd_vma symval;
1412       unsigned char *insn, *gap, *einsn;
1413       bfd_vma pc;
1414       bfd_signed_vma pcrel;
1415       int relax_relocs;
1416       int gap_size;
1417       int new_type;
1418       int posn;
1419       int enc;
1420       EncodingTable *enctbl;
1421       EncodingTable *e;
1422
1423       if (ELF32_R_TYPE(irel->r_info) != R_M32C_RL_JUMP
1424           && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_1ADDR
1425           && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_2ADDR)
1426         continue;
1427
1428       srel = irel;
1429
1430       /* There will always be room for the relaxed insn, since it is smaller
1431          than the one it would replace.  */
1432       BFD_ASSERT (irel->r_offset < sec->size);
1433
1434       insn = contents + irel->r_offset;
1435       relax_relocs = irel->r_addend % 16;
1436
1437       /* Ok, we only have three relocs we care about, and they're all
1438          fake.  The lower four bits of the addend is always the number
1439          of following relocs (hence the qsort above) that are assigned
1440          to this opcode.  The next 8 bits of the addend indicates the
1441          number of bytes in the insn.  We use the rest of them
1442          ourselves as flags for the more expensive operations (defines
1443          above).  The three relocs are:
1444
1445          RL_JUMP: This marks all direct jump insns.  We check the
1446                 displacement and replace them with shorter jumps if
1447                 they're in range.  We also use this to find JMP.S
1448                 insns and manually shorten them when we delete bytes.
1449                 We have to decode these insns to figure out what to
1450                 do.
1451
1452          RL_1ADDR: This is a :G or :Q insn, which has a single
1453                 "standard" operand.  We have to extract the type
1454                 field, see if it's a wide displacement, then figure
1455                 out if we can replace it with a narrow displacement.
1456                 We don't have to decode these insns.
1457
1458          RL_2ADDR: Similarly, but two "standard" operands.  Note that
1459                 r_addend may still be 1, as standard operands don't
1460                 always have displacements.  Gas shouldn't give us one
1461                 with zero operands, but since we don't know which one
1462                 has the displacement, we check them both anyway.
1463
1464          These all point to the beginning of the insn itself, not the
1465          operands.
1466
1467          Note that we only relax one step at a time, relying on the
1468          linker to call us repeatedly.  Thus, there is no code for
1469          JMP.A->JMP.B although that will happen in two steps.
1470          Likewise, for 2ADDR relaxes, we do one operand per cycle.
1471       */
1472
1473       /* Get the value of the symbol referred to by the reloc.  Just
1474          in case this is the last reloc in the list, use the RL's
1475          addend to choose between this reloc (no addend) or the next
1476          (yes addend, which means at least one following reloc).  */
1477       srel = irel + (relax_relocs ? 1 : 0);
1478       symval = OFFSET_FOR_RELOC (srel);
1479
1480       /* Setting gap_size nonzero is the flag which means "something
1481          shrunk".  */
1482       gap_size = 0;
1483       gap = NULL;
1484       new_type = ELF32_R_TYPE(srel->r_info);
1485
1486       pc = sec->output_section->vma + sec->output_offset
1487         + srel->r_offset;
1488       pcrel = symval - pc + srel->r_addend;
1489
1490       if (machine == bfd_mach_m16c)
1491         {
1492           /* R8C / M16C */
1493
1494           switch (ELF32_R_TYPE(irel->r_info))
1495             {
1496
1497             case R_M32C_RL_JUMP:
1498               switch (insn[0])
1499                 {
1500                 case 0xfe: /* jmp.b */
1501                   if (pcrel >= 2 && pcrel <= 9)
1502                     {
1503                       /* Relax JMP.B -> JMP.S.  We need to get rid of
1504                          the following reloc though. */
1505                       insn[0] = 0x60 | (pcrel - 2);
1506                       new_type = R_M32C_NONE;
1507                       irel->r_addend = 0x10;
1508                       gap_size = 1;
1509                       gap = insn + 1;
1510                     }
1511                   break;
1512
1513                 case 0xf4: /* jmp.w */
1514                   /* 128 is allowed because it will be one byte closer
1515                      after relaxing.  Likewise for all other pc-rel
1516                      jumps.  */
1517                   if (pcrel <= 128 && pcrel >= -128)
1518                     {
1519                       /* Relax JMP.W -> JMP.B */
1520                       insn[0] = 0xfe;
1521                       insn[1] = 0;
1522                       new_type = R_M32C_8_PCREL;
1523                       gap_size = 1;
1524                       gap = insn + 2;
1525                     }
1526                   break;
1527
1528                 case 0xfc: /* jmp.a */
1529                   if (pcrel <= 32768 && pcrel >= -32768)
1530                     {
1531                       /* Relax JMP.A -> JMP.W */
1532                       insn[0] = 0xf4;
1533                       insn[1] = 0;
1534                       insn[2] = 0;
1535                       new_type = R_M32C_16_PCREL;
1536                       gap_size = 1;
1537                       gap = insn + 3;
1538                     }
1539                   break;
1540
1541                 case 0xfd: /* jsr.a */
1542                   if (pcrel <= 32768 && pcrel >= -32768)
1543                     {
1544                       /* Relax JSR.A -> JSR.W */
1545                       insn[0] = 0xf5;
1546                       insn[1] = 0;
1547                       insn[2] = 0;
1548                       new_type = R_M32C_16_PCREL;
1549                       gap_size = 1;
1550                       gap = insn + 3;
1551                     }
1552                   break;
1553                 }
1554               break;
1555
1556             case R_M32C_RL_2ADDR:
1557               /* xxxx xxxx srce dest [src-disp] [dest-disp]*/
1558
1559               enctbl = m16c_addr_encodings;
1560               posn = 2;
1561               enc = (insn[1] >> 4) & 0x0f;
1562               e = & enctbl[enc];
1563
1564               if (srel->r_offset == irel->r_offset + posn
1565                   && e->new_encoding != enc
1566                   && symval <= e->max_disp)
1567                 {
1568                   insn[1] &= 0x0f;
1569                   insn[1] |= e->new_encoding << 4;
1570                   gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1571                   gap = insn + posn + enctbl[e->new_encoding].bytes;
1572                   new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1573                   break;
1574                 }
1575               if (relax_relocs == 2)
1576                 srel ++;
1577               posn += e->bytes;
1578
1579               goto try_1addr_16;
1580
1581             case R_M32C_RL_1ADDR:
1582               /* xxxx xxxx xxxx dest [disp] */
1583
1584               enctbl = m16c_addr_encodings;
1585               posn = 2;
1586
1587               /* Check the opcode for jumps.  We know it's safe to
1588                  do this because all 2ADDR insns are at least two
1589                  bytes long.  */
1590               enc = insn[0] * 256 + insn[1];
1591               enc &= 0xfff0;
1592               if (enc == 0x7d20
1593                   || enc == 0x7d00
1594                   || enc == 0x7d30
1595                   || enc == 0x7d10)
1596                 {
1597                   enctbl = m16c_jmpaddr_encodings;
1598                 }
1599
1600             try_1addr_16:
1601               /* srel, posn, and enc must be set here.  */
1602
1603               symval = OFFSET_FOR_RELOC (srel);
1604               enc = insn[1] & 0x0f;
1605               e = & enctbl[enc];
1606
1607               if (srel->r_offset == irel->r_offset + posn
1608                   && e->new_encoding != enc
1609                   && symval <= e->max_disp)
1610                 {
1611                   insn[1] &= 0xf0;
1612                   insn[1] |= e->new_encoding;
1613                   gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1614                   gap = insn + posn + enctbl[e->new_encoding].bytes;
1615                   new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1616                   break;
1617                 }
1618
1619               break;
1620
1621             } /* Ends switch (reloc type) for m16c.  */
1622         }
1623       else /* machine == bfd_mach_m32c */
1624         {
1625           /* M32CM / M32C */
1626
1627           switch (ELF32_R_TYPE(irel->r_info))
1628             {
1629
1630             case R_M32C_RL_JUMP:
1631               switch (insn[0])
1632                 {
1633                 case 0xbb: /* jmp.b */
1634                   if (pcrel >= 2 && pcrel <= 9)
1635                     {
1636                       int p = pcrel - 2;
1637                       /* Relax JMP.B -> JMP.S.  We need to get rid of
1638                          the following reloc though. */
1639                       insn[0] = 0x4a | ((p << 3) & 0x30) | (p & 1);
1640                       new_type = R_M32C_NONE;
1641                       irel->r_addend = 0x10;
1642                       gap_size = 1;
1643                       gap = insn + 1;
1644                     }
1645                   break;
1646
1647                 case 0xce: /* jmp.w */
1648                   if (pcrel <= 128 && pcrel >= -128)
1649                     {
1650                       /* Relax JMP.W -> JMP.B */
1651                       insn[0] = 0xbb;
1652                       insn[1] = 0;
1653                       new_type = R_M32C_8_PCREL;
1654                       gap_size = 1;
1655                       gap = insn + 2;
1656                     }
1657                   break;
1658
1659                 case 0xcc: /* jmp.a */
1660                   if (pcrel <= 32768 && pcrel >= -32768)
1661                     {
1662                       /* Relax JMP.A -> JMP.W */
1663                       insn[0] = 0xce;
1664                       insn[1] = 0;
1665                       insn[2] = 0;
1666                       new_type = R_M32C_16_PCREL;
1667                       gap_size = 1;
1668                       gap = insn + 3;
1669                     }
1670                   break;
1671
1672                 case 0xcd: /* jsr.a */
1673                   if (pcrel <= 32768 && pcrel >= -32768)
1674                     {
1675                       /* Relax JSR.A -> JSR.W */
1676                       insn[0] = 0xcf;
1677                       insn[1] = 0;
1678                       insn[2] = 0;
1679                       new_type = R_M32C_16_PCREL;
1680                       gap_size = 1;
1681                       gap = insn + 3;
1682                     }
1683                   break;
1684                 }
1685               break;
1686
1687             case R_M32C_RL_2ADDR:
1688               /* xSSS DDDx DDSS xxxx [src-disp] [dest-disp]*/
1689
1690               einsn = insn;
1691               posn = 2;
1692               if (einsn[0] == 1)
1693                 {
1694                   /* prefix; remove it as far as the RL reloc is concerned.  */
1695                   einsn ++;
1696                   posn ++;
1697                 }
1698
1699               enctbl = m32c_addr_encodings;
1700               enc = ((einsn[0] & 0x70) >> 2) | ((einsn[1] & 0x30) >> 4);
1701               e = & enctbl[enc];
1702
1703               if (srel->r_offset == irel->r_offset + posn
1704                   && e->new_encoding != enc
1705                   && symval <= e->max_disp)
1706                 {
1707                   einsn[0] &= 0x8f;
1708                   einsn[0] |= (e->new_encoding & 0x1c) << 2;
1709                   einsn[1] &= 0xcf;
1710                   einsn[1] |= (e->new_encoding & 0x03) << 4;
1711                   gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1712                   gap = insn + posn + enctbl[e->new_encoding].bytes;
1713                   new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1714                   break;
1715                 }
1716               if (relax_relocs == 2)
1717                   srel ++;
1718               posn += e->bytes;
1719
1720               goto try_1addr_32;
1721
1722             case R_M32C_RL_1ADDR:
1723               /* xxxx DDDx DDxx xxxx [disp] */
1724
1725               einsn = insn;
1726               posn = 2;
1727               if (einsn[0] == 1)
1728                 {
1729                   /* prefix; remove it as far as the RL reloc is concerned.  */
1730                   einsn ++;
1731                   posn ++;
1732                 }
1733
1734               enctbl = m32c_addr_encodings;
1735
1736             try_1addr_32:
1737               /* srel, posn, and enc must be set here.  */
1738
1739               symval = OFFSET_FOR_RELOC (srel);
1740               enc = ((einsn[0] & 0x0e) << 1) |  ((einsn[1] & 0xc0) >> 6);
1741               e = & enctbl[enc];
1742
1743               if (srel->r_offset == irel->r_offset + posn
1744                   && e->new_encoding != enc
1745                   && symval <= e->max_disp)
1746                 {
1747                   einsn[0] &= 0xf1;
1748                   einsn[0] |= (e->new_encoding & 0x1c) >> 1;
1749                   einsn[1] &= 0x3f;
1750                   einsn[1] |= (e->new_encoding & 0x03) << 6;
1751                   gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1752                   gap = insn + posn + enctbl[e->new_encoding].bytes;
1753                   new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1754                   break;
1755                 }
1756
1757               break;
1758
1759             } /* Ends switch (reloc type) for m32c.  */
1760         }
1761
1762       if (gap_size == 0)
1763         continue;
1764
1765       *again = TRUE;
1766
1767       srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), new_type);
1768
1769       /* Note that we've changed the relocs, section contents, etc.  */
1770       elf_section_data (sec)->relocs = internal_relocs;
1771       free_relocs = NULL;
1772
1773       elf_section_data (sec)->this_hdr.contents = contents;
1774       free_contents = NULL;
1775
1776       symtab_hdr->contents = (bfd_byte *) intsyms;
1777       free_intsyms = NULL;
1778
1779       bytes_saved += gap_size;
1780
1781       if (! m32c_elf_relax_delete_bytes(abfd, sec, gap - contents, gap_size))
1782         goto error_return;
1783
1784     } /* next relocation */
1785
1786   if (free_relocs != NULL)
1787     {
1788       free (free_relocs);
1789       free_relocs = NULL;
1790     }
1791
1792   if (free_contents != NULL)
1793     {
1794       if (! link_info->keep_memory)
1795         free (free_contents);
1796       /* Cache the section contents for elf_link_input_bfd.  */
1797       else
1798         elf_section_data (sec)->this_hdr.contents = contents;
1799
1800       free_contents = NULL;
1801     }
1802
1803   if (shndx_buf != NULL)
1804     {
1805       shndx_hdr->contents = NULL;
1806       free (shndx_buf);
1807     }
1808
1809   if (free_intsyms != NULL)
1810     {
1811       if (! link_info->keep_memory)
1812         free (free_intsyms);
1813       /* Cache the symbols for elf_link_input_bfd.  */
1814       else
1815         {
1816         symtab_hdr->contents = NULL /* (unsigned char *) intsyms*/;
1817         }
1818
1819       free_intsyms = NULL;
1820     }
1821
1822   return TRUE;
1823
1824  error_return:
1825   if (free_relocs != NULL)
1826     free (free_relocs);
1827   if (free_contents != NULL)
1828     free (free_contents);
1829   if (shndx_buf != NULL)
1830     {
1831       shndx_hdr->contents = NULL;
1832       free (shndx_buf);
1833     }
1834   if (free_intsyms != NULL)
1835     free (free_intsyms);
1836   return FALSE;
1837 }
1838
1839 /* Delete some bytes from a section while relaxing.  */
1840
1841 static bfd_boolean
1842 m32c_elf_relax_delete_bytes
1843  (bfd *      abfd,
1844   asection * sec,
1845   bfd_vma    addr,
1846   int        count)
1847 {
1848   Elf_Internal_Shdr *symtab_hdr;
1849   Elf_Internal_Shdr *shndx_hdr;
1850   int sec_shndx;
1851   bfd_byte *contents;
1852   Elf_Internal_Rela *irel;
1853   Elf_Internal_Rela *irelend;
1854   bfd_vma toaddr;
1855   Elf_Internal_Sym *isym;
1856   Elf_Internal_Sym *isymend;
1857   Elf_Internal_Sym *intsyms;
1858   Elf_External_Sym_Shndx *shndx_buf;
1859   Elf_External_Sym_Shndx *shndx;
1860   struct elf_link_hash_entry ** sym_hashes;
1861   struct elf_link_hash_entry ** end_hashes;
1862   unsigned int                  symcount;
1863
1864   contents   = elf_section_data (sec)->this_hdr.contents;
1865
1866   toaddr = sec->size;
1867
1868   irel = elf_section_data (sec)->relocs;
1869   irelend = irel + sec->reloc_count;
1870
1871   /* Actually delete the bytes.  */
1872   memmove (contents + addr, contents + addr + count, (size_t) (toaddr - addr - count));
1873   sec->size -= count;
1874
1875   /* Adjust all the relocs.  */
1876   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel ++)
1877     {
1878       /* Get the new reloc address.  */
1879       if (irel->r_offset > addr && irel->r_offset < toaddr)
1880         irel->r_offset -= count;
1881
1882       if (ELF32_R_TYPE(irel->r_info) == R_M32C_RL_JUMP
1883           && irel->r_addend == 0x10 /* one byte insn, no relocs */
1884           && irel->r_offset + 1 < addr
1885           && irel->r_offset + 7 > addr)
1886         {
1887           bfd_vma disp;
1888           unsigned char *insn = &contents[irel->r_offset];
1889           disp = *insn;
1890           /* This is a JMP.S, which we have to manually update. */
1891           if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
1892             {
1893               if ((*insn & 0xf8) != 0x60)
1894                 continue;
1895               disp = (disp & 7);
1896             }
1897           else
1898             {
1899               if ((*insn & 0xce) != 0x4a)
1900                 continue;
1901               disp = ((disp & 0x30) >> 3) | (disp & 1);
1902             }
1903           if (irel->r_offset + disp + 2 >= addr+count)
1904             {
1905               disp -= count;
1906               if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
1907                 {
1908                   *insn = (*insn & 0xf8) | disp;
1909                 }
1910               else
1911                 {
1912                   *insn = (*insn & 0xce) | ((disp & 6) << 3) | (disp & 1);
1913                 }
1914             }
1915         }
1916     }
1917
1918   /* Adjust the local symbols defined in this section.  */
1919   symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
1920   intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1921   isym = intsyms;
1922   isymend = isym + symtab_hdr->sh_info;
1923
1924   sec_shndx  = _bfd_elf_section_from_bfd_section (abfd, sec);
1925   shndx_hdr  = & elf_tdata (abfd)->symtab_shndx_hdr;
1926   shndx_buf  = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
1927   shndx = shndx_buf;
1928
1929   for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
1930     {
1931       /* If the symbol is in the range of memory we just moved, we
1932          have to adjust its value.  */
1933       if ((int) isym->st_shndx == sec_shndx
1934           && isym->st_value > addr
1935           && isym->st_value < toaddr)
1936         {
1937           isym->st_value -= count;
1938         }
1939       /* If the symbol *spans* the bytes we just deleted (i.e. it's
1940          *end* is in the moved bytes but it's *start* isn't), then we
1941          must adjust its size.  */
1942       if ((int) isym->st_shndx == sec_shndx
1943             && isym->st_value < addr
1944           && isym->st_value + isym->st_size > addr
1945           && isym->st_value + isym->st_size < toaddr)
1946         {
1947           isym->st_size -= count;
1948         }
1949     }
1950
1951   /* Now adjust the global symbols defined in this section.  */
1952   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1953               - symtab_hdr->sh_info);
1954   sym_hashes = elf_sym_hashes (abfd);
1955   //  sym_hashes += symtab_hdr->sh_info;
1956   end_hashes = sym_hashes + symcount;
1957
1958   for (; sym_hashes < end_hashes; sym_hashes ++)
1959     {
1960       struct elf_link_hash_entry * sym_hash = * sym_hashes;
1961
1962       if (sym_hash &&
1963           (sym_hash->root.type == bfd_link_hash_defined
1964            || sym_hash->root.type == bfd_link_hash_defweak)
1965           && sym_hash->root.u.def.section == sec)
1966         {
1967           if (sym_hash->root.u.def.value > addr
1968               && sym_hash->root.u.def.value < toaddr)
1969             {
1970               sym_hash->root.u.def.value -= count;
1971             }
1972           if (sym_hash->root.u.def.value < addr
1973               && sym_hash->root.u.def.value + sym_hash->size > addr
1974               && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1975             {
1976               sym_hash->size -= count;
1977             }
1978         }
1979     }
1980
1981   return TRUE;
1982 }
1983 \f
1984 /* This is for versions of gcc prior to 4.3.  */
1985 static unsigned int
1986 _bfd_m32c_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1987 {
1988   if ((elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK) == EF_M32C_CPU_M16C)
1989     return 2;
1990   return 4;
1991 }
1992
1993 \f
1994
1995 #define ELF_ARCH                bfd_arch_m32c
1996 #define ELF_MACHINE_CODE        EM_M32C
1997 #define ELF_MACHINE_ALT1        EM_M32C_OLD
1998 #define ELF_MAXPAGESIZE         0x100
1999
2000 #if 0
2001 #define TARGET_BIG_SYM          bfd_elf32_m32c_vec
2002 #define TARGET_BIG_NAME         "elf32-m32c"
2003 #else
2004 #define TARGET_LITTLE_SYM               bfd_elf32_m32c_vec
2005 #define TARGET_LITTLE_NAME              "elf32-m32c"
2006 #endif
2007
2008 #define elf_info_to_howto_rel                   NULL
2009 #define elf_info_to_howto                       m32c_info_to_howto_rela
2010 #define elf_backend_object_p                    m32c_elf_object_p
2011 #define elf_backend_relocate_section            m32c_elf_relocate_section
2012 #define elf_backend_check_relocs                m32c_elf_check_relocs
2013 #define elf_backend_object_p                    m32c_elf_object_p
2014 #define elf_symbol_leading_char                 ('_')
2015 #define elf_backend_always_size_sections \
2016   m32c_elf_always_size_sections
2017 #define elf_backend_finish_dynamic_sections \
2018   m32c_elf_finish_dynamic_sections
2019
2020 #define elf_backend_can_gc_sections             1
2021 #define elf_backend_eh_frame_address_size _bfd_m32c_elf_eh_frame_address_size
2022
2023 #define bfd_elf32_bfd_reloc_type_lookup         m32c_reloc_type_lookup
2024 #define bfd_elf32_bfd_reloc_name_lookup m32c_reloc_name_lookup
2025 #define bfd_elf32_bfd_relax_section             m32c_elf_relax_section
2026 #define bfd_elf32_bfd_set_private_flags         m32c_elf_set_private_flags
2027 #define bfd_elf32_bfd_merge_private_bfd_data    m32c_elf_merge_private_bfd_data
2028 #define bfd_elf32_bfd_print_private_bfd_data    m32c_elf_print_private_bfd_data
2029
2030 #include "elf32-target.h"