xref: /netbsd-src/external/gpl3/binutils/dist/bfd/elf32-h8300.c (revision a7e090f70e491979434963c9a27df4020fe0a18b)
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 
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 	{
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.  */
549 static unsigned long
550 elf32_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 
582 static void
583 elf32_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 
627 static bfd_boolean
628 elf32_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 
639 static bfd_boolean
640 elf32_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 
681 static bfd_boolean
682 elf32_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 
1290 static bfd_boolean
1291 elf32_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.  */
1367 static bfd_boolean
1368 elf32_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 
1411 static bfd_byte *
1412 elf32_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