Fix numerous occurrences of
[deliverable/binutils-gdb.git] / bfd / elf32-m32r.c
CommitLineData
252b5132 1/* M32R-specific support for 32-bit ELF.
1e2f5b6e 2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
7898deda 3 Free Software Foundation, Inc.
252b5132
RH
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#include "bfd.h"
22#include "sysdep.h"
23#include "libbfd.h"
24#include "elf-bfd.h"
25#include "elf/m32r.h"
26
27static bfd_reloc_status_type m32r_elf_10_pcrel_reloc
28 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
29static 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));
32static bfd_reloc_status_type m32r_elf_hi16_reloc
33 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
34static void m32r_elf_relocate_hi16
35 PARAMS ((bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *,
36 bfd_byte *, bfd_vma));
37bfd_reloc_status_type m32r_elf_lo16_reloc
38 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
8b125cde
DE
39bfd_reloc_status_type m32r_elf_generic_reloc
40 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
252b5132
RH
41static bfd_reloc_status_type m32r_elf_sda16_reloc
42 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
44 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
45static void m32r_info_to_howto_rel
46 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
47boolean _bfd_m32r_elf_section_from_bfd_section
af746e92 48 PARAMS ((bfd *, asection *, int *));
252b5132
RH
49void _bfd_m32r_elf_symbol_processing
50 PARAMS ((bfd *, asymbol *));
51static boolean m32r_elf_add_symbol_hook
52 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
53 const char **, flagword *, asection **, bfd_vma *));
54static 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 */
58static boolean m32r_elf_relax_delete_bytes
59 PARAMS ((bfd *, asection *, bfd_vma, int));
60#endif
252b5132
RH
61static bfd_reloc_status_type m32r_elf_final_sda_base
62 PARAMS ((bfd *, struct bfd_link_info *, const char **, bfd_vma *));
63static boolean m32r_elf_object_p
64 PARAMS ((bfd *));
65static void m32r_elf_final_write_processing
66 PARAMS ((bfd *, boolean));
67static boolean m32r_elf_set_private_flags
68 PARAMS ((bfd *, flagword));
252b5132
RH
69static boolean m32r_elf_merge_private_bfd_data
70 PARAMS ((bfd *, bfd *));
71static boolean m32r_elf_print_private_bfd_data
72 PARAMS ((bfd *, PTR));
917583ad
NC
73static boolean m32r_elf_gc_sweep_hook
74 PARAMS ((bfd *, struct bfd_link_info *, asection *,
75 const Elf_Internal_Rela *));
76static boolean m32r_elf_check_relocs
77 PARAMS ((bfd *, struct bfd_link_info *, asection *,
78 const Elf_Internal_Rela *));
79
80asection * m32r_elf_gc_mark_hook
1e2f5b6e 81 PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
917583ad 82 struct elf_link_hash_entry *, Elf_Internal_Sym *));
252b5132
RH
83
84#define NOP_INSN 0x7000
85#define MAKE_PARALLEL(insn) ((insn) | 0x8000)
86
87/* Use REL instead of RELA to save space.
88 This only saves space in libraries and object files, but perhaps
89 relocs will be put in ROM? All in all though, REL relocs are a pain
90 to work with. */
91#define USE_REL
92
93static reloc_howto_type m32r_elf_howto_table[] =
94{
95 /* This reloc does nothing. */
96 HOWTO (R_M32R_NONE, /* type */
97 0, /* rightshift */
98 2, /* size (0 = byte, 1 = short, 2 = long) */
99 32, /* bitsize */
100 false, /* pc_relative */
101 0, /* bitpos */
102 complain_overflow_bitfield, /* complain_on_overflow */
103 bfd_elf_generic_reloc, /* special_function */
104 "R_M32R_NONE", /* name */
105 false, /* partial_inplace */
106 0, /* src_mask */
107 0, /* dst_mask */
108 false), /* pcrel_offset */
109
110 /* A 16 bit absolute relocation. */
111 HOWTO (R_M32R_16, /* type */
112 0, /* rightshift */
113 1, /* size (0 = byte, 1 = short, 2 = long) */
114 16, /* bitsize */
115 false, /* pc_relative */
116 0, /* bitpos */
117 complain_overflow_bitfield, /* complain_on_overflow */
8b125cde 118 m32r_elf_generic_reloc,/* special_function */
252b5132
RH
119 "R_M32R_16", /* name */
120 true, /* partial_inplace */
121 0xffff, /* src_mask */
122 0xffff, /* dst_mask */
123 false), /* pcrel_offset */
124
125 /* A 32 bit absolute relocation. */
126 HOWTO (R_M32R_32, /* type */
127 0, /* rightshift */
128 2, /* size (0 = byte, 1 = short, 2 = long) */
129 32, /* bitsize */
130 false, /* pc_relative */
131 0, /* bitpos */
132 complain_overflow_bitfield, /* complain_on_overflow */
8b125cde 133 m32r_elf_generic_reloc,/* special_function */
252b5132
RH
134 "R_M32R_32", /* name */
135 true, /* partial_inplace */
136 0xffffffff, /* src_mask */
137 0xffffffff, /* dst_mask */
138 false), /* pcrel_offset */
139
140 /* A 24 bit address. */
141 HOWTO (R_M32R_24, /* type */
142 0, /* rightshift */
143 2, /* size (0 = byte, 1 = short, 2 = long) */
144 24, /* bitsize */
145 false, /* pc_relative */
146 0, /* bitpos */
147 complain_overflow_unsigned, /* complain_on_overflow */
8b125cde 148 m32r_elf_generic_reloc,/* special_function */
252b5132
RH
149 "R_M32R_24", /* name */
150 true, /* partial_inplace */
151 0xffffff, /* src_mask */
152 0xffffff, /* dst_mask */
153 false), /* pcrel_offset */
154
155 /* An PC Relative 10-bit relocation, shifted by 2.
156 This reloc is complicated because relocations are relative to pc & -4.
157 i.e. branches in the right insn slot use the address of the left insn
158 slot for pc. */
159 /* ??? It's not clear whether this should have partial_inplace set or not.
160 Branch relaxing in the assembler can store the addend in the insn,
161 and if bfd_install_relocation gets called the addend may get added
162 again. */
163 HOWTO (R_M32R_10_PCREL, /* type */
164 2, /* rightshift */
165 1, /* size (0 = byte, 1 = short, 2 = long) */
166 10, /* bitsize */
167 true, /* pc_relative */
168 0, /* bitpos */
169 complain_overflow_signed, /* complain_on_overflow */
170 m32r_elf_10_pcrel_reloc, /* special_function */
171 "R_M32R_10_PCREL", /* name */
172 false, /* partial_inplace */
173 0xff, /* src_mask */
174 0xff, /* dst_mask */
175 true), /* pcrel_offset */
176
177 /* A relative 18 bit relocation, right shifted by 2. */
178 HOWTO (R_M32R_18_PCREL, /* type */
179 2, /* rightshift */
180 2, /* size (0 = byte, 1 = short, 2 = long) */
181 16, /* bitsize */
182 true, /* pc_relative */
183 0, /* bitpos */
184 complain_overflow_signed, /* complain_on_overflow */
185 bfd_elf_generic_reloc, /* special_function */
186 "R_M32R_18_PCREL", /* name */
187 false, /* partial_inplace */
188 0xffff, /* src_mask */
189 0xffff, /* dst_mask */
190 true), /* pcrel_offset */
191
192 /* A relative 26 bit relocation, right shifted by 2. */
193 /* ??? It's not clear whether this should have partial_inplace set or not.
194 Branch relaxing in the assembler can store the addend in the insn,
195 and if bfd_install_relocation gets called the addend may get added
196 again. */
197 HOWTO (R_M32R_26_PCREL, /* type */
198 2, /* rightshift */
199 2, /* size (0 = byte, 1 = short, 2 = long) */
200 26, /* bitsize */
201 true, /* pc_relative */
202 0, /* bitpos */
203 complain_overflow_signed, /* complain_on_overflow */
204 bfd_elf_generic_reloc, /* special_function */
205 "R_M32R_26_PCREL", /* name */
206 false, /* partial_inplace */
207 0xffffff, /* src_mask */
208 0xffffff, /* dst_mask */
209 true), /* pcrel_offset */
210
211 /* High 16 bits of address when lower 16 is or'd in. */
212 HOWTO (R_M32R_HI16_ULO, /* type */
213 16, /* rightshift */
214 2, /* size (0 = byte, 1 = short, 2 = long) */
215 16, /* bitsize */
216 false, /* pc_relative */
217 0, /* bitpos */
218 complain_overflow_dont, /* complain_on_overflow */
219 m32r_elf_hi16_reloc, /* special_function */
220 "R_M32R_HI16_ULO", /* name */
221 true, /* partial_inplace */
222 0x0000ffff, /* src_mask */
223 0x0000ffff, /* dst_mask */
224 false), /* pcrel_offset */
225
226 /* High 16 bits of address when lower 16 is added in. */
227 HOWTO (R_M32R_HI16_SLO, /* type */
228 16, /* rightshift */
229 2, /* size (0 = byte, 1 = short, 2 = long) */
230 16, /* bitsize */
231 false, /* pc_relative */
232 0, /* bitpos */
233 complain_overflow_dont, /* complain_on_overflow */
234 m32r_elf_hi16_reloc, /* special_function */
235 "R_M32R_HI16_SLO", /* name */
236 true, /* partial_inplace */
237 0x0000ffff, /* src_mask */
238 0x0000ffff, /* dst_mask */
239 false), /* pcrel_offset */
240
241 /* Lower 16 bits of address. */
242 HOWTO (R_M32R_LO16, /* type */
243 0, /* rightshift */
244 2, /* size (0 = byte, 1 = short, 2 = long) */
245 16, /* bitsize */
246 false, /* pc_relative */
247 0, /* bitpos */
248 complain_overflow_dont, /* complain_on_overflow */
249 m32r_elf_lo16_reloc, /* special_function */
250 "R_M32R_LO16", /* name */
251 true, /* partial_inplace */
252 0x0000ffff, /* src_mask */
253 0x0000ffff, /* dst_mask */
254 false), /* pcrel_offset */
255
256 /* Small data area 16 bits offset. */
257 HOWTO (R_M32R_SDA16, /* type */
258 0, /* rightshift */
259 2, /* size (0 = byte, 1 = short, 2 = long) */
260 16, /* bitsize */
261 false, /* pc_relative */
262 0, /* bitpos */
263 complain_overflow_signed, /* complain_on_overflow */
264 m32r_elf_sda16_reloc, /* special_function */
265 "R_M32R_SDA16", /* name */
266 true, /* partial_inplace */ /* FIXME: correct? */
267 0x0000ffff, /* src_mask */
268 0x0000ffff, /* dst_mask */
269 false), /* pcrel_offset */
270
271 /* GNU extension to record C++ vtable hierarchy */
272 HOWTO (R_M32R_GNU_VTINHERIT, /* type */
273 0, /* rightshift */
274 2, /* size (0 = byte, 1 = short, 2 = long) */
275 0, /* bitsize */
276 false, /* pc_relative */
277 0, /* bitpos */
278 complain_overflow_dont, /* complain_on_overflow */
279 NULL, /* special_function */
280 "R_M32R_GNU_VTINHERIT", /* name */
281 false, /* partial_inplace */
282 0, /* src_mask */
283 0, /* dst_mask */
284 false), /* pcrel_offset */
285
286 /* GNU extension to record C++ vtable member usage */
287 HOWTO (R_M32R_GNU_VTENTRY, /* type */
288 0, /* rightshift */
289 2, /* size (0 = byte, 1 = short, 2 = long) */
290 0, /* bitsize */
291 false, /* pc_relative */
292 0, /* bitpos */
293 complain_overflow_dont, /* complain_on_overflow */
294 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
295 "R_M32R_GNU_VTENTRY", /* name */
296 false, /* partial_inplace */
297 0, /* src_mask */
298 0, /* dst_mask */
299 false), /* pcrel_offset */
300
301};
302\f
303/* Handle the R_M32R_10_PCREL reloc. */
304
305static bfd_reloc_status_type
306m32r_elf_10_pcrel_reloc (abfd, reloc_entry, symbol, data,
307 input_section, output_bfd, error_message)
308 bfd * abfd;
309 arelent * reloc_entry;
310 asymbol * symbol;
311 PTR data;
312 asection * input_section;
313 bfd * output_bfd;
5f771d47 314 char ** error_message ATTRIBUTE_UNUSED;
252b5132
RH
315{
316 /* This part is from bfd_elf_generic_reloc. */
317 if (output_bfd != (bfd *) NULL
318 && (symbol->flags & BSF_SECTION_SYM) == 0
319 && (! reloc_entry->howto->partial_inplace
320 || reloc_entry->addend == 0))
321 {
322 reloc_entry->address += input_section->output_offset;
323 return bfd_reloc_ok;
324 }
325
326 if (output_bfd != NULL)
327 {
328 /* FIXME: See bfd_perform_relocation. Is this right? */
329 return bfd_reloc_continue;
330 }
331
332 return m32r_elf_do_10_pcrel_reloc (abfd, reloc_entry->howto,
333 input_section,
334 data, reloc_entry->address,
335 symbol->section,
336 (symbol->value
337 + symbol->section->output_section->vma
338 + symbol->section->output_offset),
339 reloc_entry->addend);
340}
341
342/* Utility to actually perform an R_M32R_10_PCREL reloc. */
343
344static bfd_reloc_status_type
345m32r_elf_do_10_pcrel_reloc (abfd, howto, input_section, data, offset,
346 symbol_section, symbol_value, addend)
347 bfd *abfd;
348 reloc_howto_type *howto;
349 asection *input_section;
350 bfd_byte *data;
351 bfd_vma offset;
5f771d47 352 asection *symbol_section ATTRIBUTE_UNUSED;
252b5132
RH
353 bfd_vma symbol_value;
354 bfd_vma addend;
355{
356 bfd_signed_vma relocation;
357 unsigned long x;
358 bfd_reloc_status_type status;
359
360 /* Sanity check the address (offset in section). */
361 if (offset > input_section->_cooked_size)
362 return bfd_reloc_outofrange;
363
364 relocation = symbol_value + addend;
365 /* Make it pc relative. */
366 relocation -= (input_section->output_section->vma
367 + input_section->output_offset);
368 /* These jumps mask off the lower two bits of the current address
369 before doing pcrel calculations. */
dc810e39 370 relocation -= (offset & -(bfd_vma) 4);
252b5132
RH
371
372 if (relocation < -0x200 || relocation > 0x1ff)
373 status = bfd_reloc_overflow;
374 else
375 status = bfd_reloc_ok;
376
377 x = bfd_get_16 (abfd, data + offset);
378 relocation >>= howto->rightshift;
379 relocation <<= howto->bitpos;
380 x = (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask);
dc810e39 381 bfd_put_16 (abfd, (bfd_vma) x, data + offset);
252b5132
RH
382
383 return status;
384}
385
386/* Handle the R_M32R_HI16_[SU]LO relocs.
387 HI16_SLO is for the add3 and load/store with displacement instructions.
388 HI16_ULO is for the or3 instruction.
389 For R_M32R_HI16_SLO, the lower 16 bits are sign extended when added to
390 the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
391 we must add one to the high 16 bytes (which will get subtracted off when
392 the low 16 bits are added).
393 These relocs have to be done in combination with an R_M32R_LO16 reloc
394 because there is a carry from the LO16 to the HI16. Here we just save
395 the information we need; we do the actual relocation when we see the LO16.
396 This code is copied from the elf32-mips.c. We also support an arbitrary
397 number of HI16 relocs to be associated with a single LO16 reloc. The
398 assembler sorts the relocs to ensure each HI16 immediately precedes its
399 LO16. However if there are multiple copies, the assembler may not find
400 the real LO16 so it picks the first one it finds. */
401
402struct m32r_hi16
403{
404 struct m32r_hi16 *next;
405 bfd_byte *addr;
406 bfd_vma addend;
407};
408
409/* FIXME: This should not be a static variable. */
410
411static struct m32r_hi16 *m32r_hi16_list;
412
413static bfd_reloc_status_type
414m32r_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
415 input_section, output_bfd, error_message)
5f771d47 416 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
417 arelent *reloc_entry;
418 asymbol *symbol;
419 PTR data;
420 asection *input_section;
421 bfd *output_bfd;
5f771d47 422 char **error_message ATTRIBUTE_UNUSED;
252b5132
RH
423{
424 bfd_reloc_status_type ret;
425 bfd_vma relocation;
426 struct m32r_hi16 *n;
427
428 /* This part is from bfd_elf_generic_reloc.
429 If we're relocating, and this an external symbol, we don't want
430 to change anything. */
431 if (output_bfd != (bfd *) NULL
432 && (symbol->flags & BSF_SECTION_SYM) == 0
433 && reloc_entry->addend == 0)
434 {
435 reloc_entry->address += input_section->output_offset;
436 return bfd_reloc_ok;
437 }
438
439 /* Sanity check the address (offset in section). */
440 if (reloc_entry->address > input_section->_cooked_size)
441 return bfd_reloc_outofrange;
442
443 ret = bfd_reloc_ok;
444 if (bfd_is_und_section (symbol->section)
445 && output_bfd == (bfd *) NULL)
446 ret = bfd_reloc_undefined;
447
448 if (bfd_is_com_section (symbol->section))
449 relocation = 0;
450 else
451 relocation = symbol->value;
452
453 relocation += symbol->section->output_section->vma;
454 relocation += symbol->section->output_offset;
455 relocation += reloc_entry->addend;
456
457 /* Save the information, and let LO16 do the actual relocation. */
dc810e39 458 n = (struct m32r_hi16 *) bfd_malloc ((bfd_size_type) sizeof *n);
252b5132
RH
459 if (n == NULL)
460 return bfd_reloc_outofrange;
461 n->addr = (bfd_byte *) data + reloc_entry->address;
462 n->addend = relocation;
463 n->next = m32r_hi16_list;
464 m32r_hi16_list = n;
465
466 if (output_bfd != (bfd *) NULL)
467 reloc_entry->address += input_section->output_offset;
468
469 return ret;
470}
471
472/* Handle an M32R ELF HI16 reloc. */
473
474static void
475m32r_elf_relocate_hi16 (input_bfd, type, relhi, rello, contents, addend)
476 bfd *input_bfd;
477 int type;
478 Elf_Internal_Rela *relhi;
479 Elf_Internal_Rela *rello;
480 bfd_byte *contents;
481 bfd_vma addend;
482{
483 unsigned long insn;
484 bfd_vma addlo;
485
486 insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
487
488 addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
489 if (type == R_M32R_HI16_SLO)
490 addlo = ((addlo & 0xffff) ^ 0x8000) - 0x8000;
491 else
492 addlo &= 0xffff;
493
494 addend += ((insn & 0xffff) << 16) + addlo;
495
496 /* Reaccount for sign extension of low part. */
497 if (type == R_M32R_HI16_SLO
498 && (addend & 0x8000) != 0)
499 addend += 0x10000;
500
501 bfd_put_32 (input_bfd,
502 (insn & 0xffff0000) | ((addend >> 16) & 0xffff),
503 contents + relhi->r_offset);
504}
505
506/* Do an R_M32R_LO16 relocation. This is a straightforward 16 bit
507 inplace relocation; this function exists in order to do the
508 R_M32R_HI16_[SU]LO relocation described above. */
509
510bfd_reloc_status_type
4c72e23a 511m32r_elf_lo16_reloc (input_bfd, reloc_entry, symbol, data,
252b5132 512 input_section, output_bfd, error_message)
4c72e23a 513 bfd *input_bfd;
252b5132
RH
514 arelent *reloc_entry;
515 asymbol *symbol;
516 PTR data;
517 asection *input_section;
518 bfd *output_bfd;
519 char **error_message;
520{
4c72e23a
CM
521 /* This part is from bfd_elf_generic_reloc.
522 If we're relocating, and this an external symbol, we don't want
523 to change anything. */
524 if (output_bfd != (bfd *) NULL
525 && (symbol->flags & BSF_SECTION_SYM) == 0
526 && reloc_entry->addend == 0)
527 {
528 reloc_entry->address += input_section->output_offset;
529 return bfd_reloc_ok;
530 }
531
252b5132
RH
532 if (m32r_hi16_list != NULL)
533 {
534 struct m32r_hi16 *l;
535
536 l = m32r_hi16_list;
537 while (l != NULL)
538 {
539 unsigned long insn;
540 unsigned long val;
541 unsigned long vallo;
542 struct m32r_hi16 *next;
543
544 /* Do the HI16 relocation. Note that we actually don't need
545 to know anything about the LO16 itself, except where to
546 find the low 16 bits of the addend needed by the LO16. */
4c72e23a
CM
547 insn = bfd_get_32 (input_bfd, l->addr);
548 vallo = ((bfd_get_32 (input_bfd, (bfd_byte *) data + reloc_entry->address)
252b5132
RH
549 & 0xffff) ^ 0x8000) - 0x8000;
550 val = ((insn & 0xffff) << 16) + vallo;
551 val += l->addend;
552
553 /* Reaccount for sign extension of low part. */
554 if ((val & 0x8000) != 0)
555 val += 0x10000;
556
dc810e39
AM
557 insn = (insn &~ (bfd_vma) 0xffff) | ((val >> 16) & 0xffff);
558 bfd_put_32 (input_bfd, (bfd_vma) insn, l->addr);
252b5132
RH
559
560 next = l->next;
561 free (l);
562 l = next;
563 }
564
565 m32r_hi16_list = NULL;
566 }
567
4c72e23a
CM
568 /* Now do the LO16 reloc in the usual way.
569 ??? It would be nice to call bfd_elf_generic_reloc here,
570 but we have partial_inplace == TRUE. bfd_elf_generic_reloc will
571 pass the handling back to bfd_install_relocation which will install
572 a section relative addend which is wrong. */
8b125cde
DE
573 return m32r_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
574 input_section, output_bfd, error_message);
575}
576
c3668558
KH
577/* Do generic partial_inplace relocation.
578 This is a local replacement for bfd_elf_generic_reloc. */
8b125cde
DE
579
580bfd_reloc_status_type
581m32r_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
582 input_section, output_bfd, error_message)
583 bfd *input_bfd;
584 arelent *reloc_entry;
585 asymbol *symbol;
586 PTR data;
587 asection *input_section;
588 bfd *output_bfd;
23ccc829 589 char **error_message ATTRIBUTE_UNUSED;
8b125cde
DE
590{
591 bfd_reloc_status_type ret;
592 bfd_vma relocation;
593 bfd_byte *inplace_address;
594
595 /* This part is from bfd_elf_generic_reloc.
596 If we're relocating, and this an external symbol, we don't want
597 to change anything. */
598 if (output_bfd != (bfd *) NULL
599 && (symbol->flags & BSF_SECTION_SYM) == 0
600 && reloc_entry->addend == 0)
601 {
602 reloc_entry->address += input_section->output_offset;
603 return bfd_reloc_ok;
604 }
605
08da05b0 606 /* Now do the reloc in the usual way.
8b125cde
DE
607 ??? It would be nice to call bfd_elf_generic_reloc here,
608 but we have partial_inplace == TRUE. bfd_elf_generic_reloc will
609 pass the handling back to bfd_install_relocation which will install
610 a section relative addend which is wrong. */
4c72e23a
CM
611
612 /* Sanity check the address (offset in section). */
613 if (reloc_entry->address > input_section->_cooked_size)
614 return bfd_reloc_outofrange;
615
616 ret = bfd_reloc_ok;
617 if (bfd_is_und_section (symbol->section)
618 && output_bfd == (bfd *) NULL)
619 ret = bfd_reloc_undefined;
620
621 if (bfd_is_com_section (symbol->section)
622 || output_bfd != (bfd *) NULL)
623 relocation = 0;
624 else
625 relocation = symbol->value;
626
627 /* Only do this for a final link. */
628 if (output_bfd == (bfd *) NULL)
629 {
630 relocation += symbol->section->output_section->vma;
631 relocation += symbol->section->output_offset;
632 }
633
634 relocation += reloc_entry->addend;
23ccc829 635 inplace_address = (bfd_byte *) data + reloc_entry->address;
8b125cde
DE
636
637#define DOIT(x) \
638 x = ( (x & ~reloc_entry->howto->dst_mask) | \
639 (((x & reloc_entry->howto->src_mask) + relocation) & \
640 reloc_entry->howto->dst_mask))
4c72e23a 641
8b125cde
DE
642 switch (reloc_entry->howto->size)
643 {
644 case 1:
645 {
646 short x = bfd_get_16 (input_bfd, inplace_address);
647 DOIT (x);
dc810e39 648 bfd_put_16 (input_bfd, (bfd_vma) x, inplace_address);
8b125cde
DE
649 }
650 break;
651 case 2:
652 {
653 unsigned long x = bfd_get_32 (input_bfd, inplace_address);
654 DOIT (x);
dc810e39 655 bfd_put_32 (input_bfd, (bfd_vma)x , inplace_address);
8b125cde
DE
656 }
657 break;
658 default:
659 BFD_ASSERT (0);
660 }
4c72e23a
CM
661
662 if (output_bfd != (bfd *) NULL)
663 reloc_entry->address += input_section->output_offset;
664
665 return ret;
252b5132
RH
666}
667
668/* Handle the R_M32R_SDA16 reloc.
669 This reloc is used to compute the address of objects in the small data area
670 and to perform loads and stores from that area.
671 The lower 16 bits are sign extended and added to the register specified
672 in the instruction, which is assumed to point to _SDA_BASE_. */
673
674static bfd_reloc_status_type
675m32r_elf_sda16_reloc (abfd, reloc_entry, symbol, data,
676 input_section, output_bfd, error_message)
5f771d47 677 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
678 arelent *reloc_entry;
679 asymbol *symbol;
5f771d47 680 PTR data ATTRIBUTE_UNUSED;
252b5132
RH
681 asection *input_section;
682 bfd *output_bfd;
5f771d47 683 char **error_message ATTRIBUTE_UNUSED;
252b5132
RH
684{
685 /* This part is from bfd_elf_generic_reloc. */
686 if (output_bfd != (bfd *) NULL
687 && (symbol->flags & BSF_SECTION_SYM) == 0
688 && (! reloc_entry->howto->partial_inplace
689 || reloc_entry->addend == 0))
690 {
691 reloc_entry->address += input_section->output_offset;
692 return bfd_reloc_ok;
693 }
694
695 if (output_bfd != NULL)
696 {
697 /* FIXME: See bfd_perform_relocation. Is this right? */
698 return bfd_reloc_continue;
699 }
700
701 /* FIXME: not sure what to do here yet. But then again, the linker
702 may never call us. */
703 abort ();
704}
705\f
706/* Map BFD reloc types to M32R ELF reloc types. */
707
708struct m32r_reloc_map
709{
710 bfd_reloc_code_real_type bfd_reloc_val;
711 unsigned char elf_reloc_val;
712};
713
714static const struct m32r_reloc_map m32r_reloc_map[] =
715{
716 { BFD_RELOC_NONE, R_M32R_NONE },
717 { BFD_RELOC_16, R_M32R_16 },
718 { BFD_RELOC_32, R_M32R_32 },
719 { BFD_RELOC_M32R_24, R_M32R_24 },
720 { BFD_RELOC_M32R_10_PCREL, R_M32R_10_PCREL },
721 { BFD_RELOC_M32R_18_PCREL, R_M32R_18_PCREL },
722 { BFD_RELOC_M32R_26_PCREL, R_M32R_26_PCREL },
723 { BFD_RELOC_M32R_HI16_ULO, R_M32R_HI16_ULO },
724 { BFD_RELOC_M32R_HI16_SLO, R_M32R_HI16_SLO },
725 { BFD_RELOC_M32R_LO16, R_M32R_LO16 },
726 { BFD_RELOC_M32R_SDA16, R_M32R_SDA16 },
727 { BFD_RELOC_VTABLE_INHERIT, R_M32R_GNU_VTINHERIT },
728 { BFD_RELOC_VTABLE_ENTRY, R_M32R_GNU_VTENTRY },
729};
730
731static reloc_howto_type *
732bfd_elf32_bfd_reloc_type_lookup (abfd, code)
5f771d47 733 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
734 bfd_reloc_code_real_type code;
735{
736 unsigned int i;
737
738 for (i = 0;
739 i < sizeof (m32r_reloc_map) / sizeof (struct m32r_reloc_map);
740 i++)
741 {
742 if (m32r_reloc_map[i].bfd_reloc_val == code)
743 return &m32r_elf_howto_table[m32r_reloc_map[i].elf_reloc_val];
744 }
745
746 return NULL;
747}
748
749/* Set the howto pointer for an M32R ELF reloc. */
750
751static void
752m32r_info_to_howto_rel (abfd, cache_ptr, dst)
5f771d47 753 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
754 arelent *cache_ptr;
755 Elf32_Internal_Rel *dst;
756{
757 unsigned int r_type;
758
759 r_type = ELF32_R_TYPE (dst->r_info);
760 BFD_ASSERT (r_type < (unsigned int) R_M32R_max);
761 cache_ptr->howto = &m32r_elf_howto_table[r_type];
762}
763\f
764/* Given a BFD section, try to locate the corresponding ELF section
765 index. */
766
767boolean
af746e92 768_bfd_m32r_elf_section_from_bfd_section (abfd, sec, retval)
5f771d47 769 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
770 asection *sec;
771 int *retval;
772{
773 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
774 {
775 *retval = SHN_M32R_SCOMMON;
776 return true;
777 }
778 return false;
779}
780
781/* M32R ELF uses two common sections. One is the usual one, and the other
782 is for small objects. All the small objects are kept together, and then
783 referenced via one register, which yields faster assembler code. It is
784 up to the compiler to emit an instruction to load the register with
785 _SDA_BASE. This is what we use for the small common section. This
786 approach is copied from elf32-mips.c. */
787static asection m32r_elf_scom_section;
788static asymbol m32r_elf_scom_symbol;
789static asymbol *m32r_elf_scom_symbol_ptr;
790
791/* Handle the special M32R section numbers that a symbol may use. */
792
793void
794_bfd_m32r_elf_symbol_processing (abfd, asym)
5f771d47 795 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
796 asymbol *asym;
797{
798 elf_symbol_type *elfsym;
799
800 elfsym = (elf_symbol_type *) asym;
801
802 switch (elfsym->internal_elf_sym.st_shndx)
803 {
804 case SHN_M32R_SCOMMON:
805 if (m32r_elf_scom_section.name == NULL)
806 {
807 /* Initialize the small common section. */
808 m32r_elf_scom_section.name = ".scommon";
809 m32r_elf_scom_section.flags = SEC_IS_COMMON;
810 m32r_elf_scom_section.output_section = &m32r_elf_scom_section;
811 m32r_elf_scom_section.symbol = &m32r_elf_scom_symbol;
812 m32r_elf_scom_section.symbol_ptr_ptr = &m32r_elf_scom_symbol_ptr;
813 m32r_elf_scom_symbol.name = ".scommon";
814 m32r_elf_scom_symbol.flags = BSF_SECTION_SYM;
815 m32r_elf_scom_symbol.section = &m32r_elf_scom_section;
816 m32r_elf_scom_symbol_ptr = &m32r_elf_scom_symbol;
817 }
818 asym->section = &m32r_elf_scom_section;
819 asym->value = elfsym->internal_elf_sym.st_size;
820 break;
821 }
822}
823
824/* Hook called by the linker routine which adds symbols from an object
825 file. We must handle the special M32R section numbers here.
826 We also keep watching for whether we need to create the sdata special
827 linker sections. */
828
829static boolean
830m32r_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
831 bfd *abfd;
832 struct bfd_link_info *info;
833 const Elf_Internal_Sym *sym;
834 const char **namep;
5f771d47 835 flagword *flagsp ATTRIBUTE_UNUSED;
252b5132
RH
836 asection **secp;
837 bfd_vma *valp;
838{
839 if (! info->relocateable
840 && (*namep)[0] == '_' && (*namep)[1] == 'S'
4ab82700
AM
841 && strcmp (*namep, "_SDA_BASE_") == 0
842 && info->hash->creator->flavour == bfd_target_elf_flavour)
252b5132
RH
843 {
844 /* This is simpler than using _bfd_elf_create_linker_section
845 (our needs are simpler than ppc's needs). Also
846 _bfd_elf_create_linker_section currently has a bug where if a .sdata
847 section already exists a new one is created that follows it which
848 screws of _SDA_BASE_ address calcs because output_offset != 0. */
849 struct elf_link_hash_entry *h;
14a793b2 850 struct bfd_link_hash_entry *bh;
252b5132
RH
851 asection *s = bfd_get_section_by_name (abfd, ".sdata");
852
853 /* The following code was cobbled from elf32-ppc.c and elflink.c. */
854
855 if (s == NULL)
856 {
dc810e39
AM
857 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
858 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
252b5132
RH
859
860 s = bfd_make_section_anyway (abfd, ".sdata");
861 if (s == NULL)
862 return false;
863 bfd_set_section_flags (abfd, s, flags);
864 bfd_set_section_alignment (abfd, s, 2);
865 }
866
14a793b2
AM
867 bh = bfd_link_hash_lookup (info->hash, "_SDA_BASE_",
868 false, false, false);
252b5132 869
14a793b2 870 if ((bh == NULL || bh->type == bfd_link_hash_undefined)
252b5132
RH
871 && !(_bfd_generic_link_add_one_symbol (info,
872 abfd,
873 "_SDA_BASE_",
874 BSF_GLOBAL,
875 s,
dc810e39 876 (bfd_vma) 32768,
252b5132
RH
877 (const char *) NULL,
878 false,
879 get_elf_backend_data (abfd)->collect,
14a793b2 880 &bh)))
252b5132 881 return false;
14a793b2 882 h = (struct elf_link_hash_entry *) bh;
252b5132
RH
883 h->type = STT_OBJECT;
884 }
885
886 switch (sym->st_shndx)
887 {
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;
893 }
894
895 return true;
896}
897
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. */
903
904static bfd_reloc_status_type
905m32r_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;
910{
911 if (elf_gp (output_bfd) == 0)
912 {
913 struct bfd_link_hash_entry *h;
914
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
922 {
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;
928 }
929 }
930 *psb = elf_gp (output_bfd);
931 return bfd_reloc_ok;
932}
933\f
934/* Relocate an M32R/D ELF section.
935 There is some attempt to make this function usable for many architectures,
f0fe0e16 936 both for RELA and REL type relocs, if only to serve as a learning tool.
252b5132
RH
937
938 The RELOCATE_SECTION function is called by the new ELF backend linker
939 to handle the relocations for a section.
940
941 The relocs are always passed as Rela structures; if the section
942 actually uses Rel structures, the r_addend field will always be
943 zero.
944
945 This function is responsible for adjust the section contents as
946 necessary, and (if using Rela relocs and generating a
947 relocateable output file) adjusting the reloc addend as
948 necessary.
949
950 This function does not have to worry about setting the reloc
951 address or the reloc symbol index.
952
953 LOCAL_SYMS is a pointer to the swapped in local symbols.
954
955 LOCAL_SECTIONS is an array giving the section in the input file
956 corresponding to the st_shndx field of each local symbol.
957
958 The global hash table entry for the global symbols can be found
959 via elf_sym_hashes (input_bfd).
960
961 When generating relocateable output, this function must handle
962 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
963 going to be the section symbol corresponding to the output
964 section, which means that the addend must be adjusted
965 accordingly. */
966
967static boolean
968m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
969 contents, relocs, local_syms, local_sections)
5f771d47 970 bfd *output_bfd ATTRIBUTE_UNUSED;
252b5132
RH
971 struct bfd_link_info *info;
972 bfd *input_bfd;
973 asection *input_section;
974 bfd_byte *contents;
975 Elf_Internal_Rela *relocs;
976 Elf_Internal_Sym *local_syms;
977 asection **local_sections;
978{
979 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
980 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
981 Elf_Internal_Rela *rel, *relend;
982 /* Assume success. */
983 boolean ret = true;
984
b491616a
AM
985#ifndef USE_REL
986 if (info->relocateable)
987 return true;
988#endif
989
252b5132
RH
990 rel = relocs;
991 relend = relocs + input_section->reloc_count;
992 for (; rel < relend; rel++)
993 {
994 int r_type;
995 reloc_howto_type *howto;
996 unsigned long r_symndx;
997 /* We can't modify r_addend here as elf_link_input_bfd has an assert to
998 ensure it's zero (we use REL relocs, not RELA). Therefore this
999 should be assigning zero to `addend', but for clarity we use
1000 `r_addend'. */
1001 bfd_vma addend = rel->r_addend;
1002 bfd_vma offset = rel->r_offset;
1003 struct elf_link_hash_entry *h;
1004 Elf_Internal_Sym *sym;
1005 asection *sec;
1006 const char *sym_name;
1007 bfd_reloc_status_type r;
1008 const char *errmsg = NULL;
1009
1010 h = NULL;
1011 r_type = ELF32_R_TYPE (rel->r_info);
1012 if (r_type < 0 || r_type >= (int) R_M32R_max)
1013 {
1014 (*_bfd_error_handler) (_("%s: unknown relocation type %d"),
8f615d07 1015 bfd_archive_filename (input_bfd),
252b5132
RH
1016 (int) r_type);
1017 bfd_set_error (bfd_error_bad_value);
1018 ret = false;
1019 continue;
1020 }
1021
1022 if (r_type == R_M32R_GNU_VTENTRY
1023 || r_type == R_M32R_GNU_VTINHERIT)
1024 continue;
1025
1026 howto = m32r_elf_howto_table + r_type;
1027 r_symndx = ELF32_R_SYM (rel->r_info);
1028
b491616a 1029#ifdef USE_REL
252b5132
RH
1030 if (info->relocateable)
1031 {
1032 /* This is a relocateable link. We don't have to change
1033 anything, unless the reloc is against a section symbol,
1034 in which case we have to adjust according to where the
1035 section symbol winds up in the output section. */
1036 sec = NULL;
1037 if (r_symndx >= symtab_hdr->sh_info)
1038 {
1039 /* External symbol. */
1040 continue;
1041 }
1042
1043 /* Local symbol. */
1044 sym = local_syms + r_symndx;
1045 sym_name = "<local symbol>";
1046 /* STT_SECTION: symbol is associated with a section. */
1047 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
1048 {
1049 /* Symbol isn't associated with a section. Nothing to do. */
1050 continue;
1051 }
1052
1053 sec = local_sections[r_symndx];
1054 addend += sec->output_offset + sym->st_value;
252b5132 1055
252b5132
RH
1056 /* If partial_inplace, we need to store any additional addend
1057 back in the section. */
1058 if (! howto->partial_inplace)
1059 continue;
1060 /* ??? Here is a nice place to call a special_function
1061 like handler. */
1062 if (r_type != R_M32R_HI16_SLO && r_type != R_M32R_HI16_ULO)
1063 r = _bfd_relocate_contents (howto, input_bfd,
1064 addend, contents + offset);
1065 else
1066 {
1067 Elf_Internal_Rela *lorel;
1068
1069 /* We allow an arbitrary number of HI16 relocs before the
1070 LO16 reloc. This permits gcc to emit the HI and LO relocs
1071 itself. */
1072 for (lorel = rel + 1;
1073 (lorel < relend
1074 && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
1075 || ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
1076 lorel++)
1077 continue;
1078 if (lorel < relend
1079 && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
1080 {
1081 m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
1082 contents, addend);
1083 r = bfd_reloc_ok;
1084 }
1085 else
1086 r = _bfd_relocate_contents (howto, input_bfd,
1087 addend, contents + offset);
1088 }
252b5132
RH
1089 }
1090 else
b491616a 1091#endif /* USE_REL */
252b5132
RH
1092 {
1093 bfd_vma relocation;
1094
1095 /* This is a final link. */
1096 sym = NULL;
1097 sec = NULL;
1098
1099 if (r_symndx < symtab_hdr->sh_info)
1100 {
1101 /* Local symbol. */
1102 sym = local_syms + r_symndx;
1103 sec = local_sections[r_symndx];
1104 sym_name = "<local symbol>";
f8df10f4
JJ
1105#ifndef USE_REL
1106 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1107 addend = rel->r_addend;
1108#else
1109 /* FIXME: This won't handle local relocations against SEC_MERGE
1110 symbols. See elf32-i386.c for how to do this. */
252b5132
RH
1111 relocation = (sec->output_section->vma
1112 + sec->output_offset
1113 + sym->st_value);
f8df10f4 1114#endif
252b5132
RH
1115 }
1116 else
1117 {
1118 /* External symbol. */
1119 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1120 while (h->root.type == bfd_link_hash_indirect
1121 || h->root.type == bfd_link_hash_warning)
1122 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1123 sym_name = h->root.root.string;
1124
1125 if (h->root.type == bfd_link_hash_defined
1126 || h->root.type == bfd_link_hash_defweak)
1127 {
1128 sec = h->root.u.def.section;
1129 if (sec->output_section == NULL)
1130 relocation = 0;
1131 else
1132 relocation = (h->root.u.def.value
1133 + sec->output_section->vma
1134 + sec->output_offset);
1135 }
1136 else if (h->root.type == bfd_link_hash_undefweak)
1137 relocation = 0;
1138 else
1139 {
1140 if (! ((*info->callbacks->undefined_symbol)
1141 (info, h->root.root.string, input_bfd,
5cc7c785 1142 input_section, offset, true)))
252b5132
RH
1143 return false;
1144 relocation = 0;
1145 }
1146 }
1147
1148 /* Sanity check the address. */
1149 if (offset > input_section->_raw_size)
1150 {
1151 r = bfd_reloc_outofrange;
1152 goto check_reloc;
1153 }
1154
1155 switch ((int) r_type)
1156 {
1157 case (int) R_M32R_10_PCREL :
1158 r = m32r_elf_do_10_pcrel_reloc (input_bfd, howto, input_section,
1159 contents, offset,
1160 sec, relocation, addend);
1161 break;
1162
1163 case (int) R_M32R_HI16_SLO :
1164 case (int) R_M32R_HI16_ULO :
1165 {
1166 Elf_Internal_Rela *lorel;
1167
1168 /* We allow an arbitrary number of HI16 relocs before the
1169 LO16 reloc. This permits gcc to emit the HI and LO relocs
1170 itself. */
1171 for (lorel = rel + 1;
1172 (lorel < relend
1173 && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
1174 || ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
1175 lorel++)
1176 continue;
1177 if (lorel < relend
1178 && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
1179 {
1180 m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
1181 contents, relocation + addend);
1182 r = bfd_reloc_ok;
1183 }
1184 else
1185 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1186 contents, offset,
1187 relocation, addend);
1188 }
1189 break;
1190
1191 case (int) R_M32R_SDA16 :
1192 {
1193 const char *name;
1194
1195 BFD_ASSERT (sec != NULL);
1196 name = bfd_get_section_name (abfd, sec);
1197
1198 if (strcmp (name, ".sdata") == 0
1199 || strcmp (name, ".sbss") == 0
1200 || strcmp (name, ".scommon") == 0)
1201 {
1202 bfd_vma sda_base;
1203 bfd *out_bfd = sec->output_section->owner;
1204
1205 r = m32r_elf_final_sda_base (out_bfd, info,
1206 &errmsg,
1207 &sda_base);
1208 if (r != bfd_reloc_ok)
1209 {
1210 ret = false;
1211 goto check_reloc;
1212 }
1213
1214 /* At this point `relocation' contains the object's
1215 address. */
1216 relocation -= sda_base;
1217 /* Now it contains the offset from _SDA_BASE_. */
1218 }
1219 else
1220 {
8f615d07
AM
1221 (*_bfd_error_handler)
1222 (_("%s: The target (%s) of an %s relocation is in the wrong section (%s)"),
1223 bfd_archive_filename (input_bfd),
1224 sym_name,
1225 m32r_elf_howto_table[(int) r_type].name,
1226 bfd_get_section_name (abfd, sec));
252b5132
RH
1227 /*bfd_set_error (bfd_error_bad_value); ??? why? */
1228 ret = false;
1229 continue;
1230 }
1231 }
1232 /* fall through */
1233
1234 default :
1235 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1236 contents, offset,
1237 relocation, addend);
1238 break;
1239 }
1240 }
1241
1242 check_reloc:
1243
1244 if (r != bfd_reloc_ok)
1245 {
1246 /* FIXME: This should be generic enough to go in a utility. */
1247 const char *name;
1248
1249 if (h != NULL)
1250 name = h->root.root.string;
1251 else
1252 {
1253 name = (bfd_elf_string_from_elf_section
1254 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1255 if (name == NULL || *name == '\0')
1256 name = bfd_section_name (input_bfd, sec);
1257 }
1258
1259 if (errmsg != NULL)
1260 goto common_error;
1261
1262 switch (r)
1263 {
1264 case bfd_reloc_overflow:
1265 if (! ((*info->callbacks->reloc_overflow)
1266 (info, name, howto->name, (bfd_vma) 0,
1267 input_bfd, input_section, offset)))
1268 return false;
1269 break;
1270
1271 case bfd_reloc_undefined:
1272 if (! ((*info->callbacks->undefined_symbol)
1273 (info, name, input_bfd, input_section,
5cc7c785 1274 offset, true)))
252b5132
RH
1275 return false;
1276 break;
1277
1278 case bfd_reloc_outofrange:
1279 errmsg = _("internal error: out of range error");
1280 goto common_error;
1281
1282 case bfd_reloc_notsupported:
1283 errmsg = _("internal error: unsupported relocation error");
1284 goto common_error;
1285
1286 case bfd_reloc_dangerous:
1287 errmsg = _("internal error: dangerous error");
1288 goto common_error;
1289
1290 default:
1291 errmsg = _("internal error: unknown error");
1292 /* fall through */
1293
1294 common_error:
1295 if (!((*info->callbacks->warning)
1296 (info, errmsg, name, input_bfd, input_section,
1297 offset)))
1298 return false;
1299 break;
1300 }
1301 }
1302 }
1303
1304 return ret;
1305}
1306\f
1307#if 0 /* relaxing not supported yet */
1308
1309/* This function handles relaxing for the m32r.
1310 Relaxing on the m32r is tricky because of instruction alignment
1311 requirements (4 byte instructions must be aligned on 4 byte boundaries).
1312
1313 The following relaxing opportunities are handled:
1314
1315 seth/add3/jl -> bl24 or bl8
1316 seth/add3 -> ld24
1317
1318 It would be nice to handle bl24 -> bl8 but given:
1319
1320 - 4 byte insns must be on 4 byte boundaries
1321 - branch instructions only branch to insns on 4 byte boundaries
1322
1323 this isn't much of a win because the insn in the 2 "deleted" bytes
1324 must become a nop. With some complexity some real relaxation could be
1325 done but the frequency just wouldn't make it worth it; it's better to
1326 try to do all the code compaction one can elsewhere.
1327 When the chip supports parallel 16 bit insns, things may change.
1328*/
1329
c3668558 1330static boolean
252b5132
RH
1331m32r_elf_relax_section (abfd, sec, link_info, again)
1332 bfd *abfd;
1333 asection *sec;
1334 struct bfd_link_info *link_info;
1335 boolean *again;
1336{
1337 Elf_Internal_Shdr *symtab_hdr;
1338 /* The Rela structures are used here because that's what
1339 _bfd_elf32_link_read_relocs uses [for convenience - it sets the addend
1340 field to 0]. */
6cdc0ccc 1341 Elf_Internal_Rela *internal_relocs = NULL;
252b5132
RH
1342 Elf_Internal_Rela *irel, *irelend;
1343 bfd_byte *contents = NULL;
6cdc0ccc 1344 Elf_Internal_Sym *isymbuf = NULL;
252b5132
RH
1345
1346 /* Assume nothing changes. */
1347 *again = false;
1348
1349 /* We don't have to do anything for a relocateable link, if
1350 this section does not have relocs, or if this is not a
1351 code section. */
1352 if (link_info->relocateable
1353 || (sec->flags & SEC_RELOC) == 0
1354 || sec->reloc_count == 0
1355 || (sec->flags & SEC_CODE) == 0
1356 || 0 /* FIXME: check SHF_M32R_CAN_RELAX */)
1357 return true;
1358
1359 /* If this is the first time we have been called for this section,
1360 initialize the cooked size. */
1361 if (sec->_cooked_size == 0)
1362 sec->_cooked_size = sec->_raw_size;
1363
1364 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1365
1366 /* Get a copy of the native relocations. */
1367 internal_relocs = (_bfd_elf32_link_read_relocs
1368 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1369 link_info->keep_memory));
1370 if (internal_relocs == NULL)
1371 goto error_return;
252b5132
RH
1372
1373 /* Walk through them looking for relaxing opportunities. */
1374 irelend = internal_relocs + sec->reloc_count;
1375 for (irel = internal_relocs; irel < irelend; irel++)
1376 {
1377 bfd_vma symval;
1378
1379 /* If this isn't something that can be relaxed, then ignore
1380 this reloc. */
1381 if (ELF32_R_TYPE (irel->r_info) != (int) R_M32R_HI16_SLO)
1382 continue;
1383
1384 /* Get the section contents if we haven't done so already. */
1385 if (contents == NULL)
1386 {
1387 /* Get cached copy if it exists. */
1388 if (elf_section_data (sec)->this_hdr.contents != NULL)
1389 contents = elf_section_data (sec)->this_hdr.contents;
1390 else
1391 {
1392 /* Go get them off disk. */
1393 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1394 if (contents == NULL)
1395 goto error_return;
252b5132
RH
1396
1397 if (! bfd_get_section_contents (abfd, sec, contents,
1398 (file_ptr) 0, sec->_raw_size))
1399 goto error_return;
1400 }
1401 }
1402
6cdc0ccc
AM
1403 /* Read this BFD's local symbols if we haven't done so already. */
1404 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
252b5132 1405 {
6cdc0ccc
AM
1406 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1407 if (isymbuf == NULL)
1408 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1409 symtab_hdr->sh_info, 0,
1410 NULL, NULL, NULL);
1411 if (isymbuf == NULL)
1412 goto error_return;
252b5132
RH
1413 }
1414
1415 /* Get the value of the symbol referred to by the reloc. */
1416 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1417 {
252b5132 1418 /* A local symbol. */
6cdc0ccc
AM
1419 Elf_Internal_Sym *isym;
1420 asection *sym_sec;
252b5132 1421
6cdc0ccc
AM
1422 isym = isymbuf + ELF32_R_SYM (irel->r_info),
1423 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1424 symval = (isym->st_value
252b5132
RH
1425 + sym_sec->output_section->vma
1426 + sym_sec->output_offset);
1427 }
1428 else
1429 {
1430 unsigned long indx;
1431 struct elf_link_hash_entry *h;
1432
1433 /* An external symbol. */
1434 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1435 h = elf_sym_hashes (abfd)[indx];
1436 BFD_ASSERT (h != NULL);
1437 if (h->root.type != bfd_link_hash_defined
1438 && h->root.type != bfd_link_hash_defweak)
1439 {
1440 /* This appears to be a reference to an undefined
1441 symbol. Just ignore it--it will be caught by the
1442 regular reloc processing. */
1443 continue;
1444 }
1445
1446 symval = (h->root.u.def.value
1447 + h->root.u.def.section->output_section->vma
1448 + h->root.u.def.section->output_offset);
1449 }
1450
1451 /* For simplicity of coding, we are going to modify the section
1452 contents, the section relocs, and the BFD symbol table. We
1453 must tell the rest of the code not to free up this
1454 information. It would be possible to instead create a table
1455 of changes which have to be made, as is done in coff-mips.c;
1456 that would be more work, but would require less memory when
1457 the linker is run. */
1458
1459 /* Try to change a seth/add3/jl subroutine call to bl24 or bl8.
1460 This sequence is generated by the compiler when compiling in
1461 32 bit mode. Also look for seth/add3 -> ld24. */
1462
1463 if (ELF32_R_TYPE (irel->r_info) == (int) R_M32R_HI16_SLO)
1464 {
1465 Elf_Internal_Rela *nrel;
1466 bfd_vma pc = (sec->output_section->vma + sec->output_offset
1467 + irel->r_offset);
1468 bfd_signed_vma pcrel_value = symval - pc;
1469 unsigned int code,reg;
1470 int addend,nop_p,bl8_p,to_delete;
1471
1472 /* The tests are ordered so that we get out as quickly as possible
1473 if this isn't something we can relax, taking into account that
1474 we are looking for two separate possibilities (jl/ld24). */
1475
1476 /* Do nothing if no room in the section for this to be what we're
1477 looking for. */
1478 if (irel->r_offset > sec->_cooked_size - 8)
1479 continue;
1480
1481 /* Make sure the next relocation applies to the next
1482 instruction and that it's the add3's reloc. */
1483 nrel = irel + 1;
1484 if (nrel == irelend
1485 || irel->r_offset + 4 != nrel->r_offset
1486 || ELF32_R_TYPE (nrel->r_info) != (int) R_M32R_LO16)
1487 continue;
1488
1489 /* See if the instructions are seth/add3. */
1490 /* FIXME: This is where macros from cgen can come in. */
1491 code = bfd_get_16 (abfd, contents + irel->r_offset + 0);
1492 if ((code & 0xf0ff) != 0xd0c0)
1493 continue; /* not seth rN,foo */
1494 reg = (code & 0x0f00) >> 8;
1495 code = bfd_get_16 (abfd, contents + irel->r_offset + 4);
1496 if (code != (0x80a0 | reg | (reg << 8)))
1497 continue; /* not add3 rN,rN,foo */
1498
1499 /* At this point we've confirmed we have seth/add3. Now check
1500 whether the next insn is a jl, in which case try to change this
1501 to bl24 or bl8. */
1502
1503 /* Ensure the branch target is in range.
1504 The bl24 instruction has a 24 bit operand which is the target
1505 address right shifted by 2, giving a signed range of 26 bits.
1506 Note that 4 bytes are added to the high value because the target
1507 will be at least 4 bytes closer if we can relax. It'll actually
1508 be 4 or 8 bytes closer, but we don't know which just yet and
1509 the difference isn't significant enough to worry about. */
1510#ifndef USE_REL /* put in for learning purposes */
1511 pcrel_value += irel->r_addend;
1512#else
1513 addend = bfd_get_signed_16 (abfd, contents + irel->r_offset + 2);
1514 pcrel_value += addend;
1515#endif
1516
1517 if (pcrel_value >= -(1 << 25) && pcrel_value < (1 << 25) + 4
1518 /* Do nothing if no room in the section for this to be what we're
1519 looking for. */
1520 && (irel->r_offset <= sec->_cooked_size - 12)
1521 /* Ensure the next insn is "jl rN". */
1522 && ((code = bfd_get_16 (abfd, contents + irel->r_offset + 8)),
1523 code != (0x1ec0 | reg)))
1524 {
1525 /* We can relax to bl24/bl8. */
1526
1527 /* See if there's a nop following the jl.
1528 Also see if we can use a bl8 insn. */
1529 code = bfd_get_16 (abfd, contents + irel->r_offset + 10);
1530 nop_p = (code & 0x7fff) == NOP_INSN;
1531 bl8_p = pcrel_value >= -0x200 && pcrel_value < 0x200;
1532
1533 if (bl8_p)
1534 {
1535 /* Change "seth rN,foo" to "bl8 foo || nop".
1536 We OR in CODE just in case it's not a nop (technically,
1537 CODE currently must be a nop, but for cleanness we
1538 allow it to be anything). */
1539#ifndef USE_REL /* put in for learning purposes */
1540 code = 0x7e000000 | MAKE_PARALLEL (code);
1541#else
1542 code = (0x7e000000 + (((addend >> 2) & 0xff) << 16)) | MAKE_PARALLEL (code);
1543#endif
1544 to_delete = 8;
1545 }
1546 else
1547 {
1548 /* Change the seth rN,foo to a bl24 foo. */
1549#ifndef USE_REL /* put in for learning purposes */
1550 code = 0xfe000000;
1551#else
1552 code = 0xfe000000 + ((addend >> 2) & 0xffffff);
1553#endif
1554 to_delete = nop_p ? 8 : 4;
1555 }
1556
1557 bfd_put_32 (abfd, code, contents + irel->r_offset);
1558
1559 /* Set the new reloc type. */
1560 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1561 bl8_p ? R_M32R_10_PCREL : R_M32R_26_PCREL);
1562
1563 /* Delete the add3 reloc by making it a null reloc. */
1564 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
1565 R_M32R_NONE);
1566 }
1567 else if (addend >= 0
1568 && symval + addend <= 0xffffff)
1569 {
1570 /* We can relax to ld24. */
1571
1572 code = 0xe0000000 | (reg << 24) | (addend & 0xffffff);
1573 bfd_put_32 (abfd, code, contents + irel->r_offset);
1574 to_delete = 4;
1575 /* Tell the following code a nop filler isn't needed. */
1576 nop_p = 1;
1577 }
1578 else
1579 {
1580 /* Can't do anything here. */
1581 continue;
1582 }
1583
1584 /* Note that we've changed the relocs, section contents, etc. */
1585 elf_section_data (sec)->relocs = internal_relocs;
252b5132 1586 elf_section_data (sec)->this_hdr.contents = contents;
6cdc0ccc 1587 symtab_hdr->contents = (unsigned char *) isymbuf;
252b5132
RH
1588
1589 /* Delete TO_DELETE bytes of data. */
1590 if (!m32r_elf_relax_delete_bytes (abfd, sec,
1591 irel->r_offset + 4, to_delete))
1592 goto error_return;
1593
1594 /* Now that the following bytes have been moved into place, see if
1595 we need to replace the jl with a nop. This happens when we had
1596 to use a bl24 insn and the insn following the jl isn't a nop.
1597 Technically, this situation can't happen (since the insn can
1598 never be executed) but to be clean we do this. When the chip
1599 supports parallel 16 bit insns things may change.
1600 We don't need to do this in the case of relaxing to ld24,
1601 and the above code sets nop_p so this isn't done. */
1602 if (! nop_p && to_delete == 4)
1603 bfd_put_16 (abfd, NOP_INSN, contents + irel->r_offset + 4);
1604
1605 /* That will change things, so we should relax again.
1606 Note that this is not required, and it may be slow. */
1607 *again = true;
1608
1609 continue;
1610 }
1611
1612 /* loop to try the next reloc */
1613 }
1614
6cdc0ccc
AM
1615 if (isymbuf != NULL
1616 && symtab_hdr->contents != (unsigned char *) isymbuf)
252b5132
RH
1617 {
1618 if (! link_info->keep_memory)
6cdc0ccc 1619 free (isymbuf);
252b5132
RH
1620 else
1621 {
6cdc0ccc
AM
1622 /* Cache the symbols for elf_link_input_bfd. */
1623 symtab_hdr->contents = (unsigned char *) isymbuf;
252b5132 1624 }
252b5132
RH
1625 }
1626
6cdc0ccc
AM
1627 if (contents != NULL
1628 && elf_section_data (sec)->this_hdr.contents != contents)
252b5132
RH
1629 {
1630 if (! link_info->keep_memory)
6cdc0ccc 1631 free (contents);
252b5132
RH
1632 else
1633 {
6cdc0ccc
AM
1634 /* Cache the section contents for elf_link_input_bfd. */
1635 elf_section_data (sec)->this_hdr.contents = contents;
252b5132 1636 }
252b5132
RH
1637 }
1638
6cdc0ccc
AM
1639 if (internal_relocs != NULL
1640 && elf_section_data (sec)->relocs != internal_relocs)
1641 free (internal_relocs);
1642
252b5132
RH
1643 return true;
1644
1645 error_return:
6cdc0ccc
AM
1646 if (isymbuf != NULL
1647 && symtab_hdr->contents != (unsigned char *) isymbuf)
1648 free (isymbuf);
1649 if (contents != NULL
1650 && elf_section_data (sec)->this_hdr.contents != contents)
1651 free (contents);
1652 if (internal_relocs != NULL
1653 && elf_section_data (sec)->relocs != internal_relocs)
1654 free (internal_relocs);
1655
252b5132
RH
1656 return false;
1657}
1658
1659/* Delete some bytes from a section while relaxing. */
1660
1661static boolean
1662m32r_elf_relax_delete_bytes (abfd, sec, addr, count)
1663 bfd *abfd;
1664 asection *sec;
1665 bfd_vma addr;
1666 int count;
1667{
1668 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 1669 int shndx;
252b5132
RH
1670 bfd_byte *contents;
1671 Elf_Internal_Rela *irel, *irelend;
1672 Elf_Internal_Rela *irelalign;
1673 bfd_vma toaddr;
6cdc0ccc
AM
1674 Elf_Internal_Sym *isym, *isymend;
1675 struct elf_link_hash_entry **sym_hashes;
1676 struct elf_link_hash_entry **end_hashes;
1677 unsigned int symcount;
252b5132
RH
1678
1679 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1680
1681 contents = elf_section_data (sec)->this_hdr.contents;
1682
1683 /* The deletion must stop at the next ALIGN reloc for an aligment
1684 power larger than the number of bytes we are deleting. */
1685
1686 irelalign = NULL;
1687 toaddr = sec->_cooked_size;
1688
1689 irel = elf_section_data (sec)->relocs;
1690 irelend = irel + sec->reloc_count;
1691
1692 /* Actually delete the bytes. */
1693 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1694 sec->_cooked_size -= count;
1695
1696 /* Adjust all the relocs. */
1697 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1698 {
1699 /* Get the new reloc address. */
1700 if ((irel->r_offset > addr
1701 && irel->r_offset < toaddr))
1702 irel->r_offset -= count;
1703 }
1704
1705 /* Adjust the local symbols defined in this section. */
6cdc0ccc
AM
1706 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1707 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1708 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
252b5132 1709 {
6cdc0ccc
AM
1710 if (isym->st_shndx == shndx
1711 && isym->st_value > addr
1712 && isym->st_value < toaddr)
1713 isym->st_value -= count;
252b5132
RH
1714 }
1715
1716 /* Now adjust the global symbols defined in this section. */
6cdc0ccc
AM
1717 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1718 - symtab_hdr->sh_info);
1719 sym_hashes = elf_sym_hashes (abfd);
1720 end_hashes = sym_hashes + symcount;
1721 for (; sym_hashes < end_hashes; sym_hashes++)
252b5132 1722 {
6cdc0ccc
AM
1723 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1724
1725 if ((sym_hash->root.type == bfd_link_hash_defined
1726 || sym_hash->root.type == bfd_link_hash_defweak)
1727 && sym_hash->root.u.def.section == sec
1728 && sym_hash->root.u.def.value > addr
1729 && sym_hash->root.u.def.value < toaddr)
252b5132 1730 {
6cdc0ccc 1731 sym_hash->root.u.def.value -= count;
252b5132
RH
1732 }
1733 }
1734
1735 return true;
1736}
1737
1738/* This is a version of bfd_generic_get_relocated_section_contents
1739 which uses m32r_elf_relocate_section. */
1740
1741static bfd_byte *
1742m32r_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1743 data, relocateable, symbols)
1744 bfd *output_bfd;
1745 struct bfd_link_info *link_info;
1746 struct bfd_link_order *link_order;
1747 bfd_byte *data;
1748 boolean relocateable;
1749 asymbol **symbols;
1750{
1751 Elf_Internal_Shdr *symtab_hdr;
1752 asection *input_section = link_order->u.indirect.section;
1753 bfd *input_bfd = input_section->owner;
1754 asection **sections = NULL;
1755 Elf_Internal_Rela *internal_relocs = NULL;
6cdc0ccc 1756 Elf_Internal_Sym *isymbuf = NULL;
dc810e39 1757 bfd_size_type amt;
252b5132
RH
1758
1759 /* We only need to handle the case of relaxing, or of having a
1760 particular set of section contents, specially. */
1761 if (relocateable
1762 || elf_section_data (input_section)->this_hdr.contents == NULL)
1763 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1764 link_order, data,
1765 relocateable,
1766 symbols);
1767
1768 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1769
1770 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1771 input_section->_raw_size);
1772
1773 if ((input_section->flags & SEC_RELOC) != 0
1774 && input_section->reloc_count > 0)
1775 {
1776 Elf_Internal_Sym *isymp;
1777 asection **secpp;
1778 Elf32_External_Sym *esym, *esymend;
1779
252b5132
RH
1780 internal_relocs = (_bfd_elf32_link_read_relocs
1781 (input_bfd, input_section, (PTR) NULL,
1782 (Elf_Internal_Rela *) NULL, false));
1783 if (internal_relocs == NULL)
1784 goto error_return;
1785
6cdc0ccc
AM
1786 if (symtab_hdr->sh_info != 0)
1787 {
1788 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1789 if (isymbuf == NULL)
1790 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1791 symtab_hdr->sh_info, 0,
1792 NULL, NULL, NULL);
1793 if (isymbuf == NULL)
1794 goto error_return;
1795 }
252b5132 1796
dc810e39
AM
1797 amt = symtab_hdr->sh_info;
1798 amt *= sizeof (asection *);
1799 sections = (asection **) bfd_malloc (amt);
252b5132
RH
1800 if (sections == NULL && symtab_hdr->sh_info > 0)
1801 goto error_return;
1802
6cdc0ccc
AM
1803 isymend = isymbuf + symtab_hdr->sh_info;
1804 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
252b5132
RH
1805 {
1806 asection *isec;
1807
6cdc0ccc 1808 if (isym->st_shndx == SHN_UNDEF)
252b5132 1809 isec = bfd_und_section_ptr;
6cdc0ccc 1810 else if (isym->st_shndx == SHN_ABS)
252b5132 1811 isec = bfd_abs_section_ptr;
6cdc0ccc 1812 else if (isym->st_shndx == SHN_COMMON)
252b5132 1813 isec = bfd_com_section_ptr;
6cdc0ccc 1814 else if (isym->st_shndx == SHN_M32R_SCOMMON)
252b5132
RH
1815 isec = &m32r_elf_scom_section;
1816 else
6cdc0ccc 1817 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
252b5132
RH
1818
1819 *secpp = isec;
1820 }
1821
1822 if (! m32r_elf_relocate_section (output_bfd, link_info, input_bfd,
1823 input_section, data, internal_relocs,
6cdc0ccc 1824 isymbuf, sections))
252b5132
RH
1825 goto error_return;
1826
1827 if (sections != NULL)
1828 free (sections);
6cdc0ccc
AM
1829 if (isymbuf != NULL
1830 && symtab_hdr->contents != (unsigned char *) isymbuf)
1831 free (isymbuf);
1832 if (elf_section_data (input_section)->relocs != internal_relocs)
252b5132 1833 free (internal_relocs);
252b5132
RH
1834 }
1835
1836 return data;
1837
1838 error_return:
252b5132
RH
1839 if (sections != NULL)
1840 free (sections);
6cdc0ccc
AM
1841 if (isymbuf != NULL
1842 && symtab_hdr->contents != (unsigned char *) isymbuf)
1843 free (isymbuf);
1844 if (internal_relocs != NULL
1845 && elf_section_data (input_section)->relocs != internal_relocs)
1846 free (internal_relocs);
252b5132
RH
1847 return NULL;
1848}
1849
1850#endif /* #if 0 */
1851\f
1852/* Set the right machine number. */
1853static boolean
1854m32r_elf_object_p (abfd)
1855 bfd *abfd;
1856{
1857 switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
1858 {
1859 default:
1860 case E_M32R_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32r); break;
e916b64e 1861 case E_M32RX_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32rx); break;
252b5132
RH
1862 }
1863 return true;
1864}
1865
1866/* Store the machine number in the flags field. */
1867static void
1868m32r_elf_final_write_processing (abfd, linker)
1869 bfd * abfd;
5f771d47 1870 boolean linker ATTRIBUTE_UNUSED;
252b5132
RH
1871{
1872 unsigned long val;
1873
1874 switch (bfd_get_mach (abfd))
1875 {
1876 default:
1877 case bfd_mach_m32r: val = E_M32R_ARCH; break;
e916b64e 1878 case bfd_mach_m32rx: val = E_M32RX_ARCH; break;
252b5132
RH
1879 }
1880
1881 elf_elfheader (abfd)->e_flags &=~ EF_M32R_ARCH;
1882 elf_elfheader (abfd)->e_flags |= val;
1883}
1884
c3668558 1885/* Function to keep M32R specific file flags. */
252b5132
RH
1886static boolean
1887m32r_elf_set_private_flags (abfd, flags)
1888 bfd * abfd;
1889 flagword flags;
1890{
1891 BFD_ASSERT (!elf_flags_init (abfd)
1892 || elf_elfheader (abfd)->e_flags == flags);
1893
1894 elf_elfheader (abfd)->e_flags = flags;
1895 elf_flags_init (abfd) = true;
1896 return true;
1897}
1898
252b5132
RH
1899/* Merge backend specific data from an object file to the output
1900 object file when linking. */
1901static boolean
1902m32r_elf_merge_private_bfd_data (ibfd, obfd)
1903 bfd * ibfd;
1904 bfd * obfd;
1905{
1906 flagword out_flags;
1907 flagword in_flags;
1908
1909 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1910 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1911 return true;
1912
1913 in_flags = elf_elfheader (ibfd)->e_flags;
1914 out_flags = elf_elfheader (obfd)->e_flags;
1915
1916 if (! elf_flags_init (obfd))
1917 {
1918 /* If the input is the default architecture then do not
1919 bother setting the flags for the output architecture,
1920 instead allow future merges to do this. If no future
1921 merges ever set these flags then they will retain their
1922 unitialised values, which surprise surprise, correspond
1923 to the default values. */
1924 if (bfd_get_arch_info (ibfd)->the_default)
1925 return true;
c3668558 1926
252b5132
RH
1927 elf_flags_init (obfd) = true;
1928 elf_elfheader (obfd)->e_flags = in_flags;
1929
1930 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1931 && bfd_get_arch_info (obfd)->the_default)
1932 {
1933 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1934 }
1935
1936 return true;
1937 }
1938
1939 /* Check flag compatibility. */
1940 if (in_flags == out_flags)
1941 return true;
1942
1943 if ((in_flags & EF_M32R_ARCH) != (out_flags & EF_M32R_ARCH))
1944 {
1945 if ((in_flags & EF_M32R_ARCH) != E_M32R_ARCH)
1946 {
8f615d07
AM
1947 (*_bfd_error_handler)
1948 (_("%s: Instruction set mismatch with previous modules"),
1949 bfd_archive_filename (ibfd));
252b5132
RH
1950
1951 bfd_set_error (bfd_error_bad_value);
1952 return false;
1953 }
1954 }
1955
1956 return true;
1957}
1958
1959/* Display the flags field */
1960static boolean
1961m32r_elf_print_private_bfd_data (abfd, ptr)
1962 bfd * abfd;
1963 PTR ptr;
1964{
1965 FILE * file = (FILE *) ptr;
c3668558 1966
252b5132 1967 BFD_ASSERT (abfd != NULL && ptr != NULL)
c3668558 1968
252b5132 1969 _bfd_elf_print_private_bfd_data (abfd, ptr);
c3668558 1970
252b5132 1971 fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
c3668558 1972
252b5132
RH
1973 switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
1974 {
1975 default:
1976 case E_M32R_ARCH: fprintf (file, _(": m32r instructions")); break;
e916b64e 1977 case E_M32RX_ARCH: fprintf (file, _(": m32rx instructions")); break;
252b5132 1978 }
c3668558 1979
252b5132 1980 fputc ('\n', file);
c3668558 1981
252b5132
RH
1982 return true;
1983}
1984
1985asection *
1e2f5b6e
AM
1986m32r_elf_gc_mark_hook (sec, info, rel, h, sym)
1987 asection *sec;
1988 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1989 Elf_Internal_Rela *rel;
1990 struct elf_link_hash_entry *h;
1991 Elf_Internal_Sym *sym;
252b5132
RH
1992{
1993 if (h != NULL)
1994 {
1995 switch (ELF32_R_TYPE (rel->r_info))
1996 {
1997 case R_M32R_GNU_VTINHERIT:
1998 case R_M32R_GNU_VTENTRY:
1999 break;
c3668558 2000
252b5132
RH
2001 default:
2002 switch (h->root.type)
2003 {
2004 case bfd_link_hash_defined:
2005 case bfd_link_hash_defweak:
2006 return h->root.u.def.section;
c3668558 2007
252b5132
RH
2008 case bfd_link_hash_common:
2009 return h->root.u.c.p->section;
e049a0de
ILT
2010
2011 default:
2012 break;
252b5132
RH
2013 }
2014 }
2015 }
2016 else
1e2f5b6e
AM
2017 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
2018
252b5132
RH
2019 return NULL;
2020}
2021
2022static boolean
2023m32r_elf_gc_sweep_hook (abfd, info, sec, relocs)
5f771d47
ILT
2024 bfd *abfd ATTRIBUTE_UNUSED;
2025 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2026 asection *sec ATTRIBUTE_UNUSED;
2027 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
252b5132
RH
2028{
2029 /* we don't use got and plt entries for m32r */
2030 return true;
2031}
2032
252b5132
RH
2033/* Look through the relocs for a section during the first phase.
2034 Since we don't do .gots or .plts, we just need to consider the
2035 virtual table relocs for gc. */
c3668558 2036
252b5132
RH
2037static boolean
2038m32r_elf_check_relocs (abfd, info, sec, relocs)
2039 bfd *abfd;
2040 struct bfd_link_info *info;
2041 asection *sec;
2042 const Elf_Internal_Rela *relocs;
2043{
2044 Elf_Internal_Shdr *symtab_hdr;
2045 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2046 const Elf_Internal_Rela *rel;
2047 const Elf_Internal_Rela *rel_end;
c3668558 2048
252b5132
RH
2049 if (info->relocateable)
2050 return true;
c3668558 2051
252b5132
RH
2052 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2053 sym_hashes = elf_sym_hashes (abfd);
c3668558 2054 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
252b5132
RH
2055 if (!elf_bad_symtab (abfd))
2056 sym_hashes_end -= symtab_hdr->sh_info;
c3668558 2057
252b5132
RH
2058 rel_end = relocs + sec->reloc_count;
2059 for (rel = relocs; rel < rel_end; rel++)
2060 {
2061 struct elf_link_hash_entry *h;
2062 unsigned long r_symndx;
c3668558 2063
252b5132
RH
2064 r_symndx = ELF32_R_SYM (rel->r_info);
2065 if (r_symndx < symtab_hdr->sh_info)
2066 h = NULL;
2067 else
2068 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
c3668558 2069
252b5132
RH
2070 switch (ELF32_R_TYPE (rel->r_info))
2071 {
2072 /* This relocation describes the C++ object vtable hierarchy.
2073 Reconstruct it for later use during GC. */
2074 case R_M32R_GNU_VTINHERIT:
2075 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2076 return false;
2077 break;
c3668558 2078
252b5132
RH
2079 /* This relocation describes which C++ vtable entries are actually
2080 used. Record for later use during GC. */
2081 case R_M32R_GNU_VTENTRY:
2082 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
2083 return false;
2084 break;
2085 }
2086 }
c3668558 2087
252b5132
RH
2088 return true;
2089}
252b5132 2090\f
252b5132 2091#define ELF_ARCH bfd_arch_m32r
aa4f99bb
AO
2092#define ELF_MACHINE_CODE EM_M32R
2093#define ELF_MACHINE_ALT1 EM_CYGNUS_M32R
e916b64e 2094#define ELF_MAXPAGESIZE 0x1 /* Explicitly requested by Mitsubishi. */
252b5132
RH
2095
2096#define TARGET_BIG_SYM bfd_elf32_m32r_vec
2097#define TARGET_BIG_NAME "elf32-m32r"
2098
2099#define elf_info_to_howto 0
2100#define elf_info_to_howto_rel m32r_info_to_howto_rel
2101#define elf_backend_section_from_bfd_section _bfd_m32r_elf_section_from_bfd_section
2102#define elf_backend_symbol_processing _bfd_m32r_elf_symbol_processing
2103#define elf_backend_add_symbol_hook m32r_elf_add_symbol_hook
2104#define elf_backend_relocate_section m32r_elf_relocate_section
2105#define elf_backend_gc_mark_hook m32r_elf_gc_mark_hook
2106#define elf_backend_gc_sweep_hook m32r_elf_gc_sweep_hook
2107#define elf_backend_check_relocs m32r_elf_check_relocs
2108
2109#define elf_backend_can_gc_sections 1
b491616a
AM
2110#ifndef USE_REL
2111#define elf_backend_rela_normal 1
2112#endif
252b5132
RH
2113#if 0 /* not yet */
2114/* relax support */
2115#define bfd_elf32_bfd_relax_section m32r_elf_relax_section
2116#define bfd_elf32_bfd_get_relocated_section_contents \
2117 m32r_elf_get_relocated_section_contents
2118#endif
2119
2120#define elf_backend_object_p m32r_elf_object_p
2121#define elf_backend_final_write_processing m32r_elf_final_write_processing
252b5132
RH
2122#define bfd_elf32_bfd_merge_private_bfd_data m32r_elf_merge_private_bfd_data
2123#define bfd_elf32_bfd_set_private_flags m32r_elf_set_private_flags
2124#define bfd_elf32_bfd_print_private_bfd_data m32r_elf_print_private_bfd_data
c3668558 2125
252b5132 2126#include "elf32-target.h"
This page took 0.25594 seconds and 4 git commands to generate.