OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [bfd/] [elf32-m32r.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* M32R-specific support for 32-bit ELF.
2
   Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
3
 
4
This file is part of BFD, the Binary File Descriptor library.
5
 
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
 
20
#include "bfd.h"
21
#include "sysdep.h"
22
#include "libbfd.h"
23
#include "elf-bfd.h"
24
#include "elf/m32r.h"
25
 
26
static bfd_reloc_status_type m32r_elf_10_pcrel_reloc
27
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
28
static bfd_reloc_status_type m32r_elf_do_10_pcrel_reloc
29
  PARAMS ((bfd *, reloc_howto_type *, asection *,
30
           bfd_byte *, bfd_vma, asection *, bfd_vma, bfd_vma));
31
static bfd_reloc_status_type m32r_elf_hi16_reloc
32
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
33
static void m32r_elf_relocate_hi16
34
  PARAMS ((bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *,
35
           bfd_byte *, bfd_vma));
36
bfd_reloc_status_type m32r_elf_lo16_reloc
37
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
38
bfd_reloc_status_type m32r_elf_generic_reloc
39
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
40
static bfd_reloc_status_type m32r_elf_sda16_reloc
41
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
42
static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
43
  PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
44
static void m32r_info_to_howto_rel
45
  PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
46
boolean _bfd_m32r_elf_section_from_bfd_section
47
  PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
48
void _bfd_m32r_elf_symbol_processing
49
  PARAMS ((bfd *, asymbol *));
50
static boolean m32r_elf_add_symbol_hook
51
  PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
52
           const char **, flagword *, asection **, bfd_vma *));
53
static 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 */
57
static boolean m32r_elf_relax_delete_bytes
58
  PARAMS ((bfd *, asection *, bfd_vma, int));
59
#endif
60
 
61
static bfd_reloc_status_type m32r_elf_final_sda_base
62
  PARAMS ((bfd *, struct bfd_link_info *, const char **, bfd_vma *));
63
static boolean m32r_elf_object_p
64
  PARAMS ((bfd *));
65
static void m32r_elf_final_write_processing
66
  PARAMS ((bfd *, boolean));
67
static boolean m32r_elf_set_private_flags
68
  PARAMS ((bfd *, flagword));
69
static boolean m32r_elf_copy_private_bfd_data
70
  PARAMS ((bfd *, bfd *));
71
static boolean m32r_elf_merge_private_bfd_data
72
  PARAMS ((bfd *, bfd *));
73
static boolean m32r_elf_print_private_bfd_data
74
  PARAMS ((bfd *, PTR));
75
 
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
 
85
static 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 */
110
         m32r_elf_generic_reloc,/* special_function */
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 */
125
         m32r_elf_generic_reloc,/* special_function */
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 */
140
         m32r_elf_generic_reloc,/* special_function */
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
 
295
/* Handle the R_M32R_10_PCREL reloc.  */
296
 
297
static bfd_reloc_status_type
298
m32r_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;
306
     char ** error_message ATTRIBUTE_UNUSED;
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
 
336
static bfd_reloc_status_type
337
m32r_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;
344
     asection *symbol_section ATTRIBUTE_UNUSED;
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
 
394
struct 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
 
403
static struct m32r_hi16 *m32r_hi16_list;
404
 
405
static bfd_reloc_status_type
406
m32r_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
407
                     input_section, output_bfd, error_message)
408
     bfd *abfd ATTRIBUTE_UNUSED;
409
     arelent *reloc_entry;
410
     asymbol *symbol;
411
     PTR data;
412
     asection *input_section;
413
     bfd *output_bfd;
414
     char **error_message ATTRIBUTE_UNUSED;
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
 
466
static void
467
m32r_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
 
502
bfd_reloc_status_type
503
m32r_elf_lo16_reloc (input_bfd, reloc_entry, symbol, data,
504
                     input_section, output_bfd, error_message)
505
     bfd *input_bfd;
506
     arelent *reloc_entry;
507
     asymbol *symbol;
508
     PTR data;
509
     asection *input_section;
510
     bfd *output_bfd;
511
     char **error_message;
512
{
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
 
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.  */
539
          insn = bfd_get_32 (input_bfd, l->addr);
540
          vallo = ((bfd_get_32 (input_bfd, (bfd_byte *) data + reloc_entry->address)
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);
550
          bfd_put_32 (input_bfd, insn, l->addr);
551
 
552
          next = l->next;
553
          free (l);
554
          l = next;
555
        }
556
 
557
      m32r_hi16_list = NULL;
558
    }
559
 
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.  */
565
  return m32r_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
566
                                input_section, output_bfd, error_message);
567
}
568
 
569
/* Do generic partial_inplace relocation.
570
   This is a local replacement for bfd_elf_generic_reloc. */
571
 
572
bfd_reloc_status_type
573
m32r_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.  */
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;
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))
633
 
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
    }
653
 
654
  if (output_bfd != (bfd *) NULL)
655
    reloc_entry->address += input_section->output_offset;
656
 
657
  return ret;
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
 
666
static bfd_reloc_status_type
667
m32r_elf_sda16_reloc (abfd, reloc_entry, symbol, data,
668
                      input_section, output_bfd, error_message)
669
     bfd *abfd ATTRIBUTE_UNUSED;
670
     arelent *reloc_entry;
671
     asymbol *symbol;
672
     PTR data ATTRIBUTE_UNUSED;
673
     asection *input_section;
674
     bfd *output_bfd;
675
     char **error_message ATTRIBUTE_UNUSED;
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
 
698
/* Map BFD reloc types to M32R ELF reloc types.  */
699
 
700
struct m32r_reloc_map
701
{
702
  bfd_reloc_code_real_type bfd_reloc_val;
703
  unsigned char elf_reloc_val;
704
};
705
 
706
static 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
 
723
static reloc_howto_type *
724
bfd_elf32_bfd_reloc_type_lookup (abfd, code)
725
     bfd *abfd ATTRIBUTE_UNUSED;
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
 
743
static void
744
m32r_info_to_howto_rel (abfd, cache_ptr, dst)
745
     bfd *abfd ATTRIBUTE_UNUSED;
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
 
756
/* Given a BFD section, try to locate the corresponding ELF section
757
   index.  */
758
 
759
boolean
760
_bfd_m32r_elf_section_from_bfd_section (abfd, hdr, sec, retval)
761
     bfd *abfd ATTRIBUTE_UNUSED;
762
     Elf32_Internal_Shdr *hdr ATTRIBUTE_UNUSED;
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.  */
780
static asection m32r_elf_scom_section;
781
static asymbol m32r_elf_scom_symbol;
782
static asymbol *m32r_elf_scom_symbol_ptr;
783
 
784
/* Handle the special M32R section numbers that a symbol may use.  */
785
 
786
void
787
_bfd_m32r_elf_symbol_processing (abfd, asym)
788
     bfd *abfd ATTRIBUTE_UNUSED;
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
 
822
static boolean
823
m32r_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;
828
     flagword *flagsp ATTRIBUTE_UNUSED;
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
 
894
static bfd_reloc_status_type
895
m32r_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
 
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
 
958
static boolean
959
m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
960
                           contents, relocs, local_syms, local_sections)
961
     bfd *output_bfd ATTRIBUTE_UNUSED;
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,
1129
                          input_section, offset, true)))
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,
1260
                      offset, true)))
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
 
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
 
1316
static boolean
1317
m32r_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
 
1668
static boolean
1669
m32r_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
 
1758
static bfd_byte *
1759
m32r_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
 
1895
/* Set the right machine number.  */
1896
static boolean
1897
m32r_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;
1904
    case E_M32RX_ARCH:  (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32rx); break;
1905
    }
1906
  return true;
1907
}
1908
 
1909
/* Store the machine number in the flags field.  */
1910
static void
1911
m32r_elf_final_write_processing (abfd, linker)
1912
     bfd *   abfd;
1913
     boolean linker ATTRIBUTE_UNUSED;
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;
1921
    case bfd_mach_m32rx: val = E_M32RX_ARCH; break;
1922
    }
1923
 
1924
  elf_elfheader (abfd)->e_flags &=~ EF_M32R_ARCH;
1925
  elf_elfheader (abfd)->e_flags |= val;
1926
}
1927
 
1928
/* Function to keep M32R specific file flags. */
1929
static boolean
1930
m32r_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 */
1943
static boolean
1944
m32r_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.  */
1964
static boolean
1965
m32r_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;
1989
 
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 */
2022
static boolean
2023
m32r_elf_print_private_bfd_data (abfd, ptr)
2024
     bfd *   abfd;
2025
     PTR     ptr;
2026
{
2027
  FILE * file = (FILE *) ptr;
2028
 
2029
  BFD_ASSERT (abfd != NULL && ptr != NULL)
2030
 
2031
  _bfd_elf_print_private_bfd_data (abfd, ptr);
2032
 
2033
  fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
2034
 
2035
  switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
2036
    {
2037
    default:
2038
    case E_M32R_ARCH:  fprintf (file, _(": m32r instructions"));  break;
2039
    case E_M32RX_ARCH: fprintf (file, _(": m32rx instructions")); break;
2040
    }
2041
 
2042
  fputc ('\n', file);
2043
 
2044
  return true;
2045
}
2046
 
2047
asection *
2048
m32r_elf_gc_mark_hook (abfd, info, rel, h, sym)
2049
       bfd *abfd;
2050
       struct bfd_link_info *info ATTRIBUTE_UNUSED;
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;
2062
 
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;
2069
 
2070
          case bfd_link_hash_common:
2071
            return h->root.u.c.p->section;
2072
 
2073
          default:
2074
            break;
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
 
2091
static boolean
2092
m32r_elf_gc_sweep_hook (abfd, info, sec, relocs)
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;
2097
{
2098
  /* we don't use got and plt entries for m32r */
2099
  return true;
2100
}
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
 
2161
 
2162
 
2163
 
2164
#define ELF_ARCH                bfd_arch_m32r
2165
#define ELF_MACHINE_CODE        EM_CYGNUS_M32R
2166
#define ELF_MAXPAGESIZE         0x1 /* Explicitly requested by Mitsubishi.  */
2167
 
2168
#define TARGET_BIG_SYM          bfd_elf32_m32r_vec
2169
#define TARGET_BIG_NAME         "elf32-m32r"
2170
 
2171
#define elf_info_to_howto                       0
2172
#define elf_info_to_howto_rel                   m32r_info_to_howto_rel
2173
#define elf_backend_section_from_bfd_section    _bfd_m32r_elf_section_from_bfd_section
2174
#define elf_backend_symbol_processing           _bfd_m32r_elf_symbol_processing
2175
#define elf_backend_add_symbol_hook             m32r_elf_add_symbol_hook
2176
#define elf_backend_relocate_section            m32r_elf_relocate_section
2177
#define elf_backend_gc_mark_hook                m32r_elf_gc_mark_hook
2178
#define elf_backend_gc_sweep_hook               m32r_elf_gc_sweep_hook
2179
#define elf_backend_check_relocs                m32r_elf_check_relocs
2180
 
2181
#define elf_backend_can_gc_sections             1
2182
#if 0 /* not yet */
2183
/* relax support */
2184
#define bfd_elf32_bfd_relax_section             m32r_elf_relax_section
2185
#define bfd_elf32_bfd_get_relocated_section_contents \
2186
                                        m32r_elf_get_relocated_section_contents
2187
#endif
2188
 
2189
#define elf_backend_object_p                    m32r_elf_object_p
2190
#define elf_backend_final_write_processing      m32r_elf_final_write_processing
2191
#define bfd_elf32_bfd_copy_private_bfd_data     m32r_elf_copy_private_bfd_data
2192
#define bfd_elf32_bfd_merge_private_bfd_data    m32r_elf_merge_private_bfd_data
2193
#define bfd_elf32_bfd_set_private_flags         m32r_elf_set_private_flags
2194
#define bfd_elf32_bfd_print_private_bfd_data    m32r_elf_print_private_bfd_data
2195
 
2196
#include "elf32-target.h"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.