Initial revision
[binutils.git] / bfd / elf32-m32r.c
blobb2f852370e9aa39ea08afc60b3ff5c0b781bcff2
1 /* M32R-specific support for 32-bit ELF.
2 Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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 2 of the License, or
9 (at your option) any later version.
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.
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. */
20 #include "bfd.h"
21 #include "sysdep.h"
22 #include "libbfd.h"
23 #include "elf-bfd.h"
24 #include "elf/m32r.h"
26 static bfd_reloc_status_type m32r_elf_10_pcrel_reloc
27 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
28 static bfd_reloc_status_type m32r_elf_do_10_pcrel_reloc
29 PARAMS ((bfd *, reloc_howto_type *, asection *,
30 bfd_byte *, bfd_vma, asection *, bfd_vma, bfd_vma));
31 static bfd_reloc_status_type m32r_elf_hi16_reloc
32 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
33 static void m32r_elf_relocate_hi16
34 PARAMS ((bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *,
35 bfd_byte *, bfd_vma));
36 bfd_reloc_status_type m32r_elf_lo16_reloc
37 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
38 static bfd_reloc_status_type m32r_elf_sda16_reloc
39 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
40 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
41 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
42 static void m32r_info_to_howto_rel
43 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
44 boolean _bfd_m32r_elf_section_from_bfd_section
45 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
46 void _bfd_m32r_elf_symbol_processing
47 PARAMS ((bfd *, asymbol *));
48 static boolean m32r_elf_add_symbol_hook
49 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
50 const char **, flagword *, asection **, bfd_vma *));
51 static boolean m32r_elf_relocate_section
52 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
53 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
54 #if 0 /* not yet */
55 static boolean m32r_elf_relax_delete_bytes
56 PARAMS ((bfd *, asection *, bfd_vma, int));
57 #endif
59 static bfd_reloc_status_type m32r_elf_final_sda_base
60 PARAMS ((bfd *, struct bfd_link_info *, const char **, bfd_vma *));
61 static boolean m32r_elf_object_p
62 PARAMS ((bfd *));
63 static void m32r_elf_final_write_processing
64 PARAMS ((bfd *, boolean));
65 static boolean m32r_elf_set_private_flags
66 PARAMS ((bfd *, flagword));
67 static boolean m32r_elf_copy_private_bfd_data
68 PARAMS ((bfd *, bfd *));
69 static boolean m32r_elf_merge_private_bfd_data
70 PARAMS ((bfd *, bfd *));
71 static boolean m32r_elf_print_private_bfd_data
72 PARAMS ((bfd *, PTR));
74 #define NOP_INSN 0x7000
75 #define MAKE_PARALLEL(insn) ((insn) | 0x8000)
77 /* Use REL instead of RELA to save space.
78 This only saves space in libraries and object files, but perhaps
79 relocs will be put in ROM? All in all though, REL relocs are a pain
80 to work with. */
81 #define USE_REL
83 static reloc_howto_type m32r_elf_howto_table[] =
85 /* This reloc does nothing. */
86 HOWTO (R_M32R_NONE, /* type */
87 0, /* rightshift */
88 2, /* size (0 = byte, 1 = short, 2 = long) */
89 32, /* bitsize */
90 false, /* pc_relative */
91 0, /* bitpos */
92 complain_overflow_bitfield, /* complain_on_overflow */
93 bfd_elf_generic_reloc, /* special_function */
94 "R_M32R_NONE", /* name */
95 false, /* partial_inplace */
96 0, /* src_mask */
97 0, /* dst_mask */
98 false), /* pcrel_offset */
100 /* A 16 bit absolute relocation. */
101 HOWTO (R_M32R_16, /* type */
102 0, /* rightshift */
103 1, /* size (0 = byte, 1 = short, 2 = long) */
104 16, /* bitsize */
105 false, /* pc_relative */
106 0, /* bitpos */
107 complain_overflow_bitfield, /* complain_on_overflow */
108 bfd_elf_generic_reloc, /* special_function */
109 "R_M32R_16", /* name */
110 true, /* partial_inplace */
111 0xffff, /* src_mask */
112 0xffff, /* dst_mask */
113 false), /* pcrel_offset */
115 /* A 32 bit absolute relocation. */
116 HOWTO (R_M32R_32, /* type */
117 0, /* rightshift */
118 2, /* size (0 = byte, 1 = short, 2 = long) */
119 32, /* bitsize */
120 false, /* pc_relative */
121 0, /* bitpos */
122 complain_overflow_bitfield, /* complain_on_overflow */
123 bfd_elf_generic_reloc, /* special_function */
124 "R_M32R_32", /* name */
125 true, /* partial_inplace */
126 0xffffffff, /* src_mask */
127 0xffffffff, /* dst_mask */
128 false), /* pcrel_offset */
130 /* A 24 bit address. */
131 HOWTO (R_M32R_24, /* type */
132 0, /* rightshift */
133 2, /* size (0 = byte, 1 = short, 2 = long) */
134 24, /* bitsize */
135 false, /* pc_relative */
136 0, /* bitpos */
137 complain_overflow_unsigned, /* complain_on_overflow */
138 bfd_elf_generic_reloc, /* special_function */
139 "R_M32R_24", /* name */
140 true, /* partial_inplace */
141 0xffffff, /* src_mask */
142 0xffffff, /* dst_mask */
143 false), /* pcrel_offset */
145 /* An PC Relative 10-bit relocation, shifted by 2.
146 This reloc is complicated because relocations are relative to pc & -4.
147 i.e. branches in the right insn slot use the address of the left insn
148 slot for pc. */
149 /* ??? It's not clear whether this should have partial_inplace set or not.
150 Branch relaxing in the assembler can store the addend in the insn,
151 and if bfd_install_relocation gets called the addend may get added
152 again. */
153 HOWTO (R_M32R_10_PCREL, /* type */
154 2, /* rightshift */
155 1, /* size (0 = byte, 1 = short, 2 = long) */
156 10, /* bitsize */
157 true, /* pc_relative */
158 0, /* bitpos */
159 complain_overflow_signed, /* complain_on_overflow */
160 m32r_elf_10_pcrel_reloc, /* special_function */
161 "R_M32R_10_PCREL", /* name */
162 false, /* partial_inplace */
163 0xff, /* src_mask */
164 0xff, /* dst_mask */
165 true), /* pcrel_offset */
167 /* A relative 18 bit relocation, right shifted by 2. */
168 HOWTO (R_M32R_18_PCREL, /* type */
169 2, /* rightshift */
170 2, /* size (0 = byte, 1 = short, 2 = long) */
171 16, /* bitsize */
172 true, /* pc_relative */
173 0, /* bitpos */
174 complain_overflow_signed, /* complain_on_overflow */
175 bfd_elf_generic_reloc, /* special_function */
176 "R_M32R_18_PCREL", /* name */
177 false, /* partial_inplace */
178 0xffff, /* src_mask */
179 0xffff, /* dst_mask */
180 true), /* pcrel_offset */
182 /* A relative 26 bit relocation, right shifted by 2. */
183 /* ??? It's not clear whether this should have partial_inplace set or not.
184 Branch relaxing in the assembler can store the addend in the insn,
185 and if bfd_install_relocation gets called the addend may get added
186 again. */
187 HOWTO (R_M32R_26_PCREL, /* type */
188 2, /* rightshift */
189 2, /* size (0 = byte, 1 = short, 2 = long) */
190 26, /* bitsize */
191 true, /* pc_relative */
192 0, /* bitpos */
193 complain_overflow_signed, /* complain_on_overflow */
194 bfd_elf_generic_reloc, /* special_function */
195 "R_M32R_26_PCREL", /* name */
196 false, /* partial_inplace */
197 0xffffff, /* src_mask */
198 0xffffff, /* dst_mask */
199 true), /* pcrel_offset */
201 /* High 16 bits of address when lower 16 is or'd in. */
202 HOWTO (R_M32R_HI16_ULO, /* type */
203 16, /* rightshift */
204 2, /* size (0 = byte, 1 = short, 2 = long) */
205 16, /* bitsize */
206 false, /* pc_relative */
207 0, /* bitpos */
208 complain_overflow_dont, /* complain_on_overflow */
209 m32r_elf_hi16_reloc, /* special_function */
210 "R_M32R_HI16_ULO", /* name */
211 true, /* partial_inplace */
212 0x0000ffff, /* src_mask */
213 0x0000ffff, /* dst_mask */
214 false), /* pcrel_offset */
216 /* High 16 bits of address when lower 16 is added in. */
217 HOWTO (R_M32R_HI16_SLO, /* type */
218 16, /* rightshift */
219 2, /* size (0 = byte, 1 = short, 2 = long) */
220 16, /* bitsize */
221 false, /* pc_relative */
222 0, /* bitpos */
223 complain_overflow_dont, /* complain_on_overflow */
224 m32r_elf_hi16_reloc, /* special_function */
225 "R_M32R_HI16_SLO", /* name */
226 true, /* partial_inplace */
227 0x0000ffff, /* src_mask */
228 0x0000ffff, /* dst_mask */
229 false), /* pcrel_offset */
231 /* Lower 16 bits of address. */
232 HOWTO (R_M32R_LO16, /* type */
233 0, /* rightshift */
234 2, /* size (0 = byte, 1 = short, 2 = long) */
235 16, /* bitsize */
236 false, /* pc_relative */
237 0, /* bitpos */
238 complain_overflow_dont, /* complain_on_overflow */
239 m32r_elf_lo16_reloc, /* special_function */
240 "R_M32R_LO16", /* name */
241 true, /* partial_inplace */
242 0x0000ffff, /* src_mask */
243 0x0000ffff, /* dst_mask */
244 false), /* pcrel_offset */
246 /* Small data area 16 bits offset. */
247 HOWTO (R_M32R_SDA16, /* type */
248 0, /* rightshift */
249 2, /* size (0 = byte, 1 = short, 2 = long) */
250 16, /* bitsize */
251 false, /* pc_relative */
252 0, /* bitpos */
253 complain_overflow_signed, /* complain_on_overflow */
254 m32r_elf_sda16_reloc, /* special_function */
255 "R_M32R_SDA16", /* name */
256 true, /* partial_inplace */ /* FIXME: correct? */
257 0x0000ffff, /* src_mask */
258 0x0000ffff, /* dst_mask */
259 false), /* pcrel_offset */
261 /* GNU extension to record C++ vtable hierarchy */
262 HOWTO (R_M32R_GNU_VTINHERIT, /* type */
263 0, /* rightshift */
264 2, /* size (0 = byte, 1 = short, 2 = long) */
265 0, /* bitsize */
266 false, /* pc_relative */
267 0, /* bitpos */
268 complain_overflow_dont, /* complain_on_overflow */
269 NULL, /* special_function */
270 "R_M32R_GNU_VTINHERIT", /* name */
271 false, /* partial_inplace */
272 0, /* src_mask */
273 0, /* dst_mask */
274 false), /* pcrel_offset */
276 /* GNU extension to record C++ vtable member usage */
277 HOWTO (R_M32R_GNU_VTENTRY, /* type */
278 0, /* rightshift */
279 2, /* size (0 = byte, 1 = short, 2 = long) */
280 0, /* bitsize */
281 false, /* pc_relative */
282 0, /* bitpos */
283 complain_overflow_dont, /* complain_on_overflow */
284 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
285 "R_M32R_GNU_VTENTRY", /* name */
286 false, /* partial_inplace */
287 0, /* src_mask */
288 0, /* dst_mask */
289 false), /* pcrel_offset */
293 /* Handle the R_M32R_10_PCREL reloc. */
295 static bfd_reloc_status_type
296 m32r_elf_10_pcrel_reloc (abfd, reloc_entry, symbol, data,
297 input_section, output_bfd, error_message)
298 bfd * abfd;
299 arelent * reloc_entry;
300 asymbol * symbol;
301 PTR data;
302 asection * input_section;
303 bfd * output_bfd;
304 char ** error_message;
306 /* This part is from bfd_elf_generic_reloc. */
307 if (output_bfd != (bfd *) NULL
308 && (symbol->flags & BSF_SECTION_SYM) == 0
309 && (! reloc_entry->howto->partial_inplace
310 || reloc_entry->addend == 0))
312 reloc_entry->address += input_section->output_offset;
313 return bfd_reloc_ok;
316 if (output_bfd != NULL)
318 /* FIXME: See bfd_perform_relocation. Is this right? */
319 return bfd_reloc_continue;
322 return m32r_elf_do_10_pcrel_reloc (abfd, reloc_entry->howto,
323 input_section,
324 data, reloc_entry->address,
325 symbol->section,
326 (symbol->value
327 + symbol->section->output_section->vma
328 + symbol->section->output_offset),
329 reloc_entry->addend);
332 /* Utility to actually perform an R_M32R_10_PCREL reloc. */
334 static bfd_reloc_status_type
335 m32r_elf_do_10_pcrel_reloc (abfd, howto, input_section, data, offset,
336 symbol_section, symbol_value, addend)
337 bfd *abfd;
338 reloc_howto_type *howto;
339 asection *input_section;
340 bfd_byte *data;
341 bfd_vma offset;
342 asection *symbol_section;
343 bfd_vma symbol_value;
344 bfd_vma addend;
346 bfd_signed_vma relocation;
347 unsigned long x;
348 bfd_reloc_status_type status;
350 /* Sanity check the address (offset in section). */
351 if (offset > input_section->_cooked_size)
352 return bfd_reloc_outofrange;
354 relocation = symbol_value + addend;
355 /* Make it pc relative. */
356 relocation -= (input_section->output_section->vma
357 + input_section->output_offset);
358 /* These jumps mask off the lower two bits of the current address
359 before doing pcrel calculations. */
360 relocation -= (offset & -4L);
362 if (relocation < -0x200 || relocation > 0x1ff)
363 status = bfd_reloc_overflow;
364 else
365 status = bfd_reloc_ok;
367 x = bfd_get_16 (abfd, data + offset);
368 relocation >>= howto->rightshift;
369 relocation <<= howto->bitpos;
370 x = (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask);
371 bfd_put_16 (abfd, x, data + offset);
373 return status;
376 /* Handle the R_M32R_HI16_[SU]LO relocs.
377 HI16_SLO is for the add3 and load/store with displacement instructions.
378 HI16_ULO is for the or3 instruction.
379 For R_M32R_HI16_SLO, the lower 16 bits are sign extended when added to
380 the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
381 we must add one to the high 16 bytes (which will get subtracted off when
382 the low 16 bits are added).
383 These relocs have to be done in combination with an R_M32R_LO16 reloc
384 because there is a carry from the LO16 to the HI16. Here we just save
385 the information we need; we do the actual relocation when we see the LO16.
386 This code is copied from the elf32-mips.c. We also support an arbitrary
387 number of HI16 relocs to be associated with a single LO16 reloc. The
388 assembler sorts the relocs to ensure each HI16 immediately precedes its
389 LO16. However if there are multiple copies, the assembler may not find
390 the real LO16 so it picks the first one it finds. */
392 struct m32r_hi16
394 struct m32r_hi16 *next;
395 bfd_byte *addr;
396 bfd_vma addend;
399 /* FIXME: This should not be a static variable. */
401 static struct m32r_hi16 *m32r_hi16_list;
403 static bfd_reloc_status_type
404 m32r_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
405 input_section, output_bfd, error_message)
406 bfd *abfd;
407 arelent *reloc_entry;
408 asymbol *symbol;
409 PTR data;
410 asection *input_section;
411 bfd *output_bfd;
412 char **error_message;
414 bfd_reloc_status_type ret;
415 bfd_vma relocation;
416 struct m32r_hi16 *n;
418 /* This part is from bfd_elf_generic_reloc.
419 If we're relocating, and this an external symbol, we don't want
420 to change anything. */
421 if (output_bfd != (bfd *) NULL
422 && (symbol->flags & BSF_SECTION_SYM) == 0
423 && reloc_entry->addend == 0)
425 reloc_entry->address += input_section->output_offset;
426 return bfd_reloc_ok;
429 /* Sanity check the address (offset in section). */
430 if (reloc_entry->address > input_section->_cooked_size)
431 return bfd_reloc_outofrange;
433 ret = bfd_reloc_ok;
434 if (bfd_is_und_section (symbol->section)
435 && output_bfd == (bfd *) NULL)
436 ret = bfd_reloc_undefined;
438 if (bfd_is_com_section (symbol->section))
439 relocation = 0;
440 else
441 relocation = symbol->value;
443 relocation += symbol->section->output_section->vma;
444 relocation += symbol->section->output_offset;
445 relocation += reloc_entry->addend;
447 /* Save the information, and let LO16 do the actual relocation. */
448 n = (struct m32r_hi16 *) bfd_malloc (sizeof *n);
449 if (n == NULL)
450 return bfd_reloc_outofrange;
451 n->addr = (bfd_byte *) data + reloc_entry->address;
452 n->addend = relocation;
453 n->next = m32r_hi16_list;
454 m32r_hi16_list = n;
456 if (output_bfd != (bfd *) NULL)
457 reloc_entry->address += input_section->output_offset;
459 return ret;
462 /* Handle an M32R ELF HI16 reloc. */
464 static void
465 m32r_elf_relocate_hi16 (input_bfd, type, relhi, rello, contents, addend)
466 bfd *input_bfd;
467 int type;
468 Elf_Internal_Rela *relhi;
469 Elf_Internal_Rela *rello;
470 bfd_byte *contents;
471 bfd_vma addend;
473 unsigned long insn;
474 bfd_vma addlo;
476 insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
478 addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
479 if (type == R_M32R_HI16_SLO)
480 addlo = ((addlo & 0xffff) ^ 0x8000) - 0x8000;
481 else
482 addlo &= 0xffff;
484 addend += ((insn & 0xffff) << 16) + addlo;
486 /* Reaccount for sign extension of low part. */
487 if (type == R_M32R_HI16_SLO
488 && (addend & 0x8000) != 0)
489 addend += 0x10000;
491 bfd_put_32 (input_bfd,
492 (insn & 0xffff0000) | ((addend >> 16) & 0xffff),
493 contents + relhi->r_offset);
496 /* Do an R_M32R_LO16 relocation. This is a straightforward 16 bit
497 inplace relocation; this function exists in order to do the
498 R_M32R_HI16_[SU]LO relocation described above. */
500 bfd_reloc_status_type
501 m32r_elf_lo16_reloc (abfd, reloc_entry, symbol, data,
502 input_section, output_bfd, error_message)
503 bfd *abfd;
504 arelent *reloc_entry;
505 asymbol *symbol;
506 PTR data;
507 asection *input_section;
508 bfd *output_bfd;
509 char **error_message;
511 if (m32r_hi16_list != NULL)
513 struct m32r_hi16 *l;
515 l = m32r_hi16_list;
516 while (l != NULL)
518 unsigned long insn;
519 unsigned long val;
520 unsigned long vallo;
521 struct m32r_hi16 *next;
523 /* Do the HI16 relocation. Note that we actually don't need
524 to know anything about the LO16 itself, except where to
525 find the low 16 bits of the addend needed by the LO16. */
526 insn = bfd_get_32 (abfd, l->addr);
527 vallo = ((bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address)
528 & 0xffff) ^ 0x8000) - 0x8000;
529 val = ((insn & 0xffff) << 16) + vallo;
530 val += l->addend;
532 /* Reaccount for sign extension of low part. */
533 if ((val & 0x8000) != 0)
534 val += 0x10000;
536 insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff);
537 bfd_put_32 (abfd, insn, l->addr);
539 next = l->next;
540 free (l);
541 l = next;
544 m32r_hi16_list = NULL;
547 /* Now do the LO16 reloc in the usual way. */
548 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
549 input_section, output_bfd, error_message);
552 /* Handle the R_M32R_SDA16 reloc.
553 This reloc is used to compute the address of objects in the small data area
554 and to perform loads and stores from that area.
555 The lower 16 bits are sign extended and added to the register specified
556 in the instruction, which is assumed to point to _SDA_BASE_. */
558 static bfd_reloc_status_type
559 m32r_elf_sda16_reloc (abfd, reloc_entry, symbol, data,
560 input_section, output_bfd, error_message)
561 bfd *abfd;
562 arelent *reloc_entry;
563 asymbol *symbol;
564 PTR data;
565 asection *input_section;
566 bfd *output_bfd;
567 char **error_message;
569 /* This part is from bfd_elf_generic_reloc. */
570 if (output_bfd != (bfd *) NULL
571 && (symbol->flags & BSF_SECTION_SYM) == 0
572 && (! reloc_entry->howto->partial_inplace
573 || reloc_entry->addend == 0))
575 reloc_entry->address += input_section->output_offset;
576 return bfd_reloc_ok;
579 if (output_bfd != NULL)
581 /* FIXME: See bfd_perform_relocation. Is this right? */
582 return bfd_reloc_continue;
585 /* FIXME: not sure what to do here yet. But then again, the linker
586 may never call us. */
587 abort ();
590 /* Map BFD reloc types to M32R ELF reloc types. */
592 struct m32r_reloc_map
594 bfd_reloc_code_real_type bfd_reloc_val;
595 unsigned char elf_reloc_val;
598 static const struct m32r_reloc_map m32r_reloc_map[] =
600 { BFD_RELOC_NONE, R_M32R_NONE },
601 { BFD_RELOC_16, R_M32R_16 },
602 { BFD_RELOC_32, R_M32R_32 },
603 { BFD_RELOC_M32R_24, R_M32R_24 },
604 { BFD_RELOC_M32R_10_PCREL, R_M32R_10_PCREL },
605 { BFD_RELOC_M32R_18_PCREL, R_M32R_18_PCREL },
606 { BFD_RELOC_M32R_26_PCREL, R_M32R_26_PCREL },
607 { BFD_RELOC_M32R_HI16_ULO, R_M32R_HI16_ULO },
608 { BFD_RELOC_M32R_HI16_SLO, R_M32R_HI16_SLO },
609 { BFD_RELOC_M32R_LO16, R_M32R_LO16 },
610 { BFD_RELOC_M32R_SDA16, R_M32R_SDA16 },
611 { BFD_RELOC_VTABLE_INHERIT, R_M32R_GNU_VTINHERIT },
612 { BFD_RELOC_VTABLE_ENTRY, R_M32R_GNU_VTENTRY },
615 static reloc_howto_type *
616 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
617 bfd *abfd;
618 bfd_reloc_code_real_type code;
620 unsigned int i;
622 for (i = 0;
623 i < sizeof (m32r_reloc_map) / sizeof (struct m32r_reloc_map);
624 i++)
626 if (m32r_reloc_map[i].bfd_reloc_val == code)
627 return &m32r_elf_howto_table[m32r_reloc_map[i].elf_reloc_val];
630 return NULL;
633 /* Set the howto pointer for an M32R ELF reloc. */
635 static void
636 m32r_info_to_howto_rel (abfd, cache_ptr, dst)
637 bfd *abfd;
638 arelent *cache_ptr;
639 Elf32_Internal_Rel *dst;
641 unsigned int r_type;
643 r_type = ELF32_R_TYPE (dst->r_info);
644 BFD_ASSERT (r_type < (unsigned int) R_M32R_max);
645 cache_ptr->howto = &m32r_elf_howto_table[r_type];
648 /* Given a BFD section, try to locate the corresponding ELF section
649 index. */
651 boolean
652 _bfd_m32r_elf_section_from_bfd_section (abfd, hdr, sec, retval)
653 bfd *abfd;
654 Elf32_Internal_Shdr *hdr;
655 asection *sec;
656 int *retval;
658 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
660 *retval = SHN_M32R_SCOMMON;
661 return true;
663 return false;
666 /* M32R ELF uses two common sections. One is the usual one, and the other
667 is for small objects. All the small objects are kept together, and then
668 referenced via one register, which yields faster assembler code. It is
669 up to the compiler to emit an instruction to load the register with
670 _SDA_BASE. This is what we use for the small common section. This
671 approach is copied from elf32-mips.c. */
672 static asection m32r_elf_scom_section;
673 static asymbol m32r_elf_scom_symbol;
674 static asymbol *m32r_elf_scom_symbol_ptr;
676 /* Handle the special M32R section numbers that a symbol may use. */
678 void
679 _bfd_m32r_elf_symbol_processing (abfd, asym)
680 bfd *abfd;
681 asymbol *asym;
683 elf_symbol_type *elfsym;
685 elfsym = (elf_symbol_type *) asym;
687 switch (elfsym->internal_elf_sym.st_shndx)
689 case SHN_M32R_SCOMMON:
690 if (m32r_elf_scom_section.name == NULL)
692 /* Initialize the small common section. */
693 m32r_elf_scom_section.name = ".scommon";
694 m32r_elf_scom_section.flags = SEC_IS_COMMON;
695 m32r_elf_scom_section.output_section = &m32r_elf_scom_section;
696 m32r_elf_scom_section.symbol = &m32r_elf_scom_symbol;
697 m32r_elf_scom_section.symbol_ptr_ptr = &m32r_elf_scom_symbol_ptr;
698 m32r_elf_scom_symbol.name = ".scommon";
699 m32r_elf_scom_symbol.flags = BSF_SECTION_SYM;
700 m32r_elf_scom_symbol.section = &m32r_elf_scom_section;
701 m32r_elf_scom_symbol_ptr = &m32r_elf_scom_symbol;
703 asym->section = &m32r_elf_scom_section;
704 asym->value = elfsym->internal_elf_sym.st_size;
705 break;
709 /* Hook called by the linker routine which adds symbols from an object
710 file. We must handle the special M32R section numbers here.
711 We also keep watching for whether we need to create the sdata special
712 linker sections. */
714 static boolean
715 m32r_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
716 bfd *abfd;
717 struct bfd_link_info *info;
718 const Elf_Internal_Sym *sym;
719 const char **namep;
720 flagword *flagsp;
721 asection **secp;
722 bfd_vma *valp;
724 if (! info->relocateable
725 && (*namep)[0] == '_' && (*namep)[1] == 'S'
726 && strcmp (*namep, "_SDA_BASE_") == 0)
728 /* This is simpler than using _bfd_elf_create_linker_section
729 (our needs are simpler than ppc's needs). Also
730 _bfd_elf_create_linker_section currently has a bug where if a .sdata
731 section already exists a new one is created that follows it which
732 screws of _SDA_BASE_ address calcs because output_offset != 0. */
733 struct elf_link_hash_entry *h;
734 asection *s = bfd_get_section_by_name (abfd, ".sdata");
736 /* The following code was cobbled from elf32-ppc.c and elflink.c. */
738 if (s == NULL)
740 int flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
741 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
743 s = bfd_make_section_anyway (abfd, ".sdata");
744 if (s == NULL)
745 return false;
746 bfd_set_section_flags (abfd, s, flags);
747 bfd_set_section_alignment (abfd, s, 2);
750 h = (struct elf_link_hash_entry *)
751 bfd_link_hash_lookup (info->hash, "_SDA_BASE_", false, false, false);
753 if ((h == NULL || h->root.type == bfd_link_hash_undefined)
754 && !(_bfd_generic_link_add_one_symbol (info,
755 abfd,
756 "_SDA_BASE_",
757 BSF_GLOBAL,
759 32768,
760 (const char *) NULL,
761 false,
762 get_elf_backend_data (abfd)->collect,
763 (struct bfd_link_hash_entry **) &h)))
764 return false;
765 h->type = STT_OBJECT;
768 switch (sym->st_shndx)
770 case SHN_M32R_SCOMMON:
771 *secp = bfd_make_section_old_way (abfd, ".scommon");
772 (*secp)->flags |= SEC_IS_COMMON;
773 *valp = sym->st_size;
774 break;
777 return true;
780 /* We have to figure out the SDA_BASE value, so that we can adjust the
781 symbol value correctly. We look up the symbol _SDA_BASE_ in the output
782 BFD. If we can't find it, we're stuck. We cache it in the ELF
783 target data. We don't need to adjust the symbol value for an
784 external symbol if we are producing relocateable output. */
786 static bfd_reloc_status_type
787 m32r_elf_final_sda_base (output_bfd, info, error_message, psb)
788 bfd *output_bfd;
789 struct bfd_link_info *info;
790 const char **error_message;
791 bfd_vma *psb;
793 if (elf_gp (output_bfd) == 0)
795 struct bfd_link_hash_entry *h;
797 h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", false, false, true);
798 if (h != (struct bfd_link_hash_entry *) NULL
799 && h->type == bfd_link_hash_defined)
800 elf_gp (output_bfd) = (h->u.def.value
801 + h->u.def.section->output_section->vma
802 + h->u.def.section->output_offset);
803 else
805 /* Only get the error once. */
806 *psb = elf_gp (output_bfd) = 4;
807 *error_message =
808 (const char *) _("SDA relocation when _SDA_BASE_ not defined");
809 return bfd_reloc_dangerous;
812 *psb = elf_gp (output_bfd);
813 return bfd_reloc_ok;
816 /* Relocate an M32R/D ELF section.
817 There is some attempt to make this function usable for many architectures,
818 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
819 if only to serve as a learning tool.
821 The RELOCATE_SECTION function is called by the new ELF backend linker
822 to handle the relocations for a section.
824 The relocs are always passed as Rela structures; if the section
825 actually uses Rel structures, the r_addend field will always be
826 zero.
828 This function is responsible for adjust the section contents as
829 necessary, and (if using Rela relocs and generating a
830 relocateable output file) adjusting the reloc addend as
831 necessary.
833 This function does not have to worry about setting the reloc
834 address or the reloc symbol index.
836 LOCAL_SYMS is a pointer to the swapped in local symbols.
838 LOCAL_SECTIONS is an array giving the section in the input file
839 corresponding to the st_shndx field of each local symbol.
841 The global hash table entry for the global symbols can be found
842 via elf_sym_hashes (input_bfd).
844 When generating relocateable output, this function must handle
845 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
846 going to be the section symbol corresponding to the output
847 section, which means that the addend must be adjusted
848 accordingly. */
850 static boolean
851 m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
852 contents, relocs, local_syms, local_sections)
853 bfd *output_bfd;
854 struct bfd_link_info *info;
855 bfd *input_bfd;
856 asection *input_section;
857 bfd_byte *contents;
858 Elf_Internal_Rela *relocs;
859 Elf_Internal_Sym *local_syms;
860 asection **local_sections;
862 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
863 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
864 Elf_Internal_Rela *rel, *relend;
865 /* Assume success. */
866 boolean ret = true;
868 rel = relocs;
869 relend = relocs + input_section->reloc_count;
870 for (; rel < relend; rel++)
872 int r_type;
873 reloc_howto_type *howto;
874 unsigned long r_symndx;
875 /* We can't modify r_addend here as elf_link_input_bfd has an assert to
876 ensure it's zero (we use REL relocs, not RELA). Therefore this
877 should be assigning zero to `addend', but for clarity we use
878 `r_addend'. */
879 bfd_vma addend = rel->r_addend;
880 bfd_vma offset = rel->r_offset;
881 struct elf_link_hash_entry *h;
882 Elf_Internal_Sym *sym;
883 asection *sec;
884 const char *sym_name;
885 bfd_reloc_status_type r;
886 const char *errmsg = NULL;
888 h = NULL;
889 r_type = ELF32_R_TYPE (rel->r_info);
890 if (r_type < 0 || r_type >= (int) R_M32R_max)
892 (*_bfd_error_handler) (_("%s: unknown relocation type %d"),
893 bfd_get_filename (input_bfd),
894 (int) r_type);
895 bfd_set_error (bfd_error_bad_value);
896 ret = false;
897 continue;
900 if (r_type == R_M32R_GNU_VTENTRY
901 || r_type == R_M32R_GNU_VTINHERIT)
902 continue;
904 howto = m32r_elf_howto_table + r_type;
905 r_symndx = ELF32_R_SYM (rel->r_info);
907 if (info->relocateable)
909 /* This is a relocateable link. We don't have to change
910 anything, unless the reloc is against a section symbol,
911 in which case we have to adjust according to where the
912 section symbol winds up in the output section. */
913 sec = NULL;
914 if (r_symndx >= symtab_hdr->sh_info)
916 /* External symbol. */
917 continue;
920 /* Local symbol. */
921 sym = local_syms + r_symndx;
922 sym_name = "<local symbol>";
923 /* STT_SECTION: symbol is associated with a section. */
924 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
926 /* Symbol isn't associated with a section. Nothing to do. */
927 continue;
930 sec = local_sections[r_symndx];
931 addend += sec->output_offset + sym->st_value;
932 #ifndef USE_REL
933 /* This can't be done for USE_REL because it doesn't mean anything
934 and elf_link_input_bfd asserts this stays zero. */
935 rel->r_addend = addend;
936 #endif
938 #ifndef USE_REL
939 /* Addends are stored with relocs. We're done. */
940 continue;
941 #else /* USE_REL */
942 /* If partial_inplace, we need to store any additional addend
943 back in the section. */
944 if (! howto->partial_inplace)
945 continue;
946 /* ??? Here is a nice place to call a special_function
947 like handler. */
948 if (r_type != R_M32R_HI16_SLO && r_type != R_M32R_HI16_ULO)
949 r = _bfd_relocate_contents (howto, input_bfd,
950 addend, contents + offset);
951 else
953 Elf_Internal_Rela *lorel;
955 /* We allow an arbitrary number of HI16 relocs before the
956 LO16 reloc. This permits gcc to emit the HI and LO relocs
957 itself. */
958 for (lorel = rel + 1;
959 (lorel < relend
960 && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
961 || ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
962 lorel++)
963 continue;
964 if (lorel < relend
965 && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
967 m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
968 contents, addend);
969 r = bfd_reloc_ok;
971 else
972 r = _bfd_relocate_contents (howto, input_bfd,
973 addend, contents + offset);
975 #endif /* USE_REL */
977 else
979 bfd_vma relocation;
981 /* This is a final link. */
982 sym = NULL;
983 sec = NULL;
985 if (r_symndx < symtab_hdr->sh_info)
987 /* Local symbol. */
988 sym = local_syms + r_symndx;
989 sec = local_sections[r_symndx];
990 sym_name = "<local symbol>";
991 relocation = (sec->output_section->vma
992 + sec->output_offset
993 + sym->st_value);
995 else
997 /* External symbol. */
998 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
999 while (h->root.type == bfd_link_hash_indirect
1000 || h->root.type == bfd_link_hash_warning)
1001 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1002 sym_name = h->root.root.string;
1004 if (h->root.type == bfd_link_hash_defined
1005 || h->root.type == bfd_link_hash_defweak)
1007 sec = h->root.u.def.section;
1008 if (sec->output_section == NULL)
1009 relocation = 0;
1010 else
1011 relocation = (h->root.u.def.value
1012 + sec->output_section->vma
1013 + sec->output_offset);
1015 else if (h->root.type == bfd_link_hash_undefweak)
1016 relocation = 0;
1017 else
1019 if (! ((*info->callbacks->undefined_symbol)
1020 (info, h->root.root.string, input_bfd,
1021 input_section, offset)))
1022 return false;
1023 relocation = 0;
1027 /* Sanity check the address. */
1028 if (offset > input_section->_raw_size)
1030 r = bfd_reloc_outofrange;
1031 goto check_reloc;
1034 switch ((int) r_type)
1036 case (int) R_M32R_10_PCREL :
1037 r = m32r_elf_do_10_pcrel_reloc (input_bfd, howto, input_section,
1038 contents, offset,
1039 sec, relocation, addend);
1040 break;
1042 case (int) R_M32R_HI16_SLO :
1043 case (int) R_M32R_HI16_ULO :
1045 Elf_Internal_Rela *lorel;
1047 /* We allow an arbitrary number of HI16 relocs before the
1048 LO16 reloc. This permits gcc to emit the HI and LO relocs
1049 itself. */
1050 for (lorel = rel + 1;
1051 (lorel < relend
1052 && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
1053 || ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
1054 lorel++)
1055 continue;
1056 if (lorel < relend
1057 && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
1059 m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
1060 contents, relocation + addend);
1061 r = bfd_reloc_ok;
1063 else
1064 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1065 contents, offset,
1066 relocation, addend);
1068 break;
1070 case (int) R_M32R_SDA16 :
1072 const char *name;
1074 BFD_ASSERT (sec != NULL);
1075 name = bfd_get_section_name (abfd, sec);
1077 if (strcmp (name, ".sdata") == 0
1078 || strcmp (name, ".sbss") == 0
1079 || strcmp (name, ".scommon") == 0)
1081 bfd_vma sda_base;
1082 bfd *out_bfd = sec->output_section->owner;
1084 r = m32r_elf_final_sda_base (out_bfd, info,
1085 &errmsg,
1086 &sda_base);
1087 if (r != bfd_reloc_ok)
1089 ret = false;
1090 goto check_reloc;
1093 /* At this point `relocation' contains the object's
1094 address. */
1095 relocation -= sda_base;
1096 /* Now it contains the offset from _SDA_BASE_. */
1098 else
1100 (*_bfd_error_handler) (_("%s: The target (%s) of an %s relocation is in the wrong section (%s)"),
1101 bfd_get_filename (input_bfd),
1102 sym_name,
1103 m32r_elf_howto_table[(int) r_type].name,
1104 bfd_get_section_name (abfd, sec));
1105 /*bfd_set_error (bfd_error_bad_value); ??? why? */
1106 ret = false;
1107 continue;
1110 /* fall through */
1112 default :
1113 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1114 contents, offset,
1115 relocation, addend);
1116 break;
1120 check_reloc:
1122 if (r != bfd_reloc_ok)
1124 /* FIXME: This should be generic enough to go in a utility. */
1125 const char *name;
1127 if (h != NULL)
1128 name = h->root.root.string;
1129 else
1131 name = (bfd_elf_string_from_elf_section
1132 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1133 if (name == NULL || *name == '\0')
1134 name = bfd_section_name (input_bfd, sec);
1137 if (errmsg != NULL)
1138 goto common_error;
1140 switch (r)
1142 case bfd_reloc_overflow:
1143 if (! ((*info->callbacks->reloc_overflow)
1144 (info, name, howto->name, (bfd_vma) 0,
1145 input_bfd, input_section, offset)))
1146 return false;
1147 break;
1149 case bfd_reloc_undefined:
1150 if (! ((*info->callbacks->undefined_symbol)
1151 (info, name, input_bfd, input_section,
1152 offset)))
1153 return false;
1154 break;
1156 case bfd_reloc_outofrange:
1157 errmsg = _("internal error: out of range error");
1158 goto common_error;
1160 case bfd_reloc_notsupported:
1161 errmsg = _("internal error: unsupported relocation error");
1162 goto common_error;
1164 case bfd_reloc_dangerous:
1165 errmsg = _("internal error: dangerous error");
1166 goto common_error;
1168 default:
1169 errmsg = _("internal error: unknown error");
1170 /* fall through */
1172 common_error:
1173 if (!((*info->callbacks->warning)
1174 (info, errmsg, name, input_bfd, input_section,
1175 offset)))
1176 return false;
1177 break;
1182 return ret;
1185 #if 0 /* relaxing not supported yet */
1187 /* This function handles relaxing for the m32r.
1188 Relaxing on the m32r is tricky because of instruction alignment
1189 requirements (4 byte instructions must be aligned on 4 byte boundaries).
1191 The following relaxing opportunities are handled:
1193 seth/add3/jl -> bl24 or bl8
1194 seth/add3 -> ld24
1196 It would be nice to handle bl24 -> bl8 but given:
1198 - 4 byte insns must be on 4 byte boundaries
1199 - branch instructions only branch to insns on 4 byte boundaries
1201 this isn't much of a win because the insn in the 2 "deleted" bytes
1202 must become a nop. With some complexity some real relaxation could be
1203 done but the frequency just wouldn't make it worth it; it's better to
1204 try to do all the code compaction one can elsewhere.
1205 When the chip supports parallel 16 bit insns, things may change.
1208 static boolean
1209 m32r_elf_relax_section (abfd, sec, link_info, again)
1210 bfd *abfd;
1211 asection *sec;
1212 struct bfd_link_info *link_info;
1213 boolean *again;
1215 Elf_Internal_Shdr *symtab_hdr;
1216 /* The Rela structures are used here because that's what
1217 _bfd_elf32_link_read_relocs uses [for convenience - it sets the addend
1218 field to 0]. */
1219 Elf_Internal_Rela *internal_relocs;
1220 Elf_Internal_Rela *free_relocs = NULL;
1221 Elf_Internal_Rela *irel, *irelend;
1222 bfd_byte *contents = NULL;
1223 bfd_byte *free_contents = NULL;
1224 Elf32_External_Sym *extsyms = NULL;
1225 Elf32_External_Sym *free_extsyms = NULL;
1227 /* Assume nothing changes. */
1228 *again = false;
1230 /* We don't have to do anything for a relocateable link, if
1231 this section does not have relocs, or if this is not a
1232 code section. */
1233 if (link_info->relocateable
1234 || (sec->flags & SEC_RELOC) == 0
1235 || sec->reloc_count == 0
1236 || (sec->flags & SEC_CODE) == 0
1237 || 0 /* FIXME: check SHF_M32R_CAN_RELAX */)
1238 return true;
1240 /* If this is the first time we have been called for this section,
1241 initialize the cooked size. */
1242 if (sec->_cooked_size == 0)
1243 sec->_cooked_size = sec->_raw_size;
1245 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1247 /* Get a copy of the native relocations. */
1248 internal_relocs = (_bfd_elf32_link_read_relocs
1249 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1250 link_info->keep_memory));
1251 if (internal_relocs == NULL)
1252 goto error_return;
1253 if (! link_info->keep_memory)
1254 free_relocs = internal_relocs;
1256 /* Walk through them looking for relaxing opportunities. */
1257 irelend = internal_relocs + sec->reloc_count;
1258 for (irel = internal_relocs; irel < irelend; irel++)
1260 bfd_vma symval;
1262 /* If this isn't something that can be relaxed, then ignore
1263 this reloc. */
1264 if (ELF32_R_TYPE (irel->r_info) != (int) R_M32R_HI16_SLO)
1265 continue;
1267 /* Get the section contents if we haven't done so already. */
1268 if (contents == NULL)
1270 /* Get cached copy if it exists. */
1271 if (elf_section_data (sec)->this_hdr.contents != NULL)
1272 contents = elf_section_data (sec)->this_hdr.contents;
1273 else
1275 /* Go get them off disk. */
1276 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1277 if (contents == NULL)
1278 goto error_return;
1279 free_contents = contents;
1281 if (! bfd_get_section_contents (abfd, sec, contents,
1282 (file_ptr) 0, sec->_raw_size))
1283 goto error_return;
1287 /* Read this BFD's symbols if we haven't done so already. */
1288 if (extsyms == NULL)
1290 /* Get cached copy if it exists. */
1291 if (symtab_hdr->contents != NULL)
1292 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1293 else
1295 /* Go get them off disk. */
1296 extsyms = ((Elf32_External_Sym *)
1297 bfd_malloc (symtab_hdr->sh_size));
1298 if (extsyms == NULL)
1299 goto error_return;
1300 free_extsyms = extsyms;
1301 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1302 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
1303 != symtab_hdr->sh_size))
1304 goto error_return;
1308 /* Get the value of the symbol referred to by the reloc. */
1309 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1311 Elf_Internal_Sym isym;
1312 asection *sym_sec;
1314 /* A local symbol. */
1315 bfd_elf32_swap_symbol_in (abfd,
1316 extsyms + ELF32_R_SYM (irel->r_info),
1317 &isym);
1319 sym_sec = bfd_section_from_elf_index (abfd, isym.st_shndx);
1320 symval = (isym.st_value
1321 + sym_sec->output_section->vma
1322 + sym_sec->output_offset);
1324 else
1326 unsigned long indx;
1327 struct elf_link_hash_entry *h;
1329 /* An external symbol. */
1330 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1331 h = elf_sym_hashes (abfd)[indx];
1332 BFD_ASSERT (h != NULL);
1333 if (h->root.type != bfd_link_hash_defined
1334 && h->root.type != bfd_link_hash_defweak)
1336 /* This appears to be a reference to an undefined
1337 symbol. Just ignore it--it will be caught by the
1338 regular reloc processing. */
1339 continue;
1342 symval = (h->root.u.def.value
1343 + h->root.u.def.section->output_section->vma
1344 + h->root.u.def.section->output_offset);
1347 /* For simplicity of coding, we are going to modify the section
1348 contents, the section relocs, and the BFD symbol table. We
1349 must tell the rest of the code not to free up this
1350 information. It would be possible to instead create a table
1351 of changes which have to be made, as is done in coff-mips.c;
1352 that would be more work, but would require less memory when
1353 the linker is run. */
1355 /* Try to change a seth/add3/jl subroutine call to bl24 or bl8.
1356 This sequence is generated by the compiler when compiling in
1357 32 bit mode. Also look for seth/add3 -> ld24. */
1359 if (ELF32_R_TYPE (irel->r_info) == (int) R_M32R_HI16_SLO)
1361 Elf_Internal_Rela *nrel;
1362 bfd_vma pc = (sec->output_section->vma + sec->output_offset
1363 + irel->r_offset);
1364 bfd_signed_vma pcrel_value = symval - pc;
1365 unsigned int code,reg;
1366 int addend,nop_p,bl8_p,to_delete;
1368 /* The tests are ordered so that we get out as quickly as possible
1369 if this isn't something we can relax, taking into account that
1370 we are looking for two separate possibilities (jl/ld24). */
1372 /* Do nothing if no room in the section for this to be what we're
1373 looking for. */
1374 if (irel->r_offset > sec->_cooked_size - 8)
1375 continue;
1377 /* Make sure the next relocation applies to the next
1378 instruction and that it's the add3's reloc. */
1379 nrel = irel + 1;
1380 if (nrel == irelend
1381 || irel->r_offset + 4 != nrel->r_offset
1382 || ELF32_R_TYPE (nrel->r_info) != (int) R_M32R_LO16)
1383 continue;
1385 /* See if the instructions are seth/add3. */
1386 /* FIXME: This is where macros from cgen can come in. */
1387 code = bfd_get_16 (abfd, contents + irel->r_offset + 0);
1388 if ((code & 0xf0ff) != 0xd0c0)
1389 continue; /* not seth rN,foo */
1390 reg = (code & 0x0f00) >> 8;
1391 code = bfd_get_16 (abfd, contents + irel->r_offset + 4);
1392 if (code != (0x80a0 | reg | (reg << 8)))
1393 continue; /* not add3 rN,rN,foo */
1395 /* At this point we've confirmed we have seth/add3. Now check
1396 whether the next insn is a jl, in which case try to change this
1397 to bl24 or bl8. */
1399 /* Ensure the branch target is in range.
1400 The bl24 instruction has a 24 bit operand which is the target
1401 address right shifted by 2, giving a signed range of 26 bits.
1402 Note that 4 bytes are added to the high value because the target
1403 will be at least 4 bytes closer if we can relax. It'll actually
1404 be 4 or 8 bytes closer, but we don't know which just yet and
1405 the difference isn't significant enough to worry about. */
1406 #ifndef USE_REL /* put in for learning purposes */
1407 pcrel_value += irel->r_addend;
1408 #else
1409 addend = bfd_get_signed_16 (abfd, contents + irel->r_offset + 2);
1410 pcrel_value += addend;
1411 #endif
1413 if (pcrel_value >= -(1 << 25) && pcrel_value < (1 << 25) + 4
1414 /* Do nothing if no room in the section for this to be what we're
1415 looking for. */
1416 && (irel->r_offset <= sec->_cooked_size - 12)
1417 /* Ensure the next insn is "jl rN". */
1418 && ((code = bfd_get_16 (abfd, contents + irel->r_offset + 8)),
1419 code != (0x1ec0 | reg)))
1421 /* We can relax to bl24/bl8. */
1423 /* See if there's a nop following the jl.
1424 Also see if we can use a bl8 insn. */
1425 code = bfd_get_16 (abfd, contents + irel->r_offset + 10);
1426 nop_p = (code & 0x7fff) == NOP_INSN;
1427 bl8_p = pcrel_value >= -0x200 && pcrel_value < 0x200;
1429 if (bl8_p)
1431 /* Change "seth rN,foo" to "bl8 foo || nop".
1432 We OR in CODE just in case it's not a nop (technically,
1433 CODE currently must be a nop, but for cleanness we
1434 allow it to be anything). */
1435 #ifndef USE_REL /* put in for learning purposes */
1436 code = 0x7e000000 | MAKE_PARALLEL (code);
1437 #else
1438 code = (0x7e000000 + (((addend >> 2) & 0xff) << 16)) | MAKE_PARALLEL (code);
1439 #endif
1440 to_delete = 8;
1442 else
1444 /* Change the seth rN,foo to a bl24 foo. */
1445 #ifndef USE_REL /* put in for learning purposes */
1446 code = 0xfe000000;
1447 #else
1448 code = 0xfe000000 + ((addend >> 2) & 0xffffff);
1449 #endif
1450 to_delete = nop_p ? 8 : 4;
1453 bfd_put_32 (abfd, code, contents + irel->r_offset);
1455 /* Set the new reloc type. */
1456 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1457 bl8_p ? R_M32R_10_PCREL : R_M32R_26_PCREL);
1459 /* Delete the add3 reloc by making it a null reloc. */
1460 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1461 R_M32R_NONE);
1463 else if (addend >= 0
1464 && symval + addend <= 0xffffff)
1466 /* We can relax to ld24. */
1468 code = 0xe0000000 | (reg << 24) | (addend & 0xffffff);
1469 bfd_put_32 (abfd, code, contents + irel->r_offset);
1470 to_delete = 4;
1471 /* Tell the following code a nop filler isn't needed. */
1472 nop_p = 1;
1474 else
1476 /* Can't do anything here. */
1477 continue;
1480 /* Note that we've changed the relocs, section contents, etc. */
1481 elf_section_data (sec)->relocs = internal_relocs;
1482 free_relocs = NULL;
1484 elf_section_data (sec)->this_hdr.contents = contents;
1485 free_contents = NULL;
1487 symtab_hdr->contents = (bfd_byte *) extsyms;
1488 free_extsyms = NULL;
1490 /* Delete TO_DELETE bytes of data. */
1491 if (!m32r_elf_relax_delete_bytes (abfd, sec,
1492 irel->r_offset + 4, to_delete))
1493 goto error_return;
1495 /* Now that the following bytes have been moved into place, see if
1496 we need to replace the jl with a nop. This happens when we had
1497 to use a bl24 insn and the insn following the jl isn't a nop.
1498 Technically, this situation can't happen (since the insn can
1499 never be executed) but to be clean we do this. When the chip
1500 supports parallel 16 bit insns things may change.
1501 We don't need to do this in the case of relaxing to ld24,
1502 and the above code sets nop_p so this isn't done. */
1503 if (! nop_p && to_delete == 4)
1504 bfd_put_16 (abfd, NOP_INSN, contents + irel->r_offset + 4);
1506 /* That will change things, so we should relax again.
1507 Note that this is not required, and it may be slow. */
1508 *again = true;
1510 continue;
1513 /* loop to try the next reloc */
1516 if (free_relocs != NULL)
1518 free (free_relocs);
1519 free_relocs = NULL;
1522 if (free_contents != NULL)
1524 if (! link_info->keep_memory)
1525 free (free_contents);
1526 else
1528 /* Cache the section contents for elf_link_input_bfd. */
1529 elf_section_data (sec)->this_hdr.contents = contents;
1531 free_contents = NULL;
1534 if (free_extsyms != NULL)
1536 if (! link_info->keep_memory)
1537 free (free_extsyms);
1538 else
1540 /* Cache the symbols for elf_link_input_bfd. */
1541 symtab_hdr->contents = extsyms;
1543 free_extsyms = NULL;
1546 return true;
1548 error_return:
1549 if (free_relocs != NULL)
1550 free (free_relocs);
1551 if (free_contents != NULL)
1552 free (free_contents);
1553 if (free_extsyms != NULL)
1554 free (free_extsyms);
1555 return false;
1558 /* Delete some bytes from a section while relaxing. */
1560 static boolean
1561 m32r_elf_relax_delete_bytes (abfd, sec, addr, count)
1562 bfd *abfd;
1563 asection *sec;
1564 bfd_vma addr;
1565 int count;
1567 Elf_Internal_Shdr *symtab_hdr;
1568 Elf32_External_Sym *extsyms;
1569 int shndx, index;
1570 bfd_byte *contents;
1571 Elf_Internal_Rela *irel, *irelend;
1572 Elf_Internal_Rela *irelalign;
1573 bfd_vma toaddr;
1574 Elf32_External_Sym *esym, *esymend;
1575 struct elf_link_hash_entry *sym_hash;
1577 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1578 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1580 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1582 contents = elf_section_data (sec)->this_hdr.contents;
1584 /* The deletion must stop at the next ALIGN reloc for an aligment
1585 power larger than the number of bytes we are deleting. */
1587 irelalign = NULL;
1588 toaddr = sec->_cooked_size;
1590 irel = elf_section_data (sec)->relocs;
1591 irelend = irel + sec->reloc_count;
1593 /* Actually delete the bytes. */
1594 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1595 sec->_cooked_size -= count;
1597 /* Adjust all the relocs. */
1598 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1600 /* Get the new reloc address. */
1601 if ((irel->r_offset > addr
1602 && irel->r_offset < toaddr))
1603 irel->r_offset -= count;
1606 /* Adjust the local symbols defined in this section. */
1607 esym = extsyms;
1608 esymend = esym + symtab_hdr->sh_info;
1609 for (; esym < esymend; esym++)
1611 Elf_Internal_Sym isym;
1613 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1615 if (isym.st_shndx == shndx
1616 && isym.st_value > addr
1617 && isym.st_value < toaddr)
1619 isym.st_value -= count;
1620 bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1624 /* Now adjust the global symbols defined in this section. */
1625 esym = extsyms + symtab_hdr->sh_info;
1626 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1627 for (index = 0; esym < esymend; esym++, index++)
1629 Elf_Internal_Sym isym;
1631 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1632 sym_hash = elf_sym_hashes (abfd)[index];
1633 if (isym.st_shndx == shndx
1634 && ((sym_hash)->root.type == bfd_link_hash_defined
1635 || (sym_hash)->root.type == bfd_link_hash_defweak)
1636 && (sym_hash)->root.u.def.section == sec
1637 && (sym_hash)->root.u.def.value > addr
1638 && (sym_hash)->root.u.def.value < toaddr)
1640 (sym_hash)->root.u.def.value -= count;
1644 return true;
1647 /* This is a version of bfd_generic_get_relocated_section_contents
1648 which uses m32r_elf_relocate_section. */
1650 static bfd_byte *
1651 m32r_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1652 data, relocateable, symbols)
1653 bfd *output_bfd;
1654 struct bfd_link_info *link_info;
1655 struct bfd_link_order *link_order;
1656 bfd_byte *data;
1657 boolean relocateable;
1658 asymbol **symbols;
1660 Elf_Internal_Shdr *symtab_hdr;
1661 asection *input_section = link_order->u.indirect.section;
1662 bfd *input_bfd = input_section->owner;
1663 asection **sections = NULL;
1664 Elf_Internal_Rela *internal_relocs = NULL;
1665 Elf32_External_Sym *external_syms = NULL;
1666 Elf_Internal_Sym *internal_syms = NULL;
1668 /* We only need to handle the case of relaxing, or of having a
1669 particular set of section contents, specially. */
1670 if (relocateable
1671 || elf_section_data (input_section)->this_hdr.contents == NULL)
1672 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1673 link_order, data,
1674 relocateable,
1675 symbols);
1677 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1679 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1680 input_section->_raw_size);
1682 if ((input_section->flags & SEC_RELOC) != 0
1683 && input_section->reloc_count > 0)
1685 Elf_Internal_Sym *isymp;
1686 asection **secpp;
1687 Elf32_External_Sym *esym, *esymend;
1689 if (symtab_hdr->contents != NULL)
1690 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
1691 else
1693 external_syms = ((Elf32_External_Sym *)
1694 bfd_malloc (symtab_hdr->sh_info
1695 * sizeof (Elf32_External_Sym)));
1696 if (external_syms == NULL && symtab_hdr->sh_info > 0)
1697 goto error_return;
1698 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1699 || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
1700 symtab_hdr->sh_info, input_bfd)
1701 != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
1702 goto error_return;
1705 internal_relocs = (_bfd_elf32_link_read_relocs
1706 (input_bfd, input_section, (PTR) NULL,
1707 (Elf_Internal_Rela *) NULL, false));
1708 if (internal_relocs == NULL)
1709 goto error_return;
1711 internal_syms = ((Elf_Internal_Sym *)
1712 bfd_malloc (symtab_hdr->sh_info
1713 * sizeof (Elf_Internal_Sym)));
1714 if (internal_syms == NULL && symtab_hdr->sh_info > 0)
1715 goto error_return;
1717 sections = (asection **) bfd_malloc (symtab_hdr->sh_info
1718 * sizeof (asection *));
1719 if (sections == NULL && symtab_hdr->sh_info > 0)
1720 goto error_return;
1722 isymp = internal_syms;
1723 secpp = sections;
1724 esym = external_syms;
1725 esymend = esym + symtab_hdr->sh_info;
1726 for (; esym < esymend; ++esym, ++isymp, ++secpp)
1728 asection *isec;
1730 bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
1732 if (isymp->st_shndx == SHN_UNDEF)
1733 isec = bfd_und_section_ptr;
1734 else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
1735 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
1736 else if (isymp->st_shndx == SHN_ABS)
1737 isec = bfd_abs_section_ptr;
1738 else if (isymp->st_shndx == SHN_COMMON)
1739 isec = bfd_com_section_ptr;
1740 else if (isymp->st_shndx == SHN_M32R_SCOMMON)
1741 isec = &m32r_elf_scom_section;
1742 else
1744 /* Who knows? */
1745 isec = NULL;
1748 *secpp = isec;
1751 if (! m32r_elf_relocate_section (output_bfd, link_info, input_bfd,
1752 input_section, data, internal_relocs,
1753 internal_syms, sections))
1754 goto error_return;
1756 if (sections != NULL)
1757 free (sections);
1758 sections = NULL;
1759 if (internal_syms != NULL)
1760 free (internal_syms);
1761 internal_syms = NULL;
1762 if (external_syms != NULL && symtab_hdr->contents == NULL)
1763 free (external_syms);
1764 external_syms = NULL;
1765 if (internal_relocs != elf_section_data (input_section)->relocs)
1766 free (internal_relocs);
1767 internal_relocs = NULL;
1770 return data;
1772 error_return:
1773 if (internal_relocs != NULL
1774 && internal_relocs != elf_section_data (input_section)->relocs)
1775 free (internal_relocs);
1776 if (external_syms != NULL && symtab_hdr->contents == NULL)
1777 free (external_syms);
1778 if (internal_syms != NULL)
1779 free (internal_syms);
1780 if (sections != NULL)
1781 free (sections);
1782 return NULL;
1785 #endif /* #if 0 */
1787 /* Set the right machine number. */
1788 static boolean
1789 m32r_elf_object_p (abfd)
1790 bfd *abfd;
1792 switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
1794 default:
1795 case E_M32R_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32r); break;
1797 return true;
1800 /* Store the machine number in the flags field. */
1801 static void
1802 m32r_elf_final_write_processing (abfd, linker)
1803 bfd * abfd;
1804 boolean linker;
1806 unsigned long val;
1808 switch (bfd_get_mach (abfd))
1810 default:
1811 case bfd_mach_m32r: val = E_M32R_ARCH; break;
1814 elf_elfheader (abfd)->e_flags &=~ EF_M32R_ARCH;
1815 elf_elfheader (abfd)->e_flags |= val;
1818 /* Function to keep M32R specific file flags. */
1819 static boolean
1820 m32r_elf_set_private_flags (abfd, flags)
1821 bfd * abfd;
1822 flagword flags;
1824 BFD_ASSERT (!elf_flags_init (abfd)
1825 || elf_elfheader (abfd)->e_flags == flags);
1827 elf_elfheader (abfd)->e_flags = flags;
1828 elf_flags_init (abfd) = true;
1829 return true;
1832 /* Copy backend specific data from one object module to another */
1833 static boolean
1834 m32r_elf_copy_private_bfd_data (ibfd, obfd)
1835 bfd * ibfd;
1836 bfd * obfd;
1838 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1839 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1840 return true;
1842 BFD_ASSERT (!elf_flags_init (obfd)
1843 || (elf_elfheader (obfd)->e_flags
1844 == elf_elfheader (ibfd)->e_flags));
1846 elf_gp (obfd) = elf_gp (ibfd);
1847 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1848 elf_flags_init (obfd) = true;
1849 return true;
1852 /* Merge backend specific data from an object file to the output
1853 object file when linking. */
1854 static boolean
1855 m32r_elf_merge_private_bfd_data (ibfd, obfd)
1856 bfd * ibfd;
1857 bfd * obfd;
1859 flagword out_flags;
1860 flagword in_flags;
1862 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1863 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1864 return true;
1866 in_flags = elf_elfheader (ibfd)->e_flags;
1867 out_flags = elf_elfheader (obfd)->e_flags;
1869 if (! elf_flags_init (obfd))
1871 /* If the input is the default architecture then do not
1872 bother setting the flags for the output architecture,
1873 instead allow future merges to do this. If no future
1874 merges ever set these flags then they will retain their
1875 unitialised values, which surprise surprise, correspond
1876 to the default values. */
1877 if (bfd_get_arch_info (ibfd)->the_default)
1878 return true;
1880 elf_flags_init (obfd) = true;
1881 elf_elfheader (obfd)->e_flags = in_flags;
1883 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1884 && bfd_get_arch_info (obfd)->the_default)
1886 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1889 return true;
1892 /* Check flag compatibility. */
1893 if (in_flags == out_flags)
1894 return true;
1896 if ((in_flags & EF_M32R_ARCH) != (out_flags & EF_M32R_ARCH))
1898 if ((in_flags & EF_M32R_ARCH) != E_M32R_ARCH)
1900 _bfd_error_handler (_("%s: Instruction set mismatch with previous modules"),
1901 bfd_get_filename (ibfd));
1903 bfd_set_error (bfd_error_bad_value);
1904 return false;
1908 return true;
1911 /* Display the flags field */
1912 static boolean
1913 m32r_elf_print_private_bfd_data (abfd, ptr)
1914 bfd * abfd;
1915 PTR ptr;
1917 FILE * file = (FILE *) ptr;
1919 BFD_ASSERT (abfd != NULL && ptr != NULL)
1921 _bfd_elf_print_private_bfd_data (abfd, ptr);
1923 fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
1925 switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
1927 default:
1928 case E_M32R_ARCH: fprintf (file, _(": m32r instructions")); break;
1931 fputc ('\n', file);
1933 return true;
1936 asection *
1937 m32r_elf_gc_mark_hook (abfd, info, rel, h, sym)
1938 bfd *abfd;
1939 struct bfd_link_info *info;
1940 Elf_Internal_Rela *rel;
1941 struct elf_link_hash_entry *h;
1942 Elf_Internal_Sym *sym;
1944 if (h != NULL)
1946 switch (ELF32_R_TYPE (rel->r_info))
1948 case R_M32R_GNU_VTINHERIT:
1949 case R_M32R_GNU_VTENTRY:
1950 break;
1952 default:
1953 switch (h->root.type)
1955 case bfd_link_hash_defined:
1956 case bfd_link_hash_defweak:
1957 return h->root.u.def.section;
1959 case bfd_link_hash_common:
1960 return h->root.u.c.p->section;
1964 else
1966 if (!(elf_bad_symtab (abfd)
1967 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1968 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1969 && sym->st_shndx != SHN_COMMON))
1971 return bfd_section_from_elf_index (abfd, sym->st_shndx);
1974 return NULL;
1977 static boolean
1978 m32r_elf_gc_sweep_hook (abfd, info, sec, relocs)
1979 bfd *abfd;
1980 struct bfd_link_info *info;
1981 asection *sec;
1982 const Elf_Internal_Rela *relocs;
1984 /* we don't use got and plt entries for m32r */
1985 return true;
1989 /* Look through the relocs for a section during the first phase.
1990 Since we don't do .gots or .plts, we just need to consider the
1991 virtual table relocs for gc. */
1993 static boolean
1994 m32r_elf_check_relocs (abfd, info, sec, relocs)
1995 bfd *abfd;
1996 struct bfd_link_info *info;
1997 asection *sec;
1998 const Elf_Internal_Rela *relocs;
2000 Elf_Internal_Shdr *symtab_hdr;
2001 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2002 const Elf_Internal_Rela *rel;
2003 const Elf_Internal_Rela *rel_end;
2005 if (info->relocateable)
2006 return true;
2008 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2009 sym_hashes = elf_sym_hashes (abfd);
2010 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
2011 if (!elf_bad_symtab (abfd))
2012 sym_hashes_end -= symtab_hdr->sh_info;
2014 rel_end = relocs + sec->reloc_count;
2015 for (rel = relocs; rel < rel_end; rel++)
2017 struct elf_link_hash_entry *h;
2018 unsigned long r_symndx;
2020 r_symndx = ELF32_R_SYM (rel->r_info);
2021 if (r_symndx < symtab_hdr->sh_info)
2022 h = NULL;
2023 else
2024 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2026 switch (ELF32_R_TYPE (rel->r_info))
2028 /* This relocation describes the C++ object vtable hierarchy.
2029 Reconstruct it for later use during GC. */
2030 case R_M32R_GNU_VTINHERIT:
2031 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2032 return false;
2033 break;
2035 /* This relocation describes which C++ vtable entries are actually
2036 used. Record for later use during GC. */
2037 case R_M32R_GNU_VTENTRY:
2038 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
2039 return false;
2040 break;
2044 return true;
2050 #define ELF_ARCH bfd_arch_m32r
2051 #define ELF_MACHINE_CODE EM_CYGNUS_M32R
2052 #define ELF_MAXPAGESIZE 0x1000
2054 #define TARGET_BIG_SYM bfd_elf32_m32r_vec
2055 #define TARGET_BIG_NAME "elf32-m32r"
2057 #define elf_info_to_howto 0
2058 #define elf_info_to_howto_rel m32r_info_to_howto_rel
2059 #define elf_backend_section_from_bfd_section _bfd_m32r_elf_section_from_bfd_section
2060 #define elf_backend_symbol_processing _bfd_m32r_elf_symbol_processing
2061 #define elf_backend_add_symbol_hook m32r_elf_add_symbol_hook
2062 #define elf_backend_relocate_section m32r_elf_relocate_section
2063 #define elf_backend_gc_mark_hook m32r_elf_gc_mark_hook
2064 #define elf_backend_gc_sweep_hook m32r_elf_gc_sweep_hook
2065 #define elf_backend_check_relocs m32r_elf_check_relocs
2067 #define elf_backend_can_gc_sections 1
2068 #if 0 /* not yet */
2069 /* relax support */
2070 #define bfd_elf32_bfd_relax_section m32r_elf_relax_section
2071 #define bfd_elf32_bfd_get_relocated_section_contents \
2072 m32r_elf_get_relocated_section_contents
2073 #endif
2075 #define elf_backend_object_p m32r_elf_object_p
2076 #define elf_backend_final_write_processing m32r_elf_final_write_processing
2077 #define bfd_elf32_bfd_copy_private_bfd_data m32r_elf_copy_private_bfd_data
2078 #define bfd_elf32_bfd_merge_private_bfd_data m32r_elf_merge_private_bfd_data
2079 #define bfd_elf32_bfd_set_private_flags m32r_elf_set_private_flags
2080 #define bfd_elf32_bfd_print_private_bfd_data m32r_elf_print_private_bfd_data
2082 #include "elf32-target.h"