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