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