1/* BFD back-end for Renesas H8/300 ELF binaries.
2   Copyright 1993, 1995, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006,
3   2007, 2009, 2010 Free Software Foundation, Inc.
4
5   This file is part of BFD, the Binary File Descriptor library.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20   MA 02110-1301, USA.  */
21
22#include "sysdep.h"
23#include "bfd.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "elf/h8.h"
27
28static reloc_howto_type *elf32_h8_reloc_type_lookup
29  (bfd *abfd, bfd_reloc_code_real_type code);
30static void elf32_h8_info_to_howto
31  (bfd *, arelent *, Elf_Internal_Rela *);
32static void elf32_h8_info_to_howto_rel
33  (bfd *, arelent *, Elf_Internal_Rela *);
34static unsigned long elf32_h8_mach (flagword);
35static void elf32_h8_final_write_processing (bfd *, bfd_boolean);
36static bfd_boolean elf32_h8_object_p (bfd *);
37static bfd_boolean elf32_h8_merge_private_bfd_data (bfd *, bfd *);
38static bfd_boolean elf32_h8_relax_section
39  (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
40static bfd_boolean elf32_h8_relax_delete_bytes
41  (bfd *, asection *, bfd_vma, int);
42static bfd_boolean elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
43static bfd_byte *elf32_h8_get_relocated_section_contents
44  (bfd *, struct bfd_link_info *, struct bfd_link_order *,
45   bfd_byte *, bfd_boolean, asymbol **);
46static bfd_reloc_status_type elf32_h8_final_link_relocate
47  (unsigned long, bfd *, bfd *, asection *,
48   bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
49   struct bfd_link_info *, asection *, int);
50static bfd_boolean elf32_h8_relocate_section
51  (bfd *, struct bfd_link_info *, bfd *, asection *,
52   bfd_byte *, Elf_Internal_Rela *,
53   Elf_Internal_Sym *, asection **);
54static bfd_reloc_status_type special
55  (bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **);
56
57/* This does not include any relocation information, but should be
58   good enough for GDB or objdump to read the file.  */
59
60static reloc_howto_type h8_elf_howto_table[] = {
61#define R_H8_NONE_X 0
62  HOWTO (R_H8_NONE,		/* type */
63	 0,			/* rightshift */
64	 0,			/* size (0 = byte, 1 = short, 2 = long) */
65	 0,			/* bitsize */
66	 FALSE,			/* pc_relative */
67	 0,			/* bitpos */
68	 complain_overflow_dont,/* complain_on_overflow */
69	 special,		/* special_function */
70	 "R_H8_NONE",		/* name */
71	 FALSE,			/* partial_inplace */
72	 0,			/* src_mask */
73	 0,			/* dst_mask */
74	 FALSE),		/* pcrel_offset */
75#define R_H8_DIR32_X (R_H8_NONE_X + 1)
76  HOWTO (R_H8_DIR32,		/* type */
77	 0,			/* rightshift */
78	 2,			/* size (0 = byte, 1 = short, 2 = long) */
79	 32,			/* bitsize */
80	 FALSE,			/* pc_relative */
81	 0,			/* bitpos */
82	 complain_overflow_dont,/* complain_on_overflow */
83	 special,		/* special_function */
84	 "R_H8_DIR32",		/* name */
85	 FALSE,			/* partial_inplace */
86	 0,			/* src_mask */
87	 0xffffffff,		/* dst_mask */
88	 FALSE),		/* pcrel_offset */
89#define R_H8_DIR16_X (R_H8_DIR32_X + 1)
90  HOWTO (R_H8_DIR16,		/* type */
91	 0,			/* rightshift */
92	 1,			/* size (0 = byte, 1 = short, 2 = long) */
93	 16,			/* bitsize */
94	 FALSE,			/* pc_relative */
95	 0,			/* bitpos */
96	 complain_overflow_dont,/* complain_on_overflow */
97	 special,		/* special_function */
98	 "R_H8_DIR16",		/* name */
99	 FALSE,			/* partial_inplace */
100	 0,			/* src_mask */
101	 0x0000ffff,		/* dst_mask */
102	 FALSE),		/* pcrel_offset */
103#define R_H8_DIR8_X (R_H8_DIR16_X + 1)
104  HOWTO (R_H8_DIR8,		/* type */
105	 0,			/* rightshift */
106	 0,			/* size (0 = byte, 1 = short, 2 = long) */
107	 8,			/* bitsize */
108	 FALSE,			/* pc_relative */
109	 0,			/* bitpos */
110	 complain_overflow_dont,/* complain_on_overflow */
111	 special,		/* special_function */
112	 "R_H8_DIR8",		/* name */
113	 FALSE,			/* partial_inplace */
114	 0,			/* src_mask */
115	 0x000000ff,		/* dst_mask */
116	 FALSE),		/* pcrel_offset */
117#define R_H8_DIR16A8_X (R_H8_DIR8_X + 1)
118  HOWTO (R_H8_DIR16A8,		/* type */
119	 0,			/* rightshift */
120	 1,			/* size (0 = byte, 1 = short, 2 = long) */
121	 16,			/* bitsize */
122	 FALSE,			/* pc_relative */
123	 0,			/* bitpos */
124	 complain_overflow_bitfield, /* complain_on_overflow */
125	 special,		/* special_function */
126	 "R_H8_DIR16A8",	/* name */
127	 FALSE,			/* partial_inplace */
128	 0,			/* src_mask */
129	 0x0000ffff,		/* dst_mask */
130	 FALSE),		/* pcrel_offset */
131#define R_H8_DIR16R8_X (R_H8_DIR16A8_X + 1)
132  HOWTO (R_H8_DIR16R8,		/* type */
133	 0,			/* rightshift */
134	 1,			/* size (0 = byte, 1 = short, 2 = long) */
135	 16,			/* bitsize */
136	 FALSE,			/* pc_relative */
137	 0,			/* bitpos */
138	 complain_overflow_bitfield, /* complain_on_overflow */
139	 special,		/* special_function */
140	 "R_H8_DIR16R8",	/* name */
141	 FALSE,			/* partial_inplace */
142	 0,			/* src_mask */
143	 0x0000ffff,		/* dst_mask */
144	 FALSE),		/* pcrel_offset */
145#define R_H8_DIR24A8_X (R_H8_DIR16R8_X + 1)
146  HOWTO (R_H8_DIR24A8,		/* type */
147	 0,			/* rightshift */
148	 2,			/* size (0 = byte, 1 = short, 2 = long) */
149	 24,			/* bitsize */
150	 FALSE,			/* pc_relative */
151	 0,			/* bitpos */
152	 complain_overflow_bitfield, /* complain_on_overflow */
153	 special,		/* special_function */
154	 "R_H8_DIR24A8",	/* name */
155	 TRUE,			/* partial_inplace */
156	 0xff000000,		/* src_mask */
157	 0x00ffffff,		/* dst_mask */
158	 FALSE),		/* pcrel_offset */
159#define R_H8_DIR24R8_X (R_H8_DIR24A8_X + 1)
160  HOWTO (R_H8_DIR24R8,		/* type */
161	 0,			/* rightshift */
162	 2,			/* size (0 = byte, 1 = short, 2 = long) */
163	 24,			/* bitsize */
164	 FALSE,			/* pc_relative */
165	 0,			/* bitpos */
166	 complain_overflow_bitfield, /* complain_on_overflow */
167	 special,		/* special_function */
168	 "R_H8_DIR24R8",	/* name */
169	 TRUE,			/* partial_inplace */
170	 0xff000000,		/* src_mask */
171	 0x00ffffff,		/* dst_mask */
172	 FALSE),		/* pcrel_offset */
173#define R_H8_DIR32A16_X (R_H8_DIR24R8_X + 1)
174  HOWTO (R_H8_DIR32A16,		/* type */
175	 0,			/* rightshift */
176	 2,			/* size (0 = byte, 1 = short, 2 = long) */
177	 32,			/* bitsize */
178	 FALSE,			/* pc_relative */
179	 0,			/* bitpos */
180	 complain_overflow_dont,/* complain_on_overflow */
181	 special,		/* special_function */
182	 "R_H8_DIR32A16",	/* name */
183	 FALSE,			/* partial_inplace */
184	 0,			/* src_mask */
185	 0xffffffff,		/* dst_mask */
186	 FALSE),		/* pcrel_offset */
187#define R_H8_PCREL16_X (R_H8_DIR32A16_X + 1)
188  HOWTO (R_H8_PCREL16,		/* type */
189	 0,			/* rightshift */
190	 1,			/* size (0 = byte, 1 = short, 2 = long) */
191	 16,			/* bitsize */
192	 TRUE,			/* pc_relative */
193	 0,			/* bitpos */
194	 complain_overflow_signed,/* complain_on_overflow */
195	 special,		/* special_function */
196	 "R_H8_PCREL16",	/* name */
197	 FALSE,			/* partial_inplace */
198	 0xffff,		/* src_mask */
199	 0xffff,		/* dst_mask */
200	 TRUE),			/* pcrel_offset */
201#define R_H8_PCREL8_X (R_H8_PCREL16_X + 1)
202  HOWTO (R_H8_PCREL8,		/* type */
203	 0,			/* rightshift */
204	 0,			/* size (0 = byte, 1 = short, 2 = long) */
205	 8,			/* bitsize */
206	 TRUE,			/* pc_relative */
207	 0,			/* bitpos */
208	 complain_overflow_signed,/* complain_on_overflow */
209	 special,		/* special_function */
210	 "R_H8_PCREL8",		/* name */
211	 FALSE,			/* partial_inplace */
212	 0xff,			/* src_mask */
213	 0xff,			/* dst_mask */
214	 TRUE),			/* pcrel_offset */
215};
216
217/* This structure is used to map BFD reloc codes to H8 ELF relocs.  */
218
219struct elf_reloc_map {
220  bfd_reloc_code_real_type bfd_reloc_val;
221  unsigned char howto_index;
222};
223
224/* An array mapping BFD reloc codes to H8 ELF relocs.  */
225
226static const struct elf_reloc_map h8_reloc_map[] = {
227  { BFD_RELOC_NONE, R_H8_NONE_X },
228  { BFD_RELOC_32, R_H8_DIR32_X },
229  { BFD_RELOC_16, R_H8_DIR16_X },
230  { BFD_RELOC_8, R_H8_DIR8_X },
231  { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
232  { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
233  { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
234  { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
235  { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
236  { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
237  { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
238};
239
240
241static reloc_howto_type *
242elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
243			    bfd_reloc_code_real_type code)
244{
245  unsigned int i;
246
247  for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
248    {
249      if (h8_reloc_map[i].bfd_reloc_val == code)
250	return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
251    }
252  return NULL;
253}
254
255static reloc_howto_type *
256elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
257			    const char *r_name)
258{
259  unsigned int i;
260
261  for (i = 0;
262       i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
263       i++)
264    if (h8_elf_howto_table[i].name != NULL
265	&& strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
266      return &h8_elf_howto_table[i];
267
268  return NULL;
269}
270
271static void
272elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
273			Elf_Internal_Rela *elf_reloc)
274{
275  unsigned int r;
276  unsigned int i;
277
278  r = ELF32_R_TYPE (elf_reloc->r_info);
279  for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
280    if (h8_elf_howto_table[i].type == r)
281      {
282	bfd_reloc->howto = &h8_elf_howto_table[i];
283	return;
284      }
285  abort ();
286}
287
288static void
289elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
290			    Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
291{
292  unsigned int r;
293
294  abort ();
295  r = ELF32_R_TYPE (elf_reloc->r_info);
296  bfd_reloc->howto = &h8_elf_howto_table[r];
297}
298
299/* Special handling for H8/300 relocs.
300   We only come here for pcrel stuff and return normally if not an -r link.
301   When doing -r, we can't do any arithmetic for the pcrel stuff, because
302   we support relaxing on the H8/300 series chips.  */
303static bfd_reloc_status_type
304special (bfd *abfd ATTRIBUTE_UNUSED,
305	 arelent *reloc_entry ATTRIBUTE_UNUSED,
306	 asymbol *symbol ATTRIBUTE_UNUSED,
307	 PTR data ATTRIBUTE_UNUSED,
308	 asection *input_section ATTRIBUTE_UNUSED,
309	 bfd *output_bfd,
310	 char **error_message ATTRIBUTE_UNUSED)
311{
312  if (output_bfd == (bfd *) NULL)
313    return bfd_reloc_continue;
314
315  /* Adjust the reloc address to that in the output section.  */
316  reloc_entry->address += input_section->output_offset;
317  return bfd_reloc_ok;
318}
319
320/* Perform a relocation as part of a final link.  */
321static bfd_reloc_status_type
322elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
323			      bfd *output_bfd ATTRIBUTE_UNUSED,
324			      asection *input_section ATTRIBUTE_UNUSED,
325			      bfd_byte *contents, bfd_vma offset,
326			      bfd_vma value, bfd_vma addend,
327			      struct bfd_link_info *info ATTRIBUTE_UNUSED,
328			      asection *sym_sec ATTRIBUTE_UNUSED,
329			      int is_local ATTRIBUTE_UNUSED)
330{
331  bfd_byte *hit_data = contents + offset;
332
333  switch (r_type)
334    {
335    case R_H8_NONE:
336      return bfd_reloc_ok;
337
338    case R_H8_DIR32:
339    case R_H8_DIR32A16:
340    case R_H8_DIR24A8:
341      value += addend;
342      bfd_put_32 (input_bfd, value, hit_data);
343      return bfd_reloc_ok;
344
345    case R_H8_DIR16:
346    case R_H8_DIR16A8:
347    case R_H8_DIR16R8:
348      value += addend;
349      bfd_put_16 (input_bfd, value, hit_data);
350      return bfd_reloc_ok;
351
352    /* AKA R_RELBYTE */
353    case R_H8_DIR8:
354      value += addend;
355
356      bfd_put_8 (input_bfd, value, hit_data);
357      return bfd_reloc_ok;
358
359    case R_H8_DIR24R8:
360      value += addend;
361
362      /* HIT_DATA is the address for the first byte for the relocated
363	 value.  Subtract 1 so that we can manipulate the data in 32-bit
364	 hunks.  */
365      hit_data--;
366
367      /* Clear out the top byte in value.  */
368      value &= 0xffffff;
369
370      /* Retrieve the type byte for value from the section contents.  */
371      value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
372
373      /* Now scribble it out in one 32-bit hunk.  */
374      bfd_put_32 (input_bfd, value, hit_data);
375      return bfd_reloc_ok;
376
377    case R_H8_PCREL16:
378      value -= (input_section->output_section->vma
379		+ input_section->output_offset);
380      value -= offset;
381      value += addend;
382
383      /* The value is relative to the start of the instruction,
384	 not the relocation offset.  Subtract 2 to account for
385	 this minor issue.  */
386      value -= 2;
387
388      bfd_put_16 (input_bfd, value, hit_data);
389      return bfd_reloc_ok;
390
391    case R_H8_PCREL8:
392      value -= (input_section->output_section->vma
393		+ input_section->output_offset);
394      value -= offset;
395      value += addend;
396
397      /* The value is relative to the start of the instruction,
398	 not the relocation offset.  Subtract 1 to account for
399	 this minor issue.  */
400      value -= 1;
401
402      bfd_put_8 (input_bfd, value, hit_data);
403      return bfd_reloc_ok;
404
405    default:
406      return bfd_reloc_notsupported;
407    }
408}
409
410/* Relocate an H8 ELF section.  */
411static bfd_boolean
412elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
413			   bfd *input_bfd, asection *input_section,
414			   bfd_byte *contents, Elf_Internal_Rela *relocs,
415			   Elf_Internal_Sym *local_syms,
416			   asection **local_sections)
417{
418  Elf_Internal_Shdr *symtab_hdr;
419  struct elf_link_hash_entry **sym_hashes;
420  Elf_Internal_Rela *rel, *relend;
421
422  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
423  sym_hashes = elf_sym_hashes (input_bfd);
424
425  rel = relocs;
426  relend = relocs + input_section->reloc_count;
427  for (; rel < relend; rel++)
428    {
429      unsigned int r_type;
430      unsigned long r_symndx;
431      Elf_Internal_Sym *sym;
432      asection *sec;
433      struct elf_link_hash_entry *h;
434      bfd_vma relocation;
435      bfd_reloc_status_type r;
436      arelent bfd_reloc;
437      reloc_howto_type *howto;
438
439      elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel);
440      howto = bfd_reloc.howto;
441
442      r_symndx = ELF32_R_SYM (rel->r_info);
443      r_type = ELF32_R_TYPE (rel->r_info);
444      h = NULL;
445      sym = NULL;
446      sec = NULL;
447      if (r_symndx < symtab_hdr->sh_info)
448	{
449	  sym = local_syms + r_symndx;
450	  sec = local_sections[r_symndx];
451	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
452	}
453      else
454	{
455	  bfd_boolean unresolved_reloc, warned;
456
457	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
458				   r_symndx, symtab_hdr, sym_hashes,
459				   h, sec, relocation,
460				   unresolved_reloc, warned);
461	}
462
463      if (sec != NULL && elf_discarded_section (sec))
464	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
465					 rel, relend, howto, contents);
466
467      if (info->relocatable)
468	continue;
469
470      r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
471					input_section,
472					contents, rel->r_offset,
473					relocation, rel->r_addend,
474					info, sec, h == NULL);
475
476      if (r != bfd_reloc_ok)
477	{
478	  const char *name;
479	  const char *msg = (const char *) 0;
480
481	  if (h != NULL)
482	    name = h->root.root.string;
483	  else
484	    {
485	      name = (bfd_elf_string_from_elf_section
486		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
487	      if (name == NULL || *name == '\0')
488		name = bfd_section_name (input_bfd, sec);
489	    }
490
491	  switch (r)
492	    {
493	    case bfd_reloc_overflow:
494	      if (! ((*info->callbacks->reloc_overflow)
495		     (info, (h ? &h->root : NULL), name, howto->name,
496		      (bfd_vma) 0, input_bfd, input_section,
497		      rel->r_offset)))
498		return FALSE;
499	      break;
500
501	    case bfd_reloc_undefined:
502	      if (! ((*info->callbacks->undefined_symbol)
503		     (info, name, input_bfd, input_section,
504		      rel->r_offset, TRUE)))
505		return FALSE;
506	      break;
507
508	    case bfd_reloc_outofrange:
509	      msg = _("internal error: out of range error");
510	      goto common_error;
511
512	    case bfd_reloc_notsupported:
513	      msg = _("internal error: unsupported relocation error");
514	      goto common_error;
515
516	    case bfd_reloc_dangerous:
517	      msg = _("internal error: dangerous error");
518	      goto common_error;
519
520	    default:
521	      msg = _("internal error: unknown error");
522	      /* fall through */
523
524	    common_error:
525	      if (!((*info->callbacks->warning)
526		    (info, msg, name, input_bfd, input_section,
527		     rel->r_offset)))
528		return FALSE;
529	      break;
530	    }
531	}
532    }
533
534  return TRUE;
535}
536
537/* Object files encode the specific H8 model they were compiled
538   for in the ELF flags field.
539
540   Examine that field and return the proper BFD machine type for
541   the object file.  */
542static unsigned long
543elf32_h8_mach (flagword flags)
544{
545  switch (flags & EF_H8_MACH)
546    {
547    case E_H8_MACH_H8300:
548    default:
549      return bfd_mach_h8300;
550
551    case E_H8_MACH_H8300H:
552      return bfd_mach_h8300h;
553
554    case E_H8_MACH_H8300S:
555      return bfd_mach_h8300s;
556
557    case E_H8_MACH_H8300HN:
558      return bfd_mach_h8300hn;
559
560    case E_H8_MACH_H8300SN:
561      return bfd_mach_h8300sn;
562
563    case E_H8_MACH_H8300SX:
564      return bfd_mach_h8300sx;
565
566    case E_H8_MACH_H8300SXN:
567      return bfd_mach_h8300sxn;
568    }
569}
570
571/* The final processing done just before writing out a H8 ELF object
572   file.  We use this opportunity to encode the BFD machine type
573   into the flags field in the object file.  */
574
575static void
576elf32_h8_final_write_processing (bfd *abfd,
577				 bfd_boolean linker ATTRIBUTE_UNUSED)
578{
579  unsigned long val;
580
581  switch (bfd_get_mach (abfd))
582    {
583    default:
584    case bfd_mach_h8300:
585      val = E_H8_MACH_H8300;
586      break;
587
588    case bfd_mach_h8300h:
589      val = E_H8_MACH_H8300H;
590      break;
591
592    case bfd_mach_h8300s:
593      val = E_H8_MACH_H8300S;
594      break;
595
596    case bfd_mach_h8300hn:
597      val = E_H8_MACH_H8300HN;
598      break;
599
600    case bfd_mach_h8300sn:
601      val = E_H8_MACH_H8300SN;
602      break;
603
604    case bfd_mach_h8300sx:
605      val = E_H8_MACH_H8300SX;
606      break;
607
608    case bfd_mach_h8300sxn:
609      val = E_H8_MACH_H8300SXN;
610      break;
611    }
612
613  elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
614  elf_elfheader (abfd)->e_flags |= val;
615}
616
617/* Return nonzero if ABFD represents a valid H8 ELF object file; also
618   record the encoded machine type found in the ELF flags.  */
619
620static bfd_boolean
621elf32_h8_object_p (bfd *abfd)
622{
623  bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
624			     elf32_h8_mach (elf_elfheader (abfd)->e_flags));
625  return TRUE;
626}
627
628/* Merge backend specific data from an object file to the output
629   object file when linking.  The only data we need to copy at this
630   time is the architecture/machine information.  */
631
632static bfd_boolean
633elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
634{
635  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
636      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
637    return TRUE;
638
639  if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
640      && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
641    {
642      if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
643			       bfd_get_mach (ibfd)))
644	return FALSE;
645    }
646
647  return TRUE;
648}
649
650/* This function handles relaxing for the H8..
651
652   There are a few relaxing opportunities available on the H8:
653
654     jmp/jsr:24    ->    bra/bsr:8		2 bytes
655     The jmp may be completely eliminated if the previous insn is a
656     conditional branch to the insn after the jump.  In that case
657     we invert the branch and delete the jump and save 4 bytes.
658
659     bCC:16          ->    bCC:8                  2 bytes
660     bsr:16          ->    bsr:8                  2 bytes
661
662     bset:16	     ->    bset:8                 2 bytes
663     bset:24/32	     ->    bset:8                 4 bytes
664     (also applicable to other bit manipulation instructions)
665
666     mov.b:16	     ->    mov.b:8                2 bytes
667     mov.b:24/32     ->    mov.b:8                4 bytes
668
669     bset:24/32	     ->    bset:16                2 bytes
670     (also applicable to other bit manipulation instructions)
671
672     mov.[bwl]:24/32 ->    mov.[bwl]:16           2 bytes */
673
674static bfd_boolean
675elf32_h8_relax_section (bfd *abfd, asection *sec,
676			struct bfd_link_info *link_info, bfd_boolean *again)
677{
678  Elf_Internal_Shdr *symtab_hdr;
679  Elf_Internal_Rela *internal_relocs;
680  Elf_Internal_Rela *irel, *irelend;
681  bfd_byte *contents = NULL;
682  Elf_Internal_Sym *isymbuf = NULL;
683  static asection *last_input_section = NULL;
684  static Elf_Internal_Rela *last_reloc = NULL;
685
686  /* Assume nothing changes.  */
687  *again = FALSE;
688
689  /* We don't have to do anything for a relocatable link, if
690     this section does not have relocs, or if this is not a
691     code section.  */
692  if (link_info->relocatable
693      || (sec->flags & SEC_RELOC) == 0
694      || sec->reloc_count == 0
695      || (sec->flags & SEC_CODE) == 0)
696    return TRUE;
697
698  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
699
700  /* Get a copy of the native relocations.  */
701  internal_relocs = (_bfd_elf_link_read_relocs
702		     (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
703		      link_info->keep_memory));
704  if (internal_relocs == NULL)
705    goto error_return;
706
707  if (sec != last_input_section)
708    last_reloc = NULL;
709
710  last_input_section = sec;
711
712  /* Walk through the relocs looking for relaxing opportunities.  */
713  irelend = internal_relocs + sec->reloc_count;
714  for (irel = internal_relocs; irel < irelend; irel++)
715    {
716      bfd_vma symval;
717
718      {
719	arelent bfd_reloc;
720
721	elf32_h8_info_to_howto (abfd, &bfd_reloc, irel);
722      }
723      /* Keep track of the previous reloc so that we can delete
724	 some long jumps created by the compiler.  */
725      if (irel != internal_relocs)
726	last_reloc = irel - 1;
727
728      if (ELF32_R_TYPE (irel->r_info) != R_H8_DIR24R8
729	  && ELF32_R_TYPE (irel->r_info) != R_H8_PCREL16
730	  && ELF32_R_TYPE (irel->r_info) != R_H8_DIR16A8
731	  && ELF32_R_TYPE (irel->r_info) != R_H8_DIR24A8
732	  && ELF32_R_TYPE (irel->r_info) != R_H8_DIR32A16)
733	continue;
734
735      /* Get the section contents if we haven't done so already.  */
736      if (contents == NULL)
737	{
738	  /* Get cached copy if it exists.  */
739	  if (elf_section_data (sec)->this_hdr.contents != NULL)
740	    contents = elf_section_data (sec)->this_hdr.contents;
741	  else
742	    {
743	      /* Go get them off disk.  */
744	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
745		goto error_return;
746	    }
747	}
748
749      /* Read this BFD's local symbols if we haven't done so already.  */
750      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
751	{
752	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
753	  if (isymbuf == NULL)
754	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
755					    symtab_hdr->sh_info, 0,
756					    NULL, NULL, NULL);
757	  if (isymbuf == NULL)
758	    goto error_return;
759	}
760
761      /* Get the value of the symbol referred to by the reloc.  */
762      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
763	{
764	  /* A local symbol.  */
765	  Elf_Internal_Sym *isym;
766	  asection *sym_sec;
767
768	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
769	  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
770	  symval = isym->st_value;
771	  /* If the reloc is absolute, it will not have
772	     a symbol or section associated with it.  */
773	  if (sym_sec)
774	    symval += sym_sec->output_section->vma
775	      + sym_sec->output_offset;
776	}
777      else
778	{
779	  unsigned long indx;
780	  struct elf_link_hash_entry *h;
781
782	  /* An external symbol.  */
783	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
784	  h = elf_sym_hashes (abfd)[indx];
785	  BFD_ASSERT (h != NULL);
786	  if (h->root.type != bfd_link_hash_defined
787	      && h->root.type != bfd_link_hash_defweak)
788	    {
789	      /* This appears to be a reference to an undefined
790                 symbol.  Just ignore it--it will be caught by the
791                 regular reloc processing.  */
792	      continue;
793	    }
794
795	  symval = (h->root.u.def.value
796		    + h->root.u.def.section->output_section->vma
797		    + h->root.u.def.section->output_offset);
798	}
799
800      /* For simplicity of coding, we are going to modify the section
801	 contents, the section relocs, and the BFD symbol table.  We
802	 must tell the rest of the code not to free up this
803	 information.  It would be possible to instead create a table
804	 of changes which have to be made, as is done in coff-mips.c;
805	 that would be more work, but would require less memory when
806	 the linker is run.  */
807      switch (ELF32_R_TYPE (irel->r_info))
808	{
809        /* Try to turn a 24-bit absolute branch/call into an 8-bit
810	   pc-relative branch/call.  */
811	case R_H8_DIR24R8:
812	  {
813	    bfd_vma value = symval + irel->r_addend;
814	    bfd_vma dot, gap;
815
816	    /* Get the address of this instruction.  */
817	    dot = (sec->output_section->vma
818		   + sec->output_offset + irel->r_offset - 1);
819
820	    /* Compute the distance from this insn to the branch target.  */
821	    gap = value - dot;
822
823	    /* If the distance is within -126..+130 inclusive, then we can
824	       relax this jump.  +130 is valid since the target will move
825	       two bytes closer if we do relax this branch.  */
826	    if ((int) gap >= -126 && (int) gap <= 130)
827	      {
828		unsigned char code;
829
830		/* Note that we've changed the relocs, section contents,
831		   etc.  */
832		elf_section_data (sec)->relocs = internal_relocs;
833		elf_section_data (sec)->this_hdr.contents = contents;
834		symtab_hdr->contents = (unsigned char *) isymbuf;
835
836		/* Get the instruction code being relaxed.  */
837		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
838
839		/* If the previous instruction conditionally jumped around
840		   this instruction, we may be able to reverse the condition
841		   and redirect the previous instruction to the target of
842		   this instruction.
843
844		   Such sequences are used by the compiler to deal with
845		   long conditional branches.
846
847		   Only perform this optimisation for jumps (code 0x5a) not
848		   subroutine calls, as otherwise it could transform:
849
850		   	             mov.w   r0,r0
851		   	             beq     .L1
852		         	     jsr     @_bar
853		              .L1:   rts
854		              _bar:  rts
855		   into:
856		   	             mov.w   r0,r0
857			             bne     _bar
858			             rts
859			      _bar:  rts
860
861		   which changes the call (jsr) into a branch (bne).  */
862		if (code == 0x5a
863		    && (int) gap <= 130
864		    && (int) gap >= -128
865		    && last_reloc
866		    && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
867		    && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
868		  {
869		    bfd_vma last_value;
870		    asection *last_sym_sec;
871		    Elf_Internal_Sym *last_sym;
872
873		    /* We will need to examine the symbol used by the
874		       previous relocation.  */
875
876		    last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
877		    last_sym_sec
878		      = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
879		    last_value = (last_sym->st_value
880				  + last_sym_sec->output_section->vma
881				  + last_sym_sec->output_offset);
882
883		    /* Verify that the previous relocation was for a
884		       branch around this instruction and that no symbol
885		       exists at the current location.  */
886		    if (last_value == dot + 4
887			&& last_reloc->r_offset + 2 == irel->r_offset
888			&& ! elf32_h8_symbol_address_p (abfd, sec, dot))
889		      {
890			/* We can eliminate this jump.  Twiddle the
891			   previous relocation as necessary.  */
892			irel->r_info
893			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
894					  ELF32_R_TYPE (R_H8_NONE));
895
896			last_reloc->r_info
897			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
898					  ELF32_R_TYPE (R_H8_PCREL8));
899			last_reloc->r_addend = irel->r_addend;
900
901			code = bfd_get_8 (abfd,
902					  contents + last_reloc->r_offset - 1);
903			code ^= 1;
904			bfd_put_8 (abfd,
905				   code,
906			contents + last_reloc->r_offset - 1);
907
908			/* Delete four bytes of data.  */
909			if (!elf32_h8_relax_delete_bytes (abfd, sec,
910							  irel->r_offset - 1,
911							  4))
912			  goto error_return;
913
914			*again = TRUE;
915			break;
916		      }
917		  }
918
919		if (code == 0x5e)
920		  /* This is jsr.  */
921		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);
922		else if (code == 0x5a)
923		  /* This is jmp.  */
924		  bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);
925		else
926		  abort ();
927
928		/* Fix the relocation's type.  */
929		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
930					     R_H8_PCREL8);
931
932		/* Delete two bytes of data.  */
933		if (!elf32_h8_relax_delete_bytes (abfd, sec,
934						  irel->r_offset + 1, 2))
935		  goto error_return;
936
937		/* That will change things, so, we should relax again.
938		   Note that this is not required, and it may be slow.  */
939		*again = TRUE;
940	      }
941	    break;
942	  }
943
944	/* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
945	   branch.  */
946	case R_H8_PCREL16:
947	  {
948	    bfd_vma value = symval + irel->r_addend;
949	    bfd_vma dot;
950	    bfd_vma gap;
951
952	    /* Get the address of this instruction.  */
953	    dot = (sec->output_section->vma
954		   + sec->output_offset
955		   + irel->r_offset - 2);
956
957	    gap = value - dot;
958
959	    /* If the distance is within -126..+130 inclusive, then we can
960	       relax this jump.  +130 is valid since the target will move
961	       two bytes closer if we do relax this branch.  */
962	    if ((int) gap >= -126 && (int) gap <= 130)
963	      {
964		unsigned char code;
965
966		/* Note that we've changed the relocs, section contents,
967		   etc.  */
968		elf_section_data (sec)->relocs = internal_relocs;
969		elf_section_data (sec)->this_hdr.contents = contents;
970		symtab_hdr->contents = (unsigned char *) isymbuf;
971
972		/* Get the opcode.  */
973		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
974
975		if (code == 0x58)
976		  {
977		    /* bCC:16 -> bCC:8 */
978		    /* Get the second byte of the original insn, which
979		       contains the condition code.  */
980		    code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
981
982		    /* Compute the fisrt byte of the relaxed
983		       instruction.  The original sequence 0x58 0xX0
984		       is relaxed to 0x4X, where X represents the
985		       condition code.  */
986		    code &= 0xf0;
987		    code >>= 4;
988		    code |= 0x40;
989		    bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
990		  }
991		else if (code == 0x5c)
992		  /* This is bsr.  */
993		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);
994		else
995		  /* Might be MOVSD.  */
996		  break;
997
998		/* Fix the relocation's type.  */
999		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1000					     R_H8_PCREL8);
1001		irel->r_offset--;
1002
1003		/* Delete two bytes of data.  */
1004		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1005						  irel->r_offset + 1, 2))
1006		  goto error_return;
1007
1008		/* That will change things, so, we should relax again.
1009		   Note that this is not required, and it may be slow.  */
1010		*again = TRUE;
1011	      }
1012	    break;
1013	  }
1014
1015	/* This is a 16-bit absolute address in one of the following
1016	   instructions:
1017
1018	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1019	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1020	     "mov.b"
1021
1022	   We may relax this into an 8-bit absolute address if it's in
1023	   the right range.  */
1024	case R_H8_DIR16A8:
1025	  {
1026	    bfd_vma value;
1027
1028	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1029	    if (value >= 0xffffff00u)
1030	      {
1031		unsigned char code;
1032		unsigned char temp_code;
1033
1034		/* Note that we've changed the relocs, section contents,
1035		   etc.  */
1036		elf_section_data (sec)->relocs = internal_relocs;
1037		elf_section_data (sec)->this_hdr.contents = contents;
1038		symtab_hdr->contents = (unsigned char *) isymbuf;
1039
1040		/* Get the opcode.  */
1041		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1042
1043		/* All instructions with R_H8_DIR16A8 start with
1044		   0x6a.  */
1045		if (code != 0x6a)
1046		  abort ();
1047
1048		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1049		/* If this is a mov.b instruction, clear the lower
1050		   nibble, which contains the source/destination
1051		   register number.  */
1052		if ((temp_code & 0x10) != 0x10)
1053		  temp_code &= 0xf0;
1054
1055		switch (temp_code)
1056		  {
1057		  case 0x00:
1058		    /* This is mov.b @aa:16,Rd.  */
1059		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
1060			       contents + irel->r_offset - 2);
1061		    break;
1062		  case 0x80:
1063		    /* This is mov.b Rs,@aa:16.  */
1064		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
1065			       contents + irel->r_offset - 2);
1066		    break;
1067		  case 0x18:
1068		    /* This is a bit-maniputation instruction that
1069		       stores one bit into memory, one of "bclr",
1070		       "bist", "bnot", "bset", and "bst".  */
1071		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1072		    break;
1073		  case 0x10:
1074		    /* This is a bit-maniputation instruction that
1075		       loads one bit from memory, one of "band",
1076		       "biand", "bild", "bior", "bixor", "bld", "bor",
1077		       "btst", and "bxor".  */
1078		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1079		    break;
1080		  default:
1081		    abort ();
1082		  }
1083
1084		/* Fix the relocation's type.  */
1085		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1086					     R_H8_DIR8);
1087
1088		/* Move the relocation.  */
1089		irel->r_offset--;
1090
1091		/* Delete two bytes of data.  */
1092		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1093						  irel->r_offset + 1, 2))
1094		  goto error_return;
1095
1096		/* That will change things, so, we should relax again.
1097		   Note that this is not required, and it may be slow.  */
1098		*again = TRUE;
1099	      }
1100	    break;
1101	  }
1102
1103	/* This is a 24-bit absolute address in one of the following
1104	   instructions:
1105
1106	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1107	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1108	     "mov.b"
1109
1110	   We may relax this into an 8-bit absolute address if it's in
1111	   the right range.  */
1112	case R_H8_DIR24A8:
1113	  {
1114	    bfd_vma value;
1115
1116	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1117	    if (value >= 0xffffff00u)
1118	      {
1119		unsigned char code;
1120		unsigned char temp_code;
1121
1122		/* Note that we've changed the relocs, section contents,
1123		   etc.  */
1124		elf_section_data (sec)->relocs = internal_relocs;
1125		elf_section_data (sec)->this_hdr.contents = contents;
1126		symtab_hdr->contents = (unsigned char *) isymbuf;
1127
1128		/* Get the opcode.  */
1129		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1130
1131		/* All instructions with R_H8_DIR24A8 start with
1132		   0x6a.  */
1133		if (code != 0x6a)
1134		  abort ();
1135
1136		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1137
1138		/* If this is a mov.b instruction, clear the lower
1139		   nibble, which contains the source/destination
1140		   register number.  */
1141		if ((temp_code & 0x30) != 0x30)
1142		  temp_code &= 0xf0;
1143
1144		switch (temp_code)
1145		  {
1146		  case 0x20:
1147		    /* This is mov.b @aa:24/32,Rd.  */
1148		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
1149			       contents + irel->r_offset - 2);
1150		    break;
1151		  case 0xa0:
1152		    /* This is mov.b Rs,@aa:24/32.  */
1153		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
1154			       contents + irel->r_offset - 2);
1155		    break;
1156		  case 0x38:
1157		    /* This is a bit-maniputation instruction that
1158		       stores one bit into memory, one of "bclr",
1159		       "bist", "bnot", "bset", and "bst".  */
1160		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1161		    break;
1162		  case 0x30:
1163		    /* This is a bit-maniputation instruction that
1164		       loads one bit from memory, one of "band",
1165		       "biand", "bild", "bior", "bixor", "bld", "bor",
1166		       "btst", and "bxor".  */
1167		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1168		    break;
1169		  default:
1170		    abort();
1171		  }
1172
1173		/* Fix the relocation's type.  */
1174		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1175					     R_H8_DIR8);
1176		irel->r_offset--;
1177
1178		/* Delete two bytes of data.  */
1179		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1180						  irel->r_offset + 1, 4))
1181		  goto error_return;
1182
1183		/* That will change things, so, we should relax again.
1184		   Note that this is not required, and it may be slow.  */
1185		*again = TRUE;
1186		break;
1187	      }
1188	  }
1189
1190	  /* Fall through.  */
1191
1192	  /* This is a 24-/32-bit absolute address in one of the
1193	     following instructions:
1194
1195	       "band", "bclr", "biand", "bild", "bior", "bist",
1196	       "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
1197	       "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
1198
1199	     We may relax this into an 16-bit absolute address if it's
1200	     in the right range.  */
1201	case R_H8_DIR32A16:
1202	  {
1203	    bfd_vma value;
1204
1205	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1206	    if (value <= 0x7fff || value >= 0xffff8000u)
1207	      {
1208		unsigned char code;
1209		unsigned char op0, op1, op2, op3;
1210		unsigned char *op_ptr;
1211
1212		/* Note that we've changed the relocs, section contents,
1213		   etc.  */
1214		elf_section_data (sec)->relocs = internal_relocs;
1215		elf_section_data (sec)->this_hdr.contents = contents;
1216		symtab_hdr->contents = (unsigned char *) isymbuf;
1217
1218		if (irel->r_offset >= 4)
1219		  {
1220		    /* Check for 4-byte MOVA relaxation.  */
1221		    int second_reloc = 0;
1222
1223		    op_ptr = contents + irel->r_offset - 4;
1224
1225		    if (last_reloc)
1226		      {
1227			arelent bfd_reloc;
1228			reloc_howto_type *h;
1229			bfd_vma last_reloc_size;
1230
1231			elf32_h8_info_to_howto (abfd, &bfd_reloc, last_reloc);
1232			h = bfd_reloc.howto;
1233			last_reloc_size = 1 << h->size;
1234			if (last_reloc->r_offset + last_reloc_size
1235			    == irel->r_offset)
1236			  {
1237			    op_ptr -= last_reloc_size;
1238			    second_reloc = 1;
1239			  }
1240		      }
1241		    if (irel < irelend)
1242		      {
1243			Elf_Internal_Rela *next_reloc = irel + 1;
1244			arelent bfd_reloc;
1245			reloc_howto_type *h;
1246			bfd_vma next_reloc_size;
1247
1248			elf32_h8_info_to_howto (abfd, &bfd_reloc, next_reloc);
1249			h = bfd_reloc.howto;
1250			next_reloc_size = 1 << h->size;
1251			if (next_reloc->r_offset + next_reloc_size
1252			    == irel->r_offset)
1253			  {
1254			    op_ptr -= next_reloc_size;
1255			    second_reloc = 1;
1256			  }
1257		      }
1258
1259		    op0 = bfd_get_8 (abfd, op_ptr + 0);
1260		    op1 = bfd_get_8 (abfd, op_ptr + 1);
1261		    op2 = bfd_get_8 (abfd, op_ptr + 2);
1262		    op3 = bfd_get_8 (abfd, op_ptr + 3);
1263
1264		    if (op0 == 0x01
1265			&& (op1 & 0xdf) == 0x5f
1266			&& (op2 & 0x40) == 0x40
1267			&& (op3 & 0x80) == 0x80)
1268		      {
1269			if ((op2 & 0x08) == 0)
1270			  second_reloc = 1;
1271
1272			if (second_reloc)
1273			  {
1274			    op3 &= ~0x08;
1275			    bfd_put_8 (abfd, op3, op_ptr + 3);
1276			  }
1277			else
1278			  {
1279			    op2 &= ~0x08;
1280			    bfd_put_8 (abfd, op2, op_ptr + 2);
1281			  }
1282			goto r_h8_dir32a16_common;
1283		      }
1284		  }
1285
1286		/* Now check for short version of MOVA.  */
1287		op_ptr = contents + irel->r_offset - 2;
1288		op0 = bfd_get_8 (abfd, op_ptr + 0);
1289		op1 = bfd_get_8 (abfd, op_ptr + 1);
1290
1291		if (op0 == 0x7a
1292		    && (op1 & 0x88) == 0x80)
1293		  {
1294		    op1 |= 0x08;
1295		    bfd_put_8 (abfd, op1, op_ptr + 1);
1296		    goto r_h8_dir32a16_common;
1297		  }
1298
1299		/* Get the opcode.  */
1300		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1301
1302		/* Fix the opcode.  For all the instructions that
1303		   belong to this relaxation, we simply need to turn
1304		   off bit 0x20 in the previous byte.  */
1305		code &= ~0x20;
1306
1307		bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1308
1309	      r_h8_dir32a16_common:
1310		/* Fix the relocation's type.  */
1311		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1312					     R_H8_DIR16);
1313
1314		/* Delete two bytes of data.  */
1315		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1316						  irel->r_offset + 1, 2))
1317		  goto error_return;
1318
1319		/* That will change things, so, we should relax again.
1320		   Note that this is not required, and it may be slow.  */
1321		*again = TRUE;
1322	      }
1323	    break;
1324	  }
1325
1326	default:
1327	  break;
1328	}
1329    }
1330
1331  if (isymbuf != NULL
1332      && symtab_hdr->contents != (unsigned char *) isymbuf)
1333    {
1334      if (! link_info->keep_memory)
1335	free (isymbuf);
1336      else
1337	symtab_hdr->contents = (unsigned char *) isymbuf;
1338    }
1339
1340  if (contents != NULL
1341      && elf_section_data (sec)->this_hdr.contents != contents)
1342    {
1343      if (! link_info->keep_memory)
1344	free (contents);
1345      else
1346	{
1347	  /* Cache the section contents for elf_link_input_bfd.  */
1348	  elf_section_data (sec)->this_hdr.contents = contents;
1349	}
1350    }
1351
1352  if (internal_relocs != NULL
1353      && elf_section_data (sec)->relocs != internal_relocs)
1354    free (internal_relocs);
1355
1356  return TRUE;
1357
1358 error_return:
1359  if (isymbuf != NULL
1360      && symtab_hdr->contents != (unsigned char *) isymbuf)
1361    free (isymbuf);
1362  if (contents != NULL
1363      && elf_section_data (sec)->this_hdr.contents != contents)
1364    free (contents);
1365  if (internal_relocs != NULL
1366      && elf_section_data (sec)->relocs != internal_relocs)
1367    free (internal_relocs);
1368  return FALSE;
1369}
1370
1371/* Delete some bytes from a section while relaxing.  */
1372
1373static bfd_boolean
1374elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
1375{
1376  Elf_Internal_Shdr *symtab_hdr;
1377  unsigned int sec_shndx;
1378  bfd_byte *contents;
1379  Elf_Internal_Rela *irel, *irelend;
1380  Elf_Internal_Sym *isym;
1381  Elf_Internal_Sym *isymend;
1382  bfd_vma toaddr;
1383  struct elf_link_hash_entry **sym_hashes;
1384  struct elf_link_hash_entry **end_hashes;
1385  unsigned int symcount;
1386
1387  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1388
1389  contents = elf_section_data (sec)->this_hdr.contents;
1390
1391  toaddr = sec->size;
1392
1393  irel = elf_section_data (sec)->relocs;
1394  irelend = irel + sec->reloc_count;
1395
1396  /* Actually delete the bytes.  */
1397  memmove (contents + addr, contents + addr + count,
1398	   (size_t) (toaddr - addr - count));
1399  sec->size -= count;
1400
1401  /* Adjust all the relocs.  */
1402  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1403    {
1404      /* Get the new reloc address.  */
1405      if ((irel->r_offset > addr
1406	   && irel->r_offset < toaddr))
1407	irel->r_offset -= count;
1408    }
1409
1410  /* Adjust the local symbols defined in this section.  */
1411  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1412  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1413  isymend = isym + symtab_hdr->sh_info;
1414  for (; isym < isymend; isym++)
1415    {
1416      if (isym->st_shndx == sec_shndx
1417	  && isym->st_value > addr
1418	  && isym->st_value < toaddr)
1419	isym->st_value -= count;
1420    }
1421
1422  /* Now adjust the global symbols defined in this section.  */
1423  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1424	      - symtab_hdr->sh_info);
1425  sym_hashes = elf_sym_hashes (abfd);
1426  end_hashes = sym_hashes + symcount;
1427  for (; sym_hashes < end_hashes; sym_hashes++)
1428    {
1429      struct elf_link_hash_entry *sym_hash = *sym_hashes;
1430      if ((sym_hash->root.type == bfd_link_hash_defined
1431	   || sym_hash->root.type == bfd_link_hash_defweak)
1432	  && sym_hash->root.u.def.section == sec
1433	  && sym_hash->root.u.def.value > addr
1434	  && sym_hash->root.u.def.value < toaddr)
1435	{
1436	  sym_hash->root.u.def.value -= count;
1437	}
1438    }
1439
1440  return TRUE;
1441}
1442
1443/* Return TRUE if a symbol exists at the given address, else return
1444   FALSE.  */
1445static bfd_boolean
1446elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
1447{
1448  Elf_Internal_Shdr *symtab_hdr;
1449  unsigned int sec_shndx;
1450  Elf_Internal_Sym *isym;
1451  Elf_Internal_Sym *isymend;
1452  struct elf_link_hash_entry **sym_hashes;
1453  struct elf_link_hash_entry **end_hashes;
1454  unsigned int symcount;
1455
1456  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1457
1458  /* Examine all the symbols.  */
1459  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1460  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1461  isymend = isym + symtab_hdr->sh_info;
1462  for (; isym < isymend; isym++)
1463    {
1464      if (isym->st_shndx == sec_shndx
1465	  && isym->st_value == addr)
1466	return TRUE;
1467    }
1468
1469  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1470	      - symtab_hdr->sh_info);
1471  sym_hashes = elf_sym_hashes (abfd);
1472  end_hashes = sym_hashes + symcount;
1473  for (; sym_hashes < end_hashes; sym_hashes++)
1474    {
1475      struct elf_link_hash_entry *sym_hash = *sym_hashes;
1476      if ((sym_hash->root.type == bfd_link_hash_defined
1477	   || sym_hash->root.type == bfd_link_hash_defweak)
1478	  && sym_hash->root.u.def.section == sec
1479	  && sym_hash->root.u.def.value == addr)
1480	return TRUE;
1481    }
1482
1483  return FALSE;
1484}
1485
1486/* This is a version of bfd_generic_get_relocated_section_contents
1487   which uses elf32_h8_relocate_section.  */
1488
1489static bfd_byte *
1490elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1491					 struct bfd_link_info *link_info,
1492					 struct bfd_link_order *link_order,
1493					 bfd_byte *data,
1494					 bfd_boolean relocatable,
1495					 asymbol **symbols)
1496{
1497  Elf_Internal_Shdr *symtab_hdr;
1498  asection *input_section = link_order->u.indirect.section;
1499  bfd *input_bfd = input_section->owner;
1500  asection **sections = NULL;
1501  Elf_Internal_Rela *internal_relocs = NULL;
1502  Elf_Internal_Sym *isymbuf = NULL;
1503
1504  /* We only need to handle the case of relaxing, or of having a
1505     particular set of section contents, specially.  */
1506  if (relocatable
1507      || elf_section_data (input_section)->this_hdr.contents == NULL)
1508    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1509						       link_order, data,
1510						       relocatable,
1511						       symbols);
1512
1513  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1514
1515  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1516	  (size_t) input_section->size);
1517
1518  if ((input_section->flags & SEC_RELOC) != 0
1519      && input_section->reloc_count > 0)
1520    {
1521      asection **secpp;
1522      Elf_Internal_Sym *isym, *isymend;
1523      bfd_size_type amt;
1524
1525      internal_relocs = (_bfd_elf_link_read_relocs
1526			 (input_bfd, input_section, (PTR) NULL,
1527			  (Elf_Internal_Rela *) NULL, FALSE));
1528      if (internal_relocs == NULL)
1529	goto error_return;
1530
1531      if (symtab_hdr->sh_info != 0)
1532	{
1533	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1534	  if (isymbuf == NULL)
1535	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1536					    symtab_hdr->sh_info, 0,
1537					    NULL, NULL, NULL);
1538	  if (isymbuf == NULL)
1539	    goto error_return;
1540	}
1541
1542      amt = symtab_hdr->sh_info;
1543      amt *= sizeof (asection *);
1544      sections = (asection **) bfd_malloc (amt);
1545      if (sections == NULL && amt != 0)
1546	goto error_return;
1547
1548      isymend = isymbuf + symtab_hdr->sh_info;
1549      for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1550	{
1551	  asection *isec;
1552
1553	  if (isym->st_shndx == SHN_UNDEF)
1554	    isec = bfd_und_section_ptr;
1555	  else if (isym->st_shndx == SHN_ABS)
1556	    isec = bfd_abs_section_ptr;
1557	  else if (isym->st_shndx == SHN_COMMON)
1558	    isec = bfd_com_section_ptr;
1559	  else
1560	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1561
1562	  *secpp = isec;
1563	}
1564
1565      if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1566				       input_section, data, internal_relocs,
1567				       isymbuf, sections))
1568	goto error_return;
1569
1570      if (sections != NULL)
1571	free (sections);
1572      if (isymbuf != NULL
1573	  && symtab_hdr->contents != (unsigned char *) isymbuf)
1574	free (isymbuf);
1575      if (elf_section_data (input_section)->relocs != internal_relocs)
1576	free (internal_relocs);
1577    }
1578
1579  return data;
1580
1581 error_return:
1582  if (sections != NULL)
1583    free (sections);
1584  if (isymbuf != NULL
1585      && symtab_hdr->contents != (unsigned char *) isymbuf)
1586    free (isymbuf);
1587  if (internal_relocs != NULL
1588      && elf_section_data (input_section)->relocs != internal_relocs)
1589    free (internal_relocs);
1590  return NULL;
1591}
1592
1593
1594#define TARGET_BIG_SYM			bfd_elf32_h8300_vec
1595#define TARGET_BIG_NAME			"elf32-h8300"
1596#define ELF_ARCH			bfd_arch_h8300
1597#define ELF_MACHINE_CODE		EM_H8_300
1598#define ELF_MAXPAGESIZE			0x1
1599#define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1600#define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1601#define elf_info_to_howto		elf32_h8_info_to_howto
1602#define elf_info_to_howto_rel		elf32_h8_info_to_howto_rel
1603
1604/* So we can set/examine bits in e_flags to get the specific
1605   H8 architecture in use.  */
1606#define elf_backend_final_write_processing \
1607  elf32_h8_final_write_processing
1608#define elf_backend_object_p \
1609  elf32_h8_object_p
1610#define bfd_elf32_bfd_merge_private_bfd_data \
1611  elf32_h8_merge_private_bfd_data
1612
1613/* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1614   defaults to using _bfd_generic_link_hash_table_create, but
1615   bfd_elf_size_dynamic_sections uses
1616   dynobj = elf_hash_table (info)->dynobj;
1617   and thus requires an elf hash table.  */
1618#define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1619
1620/* Use an H8 specific linker, not the ELF generic linker.  */
1621#define elf_backend_relocate_section elf32_h8_relocate_section
1622#define elf_backend_rela_normal		1
1623#define elf_backend_can_gc_sections	1
1624
1625/* And relaxing stuff.  */
1626#define bfd_elf32_bfd_relax_section     elf32_h8_relax_section
1627#define bfd_elf32_bfd_get_relocated_section_contents \
1628                                elf32_h8_get_relocated_section_contents
1629
1630#define elf_symbol_leading_char '_'
1631
1632#include "elf32-target.h"
1633