More fixes related to NONE relocs
[deliverable/binutils-gdb.git] / bfd / elf32-m32c.c
1 /* M16C/M32C specific support for 32-bit ELF.
2 Copyright (C) 2005-2015 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "sysdep.h"
21 #include "bfd.h"
22 #include "libbfd.h"
23 #include "elf-bfd.h"
24 #include "elf/m32c.h"
25 #include "libiberty.h"
26
27 /* Forward declarations. */
28 static reloc_howto_type * m32c_reloc_type_lookup
29 (bfd *, bfd_reloc_code_real_type);
30 static void m32c_info_to_howto_rela
31 (bfd *, arelent *, Elf_Internal_Rela *);
32 static bfd_boolean m32c_elf_relocate_section
33 (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
34 static bfd_boolean m32c_elf_check_relocs
35 (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
36 static bfd_boolean m32c_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int);
37 #ifdef DEBUG
38 char * m32c_get_reloc (long reloc);
39 void dump_symtab (bfd *, void *, void *);
40 #endif
41 static bfd_boolean m32c_elf_relax_section
42 (bfd *abfd, asection *sec, struct bfd_link_info *link_info, bfd_boolean *again);
43
44
45 static reloc_howto_type m32c_elf_howto_table [] =
46 {
47 /* This reloc does nothing. */
48 HOWTO (R_M32C_NONE, /* type */
49 0, /* rightshift */
50 3, /* size (0 = byte, 1 = short, 2 = long) */
51 0, /* bitsize */
52 FALSE, /* pc_relative */
53 0, /* bitpos */
54 complain_overflow_dont, /* complain_on_overflow */
55 bfd_elf_generic_reloc, /* special_function */
56 "R_M32C_NONE", /* name */
57 FALSE, /* partial_inplace */
58 0, /* src_mask */
59 0, /* dst_mask */
60 FALSE), /* pcrel_offset */
61
62 /* GCC intentionally overflows these next two in order to work
63 around limitations in the addressing modes, so don't complain
64 about overflow. */
65 HOWTO (R_M32C_16, /* type */
66 0, /* rightshift */
67 1, /* size (0 = byte, 1 = short, 2 = long) */
68 16, /* bitsize */
69 FALSE, /* pc_relative */
70 0, /* bitpos */
71 complain_overflow_dont, /* complain_on_overflow */
72 bfd_elf_generic_reloc, /* special_function */
73 "R_M32C_16", /* name */
74 FALSE, /* partial_inplace */
75 0, /* src_mask */
76 0xffff, /* dst_mask */
77 FALSE), /* pcrel_offset */
78
79 HOWTO (R_M32C_24, /* type */
80 0, /* rightshift */
81 2, /* size (0 = byte, 1 = short, 2 = long) */
82 24, /* bitsize */
83 FALSE, /* pc_relative */
84 0, /* bitpos */
85 complain_overflow_dont, /* complain_on_overflow */
86 bfd_elf_generic_reloc, /* special_function */
87 "R_M32C_24", /* name */
88 FALSE, /* partial_inplace */
89 0, /* src_mask */
90 0xffffff, /* dst_mask */
91 FALSE), /* pcrel_offset */
92
93 HOWTO (R_M32C_32, /* type */
94 0, /* rightshift */
95 2, /* size (0 = byte, 1 = short, 2 = long) */
96 32, /* bitsize */
97 FALSE, /* pc_relative */
98 0, /* bitpos */
99 complain_overflow_bitfield, /* complain_on_overflow */
100 bfd_elf_generic_reloc, /* special_function */
101 "R_M32C_32", /* name */
102 FALSE, /* partial_inplace */
103 0, /* src_mask */
104 0xffffffff, /* dst_mask */
105 FALSE), /* pcrel_offset */
106
107 HOWTO (R_M32C_8_PCREL, /* type */
108 0, /* rightshift */
109 0, /* size (0 = byte, 1 = short, 2 = long) */
110 8, /* bitsize */
111 TRUE, /* pc_relative */
112 0, /* bitpos */
113 complain_overflow_signed, /* complain_on_overflow */
114 bfd_elf_generic_reloc, /* special_function */
115 "R_M32C_8_PCREL", /* name */
116 FALSE, /* partial_inplace */
117 0, /* src_mask */
118 0xff, /* dst_mask */
119 TRUE), /* pcrel_offset */
120
121 HOWTO (R_M32C_16_PCREL, /* type */
122 0, /* rightshift */
123 1, /* size (0 = byte, 1 = short, 2 = long) */
124 16, /* bitsize */
125 TRUE, /* pc_relative */
126 0, /* bitpos */
127 complain_overflow_signed, /* complain_on_overflow */
128 bfd_elf_generic_reloc, /* special_function */
129 "R_M32C_16_PCREL", /* name */
130 FALSE, /* partial_inplace */
131 0, /* src_mask */
132 0xffff, /* dst_mask */
133 TRUE), /* pcrel_offset */
134
135 HOWTO (R_M32C_8, /* type */
136 0, /* rightshift */
137 0, /* size (0 = byte, 1 = short, 2 = long) */
138 8, /* bitsize */
139 FALSE, /* pc_relative */
140 0, /* bitpos */
141 complain_overflow_unsigned, /* complain_on_overflow */
142 bfd_elf_generic_reloc, /* special_function */
143 "R_M32C_8", /* name */
144 FALSE, /* partial_inplace */
145 0, /* src_mask */
146 0xff, /* dst_mask */
147 FALSE), /* pcrel_offset */
148
149 HOWTO (R_M32C_LO16, /* type */
150 0, /* rightshift */
151 1, /* size (0 = byte, 1 = short, 2 = long) */
152 16, /* bitsize */
153 FALSE, /* pc_relative */
154 0, /* bitpos */
155 complain_overflow_dont, /* complain_on_overflow */
156 bfd_elf_generic_reloc, /* special_function */
157 "R_M32C_LO16", /* name */
158 FALSE, /* partial_inplace */
159 0, /* src_mask */
160 0xffff, /* dst_mask */
161 FALSE), /* pcrel_offset */
162
163 HOWTO (R_M32C_HI8, /* type */
164 0, /* rightshift */
165 0, /* size (0 = byte, 1 = short, 2 = long) */
166 8, /* bitsize */
167 FALSE, /* pc_relative */
168 0, /* bitpos */
169 complain_overflow_dont, /* complain_on_overflow */
170 bfd_elf_generic_reloc, /* special_function */
171 "R_M32C_HI8", /* name */
172 FALSE, /* partial_inplace */
173 0, /* src_mask */
174 0xff, /* dst_mask */
175 FALSE), /* pcrel_offset */
176
177 HOWTO (R_M32C_HI16, /* type */
178 0, /* rightshift */
179 1, /* size (0 = byte, 1 = short, 2 = long) */
180 16, /* bitsize */
181 FALSE, /* pc_relative */
182 0, /* bitpos */
183 complain_overflow_dont, /* complain_on_overflow */
184 bfd_elf_generic_reloc, /* special_function */
185 "R_M32C_HI16", /* name */
186 FALSE, /* partial_inplace */
187 0, /* src_mask */
188 0xffff, /* dst_mask */
189 FALSE), /* pcrel_offset */
190
191 HOWTO (R_M32C_RL_JUMP, /* type */
192 0, /* rightshift */
193 0, /* size (0 = byte, 1 = short, 2 = long) */
194 0, /* bitsize */
195 FALSE, /* pc_relative */
196 0, /* bitpos */
197 complain_overflow_signed, /* complain_on_overflow */
198 bfd_elf_generic_reloc, /* special_function */
199 "R_M32C_RL_JUMP", /* name */
200 FALSE, /* partial_inplace */
201 0, /* src_mask */
202 0, /* dst_mask */
203 FALSE), /* pcrel_offset */
204
205 HOWTO (R_M32C_RL_1ADDR, /* type */
206 0, /* rightshift */
207 0, /* size (0 = byte, 1 = short, 2 = long) */
208 0, /* bitsize */
209 FALSE, /* pc_relative */
210 0, /* bitpos */
211 complain_overflow_signed, /* complain_on_overflow */
212 bfd_elf_generic_reloc, /* special_function */
213 "R_M32C_RL_1ADDR", /* name */
214 FALSE, /* partial_inplace */
215 0, /* src_mask */
216 0, /* dst_mask */
217 FALSE), /* pcrel_offset */
218
219 HOWTO (R_M32C_RL_2ADDR, /* type */
220 0, /* rightshift */
221 0, /* size (0 = byte, 1 = short, 2 = long) */
222 0, /* bitsize */
223 FALSE, /* pc_relative */
224 0, /* bitpos */
225 complain_overflow_signed, /* complain_on_overflow */
226 bfd_elf_generic_reloc, /* special_function */
227 "R_M32C_RL_2ADDR", /* name */
228 FALSE, /* partial_inplace */
229 0, /* src_mask */
230 0, /* dst_mask */
231 FALSE), /* pcrel_offset */
232
233 };
234 \f
235 /* Map BFD reloc types to M32C ELF reloc types. */
236
237 struct m32c_reloc_map
238 {
239 bfd_reloc_code_real_type bfd_reloc_val;
240 unsigned int m32c_reloc_val;
241 };
242
243 static const struct m32c_reloc_map m32c_reloc_map [] =
244 {
245 { BFD_RELOC_NONE, R_M32C_NONE },
246 { BFD_RELOC_16, R_M32C_16 },
247 { BFD_RELOC_24, R_M32C_24 },
248 { BFD_RELOC_32, R_M32C_32 },
249 { BFD_RELOC_8_PCREL, R_M32C_8_PCREL },
250 { BFD_RELOC_16_PCREL, R_M32C_16_PCREL },
251 { BFD_RELOC_8, R_M32C_8 },
252 { BFD_RELOC_LO16, R_M32C_LO16 },
253 { BFD_RELOC_HI16, R_M32C_HI16 },
254 { BFD_RELOC_M32C_HI8, R_M32C_HI8 },
255 { BFD_RELOC_M32C_RL_JUMP, R_M32C_RL_JUMP },
256 { BFD_RELOC_M32C_RL_1ADDR, R_M32C_RL_1ADDR },
257 { BFD_RELOC_M32C_RL_2ADDR, R_M32C_RL_2ADDR }
258 };
259
260 static reloc_howto_type *
261 m32c_reloc_type_lookup
262 (bfd * abfd ATTRIBUTE_UNUSED,
263 bfd_reloc_code_real_type code)
264 {
265 unsigned int i;
266
267 for (i = ARRAY_SIZE (m32c_reloc_map); i--;)
268 if (m32c_reloc_map [i].bfd_reloc_val == code)
269 return & m32c_elf_howto_table [m32c_reloc_map[i].m32c_reloc_val];
270
271 return NULL;
272 }
273
274 static reloc_howto_type *
275 m32c_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
276 {
277 unsigned int i;
278
279 for (i = 0;
280 i < sizeof (m32c_elf_howto_table) / sizeof (m32c_elf_howto_table[0]);
281 i++)
282 if (m32c_elf_howto_table[i].name != NULL
283 && strcasecmp (m32c_elf_howto_table[i].name, r_name) == 0)
284 return &m32c_elf_howto_table[i];
285
286 return NULL;
287 }
288
289 /* Set the howto pointer for an M32C ELF reloc. */
290
291 static void
292 m32c_info_to_howto_rela
293 (bfd * abfd ATTRIBUTE_UNUSED,
294 arelent * cache_ptr,
295 Elf_Internal_Rela * dst)
296 {
297 unsigned int r_type;
298
299 r_type = ELF32_R_TYPE (dst->r_info);
300 if (r_type >= (unsigned int) R_M32C_max)
301 {
302 _bfd_error_handler (_("%A: invalid M32C reloc number: %d"), abfd, r_type);
303 r_type = 0;
304 }
305 cache_ptr->howto = & m32c_elf_howto_table [r_type];
306 }
307
308 \f
309
310 /* Relocate an M32C ELF section.
311 There is some attempt to make this function usable for many architectures,
312 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
313 if only to serve as a learning tool.
314
315 The RELOCATE_SECTION function is called by the new ELF backend linker
316 to handle the relocations for a section.
317
318 The relocs are always passed as Rela structures; if the section
319 actually uses Rel structures, the r_addend field will always be
320 zero.
321
322 This function is responsible for adjusting the section contents as
323 necessary, and (if using Rela relocs and generating a relocatable
324 output file) adjusting the reloc addend as necessary.
325
326 This function does not have to worry about setting the reloc
327 address or the reloc symbol index.
328
329 LOCAL_SYMS is a pointer to the swapped in local symbols.
330
331 LOCAL_SECTIONS is an array giving the section in the input file
332 corresponding to the st_shndx field of each local symbol.
333
334 The global hash table entry for the global symbols can be found
335 via elf_sym_hashes (input_bfd).
336
337 When generating relocatable output, this function must handle
338 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
339 going to be the section symbol corresponding to the output
340 section, which means that the addend must be adjusted
341 accordingly. */
342
343 static bfd_boolean
344 m32c_elf_relocate_section
345 (bfd * output_bfd ATTRIBUTE_UNUSED,
346 struct bfd_link_info * info,
347 bfd * input_bfd,
348 asection * input_section,
349 bfd_byte * contents,
350 Elf_Internal_Rela * relocs,
351 Elf_Internal_Sym * local_syms,
352 asection ** local_sections)
353 {
354 Elf_Internal_Shdr * symtab_hdr;
355 struct elf_link_hash_entry ** sym_hashes;
356 Elf_Internal_Rela * rel;
357 Elf_Internal_Rela * relend;
358 bfd *dynobj;
359 asection *splt;
360
361 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
362 sym_hashes = elf_sym_hashes (input_bfd);
363 relend = relocs + input_section->reloc_count;
364
365 dynobj = elf_hash_table (info)->dynobj;
366 splt = NULL;
367 if (dynobj != NULL)
368 splt = bfd_get_linker_section (dynobj, ".plt");
369
370 for (rel = relocs; rel < relend; rel ++)
371 {
372 reloc_howto_type * howto;
373 unsigned long r_symndx;
374 Elf_Internal_Sym * sym;
375 asection * sec;
376 struct elf_link_hash_entry * h;
377 bfd_vma relocation;
378 bfd_reloc_status_type r;
379 const char * name = NULL;
380 int r_type;
381
382 r_type = ELF32_R_TYPE (rel->r_info);
383
384 /* These are only used for relaxing; we don't actually relocate
385 anything with them, so skip them. */
386 if (r_type == R_M32C_RL_JUMP
387 || r_type == R_M32C_RL_1ADDR
388 || r_type == R_M32C_RL_2ADDR)
389 continue;
390
391 r_symndx = ELF32_R_SYM (rel->r_info);
392
393 howto = m32c_elf_howto_table + ELF32_R_TYPE (rel->r_info);
394 h = NULL;
395 sym = NULL;
396 sec = NULL;
397 relocation = 0;
398
399 if (r_symndx < symtab_hdr->sh_info)
400 {
401 sym = local_syms + r_symndx;
402 sec = local_sections [r_symndx];
403 relocation = (sec->output_section->vma
404 + sec->output_offset
405 + sym->st_value);
406
407 name = bfd_elf_string_from_elf_section
408 (input_bfd, symtab_hdr->sh_link, sym->st_name);
409 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
410 }
411 else
412 {
413 h = sym_hashes [r_symndx - symtab_hdr->sh_info];
414
415 if (info->wrap_hash != NULL
416 && (input_section->flags & SEC_DEBUGGING) != 0)
417 h = ((struct elf_link_hash_entry *)
418 unwrap_hash_lookup (info, input_bfd, &h->root));
419
420 while (h->root.type == bfd_link_hash_indirect
421 || h->root.type == bfd_link_hash_warning)
422 h = (struct elf_link_hash_entry *) h->root.u.i.link;
423
424 name = h->root.root.string;
425
426 if (h->root.type == bfd_link_hash_defined
427 || h->root.type == bfd_link_hash_defweak)
428 {
429 sec = h->root.u.def.section;
430 relocation = (h->root.u.def.value
431 + sec->output_section->vma
432 + sec->output_offset);
433 }
434 else if (h->root.type == bfd_link_hash_undefweak)
435 ;
436 else if (!info->relocatable)
437 {
438 if (! ((*info->callbacks->undefined_symbol)
439 (info, h->root.root.string, input_bfd,
440 input_section, rel->r_offset, TRUE)))
441 return FALSE;
442 }
443 }
444
445 if (sec != NULL && discarded_section (sec))
446 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
447 rel, 1, relend, howto, 0, contents);
448
449 if (info->relocatable)
450 {
451 /* This is a relocatable link. We don't have to change
452 anything, unless the reloc is against a section symbol,
453 in which case we have to adjust according to where the
454 section symbol winds up in the output section. */
455 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
456 rel->r_addend += sec->output_offset;
457 continue;
458 }
459
460 switch (ELF32_R_TYPE (rel->r_info))
461 {
462 case R_M32C_16:
463 {
464 bfd_vma *plt_offset;
465
466 if (h != NULL)
467 plt_offset = &h->plt.offset;
468 else
469 plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
470
471 /* printf("%s: rel %x plt %d\n", h ? h->root.root.string : "(none)",
472 relocation, *plt_offset);*/
473 if (relocation <= 0xffff)
474 {
475 /* If the symbol is in range for a 16-bit address, we should
476 have deallocated the plt entry in relax_section. */
477 BFD_ASSERT (*plt_offset == (bfd_vma) -1);
478 }
479 else
480 {
481 /* If the symbol is out of range for a 16-bit address,
482 we must have allocated a plt entry. */
483 BFD_ASSERT (*plt_offset != (bfd_vma) -1);
484
485 /* If this is the first time we've processed this symbol,
486 fill in the plt entry with the correct symbol address. */
487 if ((*plt_offset & 1) == 0)
488 {
489 unsigned int x;
490
491 x = 0x000000fc; /* jmpf */
492 x |= (relocation << 8) & 0xffffff00;
493 bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
494 *plt_offset |= 1;
495 }
496
497 relocation = (splt->output_section->vma
498 + splt->output_offset
499 + (*plt_offset & -2));
500 if (name)
501 {
502 char *newname = bfd_malloc (strlen(name)+5);
503 strcpy (newname, name);
504 strcat(newname, ".plt");
505 _bfd_generic_link_add_one_symbol (info,
506 input_bfd,
507 newname,
508 BSF_FUNCTION | BSF_WEAK,
509 splt,
510 (*plt_offset & -2),
511 0,
512 1,
513 0,
514 0);
515 }
516 }
517 }
518 break;
519
520 case R_M32C_HI8:
521 case R_M32C_HI16:
522 relocation >>= 16;
523 break;
524 }
525
526 #if 0
527 printf ("relocate %s at %06lx relocation %06lx addend %ld ",
528 m32c_elf_howto_table[ELF32_R_TYPE(rel->r_info)].name,
529 rel->r_offset + input_section->output_section->vma + input_section->output_offset,
530 relocation, rel->r_addend);
531 {
532 int i;
533 for (i=0; i<4; i++)
534 printf (" %02x", contents[rel->r_offset+i]);
535 printf ("\n");
536 }
537 #endif
538 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
539 contents, rel->r_offset, relocation,
540 rel->r_addend);
541
542 if (r != bfd_reloc_ok)
543 {
544 const char * msg = (const char *) NULL;
545
546 switch (r)
547 {
548 case bfd_reloc_overflow:
549 r = info->callbacks->reloc_overflow
550 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
551 input_bfd, input_section, rel->r_offset);
552 break;
553
554 case bfd_reloc_undefined:
555 r = info->callbacks->undefined_symbol
556 (info, name, input_bfd, input_section, rel->r_offset,
557 TRUE);
558 break;
559
560 case bfd_reloc_outofrange:
561 msg = _("internal error: out of range error");
562 break;
563
564 case bfd_reloc_notsupported:
565 msg = _("internal error: unsupported relocation error");
566 break;
567
568 case bfd_reloc_dangerous:
569 msg = _("internal error: dangerous relocation");
570 break;
571
572 default:
573 msg = _("internal error: unknown error");
574 break;
575 }
576
577 if (msg)
578 r = info->callbacks->warning
579 (info, msg, name, input_bfd, input_section, rel->r_offset);
580
581 if (! r)
582 return FALSE;
583 }
584 }
585
586 return TRUE;
587 }
588 \f
589 /* We support 16-bit pointers to code above 64k by generating a thunk
590 below 64k containing a JMP instruction to the final address. */
591
592 static bfd_boolean
593 m32c_elf_check_relocs
594 (bfd * abfd,
595 struct bfd_link_info * info,
596 asection * sec,
597 const Elf_Internal_Rela * relocs)
598 {
599 Elf_Internal_Shdr * symtab_hdr;
600 struct elf_link_hash_entry ** sym_hashes;
601 const Elf_Internal_Rela * rel;
602 const Elf_Internal_Rela * rel_end;
603 bfd_vma *local_plt_offsets;
604 asection *splt;
605 bfd *dynobj;
606
607 if (info->relocatable)
608 return TRUE;
609
610 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
611 sym_hashes = elf_sym_hashes (abfd);
612 local_plt_offsets = elf_local_got_offsets (abfd);
613 splt = NULL;
614 dynobj = elf_hash_table(info)->dynobj;
615
616 rel_end = relocs + sec->reloc_count;
617 for (rel = relocs; rel < rel_end; rel++)
618 {
619 struct elf_link_hash_entry *h;
620 unsigned long r_symndx;
621 bfd_vma *offset;
622
623 r_symndx = ELF32_R_SYM (rel->r_info);
624 if (r_symndx < symtab_hdr->sh_info)
625 h = NULL;
626 else
627 {
628 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
629 while (h->root.type == bfd_link_hash_indirect
630 || h->root.type == bfd_link_hash_warning)
631 h = (struct elf_link_hash_entry *) h->root.u.i.link;
632
633 /* PR15323, ref flags aren't set for references in the same
634 object. */
635 h->root.non_ir_ref = 1;
636 }
637
638 switch (ELF32_R_TYPE (rel->r_info))
639 {
640 /* This relocation describes a 16-bit pointer to a function.
641 We may need to allocate a thunk in low memory; reserve memory
642 for it now. */
643 case R_M32C_16:
644 if (dynobj == NULL)
645 elf_hash_table (info)->dynobj = dynobj = abfd;
646 if (splt == NULL)
647 {
648 splt = bfd_get_linker_section (dynobj, ".plt");
649 if (splt == NULL)
650 {
651 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
652 | SEC_IN_MEMORY | SEC_LINKER_CREATED
653 | SEC_READONLY | SEC_CODE);
654 splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
655 flags);
656 if (splt == NULL
657 || ! bfd_set_section_alignment (dynobj, splt, 1))
658 return FALSE;
659 }
660 }
661
662 if (h != NULL)
663 offset = &h->plt.offset;
664 else
665 {
666 if (local_plt_offsets == NULL)
667 {
668 size_t size;
669 unsigned int i;
670
671 size = symtab_hdr->sh_info * sizeof (bfd_vma);
672 local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
673 if (local_plt_offsets == NULL)
674 return FALSE;
675 elf_local_got_offsets (abfd) = local_plt_offsets;
676
677 for (i = 0; i < symtab_hdr->sh_info; i++)
678 local_plt_offsets[i] = (bfd_vma) -1;
679 }
680 offset = &local_plt_offsets[r_symndx];
681 }
682
683 if (*offset == (bfd_vma) -1)
684 {
685 *offset = splt->size;
686 splt->size += 4;
687 }
688 break;
689 }
690 }
691
692 return TRUE;
693 }
694
695 /* This must exist if dynobj is ever set. */
696
697 static bfd_boolean
698 m32c_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
699 struct bfd_link_info *info)
700 {
701 bfd *dynobj;
702 asection *splt;
703
704 /* As an extra sanity check, verify that all plt entries have
705 been filled in. */
706
707 if ((dynobj = elf_hash_table (info)->dynobj) != NULL
708 && (splt = bfd_get_linker_section (dynobj, ".plt")) != NULL)
709 {
710 bfd_byte *contents = splt->contents;
711 unsigned int i, size = splt->size;
712 for (i = 0; i < size; i += 4)
713 {
714 unsigned int x = bfd_get_32 (dynobj, contents + i);
715 BFD_ASSERT (x != 0);
716 }
717 }
718
719 return TRUE;
720 }
721
722 static bfd_boolean
723 m32c_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
724 struct bfd_link_info *info)
725 {
726 bfd *dynobj;
727 asection *splt;
728
729 if (info->relocatable)
730 return TRUE;
731
732 dynobj = elf_hash_table (info)->dynobj;
733 if (dynobj == NULL)
734 return TRUE;
735
736 splt = bfd_get_linker_section (dynobj, ".plt");
737 BFD_ASSERT (splt != NULL);
738
739 splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
740 if (splt->contents == NULL)
741 return FALSE;
742
743 return TRUE;
744 }
745 \f
746 /* Function to set the ELF flag bits. */
747
748 static bfd_boolean
749 m32c_elf_set_private_flags (bfd *abfd, flagword flags)
750 {
751 elf_elfheader (abfd)->e_flags = flags;
752 elf_flags_init (abfd) = TRUE;
753 return TRUE;
754 }
755
756 /* Merge backend specific data from an object file to the output
757 object file when linking. */
758
759 static bfd_boolean
760 m32c_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
761 {
762 flagword old_flags, old_partial;
763 flagword new_flags, new_partial;
764 bfd_boolean error = FALSE;
765 char new_opt[80];
766 char old_opt[80];
767
768 new_opt[0] = old_opt[0] = '\0';
769 new_flags = elf_elfheader (ibfd)->e_flags;
770 old_flags = elf_elfheader (obfd)->e_flags;
771
772 #ifdef DEBUG
773 (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
774 old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
775 bfd_get_filename (ibfd));
776 #endif
777
778 if (!elf_flags_init (obfd))
779 {
780 /* First call, no flags set. */
781 elf_flags_init (obfd) = TRUE;
782 elf_elfheader (obfd)->e_flags = new_flags;
783 }
784
785 else if (new_flags == old_flags)
786 /* Compatible flags are ok. */
787 ;
788
789 else /* Possibly incompatible flags. */
790 {
791 /* Warn if different cpu is used (allow a specific cpu to override
792 the generic cpu). */
793 new_partial = (new_flags & EF_M32C_CPU_MASK);
794 old_partial = (old_flags & EF_M32C_CPU_MASK);
795 if (new_partial == old_partial)
796 ;
797
798 else
799 {
800 switch (new_partial)
801 {
802 default: strcat (new_opt, " -m16c"); break;
803 case EF_M32C_CPU_M16C: strcat (new_opt, " -m16c"); break;
804 case EF_M32C_CPU_M32C: strcat (new_opt, " -m32c"); break;
805 }
806
807 switch (old_partial)
808 {
809 default: strcat (old_opt, " -m16c"); break;
810 case EF_M32C_CPU_M16C: strcat (old_opt, " -m16c"); break;
811 case EF_M32C_CPU_M32C: strcat (old_opt, " -m32c"); break;
812 }
813 }
814
815 /* Print out any mismatches from above. */
816 if (new_opt[0])
817 {
818 error = TRUE;
819 (*_bfd_error_handler)
820 (_("%s: compiled with %s and linked with modules compiled with %s"),
821 bfd_get_filename (ibfd), new_opt, old_opt);
822 }
823
824 new_flags &= ~ EF_M32C_ALL_FLAGS;
825 old_flags &= ~ EF_M32C_ALL_FLAGS;
826
827 /* Warn about any other mismatches. */
828 if (new_flags != old_flags)
829 {
830 error = TRUE;
831 (*_bfd_error_handler)
832 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
833 bfd_get_filename (ibfd), (long)new_flags, (long)old_flags);
834 }
835 }
836
837 if (error)
838 bfd_set_error (bfd_error_bad_value);
839
840 return !error;
841 }
842
843 \f
844 static bfd_boolean
845 m32c_elf_print_private_bfd_data (bfd *abfd, void *ptr)
846 {
847 FILE *file = (FILE *) ptr;
848 flagword flags;
849
850 BFD_ASSERT (abfd != NULL && ptr != NULL);
851
852 /* Print normal ELF private data. */
853 _bfd_elf_print_private_bfd_data (abfd, ptr);
854
855 flags = elf_elfheader (abfd)->e_flags;
856 fprintf (file, _("private flags = 0x%lx:"), (unsigned long) flags);
857
858 switch (flags & EF_M32C_CPU_MASK)
859 {
860 default: break;
861 case EF_M32C_CPU_M16C: fprintf (file, " -m16c"); break;
862 case EF_M32C_CPU_M32C: fprintf (file, " -m32c"); break;
863 }
864
865 fputc ('\n', file);
866 return TRUE;
867 }
868
869 /* Return the MACH for an e_flags value. */
870
871 static int
872 elf32_m32c_machine (bfd *abfd)
873 {
874 switch (elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK)
875 {
876 case EF_M32C_CPU_M16C: return bfd_mach_m16c;
877 case EF_M32C_CPU_M32C: return bfd_mach_m32c;
878 }
879
880 return bfd_mach_m16c;
881 }
882
883 static bfd_boolean
884 m32c_elf_object_p (bfd *abfd)
885 {
886 bfd_default_set_arch_mach (abfd, bfd_arch_m32c,
887 elf32_m32c_machine (abfd));
888 return TRUE;
889 }
890 \f
891
892 #ifdef DEBUG
893 void
894 dump_symtab (bfd * abfd, void *internal_syms, void *external_syms)
895 {
896 size_t locsymcount;
897 Elf_Internal_Sym *isymbuf;
898 Elf_Internal_Sym *isymend;
899 Elf_Internal_Sym *isym;
900 Elf_Internal_Shdr *symtab_hdr;
901 bfd_boolean free_internal = 0, free_external = 0;
902 char * st_info_str;
903 char * st_info_stb_str;
904 char * st_other_str;
905 char * st_shndx_str;
906
907 if (! internal_syms)
908 {
909 internal_syms = bfd_malloc (1000);
910 free_internal = 1;
911 }
912 if (! external_syms)
913 {
914 external_syms = bfd_malloc (1000);
915 free_external = 1;
916 }
917
918 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
919 locsymcount = symtab_hdr->sh_size / get_elf_backend_data(abfd)->s->sizeof_sym;
920 if (free_internal)
921 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
922 symtab_hdr->sh_info, 0,
923 internal_syms, external_syms, NULL);
924 else
925 isymbuf = internal_syms;
926 isymend = isymbuf + locsymcount;
927
928 for (isym = isymbuf ; isym < isymend ; isym++)
929 {
930 switch (ELF_ST_TYPE (isym->st_info))
931 {
932 case STT_FUNC:
933 st_info_str = "STT_FUNC";
934 break;
935
936 case STT_SECTION:
937 st_info_str = "STT_SECTION";
938 break;
939
940 case STT_FILE:
941 st_info_str = "STT_FILE";
942 break;
943
944 case STT_OBJECT:
945 st_info_str = "STT_OBJECT";
946 break;
947
948 case STT_TLS:
949 st_info_str = "STT_TLS";
950 break;
951
952 default:
953 st_info_str = "";
954 }
955
956 switch (ELF_ST_BIND (isym->st_info))
957 {
958 case STB_LOCAL:
959 st_info_stb_str = "STB_LOCAL";
960 break;
961
962 case STB_GLOBAL:
963 st_info_stb_str = "STB_GLOBAL";
964 break;
965
966 default:
967 st_info_stb_str = "";
968 }
969
970 switch (ELF_ST_VISIBILITY (isym->st_other))
971 {
972 case STV_DEFAULT:
973 st_other_str = "STV_DEFAULT";
974 break;
975
976 case STV_INTERNAL:
977 st_other_str = "STV_INTERNAL";
978 break;
979
980 case STV_PROTECTED:
981 st_other_str = "STV_PROTECTED";
982 break;
983
984 default:
985 st_other_str = "";
986 }
987
988 switch (isym->st_shndx)
989 {
990 case SHN_ABS:
991 st_shndx_str = "SHN_ABS";
992 break;
993
994 case SHN_COMMON:
995 st_shndx_str = "SHN_COMMON";
996 break;
997
998 case SHN_UNDEF:
999 st_shndx_str = "SHN_UNDEF";
1000 break;
1001
1002 default:
1003 st_shndx_str = "";
1004 }
1005
1006 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
1007 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
1008 isym,
1009 (unsigned long) isym->st_value,
1010 (unsigned long) isym->st_size,
1011 isym->st_name,
1012 bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
1013 isym->st_name),
1014 isym->st_info, st_info_str, st_info_stb_str,
1015 isym->st_other, st_other_str,
1016 isym->st_shndx, st_shndx_str);
1017 }
1018 if (free_internal)
1019 free (internal_syms);
1020 if (free_external)
1021 free (external_syms);
1022 }
1023
1024 char *
1025 m32c_get_reloc (long reloc)
1026 {
1027 if (0 <= reloc && reloc < R_M32C_max)
1028 return m32c_elf_howto_table[reloc].name;
1029 else
1030 return "";
1031 }
1032 #endif /* DEBUG */
1033
1034 /* Handle relaxing. */
1035
1036 /* A subroutine of m32c_elf_relax_section. If the global symbol H
1037 is within the low 64k, remove any entry for it in the plt. */
1038
1039 struct relax_plt_data
1040 {
1041 asection *splt;
1042 bfd_boolean *again;
1043 };
1044
1045 static bfd_boolean
1046 m32c_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1047 {
1048 struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1049
1050 if (h->plt.offset != (bfd_vma) -1)
1051 {
1052 bfd_vma address;
1053
1054 if (h->root.type == bfd_link_hash_undefined
1055 || h->root.type == bfd_link_hash_undefweak)
1056 address = 0;
1057 else
1058 address = (h->root.u.def.section->output_section->vma
1059 + h->root.u.def.section->output_offset
1060 + h->root.u.def.value);
1061
1062 if (address <= 0xffff)
1063 {
1064 h->plt.offset = -1;
1065 data->splt->size -= 4;
1066 *data->again = TRUE;
1067 }
1068 }
1069
1070 return TRUE;
1071 }
1072
1073 /* A subroutine of m32c_elf_relax_section. If the global symbol H
1074 previously had a plt entry, give it a new entry offset. */
1075
1076 static bfd_boolean
1077 m32c_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1078 {
1079 bfd_vma *entry = (bfd_vma *) xdata;
1080
1081 if (h->plt.offset != (bfd_vma) -1)
1082 {
1083 h->plt.offset = *entry;
1084 *entry += 4;
1085 }
1086
1087 return TRUE;
1088 }
1089
1090 static bfd_boolean
1091 m32c_elf_relax_plt_section (asection *splt,
1092 struct bfd_link_info *info,
1093 bfd_boolean *again)
1094 {
1095 struct relax_plt_data relax_plt_data;
1096 bfd *ibfd;
1097
1098 /* Assume nothing changes. */
1099 *again = FALSE;
1100
1101 if (info->relocatable)
1102 return TRUE;
1103
1104 /* Quick check for an empty plt. */
1105 if (splt->size == 0)
1106 return TRUE;
1107
1108 /* Map across all global symbols; see which ones happen to
1109 fall in the low 64k. */
1110 relax_plt_data.splt = splt;
1111 relax_plt_data.again = again;
1112 elf_link_hash_traverse (elf_hash_table (info), m32c_relax_plt_check,
1113 &relax_plt_data);
1114
1115 /* Likewise for local symbols, though that's somewhat less convenient
1116 as we have to walk the list of input bfds and swap in symbol data. */
1117 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1118 {
1119 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1120 Elf_Internal_Shdr *symtab_hdr;
1121 Elf_Internal_Sym *isymbuf = NULL;
1122 unsigned int idx;
1123
1124 if (! local_plt_offsets)
1125 continue;
1126
1127 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1128 if (symtab_hdr->sh_info != 0)
1129 {
1130 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1131 if (isymbuf == NULL)
1132 isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1133 symtab_hdr->sh_info, 0,
1134 NULL, NULL, NULL);
1135 if (isymbuf == NULL)
1136 return FALSE;
1137 }
1138
1139 for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1140 {
1141 Elf_Internal_Sym *isym;
1142 asection *tsec;
1143 bfd_vma address;
1144
1145 if (local_plt_offsets[idx] == (bfd_vma) -1)
1146 continue;
1147
1148 isym = &isymbuf[idx];
1149 if (isym->st_shndx == SHN_UNDEF)
1150 continue;
1151 else if (isym->st_shndx == SHN_ABS)
1152 tsec = bfd_abs_section_ptr;
1153 else if (isym->st_shndx == SHN_COMMON)
1154 tsec = bfd_com_section_ptr;
1155 else
1156 tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1157
1158 address = (tsec->output_section->vma
1159 + tsec->output_offset
1160 + isym->st_value);
1161 if (address <= 0xffff)
1162 {
1163 local_plt_offsets[idx] = -1;
1164 splt->size -= 4;
1165 *again = TRUE;
1166 }
1167 }
1168
1169 if (isymbuf != NULL
1170 && symtab_hdr->contents != (unsigned char *) isymbuf)
1171 {
1172 if (! info->keep_memory)
1173 free (isymbuf);
1174 else
1175 {
1176 /* Cache the symbols for elf_link_input_bfd. */
1177 symtab_hdr->contents = (unsigned char *) isymbuf;
1178 }
1179 }
1180 }
1181
1182 /* If we changed anything, walk the symbols again to reallocate
1183 .plt entry addresses. */
1184 if (*again && splt->size > 0)
1185 {
1186 bfd_vma entry = 0;
1187
1188 elf_link_hash_traverse (elf_hash_table (info),
1189 m32c_relax_plt_realloc, &entry);
1190
1191 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1192 {
1193 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1194 unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1195 unsigned int idx;
1196
1197 if (! local_plt_offsets)
1198 continue;
1199
1200 for (idx = 0; idx < nlocals; ++idx)
1201 if (local_plt_offsets[idx] != (bfd_vma) -1)
1202 {
1203 local_plt_offsets[idx] = entry;
1204 entry += 4;
1205 }
1206 }
1207 }
1208
1209 return TRUE;
1210 }
1211
1212 static int
1213 compare_reloc (const void *e1, const void *e2)
1214 {
1215 const Elf_Internal_Rela *i1 = (const Elf_Internal_Rela *) e1;
1216 const Elf_Internal_Rela *i2 = (const Elf_Internal_Rela *) e2;
1217
1218 if (i1->r_offset == i2->r_offset)
1219 return 0;
1220 else
1221 return i1->r_offset < i2->r_offset ? -1 : 1;
1222 }
1223
1224 #define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms)
1225 static bfd_vma
1226 m32c_offset_for_reloc (bfd *abfd,
1227 Elf_Internal_Rela *rel,
1228 Elf_Internal_Shdr *symtab_hdr,
1229 Elf_External_Sym_Shndx *shndx_buf ATTRIBUTE_UNUSED,
1230 Elf_Internal_Sym *intsyms)
1231 {
1232 bfd_vma symval;
1233
1234 /* Get the value of the symbol referred to by the reloc. */
1235 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1236 {
1237 /* A local symbol. */
1238 Elf_Internal_Sym *isym;
1239 asection *ssec;
1240
1241 isym = intsyms + ELF32_R_SYM (rel->r_info);
1242 ssec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1243 symval = isym->st_value;
1244 if (ssec)
1245 symval += ssec->output_section->vma
1246 + ssec->output_offset;
1247 }
1248 else
1249 {
1250 unsigned long indx;
1251 struct elf_link_hash_entry *h;
1252
1253 /* An external symbol. */
1254 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1255 h = elf_sym_hashes (abfd)[indx];
1256 BFD_ASSERT (h != NULL);
1257
1258 if (h->root.type != bfd_link_hash_defined
1259 && h->root.type != bfd_link_hash_defweak)
1260 /* This appears to be a reference to an undefined
1261 symbol. Just ignore it--it will be caught by the
1262 regular reloc processing. */
1263 return 0;
1264
1265 symval = (h->root.u.def.value
1266 + h->root.u.def.section->output_section->vma
1267 + h->root.u.def.section->output_offset);
1268 }
1269 return symval;
1270 }
1271
1272 static int bytes_saved = 0;
1273
1274 static int bytes_to_reloc[] = {
1275 R_M32C_NONE,
1276 R_M32C_8,
1277 R_M32C_16,
1278 R_M32C_24,
1279 R_M32C_32
1280 };
1281
1282 /* What we use the bits in a relax reloc addend (R_M32C_RL_*) for. */
1283
1284 /* Mask for the number of relocs associated with this insn. */
1285 #define RLA_RELOCS 0x0000000f
1286 /* Number of bytes gas emitted (before gas's relaxing) */
1287 #define RLA_NBYTES 0x00000ff0
1288
1289 /* If the displacement is within the given range and the new encoding
1290 differs from the old encoding (the index), then the insn can be
1291 relaxed to the new encoding. */
1292 typedef struct {
1293 int bytes;
1294 unsigned int max_disp;
1295 unsigned char new_encoding;
1296 } EncodingTable;
1297
1298 static EncodingTable m16c_addr_encodings[] = {
1299 { 0, 0, 0 }, /* R0 */
1300 { 0, 0, 1 }, /* R1 */
1301 { 0, 0, 2 }, /* R2 */
1302 { 0, 0, 3 }, /* R3 */
1303 { 0, 0, 4 }, /* A0 */
1304 { 0, 0, 5 }, /* A1 */
1305 { 0, 0, 6 }, /* [A0] */
1306 { 0, 0, 7 }, /* [A1] */
1307 { 1, 0, 6 }, /* udsp:8[A0] */
1308 { 1, 0, 7 }, /* udsp:8[A1] */
1309 { 1, 0, 10 }, /* udsp:8[SB] */
1310 { 1, 0, 11 }, /* sdsp:8[FB] */
1311 { 2, 255, 8 }, /* udsp:16[A0] */
1312 { 2, 255, 9 }, /* udsp:16[A1] */
1313 { 2, 255, 10 }, /* udsp:16[SB] */
1314 { 2, 0, 15 }, /* abs:16 */
1315 };
1316
1317 static EncodingTable m16c_jmpaddr_encodings[] = {
1318 { 0, 0, 0 }, /* R0 */
1319 { 0, 0, 1 }, /* R1 */
1320 { 0, 0, 2 }, /* R2 */
1321 { 0, 0, 3 }, /* R3 */
1322 { 0, 0, 4 }, /* A0 */
1323 { 0, 0, 5 }, /* A1 */
1324 { 0, 0, 6 }, /* [A0] */
1325 { 0, 0, 7 }, /* [A1] */
1326 { 1, 0, 6 }, /* udsp:8[A0] */
1327 { 1, 0, 7 }, /* udsp:8[A1] */
1328 { 1, 0, 10 }, /* udsp:8[SB] */
1329 { 1, 0, 11 }, /* sdsp:8[FB] */
1330 { 3, 255, 8 }, /* udsp:20[A0] */
1331 { 3, 255, 9 }, /* udsp:20[A1] */
1332 { 2, 255, 10 }, /* udsp:16[SB] */
1333 { 2, 0, 15 }, /* abs:16 */
1334 };
1335
1336 static EncodingTable m32c_addr_encodings[] = {
1337 { 0, 0, 0 }, /* [A0] */
1338 { 0, 0, 1 }, /* [A1] */
1339 { 0, 0, 2 }, /* A0 */
1340 { 0, 0, 3 }, /* A1 */
1341 { 1, 0, 0 }, /* udsp:8[A0] */
1342 { 1, 0, 1 }, /* udsp:8[A1] */
1343 { 1, 0, 6 }, /* udsp:8[SB] */
1344 { 1, 0, 7 }, /* sdsp:8[FB] */
1345 { 2, 255, 4 }, /* udsp:16[A0] */
1346 { 2, 255, 5 }, /* udsp:16[A1] */
1347 { 2, 255, 6 }, /* udsp:16[SB] */
1348 { 2, 127, 7 }, /* sdsp:16[FB] */
1349 { 3, 65535, 8 }, /* udsp:24[A0] */
1350 { 3, 65535, 9 }, /* udsp:24[A1] */
1351 { 3, 65535, 15 }, /* abs24 */
1352 { 2, 0, 15 }, /* abs16 */
1353 { 0, 0, 16 }, /* R2 */
1354 { 0, 0, 17 }, /* R3 */
1355 { 0, 0, 18 }, /* R0 */
1356 { 0, 0, 19 }, /* R1 */
1357 { 0, 0, 20 }, /* */
1358 { 0, 0, 21 }, /* */
1359 { 0, 0, 22 }, /* */
1360 { 0, 0, 23 }, /* */
1361 { 0, 0, 24 }, /* */
1362 { 0, 0, 25 }, /* */
1363 { 0, 0, 26 }, /* */
1364 { 0, 0, 27 }, /* */
1365 { 0, 0, 28 }, /* */
1366 { 0, 0, 29 }, /* */
1367 { 0, 0, 30 }, /* */
1368 { 0, 0, 31 }, /* */
1369 };
1370
1371 static bfd_boolean
1372 m32c_elf_relax_section
1373 (bfd * abfd,
1374 asection * sec,
1375 struct bfd_link_info * link_info,
1376 bfd_boolean * again)
1377 {
1378 Elf_Internal_Shdr *symtab_hdr;
1379 Elf_Internal_Shdr *shndx_hdr;
1380 Elf_Internal_Rela *internal_relocs;
1381 Elf_Internal_Rela *free_relocs = NULL;
1382 Elf_Internal_Rela *irel, *irelend, *srel;
1383 bfd_byte * contents = NULL;
1384 bfd_byte * free_contents = NULL;
1385 Elf_Internal_Sym *intsyms = NULL;
1386 Elf_Internal_Sym *free_intsyms = NULL;
1387 Elf_External_Sym_Shndx *shndx_buf = NULL;
1388 int machine;
1389
1390 if (abfd == elf_hash_table (link_info)->dynobj
1391 && (sec->flags & SEC_LINKER_CREATED) != 0
1392 && strcmp (sec->name, ".plt") == 0)
1393 return m32c_elf_relax_plt_section (sec, link_info, again);
1394
1395 /* Assume nothing changes. */
1396 *again = FALSE;
1397
1398 machine = elf32_m32c_machine (abfd);
1399
1400 /* We don't have to do anything for a relocatable link, if
1401 this section does not have relocs, or if this is not a
1402 code section. */
1403 if (link_info->relocatable
1404 || (sec->flags & SEC_RELOC) == 0
1405 || sec->reloc_count == 0
1406 || (sec->flags & SEC_CODE) == 0)
1407 return TRUE;
1408
1409 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1410 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
1411
1412 /* Get the section contents. */
1413 if (elf_section_data (sec)->this_hdr.contents != NULL)
1414 contents = elf_section_data (sec)->this_hdr.contents;
1415 /* Go get them off disk. */
1416 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1417 goto error_return;
1418
1419 /* Read this BFD's symbols. */
1420 /* Get cached copy if it exists. */
1421 if (symtab_hdr->contents != NULL)
1422 {
1423 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1424 }
1425 else
1426 {
1427 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
1428 symtab_hdr->contents = (bfd_byte *) intsyms;
1429 }
1430
1431 if (shndx_hdr->sh_size != 0)
1432 {
1433 bfd_size_type amt;
1434
1435 amt = symtab_hdr->sh_info;
1436 amt *= sizeof (Elf_External_Sym_Shndx);
1437 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
1438 if (shndx_buf == NULL)
1439 goto error_return;
1440 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
1441 || bfd_bread (shndx_buf, amt, abfd) != amt)
1442 goto error_return;
1443 shndx_hdr->contents = (bfd_byte *) shndx_buf;
1444 }
1445
1446 /* Get a copy of the native relocations. */
1447 internal_relocs = (_bfd_elf_link_read_relocs
1448 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
1449 link_info->keep_memory));
1450 if (internal_relocs == NULL)
1451 goto error_return;
1452 if (! link_info->keep_memory)
1453 free_relocs = internal_relocs;
1454
1455 /* The RL_ relocs must be just before the operand relocs they go
1456 with, so we must sort them to guarantee this. */
1457 qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
1458 compare_reloc);
1459
1460 /* Walk through them looking for relaxing opportunities. */
1461 irelend = internal_relocs + sec->reloc_count;
1462
1463 for (irel = internal_relocs; irel < irelend; irel++)
1464 {
1465 bfd_vma symval;
1466 unsigned char *insn, *gap, *einsn;
1467 bfd_vma pc;
1468 bfd_signed_vma pcrel;
1469 int relax_relocs;
1470 int gap_size;
1471 int new_type;
1472 int posn;
1473 int enc;
1474 EncodingTable *enctbl;
1475 EncodingTable *e;
1476
1477 if (ELF32_R_TYPE(irel->r_info) != R_M32C_RL_JUMP
1478 && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_1ADDR
1479 && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_2ADDR)
1480 continue;
1481
1482 srel = irel;
1483
1484 /* There will always be room for the relaxed insn, since it is smaller
1485 than the one it would replace. */
1486 BFD_ASSERT (irel->r_offset < sec->size);
1487
1488 insn = contents + irel->r_offset;
1489 relax_relocs = irel->r_addend % 16;
1490
1491 /* Ok, we only have three relocs we care about, and they're all
1492 fake. The lower four bits of the addend is always the number
1493 of following relocs (hence the qsort above) that are assigned
1494 to this opcode. The next 8 bits of the addend indicates the
1495 number of bytes in the insn. We use the rest of them
1496 ourselves as flags for the more expensive operations (defines
1497 above). The three relocs are:
1498
1499 RL_JUMP: This marks all direct jump insns. We check the
1500 displacement and replace them with shorter jumps if
1501 they're in range. We also use this to find JMP.S
1502 insns and manually shorten them when we delete bytes.
1503 We have to decode these insns to figure out what to
1504 do.
1505
1506 RL_1ADDR: This is a :G or :Q insn, which has a single
1507 "standard" operand. We have to extract the type
1508 field, see if it's a wide displacement, then figure
1509 out if we can replace it with a narrow displacement.
1510 We don't have to decode these insns.
1511
1512 RL_2ADDR: Similarly, but two "standard" operands. Note that
1513 r_addend may still be 1, as standard operands don't
1514 always have displacements. Gas shouldn't give us one
1515 with zero operands, but since we don't know which one
1516 has the displacement, we check them both anyway.
1517
1518 These all point to the beginning of the insn itself, not the
1519 operands.
1520
1521 Note that we only relax one step at a time, relying on the
1522 linker to call us repeatedly. Thus, there is no code for
1523 JMP.A->JMP.B although that will happen in two steps.
1524 Likewise, for 2ADDR relaxes, we do one operand per cycle.
1525 */
1526
1527 /* Get the value of the symbol referred to by the reloc. Just
1528 in case this is the last reloc in the list, use the RL's
1529 addend to choose between this reloc (no addend) or the next
1530 (yes addend, which means at least one following reloc). */
1531 srel = irel + (relax_relocs ? 1 : 0);
1532 symval = OFFSET_FOR_RELOC (srel);
1533
1534 /* Setting gap_size nonzero is the flag which means "something
1535 shrunk". */
1536 gap_size = 0;
1537 gap = NULL;
1538 new_type = ELF32_R_TYPE(srel->r_info);
1539
1540 pc = sec->output_section->vma + sec->output_offset
1541 + srel->r_offset;
1542 pcrel = symval - pc + srel->r_addend;
1543
1544 if (machine == bfd_mach_m16c)
1545 {
1546 /* R8C / M16C */
1547
1548 switch (ELF32_R_TYPE(irel->r_info))
1549 {
1550
1551 case R_M32C_RL_JUMP:
1552 switch (insn[0])
1553 {
1554 case 0xfe: /* jmp.b */
1555 if (pcrel >= 2 && pcrel <= 9)
1556 {
1557 /* Relax JMP.B -> JMP.S. We need to get rid of
1558 the following reloc though. */
1559 insn[0] = 0x60 | (pcrel - 2);
1560 new_type = R_M32C_NONE;
1561 irel->r_addend = 0x10;
1562 gap_size = 1;
1563 gap = insn + 1;
1564 }
1565 break;
1566
1567 case 0xf4: /* jmp.w */
1568 /* 128 is allowed because it will be one byte closer
1569 after relaxing. Likewise for all other pc-rel
1570 jumps. */
1571 if (pcrel <= 128 && pcrel >= -128)
1572 {
1573 /* Relax JMP.W -> JMP.B */
1574 insn[0] = 0xfe;
1575 insn[1] = 0;
1576 new_type = R_M32C_8_PCREL;
1577 gap_size = 1;
1578 gap = insn + 2;
1579 }
1580 break;
1581
1582 case 0xfc: /* jmp.a */
1583 if (pcrel <= 32768 && pcrel >= -32768)
1584 {
1585 /* Relax JMP.A -> JMP.W */
1586 insn[0] = 0xf4;
1587 insn[1] = 0;
1588 insn[2] = 0;
1589 new_type = R_M32C_16_PCREL;
1590 gap_size = 1;
1591 gap = insn + 3;
1592 }
1593 break;
1594
1595 case 0xfd: /* jsr.a */
1596 if (pcrel <= 32768 && pcrel >= -32768)
1597 {
1598 /* Relax JSR.A -> JSR.W */
1599 insn[0] = 0xf5;
1600 insn[1] = 0;
1601 insn[2] = 0;
1602 new_type = R_M32C_16_PCREL;
1603 gap_size = 1;
1604 gap = insn + 3;
1605 }
1606 break;
1607 }
1608 break;
1609
1610 case R_M32C_RL_2ADDR:
1611 /* xxxx xxxx srce dest [src-disp] [dest-disp]*/
1612
1613 enctbl = m16c_addr_encodings;
1614 posn = 2;
1615 enc = (insn[1] >> 4) & 0x0f;
1616 e = & enctbl[enc];
1617
1618 if (srel->r_offset == irel->r_offset + posn
1619 && e->new_encoding != enc
1620 && symval <= e->max_disp)
1621 {
1622 insn[1] &= 0x0f;
1623 insn[1] |= e->new_encoding << 4;
1624 gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1625 gap = insn + posn + enctbl[e->new_encoding].bytes;
1626 new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1627 break;
1628 }
1629 if (relax_relocs == 2)
1630 srel ++;
1631 posn += e->bytes;
1632
1633 goto try_1addr_16;
1634
1635 case R_M32C_RL_1ADDR:
1636 /* xxxx xxxx xxxx dest [disp] */
1637
1638 enctbl = m16c_addr_encodings;
1639 posn = 2;
1640
1641 /* Check the opcode for jumps. We know it's safe to
1642 do this because all 2ADDR insns are at least two
1643 bytes long. */
1644 enc = insn[0] * 256 + insn[1];
1645 enc &= 0xfff0;
1646 if (enc == 0x7d20
1647 || enc == 0x7d00
1648 || enc == 0x7d30
1649 || enc == 0x7d10)
1650 {
1651 enctbl = m16c_jmpaddr_encodings;
1652 }
1653
1654 try_1addr_16:
1655 /* srel, posn, and enc must be set here. */
1656
1657 symval = OFFSET_FOR_RELOC (srel);
1658 enc = insn[1] & 0x0f;
1659 e = & enctbl[enc];
1660
1661 if (srel->r_offset == irel->r_offset + posn
1662 && e->new_encoding != enc
1663 && symval <= e->max_disp)
1664 {
1665 insn[1] &= 0xf0;
1666 insn[1] |= e->new_encoding;
1667 gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1668 gap = insn + posn + enctbl[e->new_encoding].bytes;
1669 new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1670 break;
1671 }
1672
1673 break;
1674
1675 } /* Ends switch (reloc type) for m16c. */
1676 }
1677 else /* machine == bfd_mach_m32c */
1678 {
1679 /* M32CM / M32C */
1680
1681 switch (ELF32_R_TYPE(irel->r_info))
1682 {
1683
1684 case R_M32C_RL_JUMP:
1685 switch (insn[0])
1686 {
1687 case 0xbb: /* jmp.b */
1688 if (pcrel >= 2 && pcrel <= 9)
1689 {
1690 int p = pcrel - 2;
1691 /* Relax JMP.B -> JMP.S. We need to get rid of
1692 the following reloc though. */
1693 insn[0] = 0x4a | ((p << 3) & 0x30) | (p & 1);
1694 new_type = R_M32C_NONE;
1695 irel->r_addend = 0x10;
1696 gap_size = 1;
1697 gap = insn + 1;
1698 }
1699 break;
1700
1701 case 0xce: /* jmp.w */
1702 if (pcrel <= 128 && pcrel >= -128)
1703 {
1704 /* Relax JMP.W -> JMP.B */
1705 insn[0] = 0xbb;
1706 insn[1] = 0;
1707 new_type = R_M32C_8_PCREL;
1708 gap_size = 1;
1709 gap = insn + 2;
1710 }
1711 break;
1712
1713 case 0xcc: /* jmp.a */
1714 if (pcrel <= 32768 && pcrel >= -32768)
1715 {
1716 /* Relax JMP.A -> JMP.W */
1717 insn[0] = 0xce;
1718 insn[1] = 0;
1719 insn[2] = 0;
1720 new_type = R_M32C_16_PCREL;
1721 gap_size = 1;
1722 gap = insn + 3;
1723 }
1724 break;
1725
1726 case 0xcd: /* jsr.a */
1727 if (pcrel <= 32768 && pcrel >= -32768)
1728 {
1729 /* Relax JSR.A -> JSR.W */
1730 insn[0] = 0xcf;
1731 insn[1] = 0;
1732 insn[2] = 0;
1733 new_type = R_M32C_16_PCREL;
1734 gap_size = 1;
1735 gap = insn + 3;
1736 }
1737 break;
1738 }
1739 break;
1740
1741 case R_M32C_RL_2ADDR:
1742 /* xSSS DDDx DDSS xxxx [src-disp] [dest-disp]*/
1743
1744 einsn = insn;
1745 posn = 2;
1746 if (einsn[0] == 1)
1747 {
1748 /* prefix; remove it as far as the RL reloc is concerned. */
1749 einsn ++;
1750 posn ++;
1751 }
1752
1753 enctbl = m32c_addr_encodings;
1754 enc = ((einsn[0] & 0x70) >> 2) | ((einsn[1] & 0x30) >> 4);
1755 e = & enctbl[enc];
1756
1757 if (srel->r_offset == irel->r_offset + posn
1758 && e->new_encoding != enc
1759 && symval <= e->max_disp)
1760 {
1761 einsn[0] &= 0x8f;
1762 einsn[0] |= (e->new_encoding & 0x1c) << 2;
1763 einsn[1] &= 0xcf;
1764 einsn[1] |= (e->new_encoding & 0x03) << 4;
1765 gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1766 gap = insn + posn + enctbl[e->new_encoding].bytes;
1767 new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1768 break;
1769 }
1770 if (relax_relocs == 2)
1771 srel ++;
1772 posn += e->bytes;
1773
1774 goto try_1addr_32;
1775
1776 case R_M32C_RL_1ADDR:
1777 /* xxxx DDDx DDxx xxxx [disp] */
1778
1779 einsn = insn;
1780 posn = 2;
1781 if (einsn[0] == 1)
1782 {
1783 /* prefix; remove it as far as the RL reloc is concerned. */
1784 einsn ++;
1785 posn ++;
1786 }
1787
1788 enctbl = m32c_addr_encodings;
1789
1790 try_1addr_32:
1791 /* srel, posn, and enc must be set here. */
1792
1793 symval = OFFSET_FOR_RELOC (srel);
1794 enc = ((einsn[0] & 0x0e) << 1) | ((einsn[1] & 0xc0) >> 6);
1795 e = & enctbl[enc];
1796
1797 if (srel->r_offset == irel->r_offset + posn
1798 && e->new_encoding != enc
1799 && symval <= e->max_disp)
1800 {
1801 einsn[0] &= 0xf1;
1802 einsn[0] |= (e->new_encoding & 0x1c) >> 1;
1803 einsn[1] &= 0x3f;
1804 einsn[1] |= (e->new_encoding & 0x03) << 6;
1805 gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1806 gap = insn + posn + enctbl[e->new_encoding].bytes;
1807 new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1808 break;
1809 }
1810
1811 break;
1812
1813 } /* Ends switch (reloc type) for m32c. */
1814 }
1815
1816 if (gap_size == 0)
1817 continue;
1818
1819 *again = TRUE;
1820
1821 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), new_type);
1822
1823 /* Note that we've changed the relocs, section contents, etc. */
1824 elf_section_data (sec)->relocs = internal_relocs;
1825 free_relocs = NULL;
1826
1827 elf_section_data (sec)->this_hdr.contents = contents;
1828 free_contents = NULL;
1829
1830 symtab_hdr->contents = (bfd_byte *) intsyms;
1831 free_intsyms = NULL;
1832
1833 bytes_saved += gap_size;
1834
1835 if (! m32c_elf_relax_delete_bytes(abfd, sec, gap - contents, gap_size))
1836 goto error_return;
1837
1838 } /* next relocation */
1839
1840 if (free_relocs != NULL)
1841 {
1842 free (free_relocs);
1843 free_relocs = NULL;
1844 }
1845
1846 if (free_contents != NULL)
1847 {
1848 if (! link_info->keep_memory)
1849 free (free_contents);
1850 /* Cache the section contents for elf_link_input_bfd. */
1851 else
1852 elf_section_data (sec)->this_hdr.contents = contents;
1853
1854 free_contents = NULL;
1855 }
1856
1857 if (shndx_buf != NULL)
1858 {
1859 shndx_hdr->contents = NULL;
1860 free (shndx_buf);
1861 }
1862
1863 if (free_intsyms != NULL)
1864 {
1865 if (! link_info->keep_memory)
1866 free (free_intsyms);
1867 /* Cache the symbols for elf_link_input_bfd. */
1868 else
1869 {
1870 symtab_hdr->contents = NULL /* (unsigned char *) intsyms*/;
1871 }
1872
1873 free_intsyms = NULL;
1874 }
1875
1876 return TRUE;
1877
1878 error_return:
1879 if (free_relocs != NULL)
1880 free (free_relocs);
1881 if (free_contents != NULL)
1882 free (free_contents);
1883 if (shndx_buf != NULL)
1884 {
1885 shndx_hdr->contents = NULL;
1886 free (shndx_buf);
1887 }
1888 if (free_intsyms != NULL)
1889 free (free_intsyms);
1890 return FALSE;
1891 }
1892
1893 /* Delete some bytes from a section while relaxing. */
1894
1895 static bfd_boolean
1896 m32c_elf_relax_delete_bytes
1897 (bfd * abfd,
1898 asection * sec,
1899 bfd_vma addr,
1900 int count)
1901 {
1902 Elf_Internal_Shdr *symtab_hdr;
1903 Elf_Internal_Shdr *shndx_hdr;
1904 int sec_shndx;
1905 bfd_byte *contents;
1906 Elf_Internal_Rela *irel;
1907 Elf_Internal_Rela *irelend;
1908 bfd_vma toaddr;
1909 Elf_Internal_Sym *isym;
1910 Elf_Internal_Sym *isymend;
1911 Elf_Internal_Sym *intsyms;
1912 Elf_External_Sym_Shndx *shndx_buf;
1913 Elf_External_Sym_Shndx *shndx;
1914 struct elf_link_hash_entry ** sym_hashes;
1915 struct elf_link_hash_entry ** end_hashes;
1916 unsigned int symcount;
1917
1918 contents = elf_section_data (sec)->this_hdr.contents;
1919
1920 toaddr = sec->size;
1921
1922 irel = elf_section_data (sec)->relocs;
1923 irelend = irel + sec->reloc_count;
1924
1925 /* Actually delete the bytes. */
1926 memmove (contents + addr, contents + addr + count, (size_t) (toaddr - addr - count));
1927 sec->size -= count;
1928
1929 /* Adjust all the relocs. */
1930 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel ++)
1931 {
1932 /* Get the new reloc address. */
1933 if (irel->r_offset > addr && irel->r_offset < toaddr)
1934 irel->r_offset -= count;
1935
1936 if (ELF32_R_TYPE(irel->r_info) == R_M32C_RL_JUMP
1937 && irel->r_addend == 0x10 /* one byte insn, no relocs */
1938 && irel->r_offset + 1 < addr
1939 && irel->r_offset + 7 > addr)
1940 {
1941 bfd_vma disp;
1942 unsigned char *insn = &contents[irel->r_offset];
1943 disp = *insn;
1944 /* This is a JMP.S, which we have to manually update. */
1945 if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
1946 {
1947 if ((*insn & 0xf8) != 0x60)
1948 continue;
1949 disp = (disp & 7);
1950 }
1951 else
1952 {
1953 if ((*insn & 0xce) != 0x4a)
1954 continue;
1955 disp = ((disp & 0x30) >> 3) | (disp & 1);
1956 }
1957 if (irel->r_offset + disp + 2 >= addr+count)
1958 {
1959 disp -= count;
1960 if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
1961 {
1962 *insn = (*insn & 0xf8) | disp;
1963 }
1964 else
1965 {
1966 *insn = (*insn & 0xce) | ((disp & 6) << 3) | (disp & 1);
1967 }
1968 }
1969 }
1970 }
1971
1972 /* Adjust the local symbols defined in this section. */
1973 symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
1974 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1975 isym = intsyms;
1976 isymend = isym + symtab_hdr->sh_info;
1977
1978 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1979 shndx_hdr = & elf_tdata (abfd)->symtab_shndx_hdr;
1980 shndx_buf = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
1981 shndx = shndx_buf;
1982
1983 for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
1984 {
1985 /* If the symbol is in the range of memory we just moved, we
1986 have to adjust its value. */
1987 if ((int) isym->st_shndx == sec_shndx
1988 && isym->st_value > addr
1989 && isym->st_value < toaddr)
1990 {
1991 isym->st_value -= count;
1992 }
1993 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1994 *end* is in the moved bytes but it's *start* isn't), then we
1995 must adjust its size. */
1996 if ((int) isym->st_shndx == sec_shndx
1997 && isym->st_value < addr
1998 && isym->st_value + isym->st_size > addr
1999 && isym->st_value + isym->st_size < toaddr)
2000 {
2001 isym->st_size -= count;
2002 }
2003 }
2004
2005 /* Now adjust the global symbols defined in this section. */
2006 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2007 - symtab_hdr->sh_info);
2008 sym_hashes = elf_sym_hashes (abfd);
2009 // sym_hashes += symtab_hdr->sh_info;
2010 end_hashes = sym_hashes + symcount;
2011
2012 for (; sym_hashes < end_hashes; sym_hashes ++)
2013 {
2014 struct elf_link_hash_entry * sym_hash = * sym_hashes;
2015
2016 if (sym_hash &&
2017 (sym_hash->root.type == bfd_link_hash_defined
2018 || sym_hash->root.type == bfd_link_hash_defweak)
2019 && sym_hash->root.u.def.section == sec)
2020 {
2021 if (sym_hash->root.u.def.value > addr
2022 && sym_hash->root.u.def.value < toaddr)
2023 {
2024 sym_hash->root.u.def.value -= count;
2025 }
2026 if (sym_hash->root.u.def.value < addr
2027 && sym_hash->root.u.def.value + sym_hash->size > addr
2028 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
2029 {
2030 sym_hash->size -= count;
2031 }
2032 }
2033 }
2034
2035 return TRUE;
2036 }
2037 \f
2038 /* This is for versions of gcc prior to 4.3. */
2039 static unsigned int
2040 _bfd_m32c_elf_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED)
2041 {
2042 if ((elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK) == EF_M32C_CPU_M16C)
2043 return 2;
2044 return 4;
2045 }
2046
2047 \f
2048
2049 #define ELF_ARCH bfd_arch_m32c
2050 #define ELF_MACHINE_CODE EM_M32C
2051 #define ELF_MACHINE_ALT1 EM_M32C_OLD
2052 #define ELF_MAXPAGESIZE 0x100
2053
2054 #if 0
2055 #define TARGET_BIG_SYM m32c_elf32_vec
2056 #define TARGET_BIG_NAME "elf32-m32c"
2057 #else
2058 #define TARGET_LITTLE_SYM m32c_elf32_vec
2059 #define TARGET_LITTLE_NAME "elf32-m32c"
2060 #endif
2061
2062 #define elf_info_to_howto_rel NULL
2063 #define elf_info_to_howto m32c_info_to_howto_rela
2064 #define elf_backend_object_p m32c_elf_object_p
2065 #define elf_backend_relocate_section m32c_elf_relocate_section
2066 #define elf_backend_check_relocs m32c_elf_check_relocs
2067 #define elf_backend_object_p m32c_elf_object_p
2068 #define elf_symbol_leading_char ('_')
2069 #define elf_backend_always_size_sections \
2070 m32c_elf_always_size_sections
2071 #define elf_backend_finish_dynamic_sections \
2072 m32c_elf_finish_dynamic_sections
2073
2074 #define elf_backend_can_gc_sections 1
2075 #define elf_backend_eh_frame_address_size _bfd_m32c_elf_eh_frame_address_size
2076
2077 #define bfd_elf32_bfd_reloc_type_lookup m32c_reloc_type_lookup
2078 #define bfd_elf32_bfd_reloc_name_lookup m32c_reloc_name_lookup
2079 #define bfd_elf32_bfd_relax_section m32c_elf_relax_section
2080 #define bfd_elf32_bfd_set_private_flags m32c_elf_set_private_flags
2081 #define bfd_elf32_bfd_merge_private_bfd_data m32c_elf_merge_private_bfd_data
2082 #define bfd_elf32_bfd_print_private_bfd_data m32c_elf_print_private_bfd_data
2083
2084 #include "elf32-target.h"
This page took 0.072986 seconds and 5 git commands to generate.