xref: /netbsd-src/external/gpl3/binutils/dist/bfd/elf32-h8300.c (revision 9ddb6ab554e70fb9bbd90c3d96b812bc57755a14)
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 
28 static reloc_howto_type *elf32_h8_reloc_type_lookup
29   (bfd *abfd, bfd_reloc_code_real_type code);
30 static void elf32_h8_info_to_howto
31   (bfd *, arelent *, Elf_Internal_Rela *);
32 static void elf32_h8_info_to_howto_rel
33   (bfd *, arelent *, Elf_Internal_Rela *);
34 static unsigned long elf32_h8_mach (flagword);
35 static void elf32_h8_final_write_processing (bfd *, bfd_boolean);
36 static bfd_boolean elf32_h8_object_p (bfd *);
37 static bfd_boolean elf32_h8_merge_private_bfd_data (bfd *, bfd *);
38 static bfd_boolean elf32_h8_relax_section
39   (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
40 static bfd_boolean elf32_h8_relax_delete_bytes
41   (bfd *, asection *, bfd_vma, int);
42 static bfd_boolean elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
43 static bfd_byte *elf32_h8_get_relocated_section_contents
44   (bfd *, struct bfd_link_info *, struct bfd_link_order *,
45    bfd_byte *, bfd_boolean, asymbol **);
46 static 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);
50 static 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 **);
54 static 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 
60 static 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 
219 struct 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 
226 static 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 
241 static reloc_howto_type *
242 elf32_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 
255 static reloc_howto_type *
256 elf32_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 
271 static void
272 elf32_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 
288 static void
289 elf32_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.  */
303 static bfd_reloc_status_type
304 special (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.  */
321 static bfd_reloc_status_type
322 elf32_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.  */
411 static bfd_boolean
412 elf32_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.  */
542 static unsigned long
543 elf32_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 
575 static void
576 elf32_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 
620 static bfd_boolean
621 elf32_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 
632 static bfd_boolean
633 elf32_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 
674 static bfd_boolean
675 elf32_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 
1373 static bfd_boolean
1374 elf32_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.  */
1445 static bfd_boolean
1446 elf32_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 
1489 static bfd_byte *
1490 elf32_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