Support for more than 64k ELF sections.
[binutils.git] / bfd / elf32-m32r.c
blob4e6eca49085c6e8e8f99bbe875b38b6b3571967d
1 /* M32R-specific support for 32-bit ELF.
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/m32r.h"
27 static bfd_reloc_status_type m32r_elf_10_pcrel_reloc
28 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
29 static bfd_reloc_status_type m32r_elf_do_10_pcrel_reloc
30 PARAMS ((bfd *, reloc_howto_type *, asection *,
31 bfd_byte *, bfd_vma, asection *, bfd_vma, bfd_vma));
32 static bfd_reloc_status_type m32r_elf_hi16_reloc
33 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
34 static void m32r_elf_relocate_hi16
35 PARAMS ((bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *,
36 bfd_byte *, bfd_vma));
37 bfd_reloc_status_type m32r_elf_lo16_reloc
38 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
39 bfd_reloc_status_type m32r_elf_generic_reloc
40 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
41 static bfd_reloc_status_type m32r_elf_sda16_reloc
42 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
44 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
45 static void m32r_info_to_howto_rel
46 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
47 boolean _bfd_m32r_elf_section_from_bfd_section
48 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
49 void _bfd_m32r_elf_symbol_processing
50 PARAMS ((bfd *, asymbol *));
51 static boolean m32r_elf_add_symbol_hook
52 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
53 const char **, flagword *, asection **, bfd_vma *));
54 static boolean m32r_elf_relocate_section
55 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
56 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
57 #if 0 /* not yet */
58 static boolean m32r_elf_relax_delete_bytes
59 PARAMS ((bfd *, asection *, bfd_vma, int));
60 #endif
61 static bfd_reloc_status_type m32r_elf_final_sda_base
62 PARAMS ((bfd *, struct bfd_link_info *, const char **, bfd_vma *));
63 static boolean m32r_elf_object_p
64 PARAMS ((bfd *));
65 static void m32r_elf_final_write_processing
66 PARAMS ((bfd *, boolean));
67 static boolean m32r_elf_set_private_flags
68 PARAMS ((bfd *, flagword));
69 static boolean m32r_elf_copy_private_bfd_data
70 PARAMS ((bfd *, bfd *));
71 static boolean m32r_elf_merge_private_bfd_data
72 PARAMS ((bfd *, bfd *));
73 static boolean m32r_elf_print_private_bfd_data
74 PARAMS ((bfd *, PTR));
75 static boolean m32r_elf_gc_sweep_hook
76 PARAMS ((bfd *, struct bfd_link_info *, asection *,
77 const Elf_Internal_Rela *));
78 static boolean m32r_elf_check_relocs
79 PARAMS ((bfd *, struct bfd_link_info *, asection *,
80 const Elf_Internal_Rela *));
82 asection * m32r_elf_gc_mark_hook
83 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
84 struct elf_link_hash_entry *, Elf_Internal_Sym *));
86 #define NOP_INSN 0x7000
87 #define MAKE_PARALLEL(insn) ((insn) | 0x8000)
89 /* Use REL instead of RELA to save space.
90 This only saves space in libraries and object files, but perhaps
91 relocs will be put in ROM? All in all though, REL relocs are a pain
92 to work with. */
93 #define USE_REL
95 static reloc_howto_type m32r_elf_howto_table[] =
97 /* This reloc does nothing. */
98 HOWTO (R_M32R_NONE, /* type */
99 0, /* rightshift */
100 2, /* size (0 = byte, 1 = short, 2 = long) */
101 32, /* bitsize */
102 false, /* pc_relative */
103 0, /* bitpos */
104 complain_overflow_bitfield, /* complain_on_overflow */
105 bfd_elf_generic_reloc, /* special_function */
106 "R_M32R_NONE", /* name */
107 false, /* partial_inplace */
108 0, /* src_mask */
109 0, /* dst_mask */
110 false), /* pcrel_offset */
112 /* A 16 bit absolute relocation. */
113 HOWTO (R_M32R_16, /* type */
114 0, /* rightshift */
115 1, /* size (0 = byte, 1 = short, 2 = long) */
116 16, /* bitsize */
117 false, /* pc_relative */
118 0, /* bitpos */
119 complain_overflow_bitfield, /* complain_on_overflow */
120 m32r_elf_generic_reloc,/* special_function */
121 "R_M32R_16", /* name */
122 true, /* partial_inplace */
123 0xffff, /* src_mask */
124 0xffff, /* dst_mask */
125 false), /* pcrel_offset */
127 /* A 32 bit absolute relocation. */
128 HOWTO (R_M32R_32, /* type */
129 0, /* rightshift */
130 2, /* size (0 = byte, 1 = short, 2 = long) */
131 32, /* bitsize */
132 false, /* pc_relative */
133 0, /* bitpos */
134 complain_overflow_bitfield, /* complain_on_overflow */
135 m32r_elf_generic_reloc,/* special_function */
136 "R_M32R_32", /* name */
137 true, /* partial_inplace */
138 0xffffffff, /* src_mask */
139 0xffffffff, /* dst_mask */
140 false), /* pcrel_offset */
142 /* A 24 bit address. */
143 HOWTO (R_M32R_24, /* type */
144 0, /* rightshift */
145 2, /* size (0 = byte, 1 = short, 2 = long) */
146 24, /* bitsize */
147 false, /* pc_relative */
148 0, /* bitpos */
149 complain_overflow_unsigned, /* complain_on_overflow */
150 m32r_elf_generic_reloc,/* special_function */
151 "R_M32R_24", /* name */
152 true, /* partial_inplace */
153 0xffffff, /* src_mask */
154 0xffffff, /* dst_mask */
155 false), /* pcrel_offset */
157 /* An PC Relative 10-bit relocation, shifted by 2.
158 This reloc is complicated because relocations are relative to pc & -4.
159 i.e. branches in the right insn slot use the address of the left insn
160 slot for pc. */
161 /* ??? It's not clear whether this should have partial_inplace set or not.
162 Branch relaxing in the assembler can store the addend in the insn,
163 and if bfd_install_relocation gets called the addend may get added
164 again. */
165 HOWTO (R_M32R_10_PCREL, /* type */
166 2, /* rightshift */
167 1, /* size (0 = byte, 1 = short, 2 = long) */
168 10, /* bitsize */
169 true, /* pc_relative */
170 0, /* bitpos */
171 complain_overflow_signed, /* complain_on_overflow */
172 m32r_elf_10_pcrel_reloc, /* special_function */
173 "R_M32R_10_PCREL", /* name */
174 false, /* partial_inplace */
175 0xff, /* src_mask */
176 0xff, /* dst_mask */
177 true), /* pcrel_offset */
179 /* A relative 18 bit relocation, right shifted by 2. */
180 HOWTO (R_M32R_18_PCREL, /* type */
181 2, /* rightshift */
182 2, /* size (0 = byte, 1 = short, 2 = long) */
183 16, /* bitsize */
184 true, /* pc_relative */
185 0, /* bitpos */
186 complain_overflow_signed, /* complain_on_overflow */
187 bfd_elf_generic_reloc, /* special_function */
188 "R_M32R_18_PCREL", /* name */
189 false, /* partial_inplace */
190 0xffff, /* src_mask */
191 0xffff, /* dst_mask */
192 true), /* pcrel_offset */
194 /* A relative 26 bit relocation, right shifted by 2. */
195 /* ??? It's not clear whether this should have partial_inplace set or not.
196 Branch relaxing in the assembler can store the addend in the insn,
197 and if bfd_install_relocation gets called the addend may get added
198 again. */
199 HOWTO (R_M32R_26_PCREL, /* type */
200 2, /* rightshift */
201 2, /* size (0 = byte, 1 = short, 2 = long) */
202 26, /* bitsize */
203 true, /* pc_relative */
204 0, /* bitpos */
205 complain_overflow_signed, /* complain_on_overflow */
206 bfd_elf_generic_reloc, /* special_function */
207 "R_M32R_26_PCREL", /* name */
208 false, /* partial_inplace */
209 0xffffff, /* src_mask */
210 0xffffff, /* dst_mask */
211 true), /* pcrel_offset */
213 /* High 16 bits of address when lower 16 is or'd in. */
214 HOWTO (R_M32R_HI16_ULO, /* type */
215 16, /* rightshift */
216 2, /* size (0 = byte, 1 = short, 2 = long) */
217 16, /* bitsize */
218 false, /* pc_relative */
219 0, /* bitpos */
220 complain_overflow_dont, /* complain_on_overflow */
221 m32r_elf_hi16_reloc, /* special_function */
222 "R_M32R_HI16_ULO", /* name */
223 true, /* partial_inplace */
224 0x0000ffff, /* src_mask */
225 0x0000ffff, /* dst_mask */
226 false), /* pcrel_offset */
228 /* High 16 bits of address when lower 16 is added in. */
229 HOWTO (R_M32R_HI16_SLO, /* type */
230 16, /* rightshift */
231 2, /* size (0 = byte, 1 = short, 2 = long) */
232 16, /* bitsize */
233 false, /* pc_relative */
234 0, /* bitpos */
235 complain_overflow_dont, /* complain_on_overflow */
236 m32r_elf_hi16_reloc, /* special_function */
237 "R_M32R_HI16_SLO", /* name */
238 true, /* partial_inplace */
239 0x0000ffff, /* src_mask */
240 0x0000ffff, /* dst_mask */
241 false), /* pcrel_offset */
243 /* Lower 16 bits of address. */
244 HOWTO (R_M32R_LO16, /* type */
245 0, /* rightshift */
246 2, /* size (0 = byte, 1 = short, 2 = long) */
247 16, /* bitsize */
248 false, /* pc_relative */
249 0, /* bitpos */
250 complain_overflow_dont, /* complain_on_overflow */
251 m32r_elf_lo16_reloc, /* special_function */
252 "R_M32R_LO16", /* name */
253 true, /* partial_inplace */
254 0x0000ffff, /* src_mask */
255 0x0000ffff, /* dst_mask */
256 false), /* pcrel_offset */
258 /* Small data area 16 bits offset. */
259 HOWTO (R_M32R_SDA16, /* type */
260 0, /* rightshift */
261 2, /* size (0 = byte, 1 = short, 2 = long) */
262 16, /* bitsize */
263 false, /* pc_relative */
264 0, /* bitpos */
265 complain_overflow_signed, /* complain_on_overflow */
266 m32r_elf_sda16_reloc, /* special_function */
267 "R_M32R_SDA16", /* name */
268 true, /* partial_inplace */ /* FIXME: correct? */
269 0x0000ffff, /* src_mask */
270 0x0000ffff, /* dst_mask */
271 false), /* pcrel_offset */
273 /* GNU extension to record C++ vtable hierarchy */
274 HOWTO (R_M32R_GNU_VTINHERIT, /* type */
275 0, /* rightshift */
276 2, /* size (0 = byte, 1 = short, 2 = long) */
277 0, /* bitsize */
278 false, /* pc_relative */
279 0, /* bitpos */
280 complain_overflow_dont, /* complain_on_overflow */
281 NULL, /* special_function */
282 "R_M32R_GNU_VTINHERIT", /* name */
283 false, /* partial_inplace */
284 0, /* src_mask */
285 0, /* dst_mask */
286 false), /* pcrel_offset */
288 /* GNU extension to record C++ vtable member usage */
289 HOWTO (R_M32R_GNU_VTENTRY, /* type */
290 0, /* rightshift */
291 2, /* size (0 = byte, 1 = short, 2 = long) */
292 0, /* bitsize */
293 false, /* pc_relative */
294 0, /* bitpos */
295 complain_overflow_dont, /* complain_on_overflow */
296 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
297 "R_M32R_GNU_VTENTRY", /* name */
298 false, /* partial_inplace */
299 0, /* src_mask */
300 0, /* dst_mask */
301 false), /* pcrel_offset */
305 /* Handle the R_M32R_10_PCREL reloc. */
307 static bfd_reloc_status_type
308 m32r_elf_10_pcrel_reloc (abfd, reloc_entry, symbol, data,
309 input_section, output_bfd, error_message)
310 bfd * abfd;
311 arelent * reloc_entry;
312 asymbol * symbol;
313 PTR data;
314 asection * input_section;
315 bfd * output_bfd;
316 char ** error_message ATTRIBUTE_UNUSED;
318 /* This part is from bfd_elf_generic_reloc. */
319 if (output_bfd != (bfd *) NULL
320 && (symbol->flags & BSF_SECTION_SYM) == 0
321 && (! reloc_entry->howto->partial_inplace
322 || reloc_entry->addend == 0))
324 reloc_entry->address += input_section->output_offset;
325 return bfd_reloc_ok;
328 if (output_bfd != NULL)
330 /* FIXME: See bfd_perform_relocation. Is this right? */
331 return bfd_reloc_continue;
334 return m32r_elf_do_10_pcrel_reloc (abfd, reloc_entry->howto,
335 input_section,
336 data, reloc_entry->address,
337 symbol->section,
338 (symbol->value
339 + symbol->section->output_section->vma
340 + symbol->section->output_offset),
341 reloc_entry->addend);
344 /* Utility to actually perform an R_M32R_10_PCREL reloc. */
346 static bfd_reloc_status_type
347 m32r_elf_do_10_pcrel_reloc (abfd, howto, input_section, data, offset,
348 symbol_section, symbol_value, addend)
349 bfd *abfd;
350 reloc_howto_type *howto;
351 asection *input_section;
352 bfd_byte *data;
353 bfd_vma offset;
354 asection *symbol_section ATTRIBUTE_UNUSED;
355 bfd_vma symbol_value;
356 bfd_vma addend;
358 bfd_signed_vma relocation;
359 unsigned long x;
360 bfd_reloc_status_type status;
362 /* Sanity check the address (offset in section). */
363 if (offset > input_section->_cooked_size)
364 return bfd_reloc_outofrange;
366 relocation = symbol_value + addend;
367 /* Make it pc relative. */
368 relocation -= (input_section->output_section->vma
369 + input_section->output_offset);
370 /* These jumps mask off the lower two bits of the current address
371 before doing pcrel calculations. */
372 relocation -= (offset & -(bfd_vma) 4);
374 if (relocation < -0x200 || relocation > 0x1ff)
375 status = bfd_reloc_overflow;
376 else
377 status = bfd_reloc_ok;
379 x = bfd_get_16 (abfd, data + offset);
380 relocation >>= howto->rightshift;
381 relocation <<= howto->bitpos;
382 x = (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask);
383 bfd_put_16 (abfd, (bfd_vma) x, data + offset);
385 return status;
388 /* Handle the R_M32R_HI16_[SU]LO relocs.
389 HI16_SLO is for the add3 and load/store with displacement instructions.
390 HI16_ULO is for the or3 instruction.
391 For R_M32R_HI16_SLO, the lower 16 bits are sign extended when added to
392 the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
393 we must add one to the high 16 bytes (which will get subtracted off when
394 the low 16 bits are added).
395 These relocs have to be done in combination with an R_M32R_LO16 reloc
396 because there is a carry from the LO16 to the HI16. Here we just save
397 the information we need; we do the actual relocation when we see the LO16.
398 This code is copied from the elf32-mips.c. We also support an arbitrary
399 number of HI16 relocs to be associated with a single LO16 reloc. The
400 assembler sorts the relocs to ensure each HI16 immediately precedes its
401 LO16. However if there are multiple copies, the assembler may not find
402 the real LO16 so it picks the first one it finds. */
404 struct m32r_hi16
406 struct m32r_hi16 *next;
407 bfd_byte *addr;
408 bfd_vma addend;
411 /* FIXME: This should not be a static variable. */
413 static struct m32r_hi16 *m32r_hi16_list;
415 static bfd_reloc_status_type
416 m32r_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
417 input_section, output_bfd, error_message)
418 bfd *abfd ATTRIBUTE_UNUSED;
419 arelent *reloc_entry;
420 asymbol *symbol;
421 PTR data;
422 asection *input_section;
423 bfd *output_bfd;
424 char **error_message ATTRIBUTE_UNUSED;
426 bfd_reloc_status_type ret;
427 bfd_vma relocation;
428 struct m32r_hi16 *n;
430 /* This part is from bfd_elf_generic_reloc.
431 If we're relocating, and this an external symbol, we don't want
432 to change anything. */
433 if (output_bfd != (bfd *) NULL
434 && (symbol->flags & BSF_SECTION_SYM) == 0
435 && reloc_entry->addend == 0)
437 reloc_entry->address += input_section->output_offset;
438 return bfd_reloc_ok;
441 /* Sanity check the address (offset in section). */
442 if (reloc_entry->address > input_section->_cooked_size)
443 return bfd_reloc_outofrange;
445 ret = bfd_reloc_ok;
446 if (bfd_is_und_section (symbol->section)
447 && output_bfd == (bfd *) NULL)
448 ret = bfd_reloc_undefined;
450 if (bfd_is_com_section (symbol->section))
451 relocation = 0;
452 else
453 relocation = symbol->value;
455 relocation += symbol->section->output_section->vma;
456 relocation += symbol->section->output_offset;
457 relocation += reloc_entry->addend;
459 /* Save the information, and let LO16 do the actual relocation. */
460 n = (struct m32r_hi16 *) bfd_malloc ((bfd_size_type) sizeof *n);
461 if (n == NULL)
462 return bfd_reloc_outofrange;
463 n->addr = (bfd_byte *) data + reloc_entry->address;
464 n->addend = relocation;
465 n->next = m32r_hi16_list;
466 m32r_hi16_list = n;
468 if (output_bfd != (bfd *) NULL)
469 reloc_entry->address += input_section->output_offset;
471 return ret;
474 /* Handle an M32R ELF HI16 reloc. */
476 static void
477 m32r_elf_relocate_hi16 (input_bfd, type, relhi, rello, contents, addend)
478 bfd *input_bfd;
479 int type;
480 Elf_Internal_Rela *relhi;
481 Elf_Internal_Rela *rello;
482 bfd_byte *contents;
483 bfd_vma addend;
485 unsigned long insn;
486 bfd_vma addlo;
488 insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
490 addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
491 if (type == R_M32R_HI16_SLO)
492 addlo = ((addlo & 0xffff) ^ 0x8000) - 0x8000;
493 else
494 addlo &= 0xffff;
496 addend += ((insn & 0xffff) << 16) + addlo;
498 /* Reaccount for sign extension of low part. */
499 if (type == R_M32R_HI16_SLO
500 && (addend & 0x8000) != 0)
501 addend += 0x10000;
503 bfd_put_32 (input_bfd,
504 (insn & 0xffff0000) | ((addend >> 16) & 0xffff),
505 contents + relhi->r_offset);
508 /* Do an R_M32R_LO16 relocation. This is a straightforward 16 bit
509 inplace relocation; this function exists in order to do the
510 R_M32R_HI16_[SU]LO relocation described above. */
512 bfd_reloc_status_type
513 m32r_elf_lo16_reloc (input_bfd, reloc_entry, symbol, data,
514 input_section, output_bfd, error_message)
515 bfd *input_bfd;
516 arelent *reloc_entry;
517 asymbol *symbol;
518 PTR data;
519 asection *input_section;
520 bfd *output_bfd;
521 char **error_message;
523 /* This part is from bfd_elf_generic_reloc.
524 If we're relocating, and this an external symbol, we don't want
525 to change anything. */
526 if (output_bfd != (bfd *) NULL
527 && (symbol->flags & BSF_SECTION_SYM) == 0
528 && reloc_entry->addend == 0)
530 reloc_entry->address += input_section->output_offset;
531 return bfd_reloc_ok;
534 if (m32r_hi16_list != NULL)
536 struct m32r_hi16 *l;
538 l = m32r_hi16_list;
539 while (l != NULL)
541 unsigned long insn;
542 unsigned long val;
543 unsigned long vallo;
544 struct m32r_hi16 *next;
546 /* Do the HI16 relocation. Note that we actually don't need
547 to know anything about the LO16 itself, except where to
548 find the low 16 bits of the addend needed by the LO16. */
549 insn = bfd_get_32 (input_bfd, l->addr);
550 vallo = ((bfd_get_32 (input_bfd, (bfd_byte *) data + reloc_entry->address)
551 & 0xffff) ^ 0x8000) - 0x8000;
552 val = ((insn & 0xffff) << 16) + vallo;
553 val += l->addend;
555 /* Reaccount for sign extension of low part. */
556 if ((val & 0x8000) != 0)
557 val += 0x10000;
559 insn = (insn &~ (bfd_vma) 0xffff) | ((val >> 16) & 0xffff);
560 bfd_put_32 (input_bfd, (bfd_vma) insn, l->addr);
562 next = l->next;
563 free (l);
564 l = next;
567 m32r_hi16_list = NULL;
570 /* Now do the LO16 reloc in the usual way.
571 ??? It would be nice to call bfd_elf_generic_reloc here,
572 but we have partial_inplace == TRUE. bfd_elf_generic_reloc will
573 pass the handling back to bfd_install_relocation which will install
574 a section relative addend which is wrong. */
575 return m32r_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
576 input_section, output_bfd, error_message);
579 /* Do generic partial_inplace relocation.
580 This is a local replacement for bfd_elf_generic_reloc. */
582 bfd_reloc_status_type
583 m32r_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
584 input_section, output_bfd, error_message)
585 bfd *input_bfd;
586 arelent *reloc_entry;
587 asymbol *symbol;
588 PTR data;
589 asection *input_section;
590 bfd *output_bfd;
591 char **error_message ATTRIBUTE_UNUSED;
593 bfd_reloc_status_type ret;
594 bfd_vma relocation;
595 bfd_byte *inplace_address;
597 /* This part is from bfd_elf_generic_reloc.
598 If we're relocating, and this an external symbol, we don't want
599 to change anything. */
600 if (output_bfd != (bfd *) NULL
601 && (symbol->flags & BSF_SECTION_SYM) == 0
602 && reloc_entry->addend == 0)
604 reloc_entry->address += input_section->output_offset;
605 return bfd_reloc_ok;
608 /* Now do the reloc in the usual way.
609 ??? It would be nice to call bfd_elf_generic_reloc here,
610 but we have partial_inplace == TRUE. bfd_elf_generic_reloc will
611 pass the handling back to bfd_install_relocation which will install
612 a section relative addend which is wrong. */
614 /* Sanity check the address (offset in section). */
615 if (reloc_entry->address > input_section->_cooked_size)
616 return bfd_reloc_outofrange;
618 ret = bfd_reloc_ok;
619 if (bfd_is_und_section (symbol->section)
620 && output_bfd == (bfd *) NULL)
621 ret = bfd_reloc_undefined;
623 if (bfd_is_com_section (symbol->section)
624 || output_bfd != (bfd *) NULL)
625 relocation = 0;
626 else
627 relocation = symbol->value;
629 /* Only do this for a final link. */
630 if (output_bfd == (bfd *) NULL)
632 relocation += symbol->section->output_section->vma;
633 relocation += symbol->section->output_offset;
636 relocation += reloc_entry->addend;
637 inplace_address = (bfd_byte *) data + reloc_entry->address;
639 #define DOIT(x) \
640 x = ( (x & ~reloc_entry->howto->dst_mask) | \
641 (((x & reloc_entry->howto->src_mask) + relocation) & \
642 reloc_entry->howto->dst_mask))
644 switch (reloc_entry->howto->size)
646 case 1:
648 short x = bfd_get_16 (input_bfd, inplace_address);
649 DOIT (x);
650 bfd_put_16 (input_bfd, (bfd_vma) x, inplace_address);
652 break;
653 case 2:
655 unsigned long x = bfd_get_32 (input_bfd, inplace_address);
656 DOIT (x);
657 bfd_put_32 (input_bfd, (bfd_vma)x , inplace_address);
659 break;
660 default:
661 BFD_ASSERT (0);
664 if (output_bfd != (bfd *) NULL)
665 reloc_entry->address += input_section->output_offset;
667 return ret;
670 /* Handle the R_M32R_SDA16 reloc.
671 This reloc is used to compute the address of objects in the small data area
672 and to perform loads and stores from that area.
673 The lower 16 bits are sign extended and added to the register specified
674 in the instruction, which is assumed to point to _SDA_BASE_. */
676 static bfd_reloc_status_type
677 m32r_elf_sda16_reloc (abfd, reloc_entry, symbol, data,
678 input_section, output_bfd, error_message)
679 bfd *abfd ATTRIBUTE_UNUSED;
680 arelent *reloc_entry;
681 asymbol *symbol;
682 PTR data ATTRIBUTE_UNUSED;
683 asection *input_section;
684 bfd *output_bfd;
685 char **error_message ATTRIBUTE_UNUSED;
687 /* This part is from bfd_elf_generic_reloc. */
688 if (output_bfd != (bfd *) NULL
689 && (symbol->flags & BSF_SECTION_SYM) == 0
690 && (! reloc_entry->howto->partial_inplace
691 || reloc_entry->addend == 0))
693 reloc_entry->address += input_section->output_offset;
694 return bfd_reloc_ok;
697 if (output_bfd != NULL)
699 /* FIXME: See bfd_perform_relocation. Is this right? */
700 return bfd_reloc_continue;
703 /* FIXME: not sure what to do here yet. But then again, the linker
704 may never call us. */
705 abort ();
708 /* Map BFD reloc types to M32R ELF reloc types. */
710 struct m32r_reloc_map
712 bfd_reloc_code_real_type bfd_reloc_val;
713 unsigned char elf_reloc_val;
716 static const struct m32r_reloc_map m32r_reloc_map[] =
718 { BFD_RELOC_NONE, R_M32R_NONE },
719 { BFD_RELOC_16, R_M32R_16 },
720 { BFD_RELOC_32, R_M32R_32 },
721 { BFD_RELOC_M32R_24, R_M32R_24 },
722 { BFD_RELOC_M32R_10_PCREL, R_M32R_10_PCREL },
723 { BFD_RELOC_M32R_18_PCREL, R_M32R_18_PCREL },
724 { BFD_RELOC_M32R_26_PCREL, R_M32R_26_PCREL },
725 { BFD_RELOC_M32R_HI16_ULO, R_M32R_HI16_ULO },
726 { BFD_RELOC_M32R_HI16_SLO, R_M32R_HI16_SLO },
727 { BFD_RELOC_M32R_LO16, R_M32R_LO16 },
728 { BFD_RELOC_M32R_SDA16, R_M32R_SDA16 },
729 { BFD_RELOC_VTABLE_INHERIT, R_M32R_GNU_VTINHERIT },
730 { BFD_RELOC_VTABLE_ENTRY, R_M32R_GNU_VTENTRY },
733 static reloc_howto_type *
734 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
735 bfd *abfd ATTRIBUTE_UNUSED;
736 bfd_reloc_code_real_type code;
738 unsigned int i;
740 for (i = 0;
741 i < sizeof (m32r_reloc_map) / sizeof (struct m32r_reloc_map);
742 i++)
744 if (m32r_reloc_map[i].bfd_reloc_val == code)
745 return &m32r_elf_howto_table[m32r_reloc_map[i].elf_reloc_val];
748 return NULL;
751 /* Set the howto pointer for an M32R ELF reloc. */
753 static void
754 m32r_info_to_howto_rel (abfd, cache_ptr, dst)
755 bfd *abfd ATTRIBUTE_UNUSED;
756 arelent *cache_ptr;
757 Elf32_Internal_Rel *dst;
759 unsigned int r_type;
761 r_type = ELF32_R_TYPE (dst->r_info);
762 BFD_ASSERT (r_type < (unsigned int) R_M32R_max);
763 cache_ptr->howto = &m32r_elf_howto_table[r_type];
766 /* Given a BFD section, try to locate the corresponding ELF section
767 index. */
769 boolean
770 _bfd_m32r_elf_section_from_bfd_section (abfd, hdr, sec, retval)
771 bfd *abfd ATTRIBUTE_UNUSED;
772 Elf32_Internal_Shdr *hdr ATTRIBUTE_UNUSED;
773 asection *sec;
774 int *retval;
776 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
778 *retval = SHN_M32R_SCOMMON;
779 return true;
781 return false;
784 /* M32R ELF uses two common sections. One is the usual one, and the other
785 is for small objects. All the small objects are kept together, and then
786 referenced via one register, which yields faster assembler code. It is
787 up to the compiler to emit an instruction to load the register with
788 _SDA_BASE. This is what we use for the small common section. This
789 approach is copied from elf32-mips.c. */
790 static asection m32r_elf_scom_section;
791 static asymbol m32r_elf_scom_symbol;
792 static asymbol *m32r_elf_scom_symbol_ptr;
794 /* Handle the special M32R section numbers that a symbol may use. */
796 void
797 _bfd_m32r_elf_symbol_processing (abfd, asym)
798 bfd *abfd ATTRIBUTE_UNUSED;
799 asymbol *asym;
801 elf_symbol_type *elfsym;
803 elfsym = (elf_symbol_type *) asym;
805 switch (elfsym->internal_elf_sym.st_shndx)
807 case SHN_M32R_SCOMMON:
808 if (m32r_elf_scom_section.name == NULL)
810 /* Initialize the small common section. */
811 m32r_elf_scom_section.name = ".scommon";
812 m32r_elf_scom_section.flags = SEC_IS_COMMON;
813 m32r_elf_scom_section.output_section = &m32r_elf_scom_section;
814 m32r_elf_scom_section.symbol = &m32r_elf_scom_symbol;
815 m32r_elf_scom_section.symbol_ptr_ptr = &m32r_elf_scom_symbol_ptr;
816 m32r_elf_scom_symbol.name = ".scommon";
817 m32r_elf_scom_symbol.flags = BSF_SECTION_SYM;
818 m32r_elf_scom_symbol.section = &m32r_elf_scom_section;
819 m32r_elf_scom_symbol_ptr = &m32r_elf_scom_symbol;
821 asym->section = &m32r_elf_scom_section;
822 asym->value = elfsym->internal_elf_sym.st_size;
823 break;
827 /* Hook called by the linker routine which adds symbols from an object
828 file. We must handle the special M32R section numbers here.
829 We also keep watching for whether we need to create the sdata special
830 linker sections. */
832 static boolean
833 m32r_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
834 bfd *abfd;
835 struct bfd_link_info *info;
836 const Elf_Internal_Sym *sym;
837 const char **namep;
838 flagword *flagsp ATTRIBUTE_UNUSED;
839 asection **secp;
840 bfd_vma *valp;
842 if (! info->relocateable
843 && (*namep)[0] == '_' && (*namep)[1] == 'S'
844 && strcmp (*namep, "_SDA_BASE_") == 0)
846 /* This is simpler than using _bfd_elf_create_linker_section
847 (our needs are simpler than ppc's needs). Also
848 _bfd_elf_create_linker_section currently has a bug where if a .sdata
849 section already exists a new one is created that follows it which
850 screws of _SDA_BASE_ address calcs because output_offset != 0. */
851 struct elf_link_hash_entry *h;
852 asection *s = bfd_get_section_by_name (abfd, ".sdata");
854 /* The following code was cobbled from elf32-ppc.c and elflink.c. */
856 if (s == NULL)
858 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
859 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
861 s = bfd_make_section_anyway (abfd, ".sdata");
862 if (s == NULL)
863 return false;
864 bfd_set_section_flags (abfd, s, flags);
865 bfd_set_section_alignment (abfd, s, 2);
868 h = (struct elf_link_hash_entry *)
869 bfd_link_hash_lookup (info->hash, "_SDA_BASE_", false, false, false);
871 if ((h == NULL || h->root.type == bfd_link_hash_undefined)
872 && !(_bfd_generic_link_add_one_symbol (info,
873 abfd,
874 "_SDA_BASE_",
875 BSF_GLOBAL,
877 (bfd_vma) 32768,
878 (const char *) NULL,
879 false,
880 get_elf_backend_data (abfd)->collect,
881 (struct bfd_link_hash_entry **) &h)))
882 return false;
883 h->type = STT_OBJECT;
886 switch (sym->st_shndx)
888 case SHN_M32R_SCOMMON:
889 *secp = bfd_make_section_old_way (abfd, ".scommon");
890 (*secp)->flags |= SEC_IS_COMMON;
891 *valp = sym->st_size;
892 break;
895 return true;
898 /* We have to figure out the SDA_BASE value, so that we can adjust the
899 symbol value correctly. We look up the symbol _SDA_BASE_ in the output
900 BFD. If we can't find it, we're stuck. We cache it in the ELF
901 target data. We don't need to adjust the symbol value for an
902 external symbol if we are producing relocateable output. */
904 static bfd_reloc_status_type
905 m32r_elf_final_sda_base (output_bfd, info, error_message, psb)
906 bfd *output_bfd;
907 struct bfd_link_info *info;
908 const char **error_message;
909 bfd_vma *psb;
911 if (elf_gp (output_bfd) == 0)
913 struct bfd_link_hash_entry *h;
915 h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", false, false, true);
916 if (h != (struct bfd_link_hash_entry *) NULL
917 && h->type == bfd_link_hash_defined)
918 elf_gp (output_bfd) = (h->u.def.value
919 + h->u.def.section->output_section->vma
920 + h->u.def.section->output_offset);
921 else
923 /* Only get the error once. */
924 *psb = elf_gp (output_bfd) = 4;
925 *error_message =
926 (const char *) _("SDA relocation when _SDA_BASE_ not defined");
927 return bfd_reloc_dangerous;
930 *psb = elf_gp (output_bfd);
931 return bfd_reloc_ok;
934 /* Relocate an M32R/D ELF section.
935 There is some attempt to make this function usable for many architectures,
936 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
937 if only to serve as a learning tool.
939 The RELOCATE_SECTION function is called by the new ELF backend linker
940 to handle the relocations for a section.
942 The relocs are always passed as Rela structures; if the section
943 actually uses Rel structures, the r_addend field will always be
944 zero.
946 This function is responsible for adjust the section contents as
947 necessary, and (if using Rela relocs and generating a
948 relocateable output file) adjusting the reloc addend as
949 necessary.
951 This function does not have to worry about setting the reloc
952 address or the reloc symbol index.
954 LOCAL_SYMS is a pointer to the swapped in local symbols.
956 LOCAL_SECTIONS is an array giving the section in the input file
957 corresponding to the st_shndx field of each local symbol.
959 The global hash table entry for the global symbols can be found
960 via elf_sym_hashes (input_bfd).
962 When generating relocateable output, this function must handle
963 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
964 going to be the section symbol corresponding to the output
965 section, which means that the addend must be adjusted
966 accordingly. */
968 static boolean
969 m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
970 contents, relocs, local_syms, local_sections)
971 bfd *output_bfd ATTRIBUTE_UNUSED;
972 struct bfd_link_info *info;
973 bfd *input_bfd;
974 asection *input_section;
975 bfd_byte *contents;
976 Elf_Internal_Rela *relocs;
977 Elf_Internal_Sym *local_syms;
978 asection **local_sections;
980 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
981 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
982 Elf_Internal_Rela *rel, *relend;
983 /* Assume success. */
984 boolean ret = true;
986 rel = relocs;
987 relend = relocs + input_section->reloc_count;
988 for (; rel < relend; rel++)
990 int r_type;
991 reloc_howto_type *howto;
992 unsigned long r_symndx;
993 /* We can't modify r_addend here as elf_link_input_bfd has an assert to
994 ensure it's zero (we use REL relocs, not RELA). Therefore this
995 should be assigning zero to `addend', but for clarity we use
996 `r_addend'. */
997 bfd_vma addend = rel->r_addend;
998 bfd_vma offset = rel->r_offset;
999 struct elf_link_hash_entry *h;
1000 Elf_Internal_Sym *sym;
1001 asection *sec;
1002 const char *sym_name;
1003 bfd_reloc_status_type r;
1004 const char *errmsg = NULL;
1006 h = NULL;
1007 r_type = ELF32_R_TYPE (rel->r_info);
1008 if (r_type < 0 || r_type >= (int) R_M32R_max)
1010 (*_bfd_error_handler) (_("%s: unknown relocation type %d"),
1011 bfd_archive_filename (input_bfd),
1012 (int) r_type);
1013 bfd_set_error (bfd_error_bad_value);
1014 ret = false;
1015 continue;
1018 if (r_type == R_M32R_GNU_VTENTRY
1019 || r_type == R_M32R_GNU_VTINHERIT)
1020 continue;
1022 howto = m32r_elf_howto_table + r_type;
1023 r_symndx = ELF32_R_SYM (rel->r_info);
1025 if (info->relocateable)
1027 /* This is a relocateable link. We don't have to change
1028 anything, unless the reloc is against a section symbol,
1029 in which case we have to adjust according to where the
1030 section symbol winds up in the output section. */
1031 sec = NULL;
1032 if (r_symndx >= symtab_hdr->sh_info)
1034 /* External symbol. */
1035 continue;
1038 /* Local symbol. */
1039 sym = local_syms + r_symndx;
1040 sym_name = "<local symbol>";
1041 /* STT_SECTION: symbol is associated with a section. */
1042 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
1044 /* Symbol isn't associated with a section. Nothing to do. */
1045 continue;
1048 sec = local_sections[r_symndx];
1049 addend += sec->output_offset + sym->st_value;
1050 #ifndef USE_REL
1051 /* This can't be done for USE_REL because it doesn't mean anything
1052 and elf_link_input_bfd asserts this stays zero. */
1053 rel->r_addend = addend;
1054 #endif
1056 #ifndef USE_REL
1057 /* Addends are stored with relocs. We're done. */
1058 continue;
1059 #else /* USE_REL */
1060 /* If partial_inplace, we need to store any additional addend
1061 back in the section. */
1062 if (! howto->partial_inplace)
1063 continue;
1064 /* ??? Here is a nice place to call a special_function
1065 like handler. */
1066 if (r_type != R_M32R_HI16_SLO && r_type != R_M32R_HI16_ULO)
1067 r = _bfd_relocate_contents (howto, input_bfd,
1068 addend, contents + offset);
1069 else
1071 Elf_Internal_Rela *lorel;
1073 /* We allow an arbitrary number of HI16 relocs before the
1074 LO16 reloc. This permits gcc to emit the HI and LO relocs
1075 itself. */
1076 for (lorel = rel + 1;
1077 (lorel < relend
1078 && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
1079 || ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
1080 lorel++)
1081 continue;
1082 if (lorel < relend
1083 && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
1085 m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
1086 contents, addend);
1087 r = bfd_reloc_ok;
1089 else
1090 r = _bfd_relocate_contents (howto, input_bfd,
1091 addend, contents + offset);
1093 #endif /* USE_REL */
1095 else
1097 bfd_vma relocation;
1099 /* This is a final link. */
1100 sym = NULL;
1101 sec = NULL;
1103 if (r_symndx < symtab_hdr->sh_info)
1105 /* Local symbol. */
1106 sym = local_syms + r_symndx;
1107 sec = local_sections[r_symndx];
1108 sym_name = "<local symbol>";
1109 #ifndef USE_REL
1110 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1111 addend = rel->r_addend;
1112 #else
1113 /* FIXME: This won't handle local relocations against SEC_MERGE
1114 symbols. See elf32-i386.c for how to do this. */
1115 relocation = (sec->output_section->vma
1116 + sec->output_offset
1117 + sym->st_value);
1118 #endif
1120 else
1122 /* External symbol. */
1123 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1124 while (h->root.type == bfd_link_hash_indirect
1125 || h->root.type == bfd_link_hash_warning)
1126 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1127 sym_name = h->root.root.string;
1129 if (h->root.type == bfd_link_hash_defined
1130 || h->root.type == bfd_link_hash_defweak)
1132 sec = h->root.u.def.section;
1133 if (sec->output_section == NULL)
1134 relocation = 0;
1135 else
1136 relocation = (h->root.u.def.value
1137 + sec->output_section->vma
1138 + sec->output_offset);
1140 else if (h->root.type == bfd_link_hash_undefweak)
1141 relocation = 0;
1142 else
1144 if (! ((*info->callbacks->undefined_symbol)
1145 (info, h->root.root.string, input_bfd,
1146 input_section, offset, true)))
1147 return false;
1148 relocation = 0;
1152 /* Sanity check the address. */
1153 if (offset > input_section->_raw_size)
1155 r = bfd_reloc_outofrange;
1156 goto check_reloc;
1159 switch ((int) r_type)
1161 case (int) R_M32R_10_PCREL :
1162 r = m32r_elf_do_10_pcrel_reloc (input_bfd, howto, input_section,
1163 contents, offset,
1164 sec, relocation, addend);
1165 break;
1167 case (int) R_M32R_HI16_SLO :
1168 case (int) R_M32R_HI16_ULO :
1170 Elf_Internal_Rela *lorel;
1172 /* We allow an arbitrary number of HI16 relocs before the
1173 LO16 reloc. This permits gcc to emit the HI and LO relocs
1174 itself. */
1175 for (lorel = rel + 1;
1176 (lorel < relend
1177 && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
1178 || ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
1179 lorel++)
1180 continue;
1181 if (lorel < relend
1182 && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
1184 m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
1185 contents, relocation + addend);
1186 r = bfd_reloc_ok;
1188 else
1189 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1190 contents, offset,
1191 relocation, addend);
1193 break;
1195 case (int) R_M32R_SDA16 :
1197 const char *name;
1199 BFD_ASSERT (sec != NULL);
1200 name = bfd_get_section_name (abfd, sec);
1202 if (strcmp (name, ".sdata") == 0
1203 || strcmp (name, ".sbss") == 0
1204 || strcmp (name, ".scommon") == 0)
1206 bfd_vma sda_base;
1207 bfd *out_bfd = sec->output_section->owner;
1209 r = m32r_elf_final_sda_base (out_bfd, info,
1210 &errmsg,
1211 &sda_base);
1212 if (r != bfd_reloc_ok)
1214 ret = false;
1215 goto check_reloc;
1218 /* At this point `relocation' contains the object's
1219 address. */
1220 relocation -= sda_base;
1221 /* Now it contains the offset from _SDA_BASE_. */
1223 else
1225 (*_bfd_error_handler)
1226 (_("%s: The target (%s) of an %s relocation is in the wrong section (%s)"),
1227 bfd_archive_filename (input_bfd),
1228 sym_name,
1229 m32r_elf_howto_table[(int) r_type].name,
1230 bfd_get_section_name (abfd, sec));
1231 /*bfd_set_error (bfd_error_bad_value); ??? why? */
1232 ret = false;
1233 continue;
1236 /* fall through */
1238 default :
1239 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1240 contents, offset,
1241 relocation, addend);
1242 break;
1246 check_reloc:
1248 if (r != bfd_reloc_ok)
1250 /* FIXME: This should be generic enough to go in a utility. */
1251 const char *name;
1253 if (h != NULL)
1254 name = h->root.root.string;
1255 else
1257 name = (bfd_elf_string_from_elf_section
1258 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1259 if (name == NULL || *name == '\0')
1260 name = bfd_section_name (input_bfd, sec);
1263 if (errmsg != NULL)
1264 goto common_error;
1266 switch (r)
1268 case bfd_reloc_overflow:
1269 if (! ((*info->callbacks->reloc_overflow)
1270 (info, name, howto->name, (bfd_vma) 0,
1271 input_bfd, input_section, offset)))
1272 return false;
1273 break;
1275 case bfd_reloc_undefined:
1276 if (! ((*info->callbacks->undefined_symbol)
1277 (info, name, input_bfd, input_section,
1278 offset, true)))
1279 return false;
1280 break;
1282 case bfd_reloc_outofrange:
1283 errmsg = _("internal error: out of range error");
1284 goto common_error;
1286 case bfd_reloc_notsupported:
1287 errmsg = _("internal error: unsupported relocation error");
1288 goto common_error;
1290 case bfd_reloc_dangerous:
1291 errmsg = _("internal error: dangerous error");
1292 goto common_error;
1294 default:
1295 errmsg = _("internal error: unknown error");
1296 /* fall through */
1298 common_error:
1299 if (!((*info->callbacks->warning)
1300 (info, errmsg, name, input_bfd, input_section,
1301 offset)))
1302 return false;
1303 break;
1308 return ret;
1311 #if 0 /* relaxing not supported yet */
1313 /* This function handles relaxing for the m32r.
1314 Relaxing on the m32r is tricky because of instruction alignment
1315 requirements (4 byte instructions must be aligned on 4 byte boundaries).
1317 The following relaxing opportunities are handled:
1319 seth/add3/jl -> bl24 or bl8
1320 seth/add3 -> ld24
1322 It would be nice to handle bl24 -> bl8 but given:
1324 - 4 byte insns must be on 4 byte boundaries
1325 - branch instructions only branch to insns on 4 byte boundaries
1327 this isn't much of a win because the insn in the 2 "deleted" bytes
1328 must become a nop. With some complexity some real relaxation could be
1329 done but the frequency just wouldn't make it worth it; it's better to
1330 try to do all the code compaction one can elsewhere.
1331 When the chip supports parallel 16 bit insns, things may change.
1334 static boolean
1335 m32r_elf_relax_section (abfd, sec, link_info, again)
1336 bfd *abfd;
1337 asection *sec;
1338 struct bfd_link_info *link_info;
1339 boolean *again;
1341 Elf_Internal_Shdr *symtab_hdr;
1342 /* The Rela structures are used here because that's what
1343 _bfd_elf32_link_read_relocs uses [for convenience - it sets the addend
1344 field to 0]. */
1345 Elf_Internal_Rela *internal_relocs;
1346 Elf_Internal_Rela *free_relocs = NULL;
1347 Elf_Internal_Rela *irel, *irelend;
1348 bfd_byte *contents = NULL;
1349 bfd_byte *free_contents = NULL;
1350 Elf32_External_Sym *extsyms = NULL;
1351 Elf32_External_Sym *free_extsyms = NULL;
1353 /* Assume nothing changes. */
1354 *again = false;
1356 /* We don't have to do anything for a relocateable link, if
1357 this section does not have relocs, or if this is not a
1358 code section. */
1359 if (link_info->relocateable
1360 || (sec->flags & SEC_RELOC) == 0
1361 || sec->reloc_count == 0
1362 || (sec->flags & SEC_CODE) == 0
1363 || 0 /* FIXME: check SHF_M32R_CAN_RELAX */)
1364 return true;
1366 /* If this is the first time we have been called for this section,
1367 initialize the cooked size. */
1368 if (sec->_cooked_size == 0)
1369 sec->_cooked_size = sec->_raw_size;
1371 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1373 /* Get a copy of the native relocations. */
1374 internal_relocs = (_bfd_elf32_link_read_relocs
1375 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1376 link_info->keep_memory));
1377 if (internal_relocs == NULL)
1378 goto error_return;
1379 if (! link_info->keep_memory)
1380 free_relocs = internal_relocs;
1382 /* Walk through them looking for relaxing opportunities. */
1383 irelend = internal_relocs + sec->reloc_count;
1384 for (irel = internal_relocs; irel < irelend; irel++)
1386 bfd_vma symval;
1388 /* If this isn't something that can be relaxed, then ignore
1389 this reloc. */
1390 if (ELF32_R_TYPE (irel->r_info) != (int) R_M32R_HI16_SLO)
1391 continue;
1393 /* Get the section contents if we haven't done so already. */
1394 if (contents == NULL)
1396 /* Get cached copy if it exists. */
1397 if (elf_section_data (sec)->this_hdr.contents != NULL)
1398 contents = elf_section_data (sec)->this_hdr.contents;
1399 else
1401 /* Go get them off disk. */
1402 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1403 if (contents == NULL)
1404 goto error_return;
1405 free_contents = contents;
1407 if (! bfd_get_section_contents (abfd, sec, contents,
1408 (file_ptr) 0, sec->_raw_size))
1409 goto error_return;
1413 /* Read this BFD's symbols if we haven't done so already. */
1414 if (extsyms == NULL)
1416 /* Get cached copy if it exists. */
1417 if (symtab_hdr->contents != NULL)
1418 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1419 else
1421 bfd_size_type amt = symtab_hdr->sh_size;
1422 /* Go get them off disk. */
1423 extsyms = (Elf32_External_Sym *) bfd_malloc (amt);
1424 if (extsyms == NULL)
1425 goto error_return;
1426 free_extsyms = extsyms;
1427 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1428 || bfd_bread (extsyms, amt, abfd) != amt)
1429 goto error_return;
1433 /* Get the value of the symbol referred to by the reloc. */
1434 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1436 Elf_Internal_Sym isym;
1437 asection *sym_sec;
1439 /* A local symbol. */
1440 bfd_elf32_swap_symbol_in (abfd,
1441 extsyms + ELF32_R_SYM (irel->r_info),
1442 &isym);
1444 sym_sec = bfd_section_from_elf_index (abfd, isym.st_shndx);
1445 symval = (isym.st_value
1446 + sym_sec->output_section->vma
1447 + sym_sec->output_offset);
1449 else
1451 unsigned long indx;
1452 struct elf_link_hash_entry *h;
1454 /* An external symbol. */
1455 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1456 h = elf_sym_hashes (abfd)[indx];
1457 BFD_ASSERT (h != NULL);
1458 if (h->root.type != bfd_link_hash_defined
1459 && h->root.type != bfd_link_hash_defweak)
1461 /* This appears to be a reference to an undefined
1462 symbol. Just ignore it--it will be caught by the
1463 regular reloc processing. */
1464 continue;
1467 symval = (h->root.u.def.value
1468 + h->root.u.def.section->output_section->vma
1469 + h->root.u.def.section->output_offset);
1472 /* For simplicity of coding, we are going to modify the section
1473 contents, the section relocs, and the BFD symbol table. We
1474 must tell the rest of the code not to free up this
1475 information. It would be possible to instead create a table
1476 of changes which have to be made, as is done in coff-mips.c;
1477 that would be more work, but would require less memory when
1478 the linker is run. */
1480 /* Try to change a seth/add3/jl subroutine call to bl24 or bl8.
1481 This sequence is generated by the compiler when compiling in
1482 32 bit mode. Also look for seth/add3 -> ld24. */
1484 if (ELF32_R_TYPE (irel->r_info) == (int) R_M32R_HI16_SLO)
1486 Elf_Internal_Rela *nrel;
1487 bfd_vma pc = (sec->output_section->vma + sec->output_offset
1488 + irel->r_offset);
1489 bfd_signed_vma pcrel_value = symval - pc;
1490 unsigned int code,reg;
1491 int addend,nop_p,bl8_p,to_delete;
1493 /* The tests are ordered so that we get out as quickly as possible
1494 if this isn't something we can relax, taking into account that
1495 we are looking for two separate possibilities (jl/ld24). */
1497 /* Do nothing if no room in the section for this to be what we're
1498 looking for. */
1499 if (irel->r_offset > sec->_cooked_size - 8)
1500 continue;
1502 /* Make sure the next relocation applies to the next
1503 instruction and that it's the add3's reloc. */
1504 nrel = irel + 1;
1505 if (nrel == irelend
1506 || irel->r_offset + 4 != nrel->r_offset
1507 || ELF32_R_TYPE (nrel->r_info) != (int) R_M32R_LO16)
1508 continue;
1510 /* See if the instructions are seth/add3. */
1511 /* FIXME: This is where macros from cgen can come in. */
1512 code = bfd_get_16 (abfd, contents + irel->r_offset + 0);
1513 if ((code & 0xf0ff) != 0xd0c0)
1514 continue; /* not seth rN,foo */
1515 reg = (code & 0x0f00) >> 8;
1516 code = bfd_get_16 (abfd, contents + irel->r_offset + 4);
1517 if (code != (0x80a0 | reg | (reg << 8)))
1518 continue; /* not add3 rN,rN,foo */
1520 /* At this point we've confirmed we have seth/add3. Now check
1521 whether the next insn is a jl, in which case try to change this
1522 to bl24 or bl8. */
1524 /* Ensure the branch target is in range.
1525 The bl24 instruction has a 24 bit operand which is the target
1526 address right shifted by 2, giving a signed range of 26 bits.
1527 Note that 4 bytes are added to the high value because the target
1528 will be at least 4 bytes closer if we can relax. It'll actually
1529 be 4 or 8 bytes closer, but we don't know which just yet and
1530 the difference isn't significant enough to worry about. */
1531 #ifndef USE_REL /* put in for learning purposes */
1532 pcrel_value += irel->r_addend;
1533 #else
1534 addend = bfd_get_signed_16 (abfd, contents + irel->r_offset + 2);
1535 pcrel_value += addend;
1536 #endif
1538 if (pcrel_value >= -(1 << 25) && pcrel_value < (1 << 25) + 4
1539 /* Do nothing if no room in the section for this to be what we're
1540 looking for. */
1541 && (irel->r_offset <= sec->_cooked_size - 12)
1542 /* Ensure the next insn is "jl rN". */
1543 && ((code = bfd_get_16 (abfd, contents + irel->r_offset + 8)),
1544 code != (0x1ec0 | reg)))
1546 /* We can relax to bl24/bl8. */
1548 /* See if there's a nop following the jl.
1549 Also see if we can use a bl8 insn. */
1550 code = bfd_get_16 (abfd, contents + irel->r_offset + 10);
1551 nop_p = (code & 0x7fff) == NOP_INSN;
1552 bl8_p = pcrel_value >= -0x200 && pcrel_value < 0x200;
1554 if (bl8_p)
1556 /* Change "seth rN,foo" to "bl8 foo || nop".
1557 We OR in CODE just in case it's not a nop (technically,
1558 CODE currently must be a nop, but for cleanness we
1559 allow it to be anything). */
1560 #ifndef USE_REL /* put in for learning purposes */
1561 code = 0x7e000000 | MAKE_PARALLEL (code);
1562 #else
1563 code = (0x7e000000 + (((addend >> 2) & 0xff) << 16)) | MAKE_PARALLEL (code);
1564 #endif
1565 to_delete = 8;
1567 else
1569 /* Change the seth rN,foo to a bl24 foo. */
1570 #ifndef USE_REL /* put in for learning purposes */
1571 code = 0xfe000000;
1572 #else
1573 code = 0xfe000000 + ((addend >> 2) & 0xffffff);
1574 #endif
1575 to_delete = nop_p ? 8 : 4;
1578 bfd_put_32 (abfd, code, contents + irel->r_offset);
1580 /* Set the new reloc type. */
1581 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1582 bl8_p ? R_M32R_10_PCREL : R_M32R_26_PCREL);
1584 /* Delete the add3 reloc by making it a null reloc. */
1585 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1586 R_M32R_NONE);
1588 else if (addend >= 0
1589 && symval + addend <= 0xffffff)
1591 /* We can relax to ld24. */
1593 code = 0xe0000000 | (reg << 24) | (addend & 0xffffff);
1594 bfd_put_32 (abfd, code, contents + irel->r_offset);
1595 to_delete = 4;
1596 /* Tell the following code a nop filler isn't needed. */
1597 nop_p = 1;
1599 else
1601 /* Can't do anything here. */
1602 continue;
1605 /* Note that we've changed the relocs, section contents, etc. */
1606 elf_section_data (sec)->relocs = internal_relocs;
1607 free_relocs = NULL;
1609 elf_section_data (sec)->this_hdr.contents = contents;
1610 free_contents = NULL;
1612 symtab_hdr->contents = (bfd_byte *) extsyms;
1613 free_extsyms = NULL;
1615 /* Delete TO_DELETE bytes of data. */
1616 if (!m32r_elf_relax_delete_bytes (abfd, sec,
1617 irel->r_offset + 4, to_delete))
1618 goto error_return;
1620 /* Now that the following bytes have been moved into place, see if
1621 we need to replace the jl with a nop. This happens when we had
1622 to use a bl24 insn and the insn following the jl isn't a nop.
1623 Technically, this situation can't happen (since the insn can
1624 never be executed) but to be clean we do this. When the chip
1625 supports parallel 16 bit insns things may change.
1626 We don't need to do this in the case of relaxing to ld24,
1627 and the above code sets nop_p so this isn't done. */
1628 if (! nop_p && to_delete == 4)
1629 bfd_put_16 (abfd, NOP_INSN, contents + irel->r_offset + 4);
1631 /* That will change things, so we should relax again.
1632 Note that this is not required, and it may be slow. */
1633 *again = true;
1635 continue;
1638 /* loop to try the next reloc */
1641 if (free_relocs != NULL)
1643 free (free_relocs);
1644 free_relocs = NULL;
1647 if (free_contents != NULL)
1649 if (! link_info->keep_memory)
1650 free (free_contents);
1651 else
1653 /* Cache the section contents for elf_link_input_bfd. */
1654 elf_section_data (sec)->this_hdr.contents = contents;
1656 free_contents = NULL;
1659 if (free_extsyms != NULL)
1661 if (! link_info->keep_memory)
1662 free (free_extsyms);
1663 else
1665 /* Cache the symbols for elf_link_input_bfd. */
1666 symtab_hdr->contents = extsyms;
1668 free_extsyms = NULL;
1671 return true;
1673 error_return:
1674 if (free_relocs != NULL)
1675 free (free_relocs);
1676 if (free_contents != NULL)
1677 free (free_contents);
1678 if (free_extsyms != NULL)
1679 free (free_extsyms);
1680 return false;
1683 /* Delete some bytes from a section while relaxing. */
1685 static boolean
1686 m32r_elf_relax_delete_bytes (abfd, sec, addr, count)
1687 bfd *abfd;
1688 asection *sec;
1689 bfd_vma addr;
1690 int count;
1692 Elf_Internal_Shdr *symtab_hdr;
1693 Elf32_External_Sym *extsyms;
1694 int shndx, index;
1695 bfd_byte *contents;
1696 Elf_Internal_Rela *irel, *irelend;
1697 Elf_Internal_Rela *irelalign;
1698 bfd_vma toaddr;
1699 Elf32_External_Sym *esym, *esymend;
1700 struct elf_link_hash_entry *sym_hash;
1702 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1703 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1705 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1707 contents = elf_section_data (sec)->this_hdr.contents;
1709 /* The deletion must stop at the next ALIGN reloc for an aligment
1710 power larger than the number of bytes we are deleting. */
1712 irelalign = NULL;
1713 toaddr = sec->_cooked_size;
1715 irel = elf_section_data (sec)->relocs;
1716 irelend = irel + sec->reloc_count;
1718 /* Actually delete the bytes. */
1719 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1720 sec->_cooked_size -= count;
1722 /* Adjust all the relocs. */
1723 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1725 /* Get the new reloc address. */
1726 if ((irel->r_offset > addr
1727 && irel->r_offset < toaddr))
1728 irel->r_offset -= count;
1731 /* Adjust the local symbols defined in this section. */
1732 esym = extsyms;
1733 esymend = esym + symtab_hdr->sh_info;
1734 for (; esym < esymend; esym++)
1736 Elf_Internal_Sym isym;
1738 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1740 if (isym.st_shndx == shndx
1741 && isym.st_value > addr
1742 && isym.st_value < toaddr)
1744 isym.st_value -= count;
1745 bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1749 /* Now adjust the global symbols defined in this section. */
1750 esym = extsyms + symtab_hdr->sh_info;
1751 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1752 for (index = 0; esym < esymend; esym++, index++)
1754 Elf_Internal_Sym isym;
1756 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1757 sym_hash = elf_sym_hashes (abfd)[index];
1758 if (isym.st_shndx == shndx
1759 && ((sym_hash)->root.type == bfd_link_hash_defined
1760 || (sym_hash)->root.type == bfd_link_hash_defweak)
1761 && (sym_hash)->root.u.def.section == sec
1762 && (sym_hash)->root.u.def.value > addr
1763 && (sym_hash)->root.u.def.value < toaddr)
1765 (sym_hash)->root.u.def.value -= count;
1769 return true;
1772 /* This is a version of bfd_generic_get_relocated_section_contents
1773 which uses m32r_elf_relocate_section. */
1775 static bfd_byte *
1776 m32r_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1777 data, relocateable, symbols)
1778 bfd *output_bfd;
1779 struct bfd_link_info *link_info;
1780 struct bfd_link_order *link_order;
1781 bfd_byte *data;
1782 boolean relocateable;
1783 asymbol **symbols;
1785 Elf_Internal_Shdr *symtab_hdr;
1786 asection *input_section = link_order->u.indirect.section;
1787 bfd *input_bfd = input_section->owner;
1788 asection **sections = NULL;
1789 Elf_Internal_Rela *internal_relocs = NULL;
1790 Elf32_External_Sym *external_syms = NULL;
1791 Elf_Internal_Sym *internal_syms = NULL;
1792 bfd_size_type amt;
1794 /* We only need to handle the case of relaxing, or of having a
1795 particular set of section contents, specially. */
1796 if (relocateable
1797 || elf_section_data (input_section)->this_hdr.contents == NULL)
1798 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1799 link_order, data,
1800 relocateable,
1801 symbols);
1803 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1805 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1806 input_section->_raw_size);
1808 if ((input_section->flags & SEC_RELOC) != 0
1809 && input_section->reloc_count > 0)
1811 Elf_Internal_Sym *isymp;
1812 asection **secpp;
1813 Elf32_External_Sym *esym, *esymend;
1815 if (symtab_hdr->contents != NULL)
1816 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
1817 else
1819 amt = symtab_hdr->sh_info;
1820 amt *= sizeof (Elf32_External_Sym);
1821 external_syms = (Elf32_External_Sym *) bfd_malloc (amt);
1822 if (external_syms == NULL && symtab_hdr->sh_info > 0)
1823 goto error_return;
1824 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1825 || bfd_bread (external_syms, amt, input_bfd) != amt)
1826 goto error_return;
1829 internal_relocs = (_bfd_elf32_link_read_relocs
1830 (input_bfd, input_section, (PTR) NULL,
1831 (Elf_Internal_Rela *) NULL, false));
1832 if (internal_relocs == NULL)
1833 goto error_return;
1835 amt = symtab_hdr->sh_info;
1836 amt *= sizeof (Elf_Internal_Sym);
1837 internal_syms = (Elf_Internal_Sym *) bfd_malloc (amt);
1838 if (internal_syms == NULL && symtab_hdr->sh_info > 0)
1839 goto error_return;
1841 amt = symtab_hdr->sh_info;
1842 amt *= sizeof (asection *);
1843 sections = (asection **) bfd_malloc (amt);
1844 if (sections == NULL && symtab_hdr->sh_info > 0)
1845 goto error_return;
1847 isymp = internal_syms;
1848 secpp = sections;
1849 esym = external_syms;
1850 esymend = esym + symtab_hdr->sh_info;
1851 for (; esym < esymend; ++esym, ++isymp, ++secpp)
1853 asection *isec;
1855 bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
1857 if (isymp->st_shndx == SHN_UNDEF)
1858 isec = bfd_und_section_ptr;
1859 else if (isymp->st_shndx == SHN_ABS)
1860 isec = bfd_abs_section_ptr;
1861 else if (isymp->st_shndx == SHN_COMMON)
1862 isec = bfd_com_section_ptr;
1863 else if (isymp->st_shndx == SHN_M32R_SCOMMON)
1864 isec = &m32r_elf_scom_section;
1865 else
1866 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
1868 *secpp = isec;
1871 if (! m32r_elf_relocate_section (output_bfd, link_info, input_bfd,
1872 input_section, data, internal_relocs,
1873 internal_syms, sections))
1874 goto error_return;
1876 if (sections != NULL)
1877 free (sections);
1878 sections = NULL;
1879 if (internal_syms != NULL)
1880 free (internal_syms);
1881 internal_syms = NULL;
1882 if (external_syms != NULL && symtab_hdr->contents == NULL)
1883 free (external_syms);
1884 external_syms = NULL;
1885 if (internal_relocs != elf_section_data (input_section)->relocs)
1886 free (internal_relocs);
1887 internal_relocs = NULL;
1890 return data;
1892 error_return:
1893 if (internal_relocs != NULL
1894 && internal_relocs != elf_section_data (input_section)->relocs)
1895 free (internal_relocs);
1896 if (external_syms != NULL && symtab_hdr->contents == NULL)
1897 free (external_syms);
1898 if (internal_syms != NULL)
1899 free (internal_syms);
1900 if (sections != NULL)
1901 free (sections);
1902 return NULL;
1905 #endif /* #if 0 */
1907 /* Set the right machine number. */
1908 static boolean
1909 m32r_elf_object_p (abfd)
1910 bfd *abfd;
1912 switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
1914 default:
1915 case E_M32R_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32r); break;
1916 case E_M32RX_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32rx); break;
1918 return true;
1921 /* Store the machine number in the flags field. */
1922 static void
1923 m32r_elf_final_write_processing (abfd, linker)
1924 bfd * abfd;
1925 boolean linker ATTRIBUTE_UNUSED;
1927 unsigned long val;
1929 switch (bfd_get_mach (abfd))
1931 default:
1932 case bfd_mach_m32r: val = E_M32R_ARCH; break;
1933 case bfd_mach_m32rx: val = E_M32RX_ARCH; break;
1936 elf_elfheader (abfd)->e_flags &=~ EF_M32R_ARCH;
1937 elf_elfheader (abfd)->e_flags |= val;
1940 /* Function to keep M32R specific file flags. */
1941 static boolean
1942 m32r_elf_set_private_flags (abfd, flags)
1943 bfd * abfd;
1944 flagword flags;
1946 BFD_ASSERT (!elf_flags_init (abfd)
1947 || elf_elfheader (abfd)->e_flags == flags);
1949 elf_elfheader (abfd)->e_flags = flags;
1950 elf_flags_init (abfd) = true;
1951 return true;
1954 /* Copy backend specific data from one object module to another */
1955 static boolean
1956 m32r_elf_copy_private_bfd_data (ibfd, obfd)
1957 bfd * ibfd;
1958 bfd * obfd;
1960 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1961 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1962 return true;
1964 BFD_ASSERT (!elf_flags_init (obfd)
1965 || (elf_elfheader (obfd)->e_flags
1966 == elf_elfheader (ibfd)->e_flags));
1968 elf_gp (obfd) = elf_gp (ibfd);
1969 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1970 elf_flags_init (obfd) = true;
1971 return true;
1974 /* Merge backend specific data from an object file to the output
1975 object file when linking. */
1976 static boolean
1977 m32r_elf_merge_private_bfd_data (ibfd, obfd)
1978 bfd * ibfd;
1979 bfd * obfd;
1981 flagword out_flags;
1982 flagword in_flags;
1984 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1985 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1986 return true;
1988 in_flags = elf_elfheader (ibfd)->e_flags;
1989 out_flags = elf_elfheader (obfd)->e_flags;
1991 if (! elf_flags_init (obfd))
1993 /* If the input is the default architecture then do not
1994 bother setting the flags for the output architecture,
1995 instead allow future merges to do this. If no future
1996 merges ever set these flags then they will retain their
1997 unitialised values, which surprise surprise, correspond
1998 to the default values. */
1999 if (bfd_get_arch_info (ibfd)->the_default)
2000 return true;
2002 elf_flags_init (obfd) = true;
2003 elf_elfheader (obfd)->e_flags = in_flags;
2005 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2006 && bfd_get_arch_info (obfd)->the_default)
2008 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
2011 return true;
2014 /* Check flag compatibility. */
2015 if (in_flags == out_flags)
2016 return true;
2018 if ((in_flags & EF_M32R_ARCH) != (out_flags & EF_M32R_ARCH))
2020 if ((in_flags & EF_M32R_ARCH) != E_M32R_ARCH)
2022 (*_bfd_error_handler)
2023 (_("%s: Instruction set mismatch with previous modules"),
2024 bfd_archive_filename (ibfd));
2026 bfd_set_error (bfd_error_bad_value);
2027 return false;
2031 return true;
2034 /* Display the flags field */
2035 static boolean
2036 m32r_elf_print_private_bfd_data (abfd, ptr)
2037 bfd * abfd;
2038 PTR ptr;
2040 FILE * file = (FILE *) ptr;
2042 BFD_ASSERT (abfd != NULL && ptr != NULL)
2044 _bfd_elf_print_private_bfd_data (abfd, ptr);
2046 fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
2048 switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
2050 default:
2051 case E_M32R_ARCH: fprintf (file, _(": m32r instructions")); break;
2052 case E_M32RX_ARCH: fprintf (file, _(": m32rx instructions")); break;
2055 fputc ('\n', file);
2057 return true;
2060 asection *
2061 m32r_elf_gc_mark_hook (abfd, info, rel, h, sym)
2062 bfd *abfd;
2063 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2064 Elf_Internal_Rela *rel;
2065 struct elf_link_hash_entry *h;
2066 Elf_Internal_Sym *sym;
2068 if (h != NULL)
2070 switch (ELF32_R_TYPE (rel->r_info))
2072 case R_M32R_GNU_VTINHERIT:
2073 case R_M32R_GNU_VTENTRY:
2074 break;
2076 default:
2077 switch (h->root.type)
2079 case bfd_link_hash_defined:
2080 case bfd_link_hash_defweak:
2081 return h->root.u.def.section;
2083 case bfd_link_hash_common:
2084 return h->root.u.c.p->section;
2086 default:
2087 break;
2091 else
2093 return bfd_section_from_elf_index (abfd, sym->st_shndx);
2095 return NULL;
2098 static boolean
2099 m32r_elf_gc_sweep_hook (abfd, info, sec, relocs)
2100 bfd *abfd ATTRIBUTE_UNUSED;
2101 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2102 asection *sec ATTRIBUTE_UNUSED;
2103 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
2105 /* we don't use got and plt entries for m32r */
2106 return true;
2109 /* Look through the relocs for a section during the first phase.
2110 Since we don't do .gots or .plts, we just need to consider the
2111 virtual table relocs for gc. */
2113 static boolean
2114 m32r_elf_check_relocs (abfd, info, sec, relocs)
2115 bfd *abfd;
2116 struct bfd_link_info *info;
2117 asection *sec;
2118 const Elf_Internal_Rela *relocs;
2120 Elf_Internal_Shdr *symtab_hdr;
2121 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2122 const Elf_Internal_Rela *rel;
2123 const Elf_Internal_Rela *rel_end;
2125 if (info->relocateable)
2126 return true;
2128 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2129 sym_hashes = elf_sym_hashes (abfd);
2130 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
2131 if (!elf_bad_symtab (abfd))
2132 sym_hashes_end -= symtab_hdr->sh_info;
2134 rel_end = relocs + sec->reloc_count;
2135 for (rel = relocs; rel < rel_end; rel++)
2137 struct elf_link_hash_entry *h;
2138 unsigned long r_symndx;
2140 r_symndx = ELF32_R_SYM (rel->r_info);
2141 if (r_symndx < symtab_hdr->sh_info)
2142 h = NULL;
2143 else
2144 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2146 switch (ELF32_R_TYPE (rel->r_info))
2148 /* This relocation describes the C++ object vtable hierarchy.
2149 Reconstruct it for later use during GC. */
2150 case R_M32R_GNU_VTINHERIT:
2151 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2152 return false;
2153 break;
2155 /* This relocation describes which C++ vtable entries are actually
2156 used. Record for later use during GC. */
2157 case R_M32R_GNU_VTENTRY:
2158 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
2159 return false;
2160 break;
2164 return true;
2167 #define ELF_ARCH bfd_arch_m32r
2168 #define ELF_MACHINE_CODE EM_M32R
2169 #define ELF_MACHINE_ALT1 EM_CYGNUS_M32R
2170 #define ELF_MAXPAGESIZE 0x1 /* Explicitly requested by Mitsubishi. */
2172 #define TARGET_BIG_SYM bfd_elf32_m32r_vec
2173 #define TARGET_BIG_NAME "elf32-m32r"
2175 #define elf_info_to_howto 0
2176 #define elf_info_to_howto_rel m32r_info_to_howto_rel
2177 #define elf_backend_section_from_bfd_section _bfd_m32r_elf_section_from_bfd_section
2178 #define elf_backend_symbol_processing _bfd_m32r_elf_symbol_processing
2179 #define elf_backend_add_symbol_hook m32r_elf_add_symbol_hook
2180 #define elf_backend_relocate_section m32r_elf_relocate_section
2181 #define elf_backend_gc_mark_hook m32r_elf_gc_mark_hook
2182 #define elf_backend_gc_sweep_hook m32r_elf_gc_sweep_hook
2183 #define elf_backend_check_relocs m32r_elf_check_relocs
2185 #define elf_backend_can_gc_sections 1
2186 #if 0 /* not yet */
2187 /* relax support */
2188 #define bfd_elf32_bfd_relax_section m32r_elf_relax_section
2189 #define bfd_elf32_bfd_get_relocated_section_contents \
2190 m32r_elf_get_relocated_section_contents
2191 #endif
2193 #define elf_backend_object_p m32r_elf_object_p
2194 #define elf_backend_final_write_processing m32r_elf_final_write_processing
2195 #define bfd_elf32_bfd_copy_private_bfd_data m32r_elf_copy_private_bfd_data
2196 #define bfd_elf32_bfd_merge_private_bfd_data m32r_elf_merge_private_bfd_data
2197 #define bfd_elf32_bfd_set_private_flags m32r_elf_set_private_flags
2198 #define bfd_elf32_bfd_print_private_bfd_data m32r_elf_print_private_bfd_data
2200 #include "elf32-target.h"