1/* M16C/M32C specific support for 32-bit ELF.
2   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
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.  */
29static reloc_howto_type * m32c_reloc_type_lookup
30  (bfd *, bfd_reloc_code_real_type);
31static void m32c_info_to_howto_rela
32  (bfd *, arelent *, Elf_Internal_Rela *);
33static bfd_boolean m32c_elf_relocate_section
34  (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
35static bfd_boolean m32c_elf_check_relocs
36  (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
37static bfd_boolean m32c_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int);
38#ifdef DEBUG
39char * m32c_get_reloc (long reloc);
40void dump_symtab (bfd *, void *, void *);
41#endif
42static bfd_boolean m32c_elf_relax_section
43(bfd *abfd, asection *sec, struct bfd_link_info *link_info, bfd_boolean *again);
44
45
46static 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
236/* Map BFD reloc types to M32C ELF reloc types.  */
237
238struct m32c_reloc_map
239{
240  bfd_reloc_code_real_type bfd_reloc_val;
241  unsigned int m32c_reloc_val;
242};
243
244static 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
261static reloc_howto_type *
262m32c_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
275static reloc_howto_type *
276m32c_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
292static void
293m32c_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
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
340static bfd_boolean
341m32c_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_section_by_name (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 && elf_discarded_section (sec))
438	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
439					 rel, relend, howto, 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
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
584static bfd_boolean
585m32c_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
626      switch (ELF32_R_TYPE (rel->r_info))
627        {
628	  /* This relocation describes a 16-bit pointer to a function.
629	     We may need to allocate a thunk in low memory; reserve memory
630	     for it now.  */
631	case R_M32C_16:
632	  if (dynobj == NULL)
633	    elf_hash_table (info)->dynobj = dynobj = abfd;
634	  if (splt == NULL)
635	    {
636	      splt = bfd_get_section_by_name (dynobj, ".plt");
637	      if (splt == NULL)
638		{
639		  flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
640				    | SEC_IN_MEMORY | SEC_LINKER_CREATED
641				    | SEC_READONLY | SEC_CODE);
642		  splt = bfd_make_section_with_flags (dynobj, ".plt", flags);
643		  if (splt == NULL
644		      || ! bfd_set_section_alignment (dynobj, splt, 1))
645		    return FALSE;
646		}
647	    }
648
649	  if (h != NULL)
650	    offset = &h->plt.offset;
651	  else
652	    {
653	      if (local_plt_offsets == NULL)
654		{
655		  size_t size;
656		  unsigned int i;
657
658		  size = symtab_hdr->sh_info * sizeof (bfd_vma);
659		  local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
660		  if (local_plt_offsets == NULL)
661		    return FALSE;
662		  elf_local_got_offsets (abfd) = local_plt_offsets;
663
664		  for (i = 0; i < symtab_hdr->sh_info; i++)
665		    local_plt_offsets[i] = (bfd_vma) -1;
666		}
667	      offset = &local_plt_offsets[r_symndx];
668	    }
669
670	  if (*offset == (bfd_vma) -1)
671	    {
672	      *offset = splt->size;
673	      splt->size += 4;
674	    }
675	  break;
676        }
677    }
678
679  return TRUE;
680}
681
682/* This must exist if dynobj is ever set.  */
683
684static bfd_boolean
685m32c_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
686                                  struct bfd_link_info *info)
687{
688  bfd *dynobj;
689  asection *splt;
690
691  /* As an extra sanity check, verify that all plt entries have
692     been filled in.  */
693
694  if ((dynobj = elf_hash_table (info)->dynobj) != NULL
695      && (splt = bfd_get_section_by_name (dynobj, ".plt")) != NULL)
696    {
697      bfd_byte *contents = splt->contents;
698      unsigned int i, size = splt->size;
699      for (i = 0; i < size; i += 4)
700	{
701	  unsigned int x = bfd_get_32 (dynobj, contents + i);
702	  BFD_ASSERT (x != 0);
703	}
704    }
705
706  return TRUE;
707}
708
709static bfd_boolean
710m32c_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
711                               struct bfd_link_info *info)
712{
713  bfd *dynobj;
714  asection *splt;
715
716  if (info->relocatable)
717    return TRUE;
718
719  dynobj = elf_hash_table (info)->dynobj;
720  if (dynobj == NULL)
721    return TRUE;
722
723  splt = bfd_get_section_by_name (dynobj, ".plt");
724  BFD_ASSERT (splt != NULL);
725
726  splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
727  if (splt->contents == NULL)
728    return FALSE;
729
730  return TRUE;
731}
732
733/* Function to set the ELF flag bits.  */
734
735static bfd_boolean
736m32c_elf_set_private_flags (bfd *abfd, flagword flags)
737{
738  elf_elfheader (abfd)->e_flags = flags;
739  elf_flags_init (abfd) = TRUE;
740  return TRUE;
741}
742
743/* Merge backend specific data from an object file to the output
744   object file when linking.  */
745
746static bfd_boolean
747m32c_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
748{
749  flagword old_flags, old_partial;
750  flagword new_flags, new_partial;
751  bfd_boolean error = FALSE;
752  char new_opt[80];
753  char old_opt[80];
754
755  new_opt[0] = old_opt[0] = '\0';
756  new_flags = elf_elfheader (ibfd)->e_flags;
757  old_flags = elf_elfheader (obfd)->e_flags;
758
759#ifdef DEBUG
760  (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
761			 old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
762			 bfd_get_filename (ibfd));
763#endif
764
765  if (!elf_flags_init (obfd))
766    {
767      /* First call, no flags set.  */
768      elf_flags_init (obfd) = TRUE;
769      elf_elfheader (obfd)->e_flags = new_flags;
770    }
771
772  else if (new_flags == old_flags)
773    /* Compatible flags are ok.	 */
774    ;
775
776  else		/* Possibly incompatible flags.	 */
777    {
778      /* Warn if different cpu is used (allow a specific cpu to override
779	 the generic cpu).  */
780      new_partial = (new_flags & EF_M32C_CPU_MASK);
781      old_partial = (old_flags & EF_M32C_CPU_MASK);
782      if (new_partial == old_partial)
783	;
784
785      else
786	{
787	  switch (new_partial)
788	    {
789	    default:		  strcat (new_opt, " -m16c");	break;
790	    case EF_M32C_CPU_M16C:	strcat (new_opt, " -m16c");  break;
791	    case EF_M32C_CPU_M32C:  strcat (new_opt, " -m32c");  break;
792	    }
793
794	  switch (old_partial)
795	    {
796	    default:		  strcat (old_opt, " -m16c");	break;
797	    case EF_M32C_CPU_M16C:	strcat (old_opt, " -m16c");  break;
798	    case EF_M32C_CPU_M32C:  strcat (old_opt, " -m32c");  break;
799	    }
800	}
801
802      /* Print out any mismatches from above.  */
803      if (new_opt[0])
804	{
805	  error = TRUE;
806	  (*_bfd_error_handler)
807	    (_("%s: compiled with %s and linked with modules compiled with %s"),
808	     bfd_get_filename (ibfd), new_opt, old_opt);
809	}
810
811      new_flags &= ~ EF_M32C_ALL_FLAGS;
812      old_flags &= ~ EF_M32C_ALL_FLAGS;
813
814      /* Warn about any other mismatches.  */
815      if (new_flags != old_flags)
816	{
817	  error = TRUE;
818	  (*_bfd_error_handler)
819	    (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
820	     bfd_get_filename (ibfd), (long)new_flags, (long)old_flags);
821	}
822    }
823
824  if (error)
825    bfd_set_error (bfd_error_bad_value);
826
827  return !error;
828}
829
830
831static bfd_boolean
832m32c_elf_print_private_bfd_data (bfd *abfd, PTR ptr)
833{
834  FILE *file = (FILE *) ptr;
835  flagword flags;
836
837  BFD_ASSERT (abfd != NULL && ptr != NULL);
838
839  /* Print normal ELF private data.  */
840  _bfd_elf_print_private_bfd_data (abfd, ptr);
841
842  flags = elf_elfheader (abfd)->e_flags;
843  fprintf (file, _("private flags = 0x%lx:"), (unsigned long) flags);
844
845  switch (flags & EF_M32C_CPU_MASK)
846    {
847    default:							break;
848    case EF_M32C_CPU_M16C:	fprintf (file, " -m16c");	break;
849    case EF_M32C_CPU_M32C:  fprintf (file, " -m32c");	break;
850    }
851
852  fputc ('\n', file);
853  return TRUE;
854}
855
856/* Return the MACH for an e_flags value.  */
857
858static int
859elf32_m32c_machine (bfd *abfd)
860{
861  switch (elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK)
862    {
863    case EF_M32C_CPU_M16C:	return bfd_mach_m16c;
864    case EF_M32C_CPU_M32C:  	return bfd_mach_m32c;
865    }
866
867  return bfd_mach_m16c;
868}
869
870static bfd_boolean
871m32c_elf_object_p (bfd *abfd)
872{
873  bfd_default_set_arch_mach (abfd, bfd_arch_m32c,
874			     elf32_m32c_machine (abfd));
875  return TRUE;
876}
877
878
879#ifdef DEBUG
880void
881dump_symtab (bfd * abfd, void *internal_syms, void *external_syms)
882{
883  size_t locsymcount;
884  Elf_Internal_Sym *isymbuf;
885  Elf_Internal_Sym *isymend;
886  Elf_Internal_Sym *isym;
887  Elf_Internal_Shdr *symtab_hdr;
888  bfd_boolean free_internal = 0, free_external = 0;
889  char * st_info_str;
890  char * st_info_stb_str;
891  char * st_other_str;
892  char * st_shndx_str;
893
894  if (! internal_syms)
895    {
896      internal_syms = bfd_malloc (1000);
897      free_internal = 1;
898    }
899  if (! external_syms)
900    {
901      external_syms = bfd_malloc (1000);
902      free_external = 1;
903    }
904
905  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
906  locsymcount = symtab_hdr->sh_size / get_elf_backend_data(abfd)->s->sizeof_sym;
907  if (free_internal)
908    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
909				    symtab_hdr->sh_info, 0,
910				    internal_syms, external_syms, NULL);
911  else
912    isymbuf = internal_syms;
913  isymend = isymbuf + locsymcount;
914
915  for (isym = isymbuf ; isym < isymend ; isym++)
916    {
917      switch (ELF_ST_TYPE (isym->st_info))
918	{
919	case STT_FUNC: st_info_str = "STT_FUNC";
920	case STT_SECTION: st_info_str = "STT_SECTION";
921	case STT_FILE: st_info_str = "STT_FILE";
922	case STT_OBJECT: st_info_str = "STT_OBJECT";
923	case STT_TLS: st_info_str = "STT_TLS";
924	default: st_info_str = "";
925	}
926      switch (ELF_ST_BIND (isym->st_info))
927	{
928	case STB_LOCAL: st_info_stb_str = "STB_LOCAL";
929	case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL";
930	default: st_info_stb_str = "";
931	}
932      switch (ELF_ST_VISIBILITY (isym->st_other))
933	{
934	case STV_DEFAULT: st_other_str = "STV_DEFAULT";
935	case STV_INTERNAL: st_other_str = "STV_INTERNAL";
936	case STV_PROTECTED: st_other_str = "STV_PROTECTED";
937	default: st_other_str = "";
938	}
939      switch (isym->st_shndx)
940	{
941	case SHN_ABS: st_shndx_str = "SHN_ABS";
942	case SHN_COMMON: st_shndx_str = "SHN_COMMON";
943	case SHN_UNDEF: st_shndx_str = "SHN_UNDEF";
944	default: st_shndx_str = "";
945	}
946
947      printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
948	      "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
949	      isym,
950	      (unsigned long) isym->st_value,
951	      (unsigned long) isym->st_size,
952	      isym->st_name,
953	      bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
954					       isym->st_name),
955	      isym->st_info, st_info_str, st_info_stb_str,
956	      isym->st_other, st_other_str,
957	      isym->st_shndx, st_shndx_str);
958    }
959  if (free_internal)
960    free (internal_syms);
961  if (free_external)
962    free (external_syms);
963}
964
965char *
966m32c_get_reloc (long reloc)
967{
968  if (0 <= reloc && reloc < R_M32C_max)
969    return m32c_elf_howto_table[reloc].name;
970  else
971    return "";
972}
973#endif /* DEBUG */
974
975/* Handle relaxing.  */
976
977/* A subroutine of m32c_elf_relax_section.  If the global symbol H
978   is within the low 64k, remove any entry for it in the plt.  */
979
980struct relax_plt_data
981{
982  asection *splt;
983  bfd_boolean *again;
984};
985
986static bfd_boolean
987m32c_relax_plt_check (struct elf_link_hash_entry *h,
988                      PTR xdata)
989{
990  struct relax_plt_data *data = (struct relax_plt_data *) xdata;
991
992  if (h->root.type == bfd_link_hash_warning)
993    h = (struct elf_link_hash_entry *) h->root.u.i.link;
994
995  if (h->plt.offset != (bfd_vma) -1)
996    {
997      bfd_vma address;
998
999      if (h->root.type == bfd_link_hash_undefined
1000	  || h->root.type == bfd_link_hash_undefweak)
1001	address = 0;
1002      else
1003	address = (h->root.u.def.section->output_section->vma
1004		   + h->root.u.def.section->output_offset
1005		   + h->root.u.def.value);
1006
1007      if (address <= 0xffff)
1008	{
1009	  h->plt.offset = -1;
1010	  data->splt->size -= 4;
1011	  *data->again = TRUE;
1012	}
1013    }
1014
1015  return TRUE;
1016}
1017
1018/* A subroutine of m32c_elf_relax_section.  If the global symbol H
1019   previously had a plt entry, give it a new entry offset.  */
1020
1021static bfd_boolean
1022m32c_relax_plt_realloc (struct elf_link_hash_entry *h,
1023                        PTR xdata)
1024{
1025  bfd_vma *entry = (bfd_vma *) xdata;
1026
1027  if (h->root.type == bfd_link_hash_warning)
1028    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1029
1030  if (h->plt.offset != (bfd_vma) -1)
1031    {
1032      h->plt.offset = *entry;
1033      *entry += 4;
1034    }
1035
1036  return TRUE;
1037}
1038
1039static bfd_boolean
1040m32c_elf_relax_plt_section (bfd *dynobj,
1041                            asection *splt,
1042                            struct bfd_link_info *info,
1043                            bfd_boolean *again)
1044{
1045  struct relax_plt_data relax_plt_data;
1046  bfd *ibfd;
1047
1048  /* Assume nothing changes.  */
1049  *again = FALSE;
1050
1051  if (info->relocatable)
1052    return TRUE;
1053
1054  /* We only relax the .plt section at the moment.  */
1055  if (dynobj != elf_hash_table (info)->dynobj
1056      || strcmp (splt->name, ".plt") != 0)
1057    return TRUE;
1058
1059  /* Quick check for an empty plt.  */
1060  if (splt->size == 0)
1061    return TRUE;
1062
1063  /* Map across all global symbols; see which ones happen to
1064     fall in the low 64k.  */
1065  relax_plt_data.splt = splt;
1066  relax_plt_data.again = again;
1067  elf_link_hash_traverse (elf_hash_table (info), m32c_relax_plt_check,
1068			  &relax_plt_data);
1069
1070  /* Likewise for local symbols, though that's somewhat less convenient
1071     as we have to walk the list of input bfds and swap in symbol data.  */
1072  for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link_next)
1073    {
1074      bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1075      Elf_Internal_Shdr *symtab_hdr;
1076      Elf_Internal_Sym *isymbuf = NULL;
1077      unsigned int idx;
1078
1079      if (! local_plt_offsets)
1080	continue;
1081
1082      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1083      if (symtab_hdr->sh_info != 0)
1084	{
1085	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1086	  if (isymbuf == NULL)
1087	    isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1088					    symtab_hdr->sh_info, 0,
1089					    NULL, NULL, NULL);
1090	  if (isymbuf == NULL)
1091	    return FALSE;
1092	}
1093
1094      for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1095	{
1096	  Elf_Internal_Sym *isym;
1097	  asection *tsec;
1098	  bfd_vma address;
1099
1100	  if (local_plt_offsets[idx] == (bfd_vma) -1)
1101	    continue;
1102
1103	  isym = &isymbuf[idx];
1104	  if (isym->st_shndx == SHN_UNDEF)
1105	    continue;
1106	  else if (isym->st_shndx == SHN_ABS)
1107	    tsec = bfd_abs_section_ptr;
1108	  else if (isym->st_shndx == SHN_COMMON)
1109	    tsec = bfd_com_section_ptr;
1110	  else
1111	    tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1112
1113	  address = (tsec->output_section->vma
1114		     + tsec->output_offset
1115		     + isym->st_value);
1116	  if (address <= 0xffff)
1117	    {
1118	      local_plt_offsets[idx] = -1;
1119	      splt->size -= 4;
1120	      *again = TRUE;
1121	    }
1122	}
1123
1124      if (isymbuf != NULL
1125	  && symtab_hdr->contents != (unsigned char *) isymbuf)
1126	{
1127	  if (! info->keep_memory)
1128	    free (isymbuf);
1129	  else
1130	    {
1131	      /* Cache the symbols for elf_link_input_bfd.  */
1132	      symtab_hdr->contents = (unsigned char *) isymbuf;
1133	    }
1134	}
1135    }
1136
1137  /* If we changed anything, walk the symbols again to reallocate
1138     .plt entry addresses.  */
1139  if (*again && splt->size > 0)
1140    {
1141      bfd_vma entry = 0;
1142
1143      elf_link_hash_traverse (elf_hash_table (info),
1144			      m32c_relax_plt_realloc, &entry);
1145
1146      for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link_next)
1147	{
1148	  bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1149	  unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1150	  unsigned int idx;
1151
1152	  if (! local_plt_offsets)
1153	    continue;
1154
1155	  for (idx = 0; idx < nlocals; ++idx)
1156	    if (local_plt_offsets[idx] != (bfd_vma) -1)
1157	      {
1158	        local_plt_offsets[idx] = entry;
1159		entry += 4;
1160	      }
1161	}
1162    }
1163
1164  return TRUE;
1165}
1166
1167static int
1168compare_reloc (const void *e1, const void *e2)
1169{
1170  const Elf_Internal_Rela *i1 = (const Elf_Internal_Rela *) e1;
1171  const Elf_Internal_Rela *i2 = (const Elf_Internal_Rela *) e2;
1172
1173  if (i1->r_offset == i2->r_offset)
1174    return 0;
1175  else
1176    return i1->r_offset < i2->r_offset ? -1 : 1;
1177}
1178
1179#define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms)
1180static bfd_vma
1181m32c_offset_for_reloc (bfd *abfd,
1182		       Elf_Internal_Rela *rel,
1183		       Elf_Internal_Shdr *symtab_hdr,
1184		       Elf_External_Sym_Shndx *shndx_buf ATTRIBUTE_UNUSED,
1185		       Elf_Internal_Sym *intsyms)
1186{
1187  bfd_vma symval;
1188
1189  /* Get the value of the symbol referred to by the reloc.  */
1190  if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1191    {
1192      /* A local symbol.  */
1193      Elf_Internal_Sym *isym;
1194      asection *ssec;
1195
1196      isym = intsyms + ELF32_R_SYM (rel->r_info);
1197      ssec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1198      symval = isym->st_value;
1199      if (ssec)
1200	symval += ssec->output_section->vma
1201	  + ssec->output_offset;
1202    }
1203  else
1204    {
1205      unsigned long indx;
1206      struct elf_link_hash_entry *h;
1207
1208      /* An external symbol.  */
1209      indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1210      h = elf_sym_hashes (abfd)[indx];
1211      BFD_ASSERT (h != NULL);
1212
1213      if (h->root.type != bfd_link_hash_defined
1214	  && h->root.type != bfd_link_hash_defweak)
1215	/* This appears to be a reference to an undefined
1216	   symbol.  Just ignore it--it will be caught by the
1217	   regular reloc processing.  */
1218	return 0;
1219
1220      symval = (h->root.u.def.value
1221		+ h->root.u.def.section->output_section->vma
1222		+ h->root.u.def.section->output_offset);
1223    }
1224  return symval;
1225}
1226
1227static int bytes_saved = 0;
1228
1229static int bytes_to_reloc[] = {
1230  R_M32C_NONE,
1231  R_M32C_8,
1232  R_M32C_16,
1233  R_M32C_24,
1234  R_M32C_32
1235};
1236
1237/* What we use the bits in a relax reloc addend (R_M32C_RL_*) for.  */
1238
1239/* Mask for the number of relocs associated with this insn.  */
1240#define RLA_RELOCS		0x0000000f
1241/* Number of bytes gas emitted (before gas's relaxing) */
1242#define RLA_NBYTES		0x00000ff0
1243
1244/* If the displacement is within the given range and the new encoding
1245   differs from the old encoding (the index), then the insn can be
1246   relaxed to the new encoding.  */
1247typedef struct {
1248  int bytes;
1249  unsigned int max_disp;
1250  unsigned char new_encoding;
1251} EncodingTable;
1252
1253static EncodingTable m16c_addr_encodings[] = {
1254  { 0,   0,  0 }, /* R0 */
1255  { 0,   0,  1 }, /* R1 */
1256  { 0,   0,  2 }, /* R2 */
1257  { 0,   0,  3 }, /* R3 */
1258  { 0,   0,  4 }, /* A0 */
1259  { 0,   0,  5 }, /* A1 */
1260  { 0,   0,  6 }, /* [A0] */
1261  { 0,   0,  7 }, /* [A1] */
1262  { 1,   0,  6 }, /* udsp:8[A0] */
1263  { 1,   0,  7 }, /* udsp:8[A1] */
1264  { 1,   0, 10 }, /* udsp:8[SB] */
1265  { 1,   0, 11 }, /* sdsp:8[FB] */
1266  { 2, 255,  8 }, /* udsp:16[A0] */
1267  { 2, 255,  9 }, /* udsp:16[A1] */
1268  { 2, 255, 10 }, /* udsp:16[SB] */
1269  { 2,   0, 15 }, /* abs:16 */
1270};
1271
1272static EncodingTable m16c_jmpaddr_encodings[] = {
1273  { 0,   0,  0 }, /* R0 */
1274  { 0,   0,  1 }, /* R1 */
1275  { 0,   0,  2 }, /* R2 */
1276  { 0,   0,  3 }, /* R3 */
1277  { 0,   0,  4 }, /* A0 */
1278  { 0,   0,  5 }, /* A1 */
1279  { 0,   0,  6 }, /* [A0] */
1280  { 0,   0,  7 }, /* [A1] */
1281  { 1,   0,  6 }, /* udsp:8[A0] */
1282  { 1,   0,  7 }, /* udsp:8[A1] */
1283  { 1,   0, 10 }, /* udsp:8[SB] */
1284  { 1,   0, 11 }, /* sdsp:8[FB] */
1285  { 3, 255,  8 }, /* udsp:20[A0] */
1286  { 3, 255,  9 }, /* udsp:20[A1] */
1287  { 2, 255, 10 }, /* udsp:16[SB] */
1288  { 2,   0, 15 }, /* abs:16 */
1289};
1290
1291static EncodingTable m32c_addr_encodings[] = {
1292  { 0,     0,  0 }, /* [A0] */
1293  { 0,     0,  1 }, /* [A1] */
1294  { 0,     0,  2 }, /* A0 */
1295  { 0,     0,  3 }, /* A1 */
1296  { 1,     0,  0 }, /* udsp:8[A0] */
1297  { 1,     0,  1 }, /* udsp:8[A1] */
1298  { 1,     0,  6 }, /* udsp:8[SB] */
1299  { 1,     0,  7 }, /* sdsp:8[FB] */
1300  { 2,   255,  4 }, /* udsp:16[A0] */
1301  { 2,   255,  5 }, /* udsp:16[A1] */
1302  { 2,   255,  6 }, /* udsp:16[SB] */
1303  { 2,   127,  7 }, /* sdsp:16[FB] */
1304  { 3, 65535, 8 }, /* udsp:24[A0] */
1305  { 3, 65535, 9 }, /* udsp:24[A1] */
1306  { 3, 65535, 15 }, /* abs24 */
1307  { 2,     0, 15 }, /* abs16 */
1308  { 0,     0, 16 }, /* R2 */
1309  { 0,     0, 17 }, /* R3 */
1310  { 0,     0, 18 }, /* R0 */
1311  { 0,     0, 19 }, /* R1 */
1312  { 0,     0, 20 }, /*  */
1313  { 0,     0, 21 }, /*  */
1314  { 0,     0, 22 }, /*  */
1315  { 0,     0, 23 }, /*  */
1316  { 0,     0, 24 }, /*  */
1317  { 0,     0, 25 }, /*  */
1318  { 0,     0, 26 }, /*  */
1319  { 0,     0, 27 }, /*  */
1320  { 0,     0, 28 }, /*  */
1321  { 0,     0, 29 }, /*  */
1322  { 0,     0, 30 }, /*  */
1323  { 0,     0, 31 }, /*  */
1324};
1325
1326static bfd_boolean
1327m32c_elf_relax_section
1328    (bfd *                  abfd,
1329     asection *             sec,
1330     struct bfd_link_info * link_info,
1331     bfd_boolean *          again)
1332{
1333  Elf_Internal_Shdr *symtab_hdr;
1334  Elf_Internal_Shdr *shndx_hdr;
1335  Elf_Internal_Rela *internal_relocs;
1336  Elf_Internal_Rela *free_relocs = NULL;
1337  Elf_Internal_Rela *irel, *irelend, *srel;
1338  bfd_byte * contents = NULL;
1339  bfd_byte * free_contents = NULL;
1340  Elf_Internal_Sym *intsyms = NULL;
1341  Elf_Internal_Sym *free_intsyms = NULL;
1342  Elf_External_Sym_Shndx *shndx_buf = NULL;
1343  int machine;
1344
1345  if (abfd == elf_hash_table (link_info)->dynobj
1346      && strcmp (sec->name, ".plt") == 0)
1347    return m32c_elf_relax_plt_section (abfd, sec, link_info, again);
1348
1349  /* Assume nothing changes.  */
1350  *again = FALSE;
1351
1352  machine = elf32_m32c_machine (abfd);
1353
1354  /* We don't have to do anything for a relocatable link, if
1355     this section does not have relocs, or if this is not a
1356     code section.  */
1357  if (link_info->relocatable
1358      || (sec->flags & SEC_RELOC) == 0
1359      || sec->reloc_count == 0
1360      || (sec->flags & SEC_CODE) == 0)
1361    return TRUE;
1362
1363  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1364  shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
1365
1366  /* Get the section contents.  */
1367  if (elf_section_data (sec)->this_hdr.contents != NULL)
1368    contents = elf_section_data (sec)->this_hdr.contents;
1369  /* Go get them off disk.  */
1370  else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1371    goto error_return;
1372
1373  /* Read this BFD's symbols.  */
1374  /* Get cached copy if it exists.  */
1375  if (symtab_hdr->contents != NULL)
1376    {
1377      intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1378    }
1379  else
1380    {
1381      intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
1382      symtab_hdr->contents = (bfd_byte *) intsyms;
1383    }
1384
1385  if (shndx_hdr->sh_size != 0)
1386    {
1387      bfd_size_type amt;
1388
1389      amt = symtab_hdr->sh_info;
1390      amt *= sizeof (Elf_External_Sym_Shndx);
1391      shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
1392      if (shndx_buf == NULL)
1393	goto error_return;
1394      if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
1395	  || bfd_bread ((PTR) shndx_buf, amt, abfd) != amt)
1396	goto error_return;
1397      shndx_hdr->contents = (bfd_byte *) shndx_buf;
1398    }
1399
1400  /* Get a copy of the native relocations.  */
1401  internal_relocs = (_bfd_elf_link_read_relocs
1402		     (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1403		      link_info->keep_memory));
1404  if (internal_relocs == NULL)
1405    goto error_return;
1406  if (! link_info->keep_memory)
1407    free_relocs = internal_relocs;
1408
1409  /* The RL_ relocs must be just before the operand relocs they go
1410     with, so we must sort them to guarantee this.  */
1411  qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
1412         compare_reloc);
1413
1414  /* Walk through them looking for relaxing opportunities.  */
1415  irelend = internal_relocs + sec->reloc_count;
1416
1417  for (irel = internal_relocs; irel < irelend; irel++)
1418    {
1419      bfd_vma symval;
1420      unsigned char *insn, *gap, *einsn;
1421      bfd_vma pc;
1422      bfd_signed_vma pcrel;
1423      int relax_relocs;
1424      int gap_size;
1425      int new_type;
1426      int posn;
1427      int enc;
1428      EncodingTable *enctbl;
1429      EncodingTable *e;
1430
1431      if (ELF32_R_TYPE(irel->r_info) != R_M32C_RL_JUMP
1432	  && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_1ADDR
1433	  && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_2ADDR)
1434	continue;
1435
1436      srel = irel;
1437
1438      /* There will always be room for the relaxed insn, since it is smaller
1439	 than the one it would replace.  */
1440      BFD_ASSERT (irel->r_offset < sec->size);
1441
1442      insn = contents + irel->r_offset;
1443      relax_relocs = irel->r_addend % 16;
1444
1445      /* Ok, we only have three relocs we care about, and they're all
1446	 fake.  The lower four bits of the addend is always the number
1447	 of following relocs (hence the qsort above) that are assigned
1448	 to this opcode.  The next 8 bits of the addend indicates the
1449	 number of bytes in the insn.  We use the rest of them
1450	 ourselves as flags for the more expensive operations (defines
1451	 above).  The three relocs are:
1452
1453	 RL_JUMP: This marks all direct jump insns.  We check the
1454		displacement and replace them with shorter jumps if
1455		they're in range.  We also use this to find JMP.S
1456		insns and manually shorten them when we delete bytes.
1457		We have to decode these insns to figure out what to
1458		do.
1459
1460	 RL_1ADDR: This is a :G or :Q insn, which has a single
1461		"standard" operand.  We have to extract the type
1462		field, see if it's a wide displacement, then figure
1463		out if we can replace it with a narrow displacement.
1464		We don't have to decode these insns.
1465
1466	 RL_2ADDR: Similarly, but two "standard" operands.  Note that
1467		r_addend may still be 1, as standard operands don't
1468		always have displacements.  Gas shouldn't give us one
1469		with zero operands, but since we don't know which one
1470		has the displacement, we check them both anyway.
1471
1472	 These all point to the beginning of the insn itself, not the
1473	 operands.
1474
1475	 Note that we only relax one step at a time, relying on the
1476	 linker to call us repeatedly.  Thus, there is no code for
1477	 JMP.A->JMP.B although that will happen in two steps.
1478	 Likewise, for 2ADDR relaxes, we do one operand per cycle.
1479      */
1480
1481      /* Get the value of the symbol referred to by the reloc.  Just
1482         in case this is the last reloc in the list, use the RL's
1483         addend to choose between this reloc (no addend) or the next
1484         (yes addend, which means at least one following reloc).  */
1485      srel = irel + (relax_relocs ? 1 : 0);
1486      symval = OFFSET_FOR_RELOC (srel);
1487
1488      /* Setting gap_size nonzero is the flag which means "something
1489	 shrunk".  */
1490      gap_size = 0;
1491      gap = NULL;
1492      new_type = ELF32_R_TYPE(srel->r_info);
1493
1494      pc = sec->output_section->vma + sec->output_offset
1495	+ srel->r_offset;
1496      pcrel = symval - pc + srel->r_addend;
1497
1498      if (machine == bfd_mach_m16c)
1499	{
1500	  /* R8C / M16C */
1501
1502	  switch (ELF32_R_TYPE(irel->r_info))
1503	    {
1504
1505	    case R_M32C_RL_JUMP:
1506	      switch (insn[0])
1507		{
1508		case 0xfe: /* jmp.b */
1509		  if (pcrel >= 2 && pcrel <= 9)
1510		    {
1511		      /* Relax JMP.B -> JMP.S.  We need to get rid of
1512			 the following reloc though. */
1513		      insn[0] = 0x60 | (pcrel - 2);
1514		      new_type = R_M32C_NONE;
1515		      irel->r_addend = 0x10;
1516		      gap_size = 1;
1517		      gap = insn + 1;
1518		    }
1519		  break;
1520
1521		case 0xf4: /* jmp.w */
1522		  /* 128 is allowed because it will be one byte closer
1523		     after relaxing.  Likewise for all other pc-rel
1524		     jumps.  */
1525		  if (pcrel <= 128 && pcrel >= -128)
1526		    {
1527		      /* Relax JMP.W -> JMP.B */
1528		      insn[0] = 0xfe;
1529		      insn[1] = 0;
1530		      new_type = R_M32C_8_PCREL;
1531		      gap_size = 1;
1532		      gap = insn + 2;
1533		    }
1534		  break;
1535
1536		case 0xfc: /* jmp.a */
1537		  if (pcrel <= 32768 && pcrel >= -32768)
1538		    {
1539		      /* Relax JMP.A -> JMP.W */
1540		      insn[0] = 0xf4;
1541		      insn[1] = 0;
1542		      insn[2] = 0;
1543		      new_type = R_M32C_16_PCREL;
1544		      gap_size = 1;
1545		      gap = insn + 3;
1546		    }
1547		  break;
1548
1549		case 0xfd: /* jsr.a */
1550		  if (pcrel <= 32768 && pcrel >= -32768)
1551		    {
1552		      /* Relax JSR.A -> JSR.W */
1553		      insn[0] = 0xf5;
1554		      insn[1] = 0;
1555		      insn[2] = 0;
1556		      new_type = R_M32C_16_PCREL;
1557		      gap_size = 1;
1558		      gap = insn + 3;
1559		    }
1560		  break;
1561		}
1562	      break;
1563
1564	    case R_M32C_RL_2ADDR:
1565	      /* xxxx xxxx srce dest [src-disp] [dest-disp]*/
1566
1567	      enctbl = m16c_addr_encodings;
1568	      posn = 2;
1569	      enc = (insn[1] >> 4) & 0x0f;
1570	      e = & enctbl[enc];
1571
1572	      if (srel->r_offset == irel->r_offset + posn
1573		  && e->new_encoding != enc
1574		  && symval <= e->max_disp)
1575		{
1576		  insn[1] &= 0x0f;
1577		  insn[1] |= e->new_encoding << 4;
1578		  gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1579		  gap = insn + posn + enctbl[e->new_encoding].bytes;
1580		  new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1581		  break;
1582		}
1583	      if (relax_relocs == 2)
1584		srel ++;
1585	      posn += e->bytes;
1586
1587	      goto try_1addr_16;
1588
1589	    case R_M32C_RL_1ADDR:
1590	      /* xxxx xxxx xxxx dest [disp] */
1591
1592	      enctbl = m16c_addr_encodings;
1593	      posn = 2;
1594
1595	      /* Check the opcode for jumps.  We know it's safe to
1596		 do this because all 2ADDR insns are at least two
1597		 bytes long.  */
1598	      enc = insn[0] * 256 + insn[1];
1599	      enc &= 0xfff0;
1600	      if (enc == 0x7d20
1601		  || enc == 0x7d00
1602		  || enc == 0x7d30
1603		  || enc == 0x7d10)
1604		{
1605		  enctbl = m16c_jmpaddr_encodings;
1606		}
1607
1608	    try_1addr_16:
1609	      /* srel, posn, and enc must be set here.  */
1610
1611	      symval = OFFSET_FOR_RELOC (srel);
1612	      enc = insn[1] & 0x0f;
1613	      e = & enctbl[enc];
1614
1615	      if (srel->r_offset == irel->r_offset + posn
1616		  && e->new_encoding != enc
1617		  && symval <= e->max_disp)
1618		{
1619		  insn[1] &= 0xf0;
1620		  insn[1] |= e->new_encoding;
1621		  gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1622		  gap = insn + posn + enctbl[e->new_encoding].bytes;
1623		  new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1624		  break;
1625		}
1626
1627	      break;
1628
1629	    } /* Ends switch (reloc type) for m16c.  */
1630	}
1631      else /* machine == bfd_mach_m32c */
1632	{
1633	  /* M32CM / M32C */
1634
1635	  switch (ELF32_R_TYPE(irel->r_info))
1636	    {
1637
1638	    case R_M32C_RL_JUMP:
1639	      switch (insn[0])
1640		{
1641		case 0xbb: /* jmp.b */
1642		  if (pcrel >= 2 && pcrel <= 9)
1643		    {
1644		      int p = pcrel - 2;
1645		      /* Relax JMP.B -> JMP.S.  We need to get rid of
1646			 the following reloc though. */
1647		      insn[0] = 0x4a | ((p << 3) & 0x30) | (p & 1);
1648		      new_type = R_M32C_NONE;
1649		      irel->r_addend = 0x10;
1650		      gap_size = 1;
1651		      gap = insn + 1;
1652		    }
1653		  break;
1654
1655		case 0xce: /* jmp.w */
1656		  if (pcrel <= 128 && pcrel >= -128)
1657		    {
1658		      /* Relax JMP.W -> JMP.B */
1659		      insn[0] = 0xbb;
1660		      insn[1] = 0;
1661		      new_type = R_M32C_8_PCREL;
1662		      gap_size = 1;
1663		      gap = insn + 2;
1664		    }
1665		  break;
1666
1667		case 0xcc: /* jmp.a */
1668		  if (pcrel <= 32768 && pcrel >= -32768)
1669		    {
1670		      /* Relax JMP.A -> JMP.W */
1671		      insn[0] = 0xce;
1672		      insn[1] = 0;
1673		      insn[2] = 0;
1674		      new_type = R_M32C_16_PCREL;
1675		      gap_size = 1;
1676		      gap = insn + 3;
1677		    }
1678		  break;
1679
1680		case 0xcd: /* jsr.a */
1681		  if (pcrel <= 32768 && pcrel >= -32768)
1682		    {
1683		      /* Relax JSR.A -> JSR.W */
1684		      insn[0] = 0xcf;
1685		      insn[1] = 0;
1686		      insn[2] = 0;
1687		      new_type = R_M32C_16_PCREL;
1688		      gap_size = 1;
1689		      gap = insn + 3;
1690		    }
1691		  break;
1692		}
1693	      break;
1694
1695	    case R_M32C_RL_2ADDR:
1696	      /* xSSS DDDx DDSS xxxx [src-disp] [dest-disp]*/
1697
1698	      einsn = insn;
1699	      posn = 2;
1700	      if (einsn[0] == 1)
1701		{
1702		  /* prefix; remove it as far as the RL reloc is concerned.  */
1703		  einsn ++;
1704		  posn ++;
1705		}
1706
1707	      enctbl = m32c_addr_encodings;
1708	      enc = ((einsn[0] & 0x70) >> 2) | ((einsn[1] & 0x30) >> 4);
1709	      e = & enctbl[enc];
1710
1711	      if (srel->r_offset == irel->r_offset + posn
1712		  && e->new_encoding != enc
1713		  && symval <= e->max_disp)
1714		{
1715		  einsn[0] &= 0x8f;
1716		  einsn[0] |= (e->new_encoding & 0x1c) << 2;
1717		  einsn[1] &= 0xcf;
1718		  einsn[1] |= (e->new_encoding & 0x03) << 4;
1719		  gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1720		  gap = insn + posn + enctbl[e->new_encoding].bytes;
1721		  new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1722		  break;
1723		}
1724	      if (relax_relocs == 2)
1725		  srel ++;
1726	      posn += e->bytes;
1727
1728	      goto try_1addr_32;
1729
1730	    case R_M32C_RL_1ADDR:
1731	      /* xxxx DDDx DDxx xxxx [disp] */
1732
1733	      einsn = insn;
1734	      posn = 2;
1735	      if (einsn[0] == 1)
1736		{
1737		  /* prefix; remove it as far as the RL reloc is concerned.  */
1738		  einsn ++;
1739		  posn ++;
1740		}
1741
1742	      enctbl = m32c_addr_encodings;
1743
1744	    try_1addr_32:
1745	      /* srel, posn, and enc must be set here.  */
1746
1747	      symval = OFFSET_FOR_RELOC (srel);
1748	      enc = ((einsn[0] & 0x0e) << 1) |  ((einsn[1] & 0xc0) >> 6);
1749	      e = & enctbl[enc];
1750
1751	      if (srel->r_offset == irel->r_offset + posn
1752		  && e->new_encoding != enc
1753		  && symval <= e->max_disp)
1754		{
1755		  einsn[0] &= 0xf1;
1756		  einsn[0] |= (e->new_encoding & 0x1c) >> 1;
1757		  einsn[1] &= 0x3f;
1758		  einsn[1] |= (e->new_encoding & 0x03) << 6;
1759		  gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1760		  gap = insn + posn + enctbl[e->new_encoding].bytes;
1761		  new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1762		  break;
1763		}
1764
1765	      break;
1766
1767	    } /* Ends switch (reloc type) for m32c.  */
1768	}
1769
1770      if (gap_size == 0)
1771	continue;
1772
1773      *again = TRUE;
1774
1775      srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), new_type);
1776
1777      /* Note that we've changed the relocs, section contents, etc.  */
1778      elf_section_data (sec)->relocs = internal_relocs;
1779      free_relocs = NULL;
1780
1781      elf_section_data (sec)->this_hdr.contents = contents;
1782      free_contents = NULL;
1783
1784      symtab_hdr->contents = (bfd_byte *) intsyms;
1785      free_intsyms = NULL;
1786
1787      bytes_saved += gap_size;
1788
1789      if (! m32c_elf_relax_delete_bytes(abfd, sec, gap - contents, gap_size))
1790	goto error_return;
1791
1792    } /* next relocation */
1793
1794  if (free_relocs != NULL)
1795    {
1796      free (free_relocs);
1797      free_relocs = NULL;
1798    }
1799
1800  if (free_contents != NULL)
1801    {
1802      if (! link_info->keep_memory)
1803	free (free_contents);
1804      /* Cache the section contents for elf_link_input_bfd.  */
1805      else
1806	elf_section_data (sec)->this_hdr.contents = contents;
1807
1808      free_contents = NULL;
1809    }
1810
1811  if (shndx_buf != NULL)
1812    {
1813      shndx_hdr->contents = NULL;
1814      free (shndx_buf);
1815    }
1816
1817  if (free_intsyms != NULL)
1818    {
1819      if (! link_info->keep_memory)
1820	free (free_intsyms);
1821      /* Cache the symbols for elf_link_input_bfd.  */
1822      else
1823	{
1824	symtab_hdr->contents = NULL /* (unsigned char *) intsyms*/;
1825	}
1826
1827      free_intsyms = NULL;
1828    }
1829
1830  return TRUE;
1831
1832 error_return:
1833  if (free_relocs != NULL)
1834    free (free_relocs);
1835  if (free_contents != NULL)
1836    free (free_contents);
1837  if (shndx_buf != NULL)
1838    {
1839      shndx_hdr->contents = NULL;
1840      free (shndx_buf);
1841    }
1842  if (free_intsyms != NULL)
1843    free (free_intsyms);
1844  return FALSE;
1845}
1846
1847/* Delete some bytes from a section while relaxing.  */
1848
1849static bfd_boolean
1850m32c_elf_relax_delete_bytes
1851 (bfd *      abfd,
1852  asection * sec,
1853  bfd_vma    addr,
1854  int        count)
1855{
1856  Elf_Internal_Shdr *symtab_hdr;
1857  Elf_Internal_Shdr *shndx_hdr;
1858  int sec_shndx;
1859  bfd_byte *contents;
1860  Elf_Internal_Rela *irel;
1861  Elf_Internal_Rela *irelend;
1862  bfd_vma toaddr;
1863  Elf_Internal_Sym *isym;
1864  Elf_Internal_Sym *isymend;
1865  Elf_Internal_Sym *intsyms;
1866  Elf_External_Sym_Shndx *shndx_buf;
1867  Elf_External_Sym_Shndx *shndx;
1868  struct elf_link_hash_entry ** sym_hashes;
1869  struct elf_link_hash_entry ** end_hashes;
1870  unsigned int                  symcount;
1871
1872  contents   = elf_section_data (sec)->this_hdr.contents;
1873
1874  toaddr = sec->size;
1875
1876  irel = elf_section_data (sec)->relocs;
1877  irelend = irel + sec->reloc_count;
1878
1879  /* Actually delete the bytes.  */
1880  memmove (contents + addr, contents + addr + count, (size_t) (toaddr - addr - count));
1881  sec->size -= count;
1882
1883  /* Adjust all the relocs.  */
1884  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel ++)
1885    {
1886      /* Get the new reloc address.  */
1887      if (irel->r_offset > addr && irel->r_offset < toaddr)
1888	irel->r_offset -= count;
1889
1890      if (ELF32_R_TYPE(irel->r_info) == R_M32C_RL_JUMP
1891	  && irel->r_addend == 0x10 /* one byte insn, no relocs */
1892	  && irel->r_offset + 1 < addr
1893	  && irel->r_offset + 7 > addr)
1894	{
1895	  bfd_vma disp;
1896	  unsigned char *insn = &contents[irel->r_offset];
1897	  disp = *insn;
1898	  /* This is a JMP.S, which we have to manually update. */
1899	  if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
1900	    {
1901	      if ((*insn & 0xf8) != 0x60)
1902		continue;
1903	      disp = (disp & 7);
1904	    }
1905	  else
1906	    {
1907	      if ((*insn & 0xce) != 0x4a)
1908		continue;
1909	      disp = ((disp & 0x30) >> 3) | (disp & 1);
1910	    }
1911	  if (irel->r_offset + disp + 2 >= addr+count)
1912	    {
1913	      disp -= count;
1914	      if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
1915		{
1916		  *insn = (*insn & 0xf8) | disp;
1917		}
1918	      else
1919		{
1920		  *insn = (*insn & 0xce) | ((disp & 6) << 3) | (disp & 1);
1921		}
1922	    }
1923	}
1924    }
1925
1926  /* Adjust the local symbols defined in this section.  */
1927  symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
1928  intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1929  isym = intsyms;
1930  isymend = isym + symtab_hdr->sh_info;
1931
1932  sec_shndx  = _bfd_elf_section_from_bfd_section (abfd, sec);
1933  shndx_hdr  = & elf_tdata (abfd)->symtab_shndx_hdr;
1934  shndx_buf  = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
1935  shndx = shndx_buf;
1936
1937  for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
1938    {
1939      /* If the symbol is in the range of memory we just moved, we
1940	 have to adjust its value.  */
1941      if ((int) isym->st_shndx == sec_shndx
1942	  && isym->st_value > addr
1943	  && isym->st_value < toaddr)
1944	{
1945	  isym->st_value -= count;
1946	}
1947      /* If the symbol *spans* the bytes we just deleted (i.e. it's
1948	 *end* is in the moved bytes but it's *start* isn't), then we
1949	 must adjust its size.  */
1950      if ((int) isym->st_shndx == sec_shndx
1951	    && isym->st_value < addr
1952	  && isym->st_value + isym->st_size > addr
1953	  && isym->st_value + isym->st_size < toaddr)
1954	{
1955	  isym->st_size -= count;
1956	}
1957    }
1958
1959  /* Now adjust the global symbols defined in this section.  */
1960  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1961	      - symtab_hdr->sh_info);
1962  sym_hashes = elf_sym_hashes (abfd);
1963  //  sym_hashes += symtab_hdr->sh_info;
1964  end_hashes = sym_hashes + symcount;
1965
1966  for (; sym_hashes < end_hashes; sym_hashes ++)
1967    {
1968      struct elf_link_hash_entry * sym_hash = * sym_hashes;
1969
1970      if (sym_hash &&
1971	  (sym_hash->root.type == bfd_link_hash_defined
1972	   || sym_hash->root.type == bfd_link_hash_defweak)
1973	  && sym_hash->root.u.def.section == sec)
1974	{
1975	  if (sym_hash->root.u.def.value > addr
1976	      && sym_hash->root.u.def.value < toaddr)
1977	    {
1978	      sym_hash->root.u.def.value -= count;
1979	    }
1980	  if (sym_hash->root.u.def.value < addr
1981	      && sym_hash->root.u.def.value + sym_hash->size > addr
1982	      && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1983	    {
1984	      sym_hash->size -= count;
1985	    }
1986	}
1987    }
1988
1989  return TRUE;
1990}
1991
1992/* This is for versions of gcc prior to 4.3.  */
1993static unsigned int
1994_bfd_m32c_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
1995{
1996  if ((elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK) == EF_M32C_CPU_M16C)
1997    return 2;
1998  return 4;
1999}
2000
2001
2002
2003#define ELF_ARCH		bfd_arch_m32c
2004#define ELF_MACHINE_CODE	EM_M32C
2005#define ELF_MACHINE_ALT1	EM_M32C_OLD
2006#define ELF_MAXPAGESIZE		0x100
2007
2008#if 0
2009#define TARGET_BIG_SYM		bfd_elf32_m32c_vec
2010#define TARGET_BIG_NAME		"elf32-m32c"
2011#else
2012#define TARGET_LITTLE_SYM		bfd_elf32_m32c_vec
2013#define TARGET_LITTLE_NAME		"elf32-m32c"
2014#endif
2015
2016#define elf_info_to_howto_rel			NULL
2017#define elf_info_to_howto			m32c_info_to_howto_rela
2018#define elf_backend_object_p			m32c_elf_object_p
2019#define elf_backend_relocate_section		m32c_elf_relocate_section
2020#define elf_backend_check_relocs                m32c_elf_check_relocs
2021#define elf_backend_object_p			m32c_elf_object_p
2022#define elf_symbol_leading_char                 ('_')
2023#define elf_backend_always_size_sections \
2024  m32c_elf_always_size_sections
2025#define elf_backend_finish_dynamic_sections \
2026  m32c_elf_finish_dynamic_sections
2027
2028#define elf_backend_can_gc_sections		1
2029#define elf_backend_eh_frame_address_size _bfd_m32c_elf_eh_frame_address_size
2030
2031#define bfd_elf32_bfd_reloc_type_lookup		m32c_reloc_type_lookup
2032#define bfd_elf32_bfd_reloc_name_lookup	m32c_reloc_name_lookup
2033#define bfd_elf32_bfd_relax_section		m32c_elf_relax_section
2034#define bfd_elf32_bfd_set_private_flags		m32c_elf_set_private_flags
2035#define bfd_elf32_bfd_merge_private_bfd_data	m32c_elf_merge_private_bfd_data
2036#define bfd_elf32_bfd_print_private_bfd_data	m32c_elf_print_private_bfd_data
2037
2038#include "elf32-target.h"
2039