daily update
[deliverable/binutils-gdb.git] / bfd / elf32-h8300.c
CommitLineData
c2dcd04e 1/* BFD back-end for Renesas H8/300 ELF binaries.
ab96bf03 2 Copyright 1993, 1995, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006,
dbaa2011 3 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
e01b0e69 4
e514ac71 5 This file is part of BFD, the Binary File Descriptor library.
e01b0e69 6
e514ac71
NC
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
e514ac71 10 (at your option) any later version.
e01b0e69 11
e514ac71
NC
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.
e01b0e69 16
e514ac71
NC
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
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
e01b0e69 21
e01b0e69 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
e01b0e69
JR
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "elf/h8.h"
27
28static reloc_howto_type *elf32_h8_reloc_type_lookup
c6baf75e 29 (bfd *abfd, bfd_reloc_code_real_type code);
e01b0e69 30static void elf32_h8_info_to_howto
c6baf75e 31 (bfd *, arelent *, Elf_Internal_Rela *);
5e47149d 32static void elf32_h8_info_to_howto_rel
c6baf75e 33 (bfd *, arelent *, Elf_Internal_Rela *);
96ef1419
KH
34static unsigned long elf32_h8_mach (flagword);
35static void elf32_h8_final_write_processing (bfd *, bfd_boolean);
36static bfd_boolean elf32_h8_object_p (bfd *);
37static bfd_boolean elf32_h8_merge_private_bfd_data (bfd *, bfd *);
b34976b6 38static bfd_boolean elf32_h8_relax_section
c6baf75e 39 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
b34976b6 40static bfd_boolean elf32_h8_relax_delete_bytes
c6baf75e 41 (bfd *, asection *, bfd_vma, int);
96ef1419 42static bfd_boolean elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
dc810e39 43static bfd_byte *elf32_h8_get_relocated_section_contents
c6baf75e
RS
44 (bfd *, struct bfd_link_info *, struct bfd_link_order *,
45 bfd_byte *, bfd_boolean, asymbol **);
5e47149d 46static bfd_reloc_status_type elf32_h8_final_link_relocate
c6baf75e
RS
47 (unsigned long, bfd *, bfd *, asection *,
48 bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
49 struct bfd_link_info *, asection *, int);
b34976b6 50static bfd_boolean elf32_h8_relocate_section
c6baf75e
RS
51 (bfd *, struct bfd_link_info *, bfd *, asection *,
52 bfd_byte *, Elf_Internal_Rela *,
53 Elf_Internal_Sym *, asection **);
dc810e39 54static bfd_reloc_status_type special
c6baf75e 55 (bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **);
e01b0e69
JR
56
57/* This does not include any relocation information, but should be
58 good enough for GDB or objdump to read the file. */
59
bc7eab72 60static reloc_howto_type h8_elf_howto_table[] = {
e01b0e69
JR
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 */
b34976b6 66 FALSE, /* pc_relative */
e01b0e69 67 0, /* bitpos */
9d29900b
NC
68 complain_overflow_dont,/* complain_on_overflow */
69 special, /* special_function */
e01b0e69 70 "R_H8_NONE", /* name */
b34976b6 71 FALSE, /* partial_inplace */
e01b0e69
JR
72 0, /* src_mask */
73 0, /* dst_mask */
b34976b6 74 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 80 FALSE, /* pc_relative */
e01b0e69 81 0, /* bitpos */
9d29900b
NC
82 complain_overflow_dont,/* complain_on_overflow */
83 special, /* special_function */
e01b0e69 84 "R_H8_DIR32", /* name */
b34976b6 85 FALSE, /* partial_inplace */
e01b0e69
JR
86 0, /* src_mask */
87 0xffffffff, /* dst_mask */
b34976b6 88 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 94 FALSE, /* pc_relative */
e01b0e69 95 0, /* bitpos */
9d29900b
NC
96 complain_overflow_dont,/* complain_on_overflow */
97 special, /* special_function */
e01b0e69 98 "R_H8_DIR16", /* name */
b34976b6 99 FALSE, /* partial_inplace */
e01b0e69
JR
100 0, /* src_mask */
101 0x0000ffff, /* dst_mask */
b34976b6 102 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 108 FALSE, /* pc_relative */
e01b0e69 109 0, /* bitpos */
9d29900b
NC
110 complain_overflow_dont,/* complain_on_overflow */
111 special, /* special_function */
112 "R_H8_DIR8", /* name */
b34976b6 113 FALSE, /* partial_inplace */
e01b0e69
JR
114 0, /* src_mask */
115 0x000000ff, /* dst_mask */
b34976b6 116 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 122 FALSE, /* pc_relative */
e01b0e69
JR
123 0, /* bitpos */
124 complain_overflow_bitfield, /* complain_on_overflow */
9d29900b 125 special, /* special_function */
e01b0e69 126 "R_H8_DIR16A8", /* name */
b34976b6 127 FALSE, /* partial_inplace */
e01b0e69
JR
128 0, /* src_mask */
129 0x0000ffff, /* dst_mask */
b34976b6 130 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 136 FALSE, /* pc_relative */
e01b0e69
JR
137 0, /* bitpos */
138 complain_overflow_bitfield, /* complain_on_overflow */
9d29900b 139 special, /* special_function */
e01b0e69 140 "R_H8_DIR16R8", /* name */
b34976b6 141 FALSE, /* partial_inplace */
e01b0e69
JR
142 0, /* src_mask */
143 0x0000ffff, /* dst_mask */
b34976b6 144 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 150 FALSE, /* pc_relative */
e01b0e69
JR
151 0, /* bitpos */
152 complain_overflow_bitfield, /* complain_on_overflow */
9d29900b 153 special, /* special_function */
e01b0e69 154 "R_H8_DIR24A8", /* name */
b34976b6 155 TRUE, /* partial_inplace */
e01b0e69
JR
156 0xff000000, /* src_mask */
157 0x00ffffff, /* dst_mask */
b34976b6 158 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 164 FALSE, /* pc_relative */
e01b0e69
JR
165 0, /* bitpos */
166 complain_overflow_bitfield, /* complain_on_overflow */
9d29900b 167 special, /* special_function */
e01b0e69 168 "R_H8_DIR24R8", /* name */
b34976b6 169 TRUE, /* partial_inplace */
e01b0e69
JR
170 0xff000000, /* src_mask */
171 0x00ffffff, /* dst_mask */
b34976b6 172 FALSE), /* pcrel_offset */
e01b0e69
JR
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 */
b34976b6 178 FALSE, /* pc_relative */
e01b0e69 179 0, /* bitpos */
9d29900b
NC
180 complain_overflow_dont,/* complain_on_overflow */
181 special, /* special_function */
8c17da6e 182 "R_H8_DIR32A16", /* name */
b34976b6 183 FALSE, /* partial_inplace */
e01b0e69
JR
184 0, /* src_mask */
185 0xffffffff, /* dst_mask */
b34976b6 186 FALSE), /* pcrel_offset */
f2352488
JL
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 */
b34976b6 192 TRUE, /* pc_relative */
f2352488 193 0, /* bitpos */
9d29900b
NC
194 complain_overflow_signed,/* complain_on_overflow */
195 special, /* special_function */
f2352488 196 "R_H8_PCREL16", /* name */
b34976b6 197 FALSE, /* partial_inplace */
f2352488
JL
198 0xffff, /* src_mask */
199 0xffff, /* dst_mask */
b34976b6 200 TRUE), /* pcrel_offset */
f2352488
JL
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 */
b34976b6 206 TRUE, /* pc_relative */
f2352488 207 0, /* bitpos */
9d29900b
NC
208 complain_overflow_signed,/* complain_on_overflow */
209 special, /* special_function */
f2352488 210 "R_H8_PCREL8", /* name */
b34976b6 211 FALSE, /* partial_inplace */
f2352488
JL
212 0xff, /* src_mask */
213 0xff, /* dst_mask */
b34976b6 214 TRUE), /* pcrel_offset */
e01b0e69
JR
215};
216
217/* This structure is used to map BFD reloc codes to H8 ELF relocs. */
218
bc7eab72 219struct elf_reloc_map {
e01b0e69
JR
220 bfd_reloc_code_real_type bfd_reloc_val;
221 unsigned char howto_index;
222};
223
6288878d 224/* An array mapping BFD reloc codes to H8 ELF relocs. */
e01b0e69 225
bc7eab72 226static const struct elf_reloc_map h8_reloc_map[] = {
e01b0e69
JR
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 },
f2352488
JL
236 { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
237 { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
e01b0e69
JR
238};
239
0a83638b 240
e01b0e69 241static reloc_howto_type *
c6baf75e
RS
242elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
243 bfd_reloc_code_real_type code)
e01b0e69
JR
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
157090f7
AM
255static reloc_howto_type *
256elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
257 const char *r_name)
258{
259 unsigned int i;
260
261 for (i = 0;
262 i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
263 i++)
264 if (h8_elf_howto_table[i].name != NULL
265 && strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
266 return &h8_elf_howto_table[i];
267
268 return NULL;
269}
270
e01b0e69 271static void
c6baf75e
RS
272elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
273 Elf_Internal_Rela *elf_reloc)
e01b0e69
JR
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++)
bc7eab72 280 if (h8_elf_howto_table[i].type == r)
e01b0e69
JR
281 {
282 bfd_reloc->howto = &h8_elf_howto_table[i];
283 return;
284 }
285 abort ();
286}
287
288static void
c6baf75e
RS
289elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
290 Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
e01b0e69
JR
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
a00c9dbc
JL
299/* Special handling for H8/300 relocs.
300 We only come here for pcrel stuff and return normally if not an -r link.
301 When doing -r, we can't do any arithmetic for the pcrel stuff, because
302 we support relaxing on the H8/300 series chips. */
303static bfd_reloc_status_type
c6baf75e
RS
304special (bfd *abfd ATTRIBUTE_UNUSED,
305 arelent *reloc_entry ATTRIBUTE_UNUSED,
306 asymbol *symbol ATTRIBUTE_UNUSED,
307 PTR data ATTRIBUTE_UNUSED,
308 asection *input_section ATTRIBUTE_UNUSED,
309 bfd *output_bfd,
310 char **error_message ATTRIBUTE_UNUSED)
a00c9dbc
JL
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}
5e47149d
JL
319
320/* Perform a relocation as part of a final link. */
321static bfd_reloc_status_type
c6baf75e
RS
322elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
323 bfd *output_bfd ATTRIBUTE_UNUSED,
324 asection *input_section ATTRIBUTE_UNUSED,
325 bfd_byte *contents, bfd_vma offset,
326 bfd_vma value, bfd_vma addend,
327 struct bfd_link_info *info ATTRIBUTE_UNUSED,
328 asection *sym_sec ATTRIBUTE_UNUSED,
329 int is_local ATTRIBUTE_UNUSED)
5e47149d
JL
330{
331 bfd_byte *hit_data = contents + offset;
332
333 switch (r_type)
334 {
5e47149d
JL
335 case R_H8_NONE:
336 return bfd_reloc_ok;
337
338 case R_H8_DIR32:
339 case R_H8_DIR32A16:
a00c9dbc 340 case R_H8_DIR24A8:
5e47149d
JL
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
5e47149d
JL
356 bfd_put_8 (input_bfd, value, hit_data);
357 return bfd_reloc_ok;
358
5e47149d
JL
359 case R_H8_DIR24R8:
360 value += addend;
361
a00c9dbc 362 /* HIT_DATA is the address for the first byte for the relocated
e804e836 363 value. Subtract 1 so that we can manipulate the data in 32-bit
a00c9dbc
JL
364 hunks. */
365 hit_data--;
366
367 /* Clear out the top byte in value. */
5e47149d 368 value &= 0xffffff;
a00c9dbc
JL
369
370 /* Retrieve the type byte for value from the section contents. */
5e47149d 371 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
a00c9dbc 372
e804e836 373 /* Now scribble it out in one 32-bit hunk. */
5e47149d
JL
374 bfd_put_32 (input_bfd, value, hit_data);
375 return bfd_reloc_ok;
376
f2352488
JL
377 case R_H8_PCREL16:
378 value -= (input_section->output_section->vma
379 + input_section->output_offset);
380 value -= offset;
381 value += addend;
382
a00c9dbc
JL
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
f2352488
JL
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
a00c9dbc
JL
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
f2352488
JL
402 bfd_put_8 (input_bfd, value, hit_data);
403 return bfd_reloc_ok;
404
5e47149d
JL
405 default:
406 return bfd_reloc_notsupported;
407 }
408}
409\f
410/* Relocate an H8 ELF section. */
b34976b6 411static bfd_boolean
c6baf75e
RS
412elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
413 bfd *input_bfd, asection *input_section,
414 bfd_byte *contents, Elf_Internal_Rela *relocs,
415 Elf_Internal_Sym *local_syms,
416 asection **local_sections)
5e47149d
JL
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 {
dc810e39 429 unsigned int r_type;
5e47149d
JL
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;
ab96bf03
AM
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;
5e47149d
JL
441
442 r_symndx = ELF32_R_SYM (rel->r_info);
443 r_type = ELF32_R_TYPE (rel->r_info);
5e47149d
JL
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];
8517fae7 451 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5e47149d
JL
452 }
453 else
454 {
59c2e50f
L
455 bfd_boolean unresolved_reloc, warned;
456
b2a8e766
AM
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);
5e47149d
JL
461 }
462
dbaa2011 463 if (sec != NULL && discarded_section (sec))
e4067dbb
DJ
464 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
465 rel, relend, howto, contents);
ab96bf03
AM
466
467 if (info->relocatable)
468 continue;
469
5e47149d
JL
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;
dc810e39 480
5e47149d
JL
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)
dfeffb9f
L
495 (info, (h ? &h->root : NULL), name, howto->name,
496 (bfd_vma) 0, input_bfd, input_section,
497 rel->r_offset)))
b34976b6 498 return FALSE;
5e47149d
JL
499 break;
500
501 case bfd_reloc_undefined:
502 if (! ((*info->callbacks->undefined_symbol)
503 (info, name, input_bfd, input_section,
b34976b6
AM
504 rel->r_offset, TRUE)))
505 return FALSE;
5e47149d
JL
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)))
b34976b6 528 return FALSE;
5e47149d
JL
529 break;
530 }
531 }
532 }
533
b34976b6 534 return TRUE;
5e47149d
JL
535}
536
0a83638b
JL
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. */
dc810e39 542static unsigned long
c6baf75e 543elf32_h8_mach (flagword flags)
0a83638b
JL
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;
8d9cd6b1
NC
556
557 case E_H8_MACH_H8300HN:
558 return bfd_mach_h8300hn;
559
560 case E_H8_MACH_H8300SN:
561 return bfd_mach_h8300sn;
5d1db417
MS
562
563 case E_H8_MACH_H8300SX:
564 return bfd_mach_h8300sx;
f4984206
RS
565
566 case E_H8_MACH_H8300SXN:
567 return bfd_mach_h8300sxn;
0a83638b
JL
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
dc810e39 575static void
c6baf75e
RS
576elf32_h8_final_write_processing (bfd *abfd,
577 bfd_boolean linker ATTRIBUTE_UNUSED)
0a83638b
JL
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;
8d9cd6b1
NC
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;
5d1db417
MS
603
604 case bfd_mach_h8300sx:
605 val = E_H8_MACH_H8300SX;
606 break;
f4984206
RS
607
608 case bfd_mach_h8300sxn:
609 val = E_H8_MACH_H8300SXN;
610 break;
0a83638b
JL
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
b34976b6 620static bfd_boolean
c6baf75e 621elf32_h8_object_p (bfd *abfd)
0a83638b
JL
622{
623 bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
624 elf32_h8_mach (elf_elfheader (abfd)->e_flags));
b34976b6 625 return TRUE;
0a83638b
JL
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
b34976b6 632static bfd_boolean
c6baf75e 633elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
0a83638b
JL
634{
635 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
636 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 637 return TRUE;
0a83638b
JL
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),
96ef1419
KH
643 bfd_get_mach (ibfd)))
644 return FALSE;
0a83638b
JL
645 }
646
b34976b6 647 return TRUE;
0a83638b
JL
648}
649
5907e628
JL
650/* This function handles relaxing for the H8..
651
4cc11e76 652 There are a few relaxing opportunities available on the H8:
5907e628
JL
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
630a7b0a
KH
662 bset:16 -> bset:8 2 bytes
663 bset:24/32 -> bset:8 4 bytes
664 (also applicable to other bit manipulation instructions)
665
5907e628
JL
666 mov.b:16 -> mov.b:8 2 bytes
667 mov.b:24/32 -> mov.b:8 4 bytes
668
7e89635a
KH
669 bset:24/32 -> bset:16 2 bytes
670 (also applicable to other bit manipulation instructions)
671
76f99c63 672 mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes */
5907e628 673
b34976b6 674static bfd_boolean
c6baf75e
RS
675elf32_h8_relax_section (bfd *abfd, asection *sec,
676 struct bfd_link_info *link_info, bfd_boolean *again)
5907e628
JL
677{
678 Elf_Internal_Shdr *symtab_hdr;
679 Elf_Internal_Rela *internal_relocs;
5907e628
JL
680 Elf_Internal_Rela *irel, *irelend;
681 bfd_byte *contents = NULL;
6cdc0ccc 682 Elf_Internal_Sym *isymbuf = NULL;
5907e628
JL
683 static asection *last_input_section = NULL;
684 static Elf_Internal_Rela *last_reloc = NULL;
685
686 /* Assume nothing changes. */
b34976b6 687 *again = FALSE;
5907e628 688
1049f94e 689 /* We don't have to do anything for a relocatable link, if
5907e628
JL
690 this section does not have relocs, or if this is not a
691 code section. */
1049f94e 692 if (link_info->relocatable
5907e628
JL
693 || (sec->flags & SEC_RELOC) == 0
694 || sec->reloc_count == 0
695 || (sec->flags & SEC_CODE) == 0)
b34976b6 696 return TRUE;
5907e628 697
5907e628
JL
698 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
699
700 /* Get a copy of the native relocations. */
45d6a902 701 internal_relocs = (_bfd_elf_link_read_relocs
5907e628
JL
702 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
703 link_info->keep_memory));
704 if (internal_relocs == NULL)
705 goto error_return;
5907e628
JL
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
bcb012d3
DD
718 {
719 arelent bfd_reloc;
bcb012d3
DD
720
721 elf32_h8_info_to_howto (abfd, &bfd_reloc, irel);
bcb012d3 722 }
5907e628
JL
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
76f99c63
JL
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
5907e628
JL
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. */
eea6121a 744 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
5907e628
JL
745 goto error_return;
746 }
747 }
748
9ad5cbcf 749 /* Read this BFD's local symbols if we haven't done so already. */
6cdc0ccc 750 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
5907e628 751 {
6cdc0ccc
AM
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;
5907e628
JL
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 {
5907e628 764 /* A local symbol. */
6cdc0ccc
AM
765 Elf_Internal_Sym *isym;
766 asection *sym_sec;
5907e628 767
32ac2c9a 768 isym = isymbuf + ELF32_R_SYM (irel->r_info);
6cdc0ccc 769 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
03d14457
NC
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;
5907e628
JL
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 {
e804e836 809 /* Try to turn a 24-bit absolute branch/call into an 8-bit
5907e628
JL
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. */
dc810e39 826 if ((int) gap >= -126 && (int) gap <= 130)
5907e628
JL
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;
5907e628 833 elf_section_data (sec)->this_hdr.contents = contents;
6cdc0ccc 834 symtab_hdr->contents = (unsigned char *) isymbuf;
5907e628 835
e514ac71
NC
836 /* Get the instruction code being relaxed. */
837 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
838
5907e628
JL
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
e514ac71
NC
845 long conditional branches.
846
847 Only perform this optimisation for jumps (code 0x5a) not
848 subroutine calls, as otherwise it could transform:
b34976b6 849
e514ac71
NC
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
dc810e39 864 && (int) gap >= -128
5907e628
JL
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;
6cdc0ccc 871 Elf_Internal_Sym *last_sym;
5907e628
JL
872
873 /* We will need to examine the symbol used by the
874 previous relocation. */
dc810e39 875
6cdc0ccc 876 last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
5907e628 877 last_sym_sec
6cdc0ccc
AM
878 = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
879 last_value = (last_sym->st_value
5907e628
JL
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
9ad5cbcf 888 && ! elf32_h8_symbol_address_p (abfd, sec, dot))
5907e628
JL
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
bc7eab72 896 last_reloc->r_info
5907e628 897 = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
bc7eab72
KH
898 ELF32_R_TYPE (R_H8_PCREL8));
899 last_reloc->r_addend = irel->r_addend;
5907e628
JL
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
b34976b6 914 *again = TRUE;
5907e628
JL
915 break;
916 }
917 }
918
5907e628 919 if (code == 0x5e)
7e89635a 920 /* This is jsr. */
5907e628
JL
921 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);
922 else if (code == 0x5a)
7e89635a 923 /* This is jmp. */
5907e628
JL
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. */
b34976b6 939 *again = TRUE;
5907e628
JL
940 }
941 break;
942 }
943
e804e836 944 /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
5907e628
JL
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);
dc810e39 956
5907e628
JL
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. */
bc7eab72 962 if ((int) gap >= -126 && (int) gap <= 130)
5907e628 963 {
bc7eab72 964 unsigned char code;
5907e628 965
bc7eab72 966 /* Note that we've changed the relocs, section contents,
5907e628 967 etc. */
bc7eab72
KH
968 elf_section_data (sec)->relocs = internal_relocs;
969 elf_section_data (sec)->this_hdr.contents = contents;
6cdc0ccc 970 symtab_hdr->contents = (unsigned char *) isymbuf;
5907e628 971
bc7eab72
KH
972 /* Get the opcode. */
973 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
5907e628
JL
974
975 if (code == 0x58)
976 {
977 /* bCC:16 -> bCC:8 */
7e89635a
KH
978 /* Get the second byte of the original insn, which
979 contains the condition code. */
5907e628 980 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
7e89635a
KH
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. */
5907e628
JL
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)
7e89635a 992 /* This is bsr. */
5907e628
JL
993 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);
994 else
bcb012d3
DD
995 /* Might be MOVSD. */
996 break;
5907e628
JL
997
998 /* Fix the relocation's type. */
bc7eab72 999 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
5907e628 1000 R_H8_PCREL8);
bc7eab72 1001 irel->r_offset--;
5907e628 1002
bc7eab72
KH
1003 /* Delete two bytes of data. */
1004 if (!elf32_h8_relax_delete_bytes (abfd, sec,
5907e628
JL
1005 irel->r_offset + 1, 2))
1006 goto error_return;
1007
bc7eab72 1008 /* That will change things, so, we should relax again.
5907e628 1009 Note that this is not required, and it may be slow. */
b34976b6 1010 *again = TRUE;
5907e628
JL
1011 }
1012 break;
1013 }
1014
630a7b0a
KH
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. */
5907e628
JL
1024 case R_H8_DIR16A8:
1025 {
7a9823f1 1026 bfd_vma value;
5907e628 1027
7a9823f1
RS
1028 value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1029 if (value >= 0xffffff00u)
5907e628 1030 {
bc7eab72 1031 unsigned char code;
ca9a79a1 1032 unsigned char temp_code;
5907e628 1033
bc7eab72 1034 /* Note that we've changed the relocs, section contents,
5907e628 1035 etc. */
bc7eab72
KH
1036 elf_section_data (sec)->relocs = internal_relocs;
1037 elf_section_data (sec)->this_hdr.contents = contents;
6cdc0ccc 1038 symtab_hdr->contents = (unsigned char *) isymbuf;
5907e628 1039
bc7eab72
KH
1040 /* Get the opcode. */
1041 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
5907e628 1042
630a7b0a
KH
1043 /* All instructions with R_H8_DIR16A8 start with
1044 0x6a. */
bc7eab72 1045 if (code != 0x6a)
5907e628
JL
1046 abort ();
1047
ca9a79a1 1048 temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
630a7b0a
KH
1049 /* If this is a mov.b instruction, clear the lower
1050 nibble, which contains the source/destination
1051 register number. */
ca9a79a1
NC
1052 if ((temp_code & 0x10) != 0x10)
1053 temp_code &= 0xf0;
5907e628 1054
ca9a79a1
NC
1055 switch (temp_code)
1056 {
1057 case 0x00:
630a7b0a 1058 /* This is mov.b @aa:16,Rd. */
ca9a79a1
NC
1059 bfd_put_8 (abfd, (code & 0xf) | 0x20,
1060 contents + irel->r_offset - 2);
1061 break;
1062 case 0x80:
630a7b0a 1063 /* This is mov.b Rs,@aa:16. */
ca9a79a1
NC
1064 bfd_put_8 (abfd, (code & 0xf) | 0x30,
1065 contents + irel->r_offset - 2);
1066 break;
1067 case 0x18:
630a7b0a
KH
1068 /* This is a bit-maniputation instruction that
1069 stores one bit into memory, one of "bclr",
1070 "bist", "bnot", "bset", and "bst". */
ca9a79a1
NC
1071 bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1072 break;
1073 case 0x10:
630a7b0a
KH
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". */
ca9a79a1
NC
1078 bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1079 break;
1080 default:
1081 abort ();
1082 }
5907e628 1083
bc7eab72
KH
1084 /* Fix the relocation's type. */
1085 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
5907e628
JL
1086 R_H8_DIR8);
1087
8c17da6e
NC
1088 /* Move the relocation. */
1089 irel->r_offset--;
1090
bc7eab72
KH
1091 /* Delete two bytes of data. */
1092 if (!elf32_h8_relax_delete_bytes (abfd, sec,
5907e628
JL
1093 irel->r_offset + 1, 2))
1094 goto error_return;
1095
bc7eab72 1096 /* That will change things, so, we should relax again.
5907e628 1097 Note that this is not required, and it may be slow. */
b34976b6 1098 *again = TRUE;
5907e628
JL
1099 }
1100 break;
1101 }
1102
630a7b0a
KH
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. */
5907e628
JL
1112 case R_H8_DIR24A8:
1113 {
7a9823f1 1114 bfd_vma value;
5907e628 1115
7a9823f1
RS
1116 value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1117 if (value >= 0xffffff00u)
5907e628 1118 {
bc7eab72 1119 unsigned char code;
ca9a79a1 1120 unsigned char temp_code;
5907e628 1121
bc7eab72 1122 /* Note that we've changed the relocs, section contents,
5907e628 1123 etc. */
bc7eab72
KH
1124 elf_section_data (sec)->relocs = internal_relocs;
1125 elf_section_data (sec)->this_hdr.contents = contents;
6cdc0ccc 1126 symtab_hdr->contents = (unsigned char *) isymbuf;
5907e628 1127
bc7eab72
KH
1128 /* Get the opcode. */
1129 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
5907e628 1130
630a7b0a
KH
1131 /* All instructions with R_H8_DIR24A8 start with
1132 0x6a. */
bc7eab72 1133 if (code != 0x6a)
5907e628
JL
1134 abort ();
1135
ca9a79a1
NC
1136 temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1137
630a7b0a
KH
1138 /* If this is a mov.b instruction, clear the lower
1139 nibble, which contains the source/destination
1140 register number. */
ca9a79a1
NC
1141 if ((temp_code & 0x30) != 0x30)
1142 temp_code &= 0xf0;
5907e628 1143
ca9a79a1 1144 switch (temp_code)
03d14457 1145 {
7a9823f1 1146 case 0x20:
630a7b0a 1147 /* This is mov.b @aa:24/32,Rd. */
03d14457
NC
1148 bfd_put_8 (abfd, (code & 0xf) | 0x20,
1149 contents + irel->r_offset - 2);
1150 break;
7a9823f1 1151 case 0xa0:
630a7b0a 1152 /* This is mov.b Rs,@aa:24/32. */
03d14457
NC
1153 bfd_put_8 (abfd, (code & 0xf) | 0x30,
1154 contents + irel->r_offset - 2);
1155 break;
ca9a79a1 1156 case 0x38:
630a7b0a
KH
1157 /* This is a bit-maniputation instruction that
1158 stores one bit into memory, one of "bclr",
1159 "bist", "bnot", "bset", and "bst". */
ca9a79a1
NC
1160 bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1161 break;
1162 case 0x30:
630a7b0a
KH
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". */
ca9a79a1
NC
1167 bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1168 break;
03d14457 1169 default:
ca9a79a1 1170 abort();
03d14457
NC
1171 }
1172
bc7eab72
KH
1173 /* Fix the relocation's type. */
1174 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
5907e628 1175 R_H8_DIR8);
7a9823f1 1176 irel->r_offset--;
5907e628 1177
bc7eab72 1178 /* Delete two bytes of data. */
7a9823f1
RS
1179 if (!elf32_h8_relax_delete_bytes (abfd, sec,
1180 irel->r_offset + 1, 4))
5907e628
JL
1181 goto error_return;
1182
bc7eab72 1183 /* That will change things, so, we should relax again.
5907e628 1184 Note that this is not required, and it may be slow. */
b34976b6 1185 *again = TRUE;
7a9823f1 1186 break;
5907e628
JL
1187 }
1188 }
1189
7e89635a
KH
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",
3255318a 1197 "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
5907e628 1198
7e89635a
KH
1199 We may relax this into an 16-bit absolute address if it's
1200 in the right range. */
5907e628
JL
1201 case R_H8_DIR32A16:
1202 {
7a9823f1 1203 bfd_vma value;
5907e628 1204
7a9823f1
RS
1205 value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1206 if (value <= 0x7fff || value >= 0xffff8000u)
5907e628 1207 {
bc7eab72 1208 unsigned char code;
bcb012d3
DD
1209 unsigned char op0, op1, op2, op3;
1210 unsigned char *op_ptr;
5907e628 1211
bc7eab72 1212 /* Note that we've changed the relocs, section contents,
5907e628 1213 etc. */
bc7eab72
KH
1214 elf_section_data (sec)->relocs = internal_relocs;
1215 elf_section_data (sec)->this_hdr.contents = contents;
6cdc0ccc 1216 symtab_hdr->contents = (unsigned char *) isymbuf;
5907e628 1217
bcb012d3
DD
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
bc7eab72
KH
1299 /* Get the opcode. */
1300 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
5907e628 1301
7e89635a
KH
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. */
bc7eab72 1305 code &= ~0x20;
5907e628 1306
bc7eab72 1307 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
5907e628 1308
bcb012d3 1309 r_h8_dir32a16_common:
bc7eab72
KH
1310 /* Fix the relocation's type. */
1311 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
8c17da6e 1312 R_H8_DIR16);
5907e628 1313
bc7eab72
KH
1314 /* Delete two bytes of data. */
1315 if (!elf32_h8_relax_delete_bytes (abfd, sec,
5907e628
JL
1316 irel->r_offset + 1, 2))
1317 goto error_return;
1318
bc7eab72 1319 /* That will change things, so, we should relax again.
5907e628 1320 Note that this is not required, and it may be slow. */
b34976b6 1321 *again = TRUE;
5907e628
JL
1322 }
1323 break;
1324 }
1325
1326 default:
1327 break;
1328 }
1329 }
1330
6cdc0ccc
AM
1331 if (isymbuf != NULL
1332 && symtab_hdr->contents != (unsigned char *) isymbuf)
5907e628 1333 {
6cdc0ccc
AM
1334 if (! link_info->keep_memory)
1335 free (isymbuf);
1336 else
1337 symtab_hdr->contents = (unsigned char *) isymbuf;
5907e628
JL
1338 }
1339
6cdc0ccc
AM
1340 if (contents != NULL
1341 && elf_section_data (sec)->this_hdr.contents != contents)
5907e628
JL
1342 {
1343 if (! link_info->keep_memory)
6cdc0ccc 1344 free (contents);
5907e628
JL
1345 else
1346 {
1347 /* Cache the section contents for elf_link_input_bfd. */
1348 elf_section_data (sec)->this_hdr.contents = contents;
1349 }
9ad5cbcf
AM
1350 }
1351
6cdc0ccc
AM
1352 if (internal_relocs != NULL
1353 && elf_section_data (sec)->relocs != internal_relocs)
1354 free (internal_relocs);
5907e628 1355
b34976b6 1356 return TRUE;
5907e628
JL
1357
1358 error_return:
6cdc0ccc
AM
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);
b34976b6 1368 return FALSE;
5907e628
JL
1369}
1370
1371/* Delete some bytes from a section while relaxing. */
1372
b34976b6 1373static bfd_boolean
c6baf75e 1374elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
5907e628
JL
1375{
1376 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 1377 unsigned int sec_shndx;
5907e628
JL
1378 bfd_byte *contents;
1379 Elf_Internal_Rela *irel, *irelend;
6cdc0ccc
AM
1380 Elf_Internal_Sym *isym;
1381 Elf_Internal_Sym *isymend;
5907e628 1382 bfd_vma toaddr;
9ad5cbcf
AM
1383 struct elf_link_hash_entry **sym_hashes;
1384 struct elf_link_hash_entry **end_hashes;
1385 unsigned int symcount;
5907e628 1386
9ad5cbcf 1387 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
5907e628
JL
1388
1389 contents = elf_section_data (sec)->this_hdr.contents;
1390
eea6121a 1391 toaddr = sec->size;
5907e628
JL
1392
1393 irel = elf_section_data (sec)->relocs;
1394 irelend = irel + sec->reloc_count;
1395
1396 /* Actually delete the bytes. */
dc810e39
AM
1397 memmove (contents + addr, contents + addr + count,
1398 (size_t) (toaddr - addr - count));
eea6121a 1399 sec->size -= count;
5907e628
JL
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. */
6cdc0ccc
AM
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++)
5907e628 1415 {
6cdc0ccc
AM
1416 if (isym->st_shndx == sec_shndx
1417 && isym->st_value > addr
1418 && isym->st_value < toaddr)
1419 isym->st_value -= count;
5907e628
JL
1420 }
1421
1422 /* Now adjust the global symbols defined in this section. */
9ad5cbcf
AM
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++)
5907e628 1428 {
9ad5cbcf
AM
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)
5907e628 1435 {
9ad5cbcf 1436 sym_hash->root.u.def.value -= count;
5907e628
JL
1437 }
1438 }
1439
b34976b6 1440 return TRUE;
5907e628
JL
1441}
1442
b34976b6
AM
1443/* Return TRUE if a symbol exists at the given address, else return
1444 FALSE. */
1445static bfd_boolean
c6baf75e 1446elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
5907e628
JL
1447{
1448 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 1449 unsigned int sec_shndx;
6cdc0ccc
AM
1450 Elf_Internal_Sym *isym;
1451 Elf_Internal_Sym *isymend;
9ad5cbcf
AM
1452 struct elf_link_hash_entry **sym_hashes;
1453 struct elf_link_hash_entry **end_hashes;
1454 unsigned int symcount;
5907e628 1455
9ad5cbcf 1456 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
5907e628
JL
1457
1458 /* Examine all the symbols. */
9ad5cbcf 1459 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6cdc0ccc
AM
1460 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1461 isymend = isym + symtab_hdr->sh_info;
1462 for (; isym < isymend; isym++)
5907e628 1463 {
6cdc0ccc
AM
1464 if (isym->st_shndx == sec_shndx
1465 && isym->st_value == addr)
b34976b6 1466 return TRUE;
5907e628
JL
1467 }
1468
9ad5cbcf
AM
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++)
5907e628 1474 {
9ad5cbcf
AM
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)
b34976b6 1480 return TRUE;
5907e628 1481 }
9ad5cbcf 1482
b34976b6 1483 return FALSE;
5907e628
JL
1484}
1485
1486/* This is a version of bfd_generic_get_relocated_section_contents
1487 which uses elf32_h8_relocate_section. */
1488
1489static bfd_byte *
c6baf75e
RS
1490elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1491 struct bfd_link_info *link_info,
1492 struct bfd_link_order *link_order,
1493 bfd_byte *data,
1494 bfd_boolean relocatable,
1495 asymbol **symbols)
5907e628
JL
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;
6cdc0ccc 1502 Elf_Internal_Sym *isymbuf = NULL;
5907e628
JL
1503
1504 /* We only need to handle the case of relaxing, or of having a
1505 particular set of section contents, specially. */
1049f94e 1506 if (relocatable
5907e628
JL
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,
1049f94e 1510 relocatable,
5907e628
JL
1511 symbols);
1512
1513 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1514
1515 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
eea6121a 1516 (size_t) input_section->size);
5907e628
JL
1517
1518 if ((input_section->flags & SEC_RELOC) != 0
1519 && input_section->reloc_count > 0)
1520 {
5907e628 1521 asection **secpp;
6cdc0ccc 1522 Elf_Internal_Sym *isym, *isymend;
9ad5cbcf 1523 bfd_size_type amt;
5907e628 1524
45d6a902 1525 internal_relocs = (_bfd_elf_link_read_relocs
5907e628 1526 (input_bfd, input_section, (PTR) NULL,
b34976b6 1527 (Elf_Internal_Rela *) NULL, FALSE));
5907e628
JL
1528 if (internal_relocs == NULL)
1529 goto error_return;
1530
6cdc0ccc
AM
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 }
5907e628 1541
9ad5cbcf
AM
1542 amt = symtab_hdr->sh_info;
1543 amt *= sizeof (asection *);
1544 sections = (asection **) bfd_malloc (amt);
1545 if (sections == NULL && amt != 0)
5907e628
JL
1546 goto error_return;
1547
6cdc0ccc
AM
1548 isymend = isymbuf + symtab_hdr->sh_info;
1549 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
5907e628
JL
1550 {
1551 asection *isec;
1552
6cdc0ccc 1553 if (isym->st_shndx == SHN_UNDEF)
5907e628 1554 isec = bfd_und_section_ptr;
6cdc0ccc 1555 else if (isym->st_shndx == SHN_ABS)
5907e628 1556 isec = bfd_abs_section_ptr;
6cdc0ccc 1557 else if (isym->st_shndx == SHN_COMMON)
5907e628
JL
1558 isec = bfd_com_section_ptr;
1559 else
6cdc0ccc 1560 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
5907e628
JL
1561
1562 *secpp = isec;
1563 }
1564
1565 if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1566 input_section, data, internal_relocs,
6cdc0ccc 1567 isymbuf, sections))
5907e628
JL
1568 goto error_return;
1569
1570 if (sections != NULL)
1571 free (sections);
6cdc0ccc
AM
1572 if (isymbuf != NULL
1573 && symtab_hdr->contents != (unsigned char *) isymbuf)
1574 free (isymbuf);
1575 if (elf_section_data (input_section)->relocs != internal_relocs)
5907e628 1576 free (internal_relocs);
5907e628
JL
1577 }
1578
1579 return data;
1580
1581 error_return:
5907e628
JL
1582 if (sections != NULL)
1583 free (sections);
6cdc0ccc
AM
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);
5907e628
JL
1590 return NULL;
1591}
1592
0a83638b 1593
e01b0e69
JR
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
157090f7 1600#define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
e01b0e69
JR
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
0a83638b
JL
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
e01b0e69
JR
1613/* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1614 defaults to using _bfd_generic_link_hash_table_create, but
c152c796 1615 bfd_elf_size_dynamic_sections uses
e01b0e69
JR
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
5e47149d
JL
1620/* Use an H8 specific linker, not the ELF generic linker. */
1621#define elf_backend_relocate_section elf32_h8_relocate_section
f0fe0e16 1622#define elf_backend_rela_normal 1
2627de83 1623#define elf_backend_can_gc_sections 1
5e47149d 1624
5907e628
JL
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
84477db9 1630#define elf_symbol_leading_char '_'
5907e628 1631
e01b0e69 1632#include "elf32-target.h"
This page took 0.740309 seconds and 4 git commands to generate.