1/* BFD back-end for Renesas H8/300 ELF binaries.
2   Copyright 1993, 1995, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006,
3   2007 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	{
465	  /* For relocs against symbols from removed linkonce sections,
466	     or sections discarded by a linker script, we just want the
467	     section contents zeroed.  Avoid any special processing.  */
468	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
469	  rel->r_info = 0;
470	  rel->r_addend = 0;
471	  continue;
472	}
473
474      if (info->relocatable)
475	continue;
476
477      r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
478					input_section,
479					contents, rel->r_offset,
480					relocation, rel->r_addend,
481					info, sec, h == NULL);
482
483      if (r != bfd_reloc_ok)
484	{
485	  const char *name;
486	  const char *msg = (const char *) 0;
487
488	  if (h != NULL)
489	    name = h->root.root.string;
490	  else
491	    {
492	      name = (bfd_elf_string_from_elf_section
493		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
494	      if (name == NULL || *name == '\0')
495		name = bfd_section_name (input_bfd, sec);
496	    }
497
498	  switch (r)
499	    {
500	    case bfd_reloc_overflow:
501	      if (! ((*info->callbacks->reloc_overflow)
502		     (info, (h ? &h->root : NULL), name, howto->name,
503		      (bfd_vma) 0, input_bfd, input_section,
504		      rel->r_offset)))
505		return FALSE;
506	      break;
507
508	    case bfd_reloc_undefined:
509	      if (! ((*info->callbacks->undefined_symbol)
510		     (info, name, input_bfd, input_section,
511		      rel->r_offset, TRUE)))
512		return FALSE;
513	      break;
514
515	    case bfd_reloc_outofrange:
516	      msg = _("internal error: out of range error");
517	      goto common_error;
518
519	    case bfd_reloc_notsupported:
520	      msg = _("internal error: unsupported relocation error");
521	      goto common_error;
522
523	    case bfd_reloc_dangerous:
524	      msg = _("internal error: dangerous error");
525	      goto common_error;
526
527	    default:
528	      msg = _("internal error: unknown error");
529	      /* fall through */
530
531	    common_error:
532	      if (!((*info->callbacks->warning)
533		    (info, msg, name, input_bfd, input_section,
534		     rel->r_offset)))
535		return FALSE;
536	      break;
537	    }
538	}
539    }
540
541  return TRUE;
542}
543
544/* Object files encode the specific H8 model they were compiled
545   for in the ELF flags field.
546
547   Examine that field and return the proper BFD machine type for
548   the object file.  */
549static unsigned long
550elf32_h8_mach (flagword flags)
551{
552  switch (flags & EF_H8_MACH)
553    {
554    case E_H8_MACH_H8300:
555    default:
556      return bfd_mach_h8300;
557
558    case E_H8_MACH_H8300H:
559      return bfd_mach_h8300h;
560
561    case E_H8_MACH_H8300S:
562      return bfd_mach_h8300s;
563
564    case E_H8_MACH_H8300HN:
565      return bfd_mach_h8300hn;
566
567    case E_H8_MACH_H8300SN:
568      return bfd_mach_h8300sn;
569
570    case E_H8_MACH_H8300SX:
571      return bfd_mach_h8300sx;
572
573    case E_H8_MACH_H8300SXN:
574      return bfd_mach_h8300sxn;
575    }
576}
577
578/* The final processing done just before writing out a H8 ELF object
579   file.  We use this opportunity to encode the BFD machine type
580   into the flags field in the object file.  */
581
582static void
583elf32_h8_final_write_processing (bfd *abfd,
584				 bfd_boolean linker ATTRIBUTE_UNUSED)
585{
586  unsigned long val;
587
588  switch (bfd_get_mach (abfd))
589    {
590    default:
591    case bfd_mach_h8300:
592      val = E_H8_MACH_H8300;
593      break;
594
595    case bfd_mach_h8300h:
596      val = E_H8_MACH_H8300H;
597      break;
598
599    case bfd_mach_h8300s:
600      val = E_H8_MACH_H8300S;
601      break;
602
603    case bfd_mach_h8300hn:
604      val = E_H8_MACH_H8300HN;
605      break;
606
607    case bfd_mach_h8300sn:
608      val = E_H8_MACH_H8300SN;
609      break;
610
611    case bfd_mach_h8300sx:
612      val = E_H8_MACH_H8300SX;
613      break;
614
615    case bfd_mach_h8300sxn:
616      val = E_H8_MACH_H8300SXN;
617      break;
618    }
619
620  elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
621  elf_elfheader (abfd)->e_flags |= val;
622}
623
624/* Return nonzero if ABFD represents a valid H8 ELF object file; also
625   record the encoded machine type found in the ELF flags.  */
626
627static bfd_boolean
628elf32_h8_object_p (bfd *abfd)
629{
630  bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
631			     elf32_h8_mach (elf_elfheader (abfd)->e_flags));
632  return TRUE;
633}
634
635/* Merge backend specific data from an object file to the output
636   object file when linking.  The only data we need to copy at this
637   time is the architecture/machine information.  */
638
639static bfd_boolean
640elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
641{
642  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
643      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
644    return TRUE;
645
646  if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
647      && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
648    {
649      if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
650			       bfd_get_mach (ibfd)))
651	return FALSE;
652    }
653
654  return TRUE;
655}
656
657/* This function handles relaxing for the H8..
658
659   There are a few relaxing opportunities available on the H8:
660
661     jmp/jsr:24    ->    bra/bsr:8		2 bytes
662     The jmp may be completely eliminated if the previous insn is a
663     conditional branch to the insn after the jump.  In that case
664     we invert the branch and delete the jump and save 4 bytes.
665
666     bCC:16          ->    bCC:8                  2 bytes
667     bsr:16          ->    bsr:8                  2 bytes
668
669     bset:16	     ->    bset:8                 2 bytes
670     bset:24/32	     ->    bset:8                 4 bytes
671     (also applicable to other bit manipulation instructions)
672
673     mov.b:16	     ->    mov.b:8                2 bytes
674     mov.b:24/32     ->    mov.b:8                4 bytes
675
676     bset:24/32	     ->    bset:16                2 bytes
677     (also applicable to other bit manipulation instructions)
678
679     mov.[bwl]:24/32 ->    mov.[bwl]:16           2 bytes */
680
681static bfd_boolean
682elf32_h8_relax_section (bfd *abfd, asection *sec,
683			struct bfd_link_info *link_info, bfd_boolean *again)
684{
685  Elf_Internal_Shdr *symtab_hdr;
686  Elf_Internal_Rela *internal_relocs;
687  Elf_Internal_Rela *irel, *irelend;
688  bfd_byte *contents = NULL;
689  Elf_Internal_Sym *isymbuf = NULL;
690  static asection *last_input_section = NULL;
691  static Elf_Internal_Rela *last_reloc = NULL;
692
693  /* Assume nothing changes.  */
694  *again = FALSE;
695
696  /* We don't have to do anything for a relocatable link, if
697     this section does not have relocs, or if this is not a
698     code section.  */
699  if (link_info->relocatable
700      || (sec->flags & SEC_RELOC) == 0
701      || sec->reloc_count == 0
702      || (sec->flags & SEC_CODE) == 0)
703    return TRUE;
704
705  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
706
707  /* Get a copy of the native relocations.  */
708  internal_relocs = (_bfd_elf_link_read_relocs
709		     (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
710		      link_info->keep_memory));
711  if (internal_relocs == NULL)
712    goto error_return;
713
714  if (sec != last_input_section)
715    last_reloc = NULL;
716
717  last_input_section = sec;
718
719  /* Walk through the relocs looking for relaxing opportunities.  */
720  irelend = internal_relocs + sec->reloc_count;
721  for (irel = internal_relocs; irel < irelend; irel++)
722    {
723      bfd_vma symval;
724
725      /* Keep track of the previous reloc so that we can delete
726	 some long jumps created by the compiler.  */
727      if (irel != internal_relocs)
728	last_reloc = irel - 1;
729
730      if (ELF32_R_TYPE (irel->r_info) != R_H8_DIR24R8
731	  && ELF32_R_TYPE (irel->r_info) != R_H8_PCREL16
732	  && ELF32_R_TYPE (irel->r_info) != R_H8_DIR16A8
733	  && ELF32_R_TYPE (irel->r_info) != R_H8_DIR24A8
734	  && ELF32_R_TYPE (irel->r_info) != R_H8_DIR32A16)
735	continue;
736
737      /* Get the section contents if we haven't done so already.  */
738      if (contents == NULL)
739	{
740	  /* Get cached copy if it exists.  */
741	  if (elf_section_data (sec)->this_hdr.contents != NULL)
742	    contents = elf_section_data (sec)->this_hdr.contents;
743	  else
744	    {
745	      /* Go get them off disk.  */
746	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
747		goto error_return;
748	    }
749	}
750
751      /* Read this BFD's local symbols if we haven't done so already.  */
752      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
753	{
754	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
755	  if (isymbuf == NULL)
756	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
757					    symtab_hdr->sh_info, 0,
758					    NULL, NULL, NULL);
759	  if (isymbuf == NULL)
760	    goto error_return;
761	}
762
763      /* Get the value of the symbol referred to by the reloc.  */
764      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
765	{
766	  /* A local symbol.  */
767	  Elf_Internal_Sym *isym;
768	  asection *sym_sec;
769
770	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
771	  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
772	  symval = isym->st_value;
773	  /* If the reloc is absolute, it will not have
774	     a symbol or section associated with it.  */
775	  if (sym_sec)
776	    symval += sym_sec->output_section->vma
777	      + sym_sec->output_offset;
778	}
779      else
780	{
781	  unsigned long indx;
782	  struct elf_link_hash_entry *h;
783
784	  /* An external symbol.  */
785	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
786	  h = elf_sym_hashes (abfd)[indx];
787	  BFD_ASSERT (h != NULL);
788	  if (h->root.type != bfd_link_hash_defined
789	      && h->root.type != bfd_link_hash_defweak)
790	    {
791	      /* This appears to be a reference to an undefined
792                 symbol.  Just ignore it--it will be caught by the
793                 regular reloc processing.  */
794	      continue;
795	    }
796
797	  symval = (h->root.u.def.value
798		    + h->root.u.def.section->output_section->vma
799		    + h->root.u.def.section->output_offset);
800	}
801
802      /* For simplicity of coding, we are going to modify the section
803	 contents, the section relocs, and the BFD symbol table.  We
804	 must tell the rest of the code not to free up this
805	 information.  It would be possible to instead create a table
806	 of changes which have to be made, as is done in coff-mips.c;
807	 that would be more work, but would require less memory when
808	 the linker is run.  */
809      switch (ELF32_R_TYPE (irel->r_info))
810	{
811        /* Try to turn a 24-bit absolute branch/call into an 8-bit
812	   pc-relative branch/call.  */
813	case R_H8_DIR24R8:
814	  {
815	    bfd_vma value = symval + irel->r_addend;
816	    bfd_vma dot, gap;
817
818	    /* Get the address of this instruction.  */
819	    dot = (sec->output_section->vma
820		   + sec->output_offset + irel->r_offset - 1);
821
822	    /* Compute the distance from this insn to the branch target.  */
823	    gap = value - dot;
824
825	    /* If the distance is within -126..+130 inclusive, then we can
826	       relax this jump.  +130 is valid since the target will move
827	       two bytes closer if we do relax this branch.  */
828	    if ((int) gap >= -126 && (int) gap <= 130)
829	      {
830		unsigned char code;
831
832		/* Note that we've changed the relocs, section contents,
833		   etc.  */
834		elf_section_data (sec)->relocs = internal_relocs;
835		elf_section_data (sec)->this_hdr.contents = contents;
836		symtab_hdr->contents = (unsigned char *) isymbuf;
837
838		/* Get the instruction code being relaxed.  */
839		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
840
841		/* If the previous instruction conditionally jumped around
842		   this instruction, we may be able to reverse the condition
843		   and redirect the previous instruction to the target of
844		   this instruction.
845
846		   Such sequences are used by the compiler to deal with
847		   long conditional branches.
848
849		   Only perform this optimisation for jumps (code 0x5a) not
850		   subroutine calls, as otherwise it could transform:
851
852		   	             mov.w   r0,r0
853		   	             beq     .L1
854		         	     jsr     @_bar
855		              .L1:   rts
856		              _bar:  rts
857		   into:
858		   	             mov.w   r0,r0
859			             bne     _bar
860			             rts
861			      _bar:  rts
862
863		   which changes the call (jsr) into a branch (bne).  */
864		if (code == 0x5a
865		    && (int) gap <= 130
866		    && (int) gap >= -128
867		    && last_reloc
868		    && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
869		    && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
870		  {
871		    bfd_vma last_value;
872		    asection *last_sym_sec;
873		    Elf_Internal_Sym *last_sym;
874
875		    /* We will need to examine the symbol used by the
876		       previous relocation.  */
877
878		    last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
879		    last_sym_sec
880		      = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
881		    last_value = (last_sym->st_value
882				  + last_sym_sec->output_section->vma
883				  + last_sym_sec->output_offset);
884
885		    /* Verify that the previous relocation was for a
886		       branch around this instruction and that no symbol
887		       exists at the current location.  */
888		    if (last_value == dot + 4
889			&& last_reloc->r_offset + 2 == irel->r_offset
890			&& ! elf32_h8_symbol_address_p (abfd, sec, dot))
891		      {
892			/* We can eliminate this jump.  Twiddle the
893			   previous relocation as necessary.  */
894			irel->r_info
895			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
896					  ELF32_R_TYPE (R_H8_NONE));
897
898			last_reloc->r_info
899			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
900					  ELF32_R_TYPE (R_H8_PCREL8));
901			last_reloc->r_addend = irel->r_addend;
902
903			code = bfd_get_8 (abfd,
904					  contents + last_reloc->r_offset - 1);
905			code ^= 1;
906			bfd_put_8 (abfd,
907				   code,
908			contents + last_reloc->r_offset - 1);
909
910			/* Delete four bytes of data.  */
911			if (!elf32_h8_relax_delete_bytes (abfd, sec,
912							  irel->r_offset - 1,
913							  4))
914			  goto error_return;
915
916			*again = TRUE;
917			break;
918		      }
919		  }
920
921		if (code == 0x5e)
922		  /* This is jsr.  */
923		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);
924		else if (code == 0x5a)
925		  /* This is jmp.  */
926		  bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);
927		else
928		  abort ();
929
930		/* Fix the relocation's type.  */
931		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
932					     R_H8_PCREL8);
933
934		/* Delete two bytes of data.  */
935		if (!elf32_h8_relax_delete_bytes (abfd, sec,
936						  irel->r_offset + 1, 2))
937		  goto error_return;
938
939		/* That will change things, so, we should relax again.
940		   Note that this is not required, and it may be slow.  */
941		*again = TRUE;
942	      }
943	    break;
944	  }
945
946	/* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
947	   branch.  */
948	case R_H8_PCREL16:
949	  {
950	    bfd_vma value = symval + irel->r_addend;
951	    bfd_vma dot;
952	    bfd_vma gap;
953
954	    /* Get the address of this instruction.  */
955	    dot = (sec->output_section->vma
956		   + sec->output_offset
957		   + irel->r_offset - 2);
958
959	    gap = value - dot;
960
961	    /* If the distance is within -126..+130 inclusive, then we can
962	       relax this jump.  +130 is valid since the target will move
963	       two bytes closer if we do relax this branch.  */
964	    if ((int) gap >= -126 && (int) gap <= 130)
965	      {
966		unsigned char code;
967
968		/* Note that we've changed the relocs, section contents,
969		   etc.  */
970		elf_section_data (sec)->relocs = internal_relocs;
971		elf_section_data (sec)->this_hdr.contents = contents;
972		symtab_hdr->contents = (unsigned char *) isymbuf;
973
974		/* Get the opcode.  */
975		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
976
977		if (code == 0x58)
978		  {
979		    /* bCC:16 -> bCC:8 */
980		    /* Get the second byte of the original insn, which
981		       contains the condition code.  */
982		    code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
983
984		    /* Compute the fisrt byte of the relaxed
985		       instruction.  The original sequence 0x58 0xX0
986		       is relaxed to 0x4X, where X represents the
987		       condition code.  */
988		    code &= 0xf0;
989		    code >>= 4;
990		    code |= 0x40;
991		    bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
992		  }
993		else if (code == 0x5c)
994		  /* This is bsr.  */
995		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);
996		else
997		  abort ();
998
999		/* Fix the relocation's type.  */
1000		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1001					     R_H8_PCREL8);
1002		irel->r_offset--;
1003
1004		/* Delete two bytes of data.  */
1005		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1006						  irel->r_offset + 1, 2))
1007		  goto error_return;
1008
1009		/* That will change things, so, we should relax again.
1010		   Note that this is not required, and it may be slow.  */
1011		*again = TRUE;
1012	      }
1013	    break;
1014	  }
1015
1016	/* This is a 16-bit absolute address in one of the following
1017	   instructions:
1018
1019	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1020	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1021	     "mov.b"
1022
1023	   We may relax this into an 8-bit absolute address if it's in
1024	   the right range.  */
1025	case R_H8_DIR16A8:
1026	  {
1027	    bfd_vma value;
1028
1029	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1030	    if (value >= 0xffffff00u)
1031	      {
1032		unsigned char code;
1033		unsigned char temp_code;
1034
1035		/* Note that we've changed the relocs, section contents,
1036		   etc.  */
1037		elf_section_data (sec)->relocs = internal_relocs;
1038		elf_section_data (sec)->this_hdr.contents = contents;
1039		symtab_hdr->contents = (unsigned char *) isymbuf;
1040
1041		/* Get the opcode.  */
1042		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1043
1044		/* All instructions with R_H8_DIR16A8 start with
1045		   0x6a.  */
1046		if (code != 0x6a)
1047		  abort ();
1048
1049		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1050		/* If this is a mov.b instruction, clear the lower
1051		   nibble, which contains the source/destination
1052		   register number.  */
1053		if ((temp_code & 0x10) != 0x10)
1054		  temp_code &= 0xf0;
1055
1056		switch (temp_code)
1057		  {
1058		  case 0x00:
1059		    /* This is mov.b @aa:16,Rd.  */
1060		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
1061			       contents + irel->r_offset - 2);
1062		    break;
1063		  case 0x80:
1064		    /* This is mov.b Rs,@aa:16.  */
1065		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
1066			       contents + irel->r_offset - 2);
1067		    break;
1068		  case 0x18:
1069		    /* This is a bit-maniputation instruction that
1070		       stores one bit into memory, one of "bclr",
1071		       "bist", "bnot", "bset", and "bst".  */
1072		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1073		    break;
1074		  case 0x10:
1075		    /* This is a bit-maniputation instruction that
1076		       loads one bit from memory, one of "band",
1077		       "biand", "bild", "bior", "bixor", "bld", "bor",
1078		       "btst", and "bxor".  */
1079		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1080		    break;
1081		  default:
1082		    abort ();
1083		  }
1084
1085		/* Fix the relocation's type.  */
1086		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1087					     R_H8_DIR8);
1088
1089		/* Move the relocation.  */
1090		irel->r_offset--;
1091
1092		/* Delete two bytes of data.  */
1093		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1094						  irel->r_offset + 1, 2))
1095		  goto error_return;
1096
1097		/* That will change things, so, we should relax again.
1098		   Note that this is not required, and it may be slow.  */
1099		*again = TRUE;
1100	      }
1101	    break;
1102	  }
1103
1104	/* This is a 24-bit absolute address in one of the following
1105	   instructions:
1106
1107	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1108	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1109	     "mov.b"
1110
1111	   We may relax this into an 8-bit absolute address if it's in
1112	   the right range.  */
1113	case R_H8_DIR24A8:
1114	  {
1115	    bfd_vma value;
1116
1117	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1118	    if (value >= 0xffffff00u)
1119	      {
1120		unsigned char code;
1121		unsigned char temp_code;
1122
1123		/* Note that we've changed the relocs, section contents,
1124		   etc.  */
1125		elf_section_data (sec)->relocs = internal_relocs;
1126		elf_section_data (sec)->this_hdr.contents = contents;
1127		symtab_hdr->contents = (unsigned char *) isymbuf;
1128
1129		/* Get the opcode.  */
1130		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1131
1132		/* All instructions with R_H8_DIR24A8 start with
1133		   0x6a.  */
1134		if (code != 0x6a)
1135		  abort ();
1136
1137		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1138
1139		/* If this is a mov.b instruction, clear the lower
1140		   nibble, which contains the source/destination
1141		   register number.  */
1142		if ((temp_code & 0x30) != 0x30)
1143		  temp_code &= 0xf0;
1144
1145		switch (temp_code)
1146		  {
1147		  case 0x20:
1148		    /* This is mov.b @aa:24/32,Rd.  */
1149		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
1150			       contents + irel->r_offset - 2);
1151		    break;
1152		  case 0xa0:
1153		    /* This is mov.b Rs,@aa:24/32.  */
1154		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
1155			       contents + irel->r_offset - 2);
1156		    break;
1157		  case 0x38:
1158		    /* This is a bit-maniputation instruction that
1159		       stores one bit into memory, one of "bclr",
1160		       "bist", "bnot", "bset", and "bst".  */
1161		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1162		    break;
1163		  case 0x30:
1164		    /* This is a bit-maniputation instruction that
1165		       loads one bit from memory, one of "band",
1166		       "biand", "bild", "bior", "bixor", "bld", "bor",
1167		       "btst", and "bxor".  */
1168		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1169		    break;
1170		  default:
1171		    abort();
1172		  }
1173
1174		/* Fix the relocation's type.  */
1175		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1176					     R_H8_DIR8);
1177		irel->r_offset--;
1178
1179		/* Delete two bytes of data.  */
1180		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1181						  irel->r_offset + 1, 4))
1182		  goto error_return;
1183
1184		/* That will change things, so, we should relax again.
1185		   Note that this is not required, and it may be slow.  */
1186		*again = TRUE;
1187		break;
1188	      }
1189	  }
1190
1191	  /* Fall through.  */
1192
1193	  /* This is a 24-/32-bit absolute address in one of the
1194	     following instructions:
1195
1196	       "band", "bclr", "biand", "bild", "bior", "bist",
1197	       "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
1198	       "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
1199
1200	     We may relax this into an 16-bit absolute address if it's
1201	     in the right range.  */
1202	case R_H8_DIR32A16:
1203	  {
1204	    bfd_vma value;
1205
1206	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1207	    if (value <= 0x7fff || value >= 0xffff8000u)
1208	      {
1209		unsigned char code;
1210
1211		/* Note that we've changed the relocs, section contents,
1212		   etc.  */
1213		elf_section_data (sec)->relocs = internal_relocs;
1214		elf_section_data (sec)->this_hdr.contents = contents;
1215		symtab_hdr->contents = (unsigned char *) isymbuf;
1216
1217		/* Get the opcode.  */
1218		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1219
1220		/* Fix the opcode.  For all the instructions that
1221		   belong to this relaxation, we simply need to turn
1222		   off bit 0x20 in the previous byte.  */
1223		code &= ~0x20;
1224
1225		bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1226
1227		/* Fix the relocation's type.  */
1228		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1229					     R_H8_DIR16);
1230
1231		/* Delete two bytes of data.  */
1232		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1233						  irel->r_offset + 1, 2))
1234		  goto error_return;
1235
1236		/* That will change things, so, we should relax again.
1237		   Note that this is not required, and it may be slow.  */
1238		*again = TRUE;
1239	      }
1240	    break;
1241	  }
1242
1243	default:
1244	  break;
1245	}
1246    }
1247
1248  if (isymbuf != NULL
1249      && symtab_hdr->contents != (unsigned char *) isymbuf)
1250    {
1251      if (! link_info->keep_memory)
1252	free (isymbuf);
1253      else
1254	symtab_hdr->contents = (unsigned char *) isymbuf;
1255    }
1256
1257  if (contents != NULL
1258      && elf_section_data (sec)->this_hdr.contents != contents)
1259    {
1260      if (! link_info->keep_memory)
1261	free (contents);
1262      else
1263	{
1264	  /* Cache the section contents for elf_link_input_bfd.  */
1265	  elf_section_data (sec)->this_hdr.contents = contents;
1266	}
1267    }
1268
1269  if (internal_relocs != NULL
1270      && elf_section_data (sec)->relocs != internal_relocs)
1271    free (internal_relocs);
1272
1273  return TRUE;
1274
1275 error_return:
1276  if (isymbuf != NULL
1277      && symtab_hdr->contents != (unsigned char *) isymbuf)
1278    free (isymbuf);
1279  if (contents != NULL
1280      && elf_section_data (sec)->this_hdr.contents != contents)
1281    free (contents);
1282  if (internal_relocs != NULL
1283      && elf_section_data (sec)->relocs != internal_relocs)
1284    free (internal_relocs);
1285  return FALSE;
1286}
1287
1288/* Delete some bytes from a section while relaxing.  */
1289
1290static bfd_boolean
1291elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
1292{
1293  Elf_Internal_Shdr *symtab_hdr;
1294  unsigned int sec_shndx;
1295  bfd_byte *contents;
1296  Elf_Internal_Rela *irel, *irelend;
1297  Elf_Internal_Rela *irelalign;
1298  Elf_Internal_Sym *isym;
1299  Elf_Internal_Sym *isymend;
1300  bfd_vma toaddr;
1301  struct elf_link_hash_entry **sym_hashes;
1302  struct elf_link_hash_entry **end_hashes;
1303  unsigned int symcount;
1304
1305  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1306
1307  contents = elf_section_data (sec)->this_hdr.contents;
1308
1309  /* The deletion must stop at the next ALIGN reloc for an aligment
1310     power larger than the number of bytes we are deleting.  */
1311
1312  irelalign = NULL;
1313  toaddr = sec->size;
1314
1315  irel = elf_section_data (sec)->relocs;
1316  irelend = irel + sec->reloc_count;
1317
1318  /* Actually delete the bytes.  */
1319  memmove (contents + addr, contents + addr + count,
1320	   (size_t) (toaddr - addr - count));
1321  sec->size -= count;
1322
1323  /* Adjust all the relocs.  */
1324  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1325    {
1326      /* Get the new reloc address.  */
1327      if ((irel->r_offset > addr
1328	   && irel->r_offset < toaddr))
1329	irel->r_offset -= count;
1330    }
1331
1332  /* Adjust the local symbols defined in this section.  */
1333  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1334  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1335  isymend = isym + symtab_hdr->sh_info;
1336  for (; isym < isymend; isym++)
1337    {
1338      if (isym->st_shndx == sec_shndx
1339	  && isym->st_value > addr
1340	  && isym->st_value < toaddr)
1341	isym->st_value -= count;
1342    }
1343
1344  /* Now adjust the global symbols defined in this section.  */
1345  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1346	      - symtab_hdr->sh_info);
1347  sym_hashes = elf_sym_hashes (abfd);
1348  end_hashes = sym_hashes + symcount;
1349  for (; sym_hashes < end_hashes; sym_hashes++)
1350    {
1351      struct elf_link_hash_entry *sym_hash = *sym_hashes;
1352      if ((sym_hash->root.type == bfd_link_hash_defined
1353	   || sym_hash->root.type == bfd_link_hash_defweak)
1354	  && sym_hash->root.u.def.section == sec
1355	  && sym_hash->root.u.def.value > addr
1356	  && sym_hash->root.u.def.value < toaddr)
1357	{
1358	  sym_hash->root.u.def.value -= count;
1359	}
1360    }
1361
1362  return TRUE;
1363}
1364
1365/* Return TRUE if a symbol exists at the given address, else return
1366   FALSE.  */
1367static bfd_boolean
1368elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
1369{
1370  Elf_Internal_Shdr *symtab_hdr;
1371  unsigned int sec_shndx;
1372  Elf_Internal_Sym *isym;
1373  Elf_Internal_Sym *isymend;
1374  struct elf_link_hash_entry **sym_hashes;
1375  struct elf_link_hash_entry **end_hashes;
1376  unsigned int symcount;
1377
1378  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1379
1380  /* Examine all the symbols.  */
1381  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1382  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1383  isymend = isym + symtab_hdr->sh_info;
1384  for (; isym < isymend; isym++)
1385    {
1386      if (isym->st_shndx == sec_shndx
1387	  && isym->st_value == addr)
1388	return TRUE;
1389    }
1390
1391  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1392	      - symtab_hdr->sh_info);
1393  sym_hashes = elf_sym_hashes (abfd);
1394  end_hashes = sym_hashes + symcount;
1395  for (; sym_hashes < end_hashes; sym_hashes++)
1396    {
1397      struct elf_link_hash_entry *sym_hash = *sym_hashes;
1398      if ((sym_hash->root.type == bfd_link_hash_defined
1399	   || sym_hash->root.type == bfd_link_hash_defweak)
1400	  && sym_hash->root.u.def.section == sec
1401	  && sym_hash->root.u.def.value == addr)
1402	return TRUE;
1403    }
1404
1405  return FALSE;
1406}
1407
1408/* This is a version of bfd_generic_get_relocated_section_contents
1409   which uses elf32_h8_relocate_section.  */
1410
1411static bfd_byte *
1412elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1413					 struct bfd_link_info *link_info,
1414					 struct bfd_link_order *link_order,
1415					 bfd_byte *data,
1416					 bfd_boolean relocatable,
1417					 asymbol **symbols)
1418{
1419  Elf_Internal_Shdr *symtab_hdr;
1420  asection *input_section = link_order->u.indirect.section;
1421  bfd *input_bfd = input_section->owner;
1422  asection **sections = NULL;
1423  Elf_Internal_Rela *internal_relocs = NULL;
1424  Elf_Internal_Sym *isymbuf = NULL;
1425
1426  /* We only need to handle the case of relaxing, or of having a
1427     particular set of section contents, specially.  */
1428  if (relocatable
1429      || elf_section_data (input_section)->this_hdr.contents == NULL)
1430    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1431						       link_order, data,
1432						       relocatable,
1433						       symbols);
1434
1435  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1436
1437  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1438	  (size_t) input_section->size);
1439
1440  if ((input_section->flags & SEC_RELOC) != 0
1441      && input_section->reloc_count > 0)
1442    {
1443      asection **secpp;
1444      Elf_Internal_Sym *isym, *isymend;
1445      bfd_size_type amt;
1446
1447      internal_relocs = (_bfd_elf_link_read_relocs
1448			 (input_bfd, input_section, (PTR) NULL,
1449			  (Elf_Internal_Rela *) NULL, FALSE));
1450      if (internal_relocs == NULL)
1451	goto error_return;
1452
1453      if (symtab_hdr->sh_info != 0)
1454	{
1455	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1456	  if (isymbuf == NULL)
1457	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1458					    symtab_hdr->sh_info, 0,
1459					    NULL, NULL, NULL);
1460	  if (isymbuf == NULL)
1461	    goto error_return;
1462	}
1463
1464      amt = symtab_hdr->sh_info;
1465      amt *= sizeof (asection *);
1466      sections = (asection **) bfd_malloc (amt);
1467      if (sections == NULL && amt != 0)
1468	goto error_return;
1469
1470      isymend = isymbuf + symtab_hdr->sh_info;
1471      for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1472	{
1473	  asection *isec;
1474
1475	  if (isym->st_shndx == SHN_UNDEF)
1476	    isec = bfd_und_section_ptr;
1477	  else if (isym->st_shndx == SHN_ABS)
1478	    isec = bfd_abs_section_ptr;
1479	  else if (isym->st_shndx == SHN_COMMON)
1480	    isec = bfd_com_section_ptr;
1481	  else
1482	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1483
1484	  *secpp = isec;
1485	}
1486
1487      if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1488				       input_section, data, internal_relocs,
1489				       isymbuf, sections))
1490	goto error_return;
1491
1492      if (sections != NULL)
1493	free (sections);
1494      if (isymbuf != NULL
1495	  && symtab_hdr->contents != (unsigned char *) isymbuf)
1496	free (isymbuf);
1497      if (elf_section_data (input_section)->relocs != internal_relocs)
1498	free (internal_relocs);
1499    }
1500
1501  return data;
1502
1503 error_return:
1504  if (sections != NULL)
1505    free (sections);
1506  if (isymbuf != NULL
1507      && symtab_hdr->contents != (unsigned char *) isymbuf)
1508    free (isymbuf);
1509  if (internal_relocs != NULL
1510      && elf_section_data (input_section)->relocs != internal_relocs)
1511    free (internal_relocs);
1512  return NULL;
1513}
1514
1515
1516#define TARGET_BIG_SYM			bfd_elf32_h8300_vec
1517#define TARGET_BIG_NAME			"elf32-h8300"
1518#define ELF_ARCH			bfd_arch_h8300
1519#define ELF_MACHINE_CODE		EM_H8_300
1520#define ELF_MAXPAGESIZE			0x1
1521#define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1522#define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1523#define elf_info_to_howto		elf32_h8_info_to_howto
1524#define elf_info_to_howto_rel		elf32_h8_info_to_howto_rel
1525
1526/* So we can set/examine bits in e_flags to get the specific
1527   H8 architecture in use.  */
1528#define elf_backend_final_write_processing \
1529  elf32_h8_final_write_processing
1530#define elf_backend_object_p \
1531  elf32_h8_object_p
1532#define bfd_elf32_bfd_merge_private_bfd_data \
1533  elf32_h8_merge_private_bfd_data
1534
1535/* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1536   defaults to using _bfd_generic_link_hash_table_create, but
1537   bfd_elf_size_dynamic_sections uses
1538   dynobj = elf_hash_table (info)->dynobj;
1539   and thus requires an elf hash table.  */
1540#define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1541
1542/* Use an H8 specific linker, not the ELF generic linker.  */
1543#define elf_backend_relocate_section elf32_h8_relocate_section
1544#define elf_backend_rela_normal		1
1545#define elf_backend_can_gc_sections	1
1546
1547/* And relaxing stuff.  */
1548#define bfd_elf32_bfd_relax_section     elf32_h8_relax_section
1549#define bfd_elf32_bfd_get_relocated_section_contents \
1550                                elf32_h8_get_relocated_section_contents
1551
1552
1553#include "elf32-target.h"
1554