Coverage Report

Created: 2023-08-28 06:26

/src/binutils-gdb/bfd/elf32-m32c.c
Line
Count
Source (jump to first uncovered line)
1
/* M16C/M32C specific support for 32-bit ELF.
2
   Copyright (C) 2005-2023 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
#include "sysdep.h"
22
#include "bfd.h"
23
#include "libbfd.h"
24
#include "elf-bfd.h"
25
#include "elf/m32c.h"
26
#include "libiberty.h"
27
28
/* Forward declarations.  */
29
static reloc_howto_type * m32c_reloc_type_lookup
30
  (bfd *, bfd_reloc_code_real_type);
31
static bool m32c_info_to_howto_rela
32
  (bfd *, arelent *, Elf_Internal_Rela *);
33
static int m32c_elf_relocate_section
34
  (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
35
static bool m32c_elf_check_relocs
36
  (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
37
static bool m32c_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int);
38
#ifdef DEBUG
39
char * m32c_get_reloc (long reloc);
40
void dump_symtab (bfd *, void *, void *);
41
#endif
42
static bool m32c_elf_relax_section
43
(bfd *abfd, asection *sec, struct bfd_link_info *link_info, bool *again);
44
static bfd_reloc_status_type m32c_apply_reloc_24
45
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46
47
48
static reloc_howto_type m32c_elf_howto_table [] =
49
{
50
  /* This reloc does nothing.  */
51
  HOWTO (R_M32C_NONE,   /* type */
52
   0,     /* rightshift */
53
   0,     /* size */
54
   0,     /* bitsize */
55
   false,     /* pc_relative */
56
   0,     /* bitpos */
57
   complain_overflow_dont, /* complain_on_overflow */
58
   bfd_elf_generic_reloc, /* special_function */
59
   "R_M32C_NONE",   /* name */
60
   false,     /* partial_inplace */
61
   0,     /* src_mask */
62
   0,     /* dst_mask */
63
   false),    /* pcrel_offset */
64
65
  /* GCC intentionally overflows these next two in order to work
66
     around limitations in the addressing modes, so don't complain
67
     about overflow.  */
68
  HOWTO (R_M32C_16,   /* type */
69
   0,     /* rightshift */
70
   2,     /* size */
71
   16,      /* bitsize */
72
   false,     /* pc_relative */
73
   0,     /* bitpos */
74
   complain_overflow_dont, /* complain_on_overflow */
75
   bfd_elf_generic_reloc, /* special_function */
76
   "R_M32C_16",   /* name */
77
   false,     /* partial_inplace */
78
   0,     /* src_mask */
79
   0xffff,    /* dst_mask */
80
   false),    /* pcrel_offset */
81
82
  HOWTO (R_M32C_24,   /* type */
83
   0,     /* rightshift */
84
   4,     /* size */
85
   24,      /* bitsize */
86
   false,     /* pc_relative */
87
   0,     /* bitpos */
88
   complain_overflow_dont, /* complain_on_overflow */
89
   m32c_apply_reloc_24, /* special_function */
90
   "R_M32C_24",   /* name */
91
   false,     /* partial_inplace */
92
   0,     /* src_mask */
93
   0xffffff,    /* dst_mask */
94
   false),    /* pcrel_offset */
95
96
  HOWTO (R_M32C_32,   /* type */
97
   0,     /* rightshift */
98
   4,     /* size */
99
   32,      /* bitsize */
100
   false,     /* pc_relative */
101
   0,     /* bitpos */
102
   complain_overflow_bitfield, /* complain_on_overflow */
103
   bfd_elf_generic_reloc, /* special_function */
104
   "R_M32C_32",   /* name */
105
   false,     /* partial_inplace */
106
   0,     /* src_mask */
107
   0xffffffff,    /* dst_mask */
108
   false),    /* pcrel_offset */
109
110
  HOWTO (R_M32C_8_PCREL,  /* type */
111
   0,     /* rightshift */
112
   1,     /* size */
113
   8,     /* bitsize */
114
   true,      /* pc_relative */
115
   0,     /* bitpos */
116
   complain_overflow_signed, /* complain_on_overflow */
117
   bfd_elf_generic_reloc, /* special_function */
118
   "R_M32C_8_PCREL",  /* name */
119
   false,     /* partial_inplace */
120
   0,     /* src_mask */
121
   0xff,      /* dst_mask */
122
   true),     /* pcrel_offset */
123
124
  HOWTO (R_M32C_16_PCREL, /* type */
125
   0,     /* rightshift */
126
   2,     /* size */
127
   16,      /* bitsize */
128
   true,      /* pc_relative */
129
   0,     /* bitpos */
130
   complain_overflow_signed, /* complain_on_overflow */
131
   bfd_elf_generic_reloc, /* special_function */
132
   "R_M32C_16_PCREL", /* name */
133
   false,     /* partial_inplace */
134
   0,     /* src_mask */
135
   0xffff,    /* dst_mask */
136
   true),     /* pcrel_offset */
137
138
  HOWTO (R_M32C_8,    /* type */
139
   0,     /* rightshift */
140
   1,     /* size */
141
   8,     /* bitsize */
142
   false,     /* pc_relative */
143
   0,     /* bitpos */
144
   complain_overflow_unsigned, /* complain_on_overflow */
145
   bfd_elf_generic_reloc, /* special_function */
146
   "R_M32C_8",    /* name */
147
   false,     /* partial_inplace */
148
   0,     /* src_mask */
149
   0xff,      /* dst_mask */
150
   false),    /* pcrel_offset */
151
152
  HOWTO (R_M32C_LO16,   /* type */
153
   0,     /* rightshift */
154
   2,     /* size */
155
   16,      /* bitsize */
156
   false,     /* pc_relative */
157
   0,     /* bitpos */
158
   complain_overflow_dont, /* complain_on_overflow */
159
   bfd_elf_generic_reloc, /* special_function */
160
   "R_M32C_LO16",   /* name */
161
   false,     /* partial_inplace */
162
   0,     /* src_mask */
163
   0xffff,    /* dst_mask */
164
   false),    /* pcrel_offset */
165
166
  HOWTO (R_M32C_HI8,    /* type */
167
   0,     /* rightshift */
168
   1,     /* size */
169
   8,     /* bitsize */
170
   false,     /* pc_relative */
171
   0,     /* bitpos */
172
   complain_overflow_dont, /* complain_on_overflow */
173
   bfd_elf_generic_reloc, /* special_function */
174
   "R_M32C_HI8",    /* name */
175
   false,     /* partial_inplace */
176
   0,     /* src_mask */
177
   0xff,      /* dst_mask */
178
   false),    /* pcrel_offset */
179
180
  HOWTO (R_M32C_HI16,   /* type */
181
   0,     /* rightshift */
182
   2,     /* size */
183
   16,      /* bitsize */
184
   false,     /* pc_relative */
185
   0,     /* bitpos */
186
   complain_overflow_dont, /* complain_on_overflow */
187
   bfd_elf_generic_reloc, /* special_function */
188
   "R_M32C_HI16",   /* name */
189
   false,     /* partial_inplace */
190
   0,     /* src_mask */
191
   0xffff,    /* dst_mask */
192
   false),    /* pcrel_offset */
193
194
  HOWTO (R_M32C_RL_JUMP,  /* type */
195
   0,     /* rightshift */
196
   0,     /* size */
197
   0,     /* bitsize */
198
   false,     /* pc_relative */
199
   0,     /* bitpos */
200
   complain_overflow_signed, /* complain_on_overflow */
201
   bfd_elf_generic_reloc, /* special_function */
202
   "R_M32C_RL_JUMP",  /* name */
203
   false,     /* partial_inplace */
204
   0,     /* src_mask */
205
   0,     /* dst_mask */
206
   false),    /* pcrel_offset */
207
208
  HOWTO (R_M32C_RL_1ADDR, /* type */
209
   0,     /* rightshift */
210
   0,     /* size */
211
   0,     /* bitsize */
212
   false,     /* pc_relative */
213
   0,     /* bitpos */
214
   complain_overflow_signed, /* complain_on_overflow */
215
   bfd_elf_generic_reloc, /* special_function */
216
   "R_M32C_RL_1ADDR", /* name */
217
   false,     /* partial_inplace */
218
   0,     /* src_mask */
219
   0,     /* dst_mask */
220
   false),    /* pcrel_offset */
221
222
  HOWTO (R_M32C_RL_2ADDR, /* type */
223
   0,     /* rightshift */
224
   0,     /* size */
225
   0,     /* bitsize */
226
   false,     /* pc_relative */
227
   0,     /* bitpos */
228
   complain_overflow_signed, /* complain_on_overflow */
229
   bfd_elf_generic_reloc, /* special_function */
230
   "R_M32C_RL_2ADDR", /* name */
231
   false,     /* partial_inplace */
232
   0,     /* src_mask */
233
   0,     /* dst_mask */
234
   false),    /* pcrel_offset */
235
236
};
237

238
/* Map BFD reloc types to M32C ELF reloc types.  */
239
240
struct m32c_reloc_map
241
{
242
  bfd_reloc_code_real_type bfd_reloc_val;
243
  unsigned int m32c_reloc_val;
244
};
245
246
static const struct m32c_reloc_map m32c_reloc_map [] =
247
{
248
  { BFD_RELOC_NONE,   R_M32C_NONE },
249
  { BFD_RELOC_16,   R_M32C_16 },
250
  { BFD_RELOC_24,   R_M32C_24 },
251
  { BFD_RELOC_32,   R_M32C_32 },
252
  { BFD_RELOC_8_PCREL,    R_M32C_8_PCREL },
253
  { BFD_RELOC_16_PCREL,   R_M32C_16_PCREL },
254
  { BFD_RELOC_8,    R_M32C_8 },
255
  { BFD_RELOC_LO16,   R_M32C_LO16 },
256
  { BFD_RELOC_HI16,   R_M32C_HI16 },
257
  { BFD_RELOC_M32C_HI8,   R_M32C_HI8 },
258
  { BFD_RELOC_M32C_RL_JUMP, R_M32C_RL_JUMP },
259
  { BFD_RELOC_M32C_RL_1ADDR,  R_M32C_RL_1ADDR },
260
  { BFD_RELOC_M32C_RL_2ADDR,  R_M32C_RL_2ADDR }
261
};
262
263
static reloc_howto_type *
264
m32c_reloc_type_lookup
265
    (bfd *          abfd ATTRIBUTE_UNUSED,
266
     bfd_reloc_code_real_type code)
267
0
{
268
0
  unsigned int i;
269
270
0
  for (i = ARRAY_SIZE (m32c_reloc_map); i--;)
271
0
    if (m32c_reloc_map [i].bfd_reloc_val == code)
272
0
      return & m32c_elf_howto_table [m32c_reloc_map[i].m32c_reloc_val];
273
274
0
  return NULL;
275
0
}
276
277
static reloc_howto_type *
278
m32c_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
279
0
{
280
0
  unsigned int i;
281
282
0
  for (i = 0;
283
0
       i < sizeof (m32c_elf_howto_table) / sizeof (m32c_elf_howto_table[0]);
284
0
       i++)
285
0
    if (m32c_elf_howto_table[i].name != NULL
286
0
  && strcasecmp (m32c_elf_howto_table[i].name, r_name) == 0)
287
0
      return &m32c_elf_howto_table[i];
288
289
0
  return NULL;
290
0
}
291
292
/* Set the howto pointer for an M32C ELF reloc.  */
293
294
static bool
295
m32c_info_to_howto_rela (bfd *               abfd,
296
       arelent *           cache_ptr,
297
       Elf_Internal_Rela * dst)
298
0
{
299
0
  unsigned int r_type;
300
301
0
  r_type = ELF32_R_TYPE (dst->r_info);
302
0
  if (r_type >= (unsigned int) R_M32C_max)
303
0
    {
304
      /* xgettext:c-format */
305
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
306
0
        abfd, r_type);
307
0
      bfd_set_error (bfd_error_bad_value);
308
0
      return false;
309
0
    }
310
0
  cache_ptr->howto = & m32c_elf_howto_table [r_type];
311
0
  return true;
312
0
}
313
314

315
316
/* Apply R_M32C_24 relocations.  We have to do this because it's not a
317
   power-of-two size, and the generic code may think it overruns the
318
   section if it's right at the end.
319
320
   Must return something other than bfd_reloc_continue to avoid the
321
   above problem.  Typical return values include bfd_reloc_ok or
322
   bfd_reloc_overflow.
323
*/
324
325
static bfd_reloc_status_type m32c_apply_reloc_24 (bfd *abfd ATTRIBUTE_UNUSED,
326
              arelent *reloc_entry,
327
              asymbol *symbol,
328
              void *vdata_start ATTRIBUTE_UNUSED,
329
              asection *input_section,
330
              bfd *ibfd ATTRIBUTE_UNUSED,
331
              char **error_msg ATTRIBUTE_UNUSED)
332
0
{
333
0
  bfd_vma relocation;
334
0
  bfd_reloc_status_type s;
335
336
0
  s = bfd_elf_generic_reloc (abfd, reloc_entry, symbol,
337
0
           vdata_start,
338
0
           input_section, ibfd, error_msg);
339
0
  if (s != bfd_reloc_continue)
340
0
    return s;
341
342
  /* Get symbol value.  (Common symbols are special.)  */
343
0
  if (bfd_is_com_section (symbol->section))
344
0
    relocation = 0;
345
0
  else
346
0
    relocation = symbol->value;
347
348
0
  relocation += symbol->section->output_offset;
349
350
  /* Add in supplied addend.  */
351
0
  relocation += reloc_entry->addend;
352
353
0
  reloc_entry->addend = relocation;
354
0
  reloc_entry->address += input_section->output_offset;
355
0
  return bfd_reloc_ok;
356
0
}
357
358
/* Relocate an M32C ELF section.
359
   There is some attempt to make this function usable for many architectures,
360
   both USE_REL and USE_RELA ['twould be nice if such a critter existed],
361
   if only to serve as a learning tool.
362
363
   The RELOCATE_SECTION function is called by the new ELF backend linker
364
   to handle the relocations for a section.
365
366
   The relocs are always passed as Rela structures; if the section
367
   actually uses Rel structures, the r_addend field will always be
368
   zero.
369
370
   This function is responsible for adjusting the section contents as
371
   necessary, and (if using Rela relocs and generating a relocatable
372
   output file) adjusting the reloc addend as necessary.
373
374
   This function does not have to worry about setting the reloc
375
   address or the reloc symbol index.
376
377
   LOCAL_SYMS is a pointer to the swapped in local symbols.
378
379
   LOCAL_SECTIONS is an array giving the section in the input file
380
   corresponding to the st_shndx field of each local symbol.
381
382
   The global hash table entry for the global symbols can be found
383
   via elf_sym_hashes (input_bfd).
384
385
   When generating relocatable output, this function must handle
386
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
387
   going to be the section symbol corresponding to the output
388
   section, which means that the addend must be adjusted
389
   accordingly.  */
390
391
static int
392
m32c_elf_relocate_section
393
    (bfd *         output_bfd ATTRIBUTE_UNUSED,
394
     struct bfd_link_info *  info,
395
     bfd *         input_bfd,
396
     asection *        input_section,
397
     bfd_byte *        contents,
398
     Elf_Internal_Rela *     relocs,
399
     Elf_Internal_Sym *      local_syms,
400
     asection **       local_sections)
401
0
{
402
0
  Elf_Internal_Shdr *   symtab_hdr;
403
0
  struct elf_link_hash_entry ** sym_hashes;
404
0
  Elf_Internal_Rela *   rel;
405
0
  Elf_Internal_Rela *   relend;
406
0
  asection *splt;
407
408
0
  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
409
0
  sym_hashes = elf_sym_hashes (input_bfd);
410
0
  relend     = relocs + input_section->reloc_count;
411
412
0
  splt = elf_hash_table (info)->splt;
413
414
0
  for (rel = relocs; rel < relend; rel ++)
415
0
    {
416
0
      reloc_howto_type *     howto;
417
0
      unsigned long      r_symndx;
418
0
      Elf_Internal_Sym *     sym;
419
0
      asection *       sec;
420
0
      struct elf_link_hash_entry * h;
421
0
      bfd_vma        relocation;
422
0
      bfd_reloc_status_type    r;
423
0
      const char *       name = NULL;
424
0
      int        r_type;
425
426
0
      r_type = ELF32_R_TYPE (rel->r_info);
427
428
      /* These are only used for relaxing; we don't actually relocate
429
   anything with them, so skip them.  */
430
0
      if (r_type == R_M32C_RL_JUMP
431
0
    || r_type == R_M32C_RL_1ADDR
432
0
    || r_type == R_M32C_RL_2ADDR)
433
0
  continue;
434
435
0
      r_symndx = ELF32_R_SYM (rel->r_info);
436
437
0
      howto  = m32c_elf_howto_table + ELF32_R_TYPE (rel->r_info);
438
0
      h      = NULL;
439
0
      sym    = NULL;
440
0
      sec    = NULL;
441
0
      relocation = 0;
442
443
0
      if (r_symndx < symtab_hdr->sh_info)
444
0
  {
445
0
    sym = local_syms + r_symndx;
446
0
    sec = local_sections [r_symndx];
447
0
    relocation = (sec->output_section->vma
448
0
      + sec->output_offset
449
0
      + sym->st_value);
450
451
0
    name = bfd_elf_string_from_elf_section
452
0
      (input_bfd, symtab_hdr->sh_link, sym->st_name);
453
0
    name = sym->st_name == 0 ? bfd_section_name (sec) : name;
454
0
  }
455
0
      else
456
0
  {
457
0
    h = sym_hashes [r_symndx - symtab_hdr->sh_info];
458
459
0
    if (info->wrap_hash != NULL
460
0
        && (input_section->flags & SEC_DEBUGGING) != 0)
461
0
      h = ((struct elf_link_hash_entry *)
462
0
     unwrap_hash_lookup (info, input_bfd, &h->root));
463
464
0
    while (h->root.type == bfd_link_hash_indirect
465
0
     || h->root.type == bfd_link_hash_warning)
466
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
467
468
0
    name = h->root.root.string;
469
470
0
    if (h->root.type == bfd_link_hash_defined
471
0
        || h->root.type == bfd_link_hash_defweak)
472
0
      {
473
0
        sec = h->root.u.def.section;
474
0
        relocation = (h->root.u.def.value
475
0
          + sec->output_section->vma
476
0
          + sec->output_offset);
477
0
      }
478
0
    else if (h->root.type == bfd_link_hash_undefweak)
479
0
      ;
480
0
    else if (!bfd_link_relocatable (info))
481
0
      (*info->callbacks->undefined_symbol) (info, h->root.root.string,
482
0
              input_bfd, input_section,
483
0
              rel->r_offset, true);
484
0
  }
485
486
0
      if (sec != NULL && discarded_section (sec))
487
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
488
0
           rel, 1, relend, howto, 0, contents);
489
490
0
      if (bfd_link_relocatable (info))
491
0
  {
492
    /* This is a relocatable link.  We don't have to change
493
       anything, unless the reloc is against a section symbol,
494
       in which case we have to adjust according to where the
495
       section symbol winds up in the output section.  */
496
0
    if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
497
0
      rel->r_addend += sec->output_offset;
498
0
    continue;
499
0
  }
500
501
0
      switch (ELF32_R_TYPE (rel->r_info))
502
0
  {
503
0
  case R_M32C_16:
504
0
    {
505
0
      bfd_vma *plt_offset;
506
507
0
      if (h != NULL)
508
0
        plt_offset = &h->plt.offset;
509
0
      else
510
0
        plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
511
512
      /*      printf("%s: rel %x plt %d\n", h ? h->root.root.string : "(none)",
513
        relocation, *plt_offset);*/
514
0
      if (relocation <= 0xffff)
515
0
        {
516
    /* If the symbol is in range for a 16-bit address, we should
517
       have deallocated the plt entry in relax_section.  */
518
0
    BFD_ASSERT (*plt_offset == (bfd_vma) -1);
519
0
        }
520
0
      else
521
0
        {
522
    /* If the symbol is out of range for a 16-bit address,
523
       we must have allocated a plt entry.  */
524
0
    BFD_ASSERT (*plt_offset != (bfd_vma) -1);
525
526
    /* If this is the first time we've processed this symbol,
527
       fill in the plt entry with the correct symbol address.  */
528
0
    if ((*plt_offset & 1) == 0)
529
0
      {
530
0
        unsigned int x;
531
532
0
        x = 0x000000fc;  /* jmpf */
533
0
        x |= (relocation << 8) & 0xffffff00;
534
0
        bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
535
0
        *plt_offset |= 1;
536
0
      }
537
538
0
    relocation = (splt->output_section->vma
539
0
            + splt->output_offset
540
0
            + (*plt_offset & -2));
541
0
    if (name)
542
0
    {
543
0
      char *newname = bfd_malloc (strlen(name)+5);
544
0
      strcpy (newname, name);
545
0
      strcat(newname, ".plt");
546
0
      _bfd_generic_link_add_one_symbol (info,
547
0
                input_bfd,
548
0
                newname,
549
0
                BSF_FUNCTION | BSF_WEAK,
550
0
                splt,
551
0
                (*plt_offset & -2),
552
0
                0,
553
0
                1,
554
0
                0,
555
0
                0);
556
0
    }
557
0
        }
558
0
    }
559
0
    break;
560
561
0
  case R_M32C_HI8:
562
0
  case R_M32C_HI16:
563
0
    relocation >>= 16;
564
0
    break;
565
0
  }
566
567
#if 0
568
      printf ("relocate %s at %06lx relocation %06lx addend %ld  ",
569
        m32c_elf_howto_table[ELF32_R_TYPE(rel->r_info)].name,
570
        rel->r_offset + input_section->output_section->vma + input_section->output_offset,
571
        relocation, rel->r_addend);
572
      {
573
  int i;
574
  for (i=0; i<4; i++)
575
    printf (" %02x", contents[rel->r_offset+i]);
576
  printf ("\n");
577
      }
578
#endif
579
0
      switch (ELF32_R_TYPE(rel->r_info))
580
0
  {
581
0
  case R_M32C_24:
582
    /* Like m32c_apply_reloc_24, we must handle this one separately.  */
583
0
    relocation += rel->r_addend;
584
585
    /* Sanity check the address.  */
586
0
    if (rel->r_offset + 3
587
0
        > bfd_get_section_limit_octets (input_bfd, input_section))
588
0
      r = bfd_reloc_outofrange;
589
0
    else
590
0
      {
591
0
        bfd_put_8 (input_bfd, relocation & 0xff, contents + rel->r_offset);
592
0
        bfd_put_8 (input_bfd, (relocation >> 8) & 0xff, contents + rel->r_offset + 1);
593
0
        bfd_put_8 (input_bfd, (relocation >> 16) & 0xff, contents + rel->r_offset + 2);
594
0
        r = bfd_reloc_ok;
595
0
      }
596
597
0
    break;
598
599
0
  default:
600
0
    r = _bfd_final_link_relocate (howto, input_bfd, input_section,
601
0
          contents, rel->r_offset, relocation,
602
0
          rel->r_addend);
603
0
    break;
604
0
  }
605
606
0
      if (r != bfd_reloc_ok)
607
0
  {
608
0
    const char * msg = (const char *) NULL;
609
610
0
    switch (r)
611
0
      {
612
0
      case bfd_reloc_overflow:
613
0
        (*info->callbacks->reloc_overflow)
614
0
    (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
615
0
     input_bfd, input_section, rel->r_offset);
616
0
        break;
617
618
0
      case bfd_reloc_undefined:
619
0
        (*info->callbacks->undefined_symbol)
620
0
    (info, name, input_bfd, input_section, rel->r_offset, true);
621
0
        break;
622
623
0
      case bfd_reloc_outofrange:
624
0
        msg = _("internal error: out of range error");
625
0
        break;
626
627
0
      case bfd_reloc_notsupported:
628
0
        msg = _("internal error: unsupported relocation error");
629
0
        break;
630
631
0
      case bfd_reloc_dangerous:
632
0
        msg = _("internal error: dangerous relocation");
633
0
        break;
634
635
0
      default:
636
0
        msg = _("internal error: unknown error");
637
0
        break;
638
0
      }
639
640
0
    if (msg)
641
0
      (*info->callbacks->warning) (info, msg, name, input_bfd,
642
0
           input_section, rel->r_offset);
643
0
  }
644
0
    }
645
646
0
  return true;
647
0
}
648

649
/* We support 16-bit pointers to code above 64k by generating a thunk
650
   below 64k containing a JMP instruction to the final address.  */
651
652
static bool
653
m32c_elf_check_relocs
654
    (bfd *           abfd,
655
     struct bfd_link_info *    info,
656
     asection *          sec,
657
     const Elf_Internal_Rela * relocs)
658
0
{
659
0
  Elf_Internal_Shdr *   symtab_hdr;
660
0
  struct elf_link_hash_entry ** sym_hashes;
661
0
  const Elf_Internal_Rela * rel;
662
0
  const Elf_Internal_Rela * rel_end;
663
0
  bfd_vma *local_plt_offsets;
664
0
  asection *splt;
665
0
  bfd *dynobj;
666
667
0
  if (bfd_link_relocatable (info))
668
0
    return true;
669
670
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
671
0
  sym_hashes = elf_sym_hashes (abfd);
672
0
  local_plt_offsets = elf_local_got_offsets (abfd);
673
0
  splt = NULL;
674
0
  dynobj = elf_hash_table(info)->dynobj;
675
676
0
  rel_end = relocs + sec->reloc_count;
677
0
  for (rel = relocs; rel < rel_end; rel++)
678
0
    {
679
0
      struct elf_link_hash_entry *h;
680
0
      unsigned long r_symndx;
681
0
      bfd_vma *offset;
682
683
0
      r_symndx = ELF32_R_SYM (rel->r_info);
684
0
      if (r_symndx < symtab_hdr->sh_info)
685
0
  h = NULL;
686
0
      else
687
0
  {
688
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
689
0
    while (h->root.type == bfd_link_hash_indirect
690
0
     || h->root.type == bfd_link_hash_warning)
691
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
692
0
  }
693
694
0
      switch (ELF32_R_TYPE (rel->r_info))
695
0
  {
696
    /* This relocation describes a 16-bit pointer to a function.
697
       We may need to allocate a thunk in low memory; reserve memory
698
       for it now.  */
699
0
  case R_M32C_16:
700
0
    if (dynobj == NULL)
701
0
      elf_hash_table (info)->dynobj = dynobj = abfd;
702
0
    splt = elf_hash_table (info)->splt;
703
0
    if (splt == NULL)
704
0
      {
705
0
        flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
706
0
        | SEC_IN_MEMORY | SEC_LINKER_CREATED
707
0
        | SEC_READONLY | SEC_CODE);
708
0
        splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
709
0
               flags);
710
0
        elf_hash_table (info)->splt = splt;
711
0
        if (splt == NULL
712
0
      || !bfd_set_section_alignment (splt, 1))
713
0
    return false;
714
0
      }
715
716
0
    if (h != NULL)
717
0
      offset = &h->plt.offset;
718
0
    else
719
0
      {
720
0
        if (local_plt_offsets == NULL)
721
0
    {
722
0
      size_t size;
723
0
      unsigned int i;
724
725
0
      size = symtab_hdr->sh_info * sizeof (bfd_vma);
726
0
      local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
727
0
      if (local_plt_offsets == NULL)
728
0
        return false;
729
0
      elf_local_got_offsets (abfd) = local_plt_offsets;
730
731
0
      for (i = 0; i < symtab_hdr->sh_info; i++)
732
0
        local_plt_offsets[i] = (bfd_vma) -1;
733
0
    }
734
0
        offset = &local_plt_offsets[r_symndx];
735
0
      }
736
737
0
    if (*offset == (bfd_vma) -1)
738
0
      {
739
0
        *offset = splt->size;
740
0
        splt->size += 4;
741
0
      }
742
0
    break;
743
0
  }
744
0
    }
745
746
0
  return true;
747
0
}
748
749
/* This must exist if dynobj is ever set.  */
750
751
static bool
752
m32c_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
753
          struct bfd_link_info *info)
754
0
{
755
0
  bfd *dynobj = elf_hash_table (info)->dynobj;
756
0
  asection *splt = elf_hash_table (info)->splt;
757
758
  /* As an extra sanity check, verify that all plt entries have
759
     been filled in.  */
760
761
0
  if (dynobj != NULL && splt != NULL)
762
0
    {
763
0
      bfd_byte *contents = splt->contents;
764
0
      unsigned int i, size = splt->size;
765
0
      for (i = 0; i < size; i += 4)
766
0
  {
767
0
    unsigned int x = bfd_get_32 (dynobj, contents + i);
768
0
    BFD_ASSERT (x != 0);
769
0
  }
770
0
    }
771
772
0
  return true;
773
0
}
774
775
static bool
776
m32c_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
777
             struct bfd_link_info *info)
778
0
{
779
0
  bfd *dynobj;
780
0
  asection *splt;
781
782
0
  if (bfd_link_relocatable (info))
783
0
    return true;
784
785
0
  dynobj = elf_hash_table (info)->dynobj;
786
0
  if (dynobj == NULL)
787
0
    return true;
788
789
0
  splt = elf_hash_table (info)->splt;
790
0
  BFD_ASSERT (splt != NULL);
791
792
0
  splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
793
0
  if (splt->contents == NULL)
794
0
    return false;
795
796
0
  return true;
797
0
}
798

799
/* Function to set the ELF flag bits.  */
800
801
static bool
802
m32c_elf_set_private_flags (bfd *abfd, flagword flags)
803
0
{
804
0
  elf_elfheader (abfd)->e_flags = flags;
805
0
  elf_flags_init (abfd) = true;
806
0
  return true;
807
0
}
808
809
/* Merge backend specific data from an object file to the output
810
   object file when linking.  */
811
812
static bool
813
m32c_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
814
0
{
815
0
  bfd *obfd = info->output_bfd;
816
0
  flagword old_flags, old_partial;
817
0
  flagword new_flags, new_partial;
818
0
  bool error = false;
819
0
  char new_opt[80];
820
0
  char old_opt[80];
821
822
0
  new_opt[0] = old_opt[0] = '\0';
823
0
  new_flags = elf_elfheader (ibfd)->e_flags;
824
0
  old_flags = elf_elfheader (obfd)->e_flags;
825
826
#ifdef DEBUG
827
  _bfd_error_handler
828
    ("old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s, filename = %s",
829
     old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
830
     bfd_get_filename (ibfd));
831
#endif
832
833
0
  if (!elf_flags_init (obfd))
834
0
    {
835
      /* First call, no flags set.  */
836
0
      elf_flags_init (obfd) = true;
837
0
      elf_elfheader (obfd)->e_flags = new_flags;
838
0
    }
839
840
0
  else if (new_flags == old_flags)
841
    /* Compatible flags are ok.  */
842
0
    ;
843
844
0
  else    /* Possibly incompatible flags.  */
845
0
    {
846
      /* Warn if different cpu is used (allow a specific cpu to override
847
   the generic cpu).  */
848
0
      new_partial = (new_flags & EF_M32C_CPU_MASK);
849
0
      old_partial = (old_flags & EF_M32C_CPU_MASK);
850
0
      if (new_partial == old_partial)
851
0
  ;
852
853
0
      else
854
0
  {
855
0
    switch (new_partial)
856
0
      {
857
0
      default:      strcat (new_opt, " -m16c"); break;
858
0
      case EF_M32C_CPU_M16C: strcat (new_opt, " -m16c");  break;
859
0
      case EF_M32C_CPU_M32C:  strcat (new_opt, " -m32c");  break;
860
0
      }
861
862
0
    switch (old_partial)
863
0
      {
864
0
      default:      strcat (old_opt, " -m16c"); break;
865
0
      case EF_M32C_CPU_M16C: strcat (old_opt, " -m16c");  break;
866
0
      case EF_M32C_CPU_M32C:  strcat (old_opt, " -m32c");  break;
867
0
      }
868
0
  }
869
870
      /* Print out any mismatches from above.  */
871
0
      if (new_opt[0])
872
0
  {
873
0
    error = true;
874
0
    _bfd_error_handler
875
      /* xgettext:c-format */
876
0
      (_("%pB: compiled with %s and linked with modules compiled with %s"),
877
0
       ibfd, new_opt, old_opt);
878
0
  }
879
880
0
      new_flags &= ~ EF_M32C_ALL_FLAGS;
881
0
      old_flags &= ~ EF_M32C_ALL_FLAGS;
882
883
      /* Warn about any other mismatches.  */
884
0
      if (new_flags != old_flags)
885
0
  {
886
0
    error = true;
887
0
    _bfd_error_handler
888
      /* xgettext:c-format */
889
0
      (_("%pB: uses different e_flags (%#x) fields"
890
0
         " than previous modules (%#x)"),
891
0
       ibfd, new_flags, old_flags);
892
0
  }
893
0
    }
894
895
0
  if (error)
896
0
    bfd_set_error (bfd_error_bad_value);
897
898
0
  return !error;
899
0
}
900
901

902
static bool
903
m32c_elf_print_private_bfd_data (bfd *abfd, void *ptr)
904
0
{
905
0
  FILE *file = (FILE *) ptr;
906
0
  flagword flags;
907
908
0
  BFD_ASSERT (abfd != NULL && ptr != NULL);
909
910
  /* Print normal ELF private data.  */
911
0
  _bfd_elf_print_private_bfd_data (abfd, ptr);
912
913
0
  flags = elf_elfheader (abfd)->e_flags;
914
0
  fprintf (file, _("private flags = 0x%lx:"), (unsigned long) flags);
915
916
0
  switch (flags & EF_M32C_CPU_MASK)
917
0
    {
918
0
    default:              break;
919
0
    case EF_M32C_CPU_M16C: fprintf (file, " -m16c"); break;
920
0
    case EF_M32C_CPU_M32C:  fprintf (file, " -m32c");  break;
921
0
    }
922
923
0
  fputc ('\n', file);
924
0
  return true;
925
0
}
926
927
/* Return the MACH for an e_flags value.  */
928
929
static int
930
elf32_m32c_machine (bfd *abfd)
931
0
{
932
0
  switch (elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK)
933
0
    {
934
0
    case EF_M32C_CPU_M16C: return bfd_mach_m16c;
935
0
    case EF_M32C_CPU_M32C: return bfd_mach_m32c;
936
0
    }
937
938
0
  return bfd_mach_m16c;
939
0
}
940
941
static bool
942
m32c_elf_object_p (bfd *abfd)
943
0
{
944
0
  bfd_default_set_arch_mach (abfd, bfd_arch_m32c,
945
0
           elf32_m32c_machine (abfd));
946
0
  return true;
947
0
}
948
 
949
950
#ifdef DEBUG
951
void
952
dump_symtab (bfd * abfd, void *internal_syms, void *external_syms)
953
{
954
  size_t locsymcount;
955
  Elf_Internal_Sym *isymbuf;
956
  Elf_Internal_Sym *isymend;
957
  Elf_Internal_Sym *isym;
958
  Elf_Internal_Shdr *symtab_hdr;
959
  bool free_internal = 0, free_external = 0;
960
  char * st_info_str;
961
  char * st_info_stb_str;
962
  char * st_other_str;
963
  char * st_shndx_str;
964
965
  if (! internal_syms)
966
    {
967
      internal_syms = bfd_malloc (1000);
968
      free_internal = 1;
969
    }
970
  if (! external_syms)
971
    {
972
      external_syms = bfd_malloc (1000);
973
      free_external = 1;
974
    }
975
976
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
977
  locsymcount = symtab_hdr->sh_size / get_elf_backend_data(abfd)->s->sizeof_sym;
978
  if (free_internal)
979
    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
980
            symtab_hdr->sh_info, 0,
981
            internal_syms, external_syms, NULL);
982
  else
983
    isymbuf = internal_syms;
984
  isymend = isymbuf + locsymcount;
985
986
  for (isym = isymbuf ; isym < isymend ; isym++)
987
    {
988
      switch (ELF_ST_TYPE (isym->st_info))
989
  {
990
  case STT_FUNC:
991
    st_info_str = "STT_FUNC";
992
    break;
993
994
  case STT_SECTION:
995
    st_info_str = "STT_SECTION";
996
    break;
997
998
  case STT_FILE:
999
    st_info_str = "STT_FILE";
1000
    break;
1001
1002
  case STT_OBJECT:
1003
    st_info_str = "STT_OBJECT";
1004
    break;
1005
1006
  case STT_TLS:
1007
    st_info_str = "STT_TLS";
1008
    break;
1009
1010
  default:
1011
    st_info_str = "";
1012
  }
1013
1014
      switch (ELF_ST_BIND (isym->st_info))
1015
  {
1016
  case STB_LOCAL:
1017
    st_info_stb_str = "STB_LOCAL";
1018
    break;
1019
1020
  case STB_GLOBAL:
1021
    st_info_stb_str = "STB_GLOBAL";
1022
    break;
1023
1024
  default:
1025
    st_info_stb_str = "";
1026
  }
1027
1028
      switch (ELF_ST_VISIBILITY (isym->st_other))
1029
  {
1030
  case STV_DEFAULT:
1031
    st_other_str = "STV_DEFAULT";
1032
    break;
1033
1034
  case STV_INTERNAL:
1035
    st_other_str = "STV_INTERNAL";
1036
    break;
1037
1038
  case STV_PROTECTED:
1039
    st_other_str = "STV_PROTECTED";
1040
    break;
1041
1042
  default:
1043
    st_other_str = "";
1044
  }
1045
1046
      switch (isym->st_shndx)
1047
  {
1048
  case SHN_ABS:
1049
    st_shndx_str = "SHN_ABS";
1050
    break;
1051
1052
  case SHN_COMMON:
1053
    st_shndx_str = "SHN_COMMON";
1054
    break;
1055
1056
  case SHN_UNDEF:
1057
    st_shndx_str = "SHN_UNDEF";
1058
    break;
1059
1060
  default:
1061
    st_shndx_str = "";
1062
  }
1063
1064
      printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
1065
        "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
1066
        isym,
1067
        (unsigned long) isym->st_value,
1068
        (unsigned long) isym->st_size,
1069
        isym->st_name,
1070
        bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
1071
                 isym->st_name),
1072
        isym->st_info, st_info_str, st_info_stb_str,
1073
        isym->st_other, st_other_str,
1074
        isym->st_shndx, st_shndx_str);
1075
    }
1076
  if (free_internal)
1077
    free (internal_syms);
1078
  if (free_external)
1079
    free (external_syms);
1080
}
1081
1082
char *
1083
m32c_get_reloc (long reloc)
1084
{
1085
  if (0 <= reloc && reloc < R_M32C_max)
1086
    return m32c_elf_howto_table[reloc].name;
1087
  else
1088
    return "";
1089
}
1090
#endif /* DEBUG */
1091
1092
/* Handle relaxing.  */
1093
1094
/* A subroutine of m32c_elf_relax_section.  If the global symbol H
1095
   is within the low 64k, remove any entry for it in the plt.  */
1096
1097
struct relax_plt_data
1098
{
1099
  asection *splt;
1100
  bool *again;
1101
};
1102
1103
static bool
1104
m32c_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1105
0
{
1106
0
  struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1107
1108
0
  if (h->plt.offset != (bfd_vma) -1)
1109
0
    {
1110
0
      bfd_vma address;
1111
1112
0
      if (h->root.type == bfd_link_hash_undefined
1113
0
    || h->root.type == bfd_link_hash_undefweak)
1114
0
  address = 0;
1115
0
      else
1116
0
  address = (h->root.u.def.section->output_section->vma
1117
0
       + h->root.u.def.section->output_offset
1118
0
       + h->root.u.def.value);
1119
1120
0
      if (address <= 0xffff)
1121
0
  {
1122
0
    h->plt.offset = -1;
1123
0
    data->splt->size -= 4;
1124
0
    *data->again = true;
1125
0
  }
1126
0
    }
1127
1128
0
  return true;
1129
0
}
1130
1131
/* A subroutine of m32c_elf_relax_section.  If the global symbol H
1132
   previously had a plt entry, give it a new entry offset.  */
1133
1134
static bool
1135
m32c_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1136
0
{
1137
0
  bfd_vma *entry = (bfd_vma *) xdata;
1138
1139
0
  if (h->plt.offset != (bfd_vma) -1)
1140
0
    {
1141
0
      h->plt.offset = *entry;
1142
0
      *entry += 4;
1143
0
    }
1144
1145
0
  return true;
1146
0
}
1147
1148
static bool
1149
m32c_elf_relax_plt_section (asection *splt,
1150
          struct bfd_link_info *info,
1151
          bool *again)
1152
0
{
1153
0
  struct relax_plt_data relax_plt_data;
1154
0
  bfd *ibfd;
1155
1156
  /* Assume nothing changes.  */
1157
0
  *again = false;
1158
1159
0
  if (bfd_link_relocatable (info))
1160
0
    return true;
1161
1162
  /* Quick check for an empty plt.  */
1163
0
  if (splt->size == 0)
1164
0
    return true;
1165
1166
  /* Map across all global symbols; see which ones happen to
1167
     fall in the low 64k.  */
1168
0
  relax_plt_data.splt = splt;
1169
0
  relax_plt_data.again = again;
1170
0
  elf_link_hash_traverse (elf_hash_table (info), m32c_relax_plt_check,
1171
0
        &relax_plt_data);
1172
1173
  /* Likewise for local symbols, though that's somewhat less convenient
1174
     as we have to walk the list of input bfds and swap in symbol data.  */
1175
0
  for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1176
0
    {
1177
0
      bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1178
0
      Elf_Internal_Shdr *symtab_hdr;
1179
0
      Elf_Internal_Sym *isymbuf = NULL;
1180
0
      unsigned int idx;
1181
1182
0
      if (! local_plt_offsets)
1183
0
  continue;
1184
1185
0
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1186
0
      if (symtab_hdr->sh_info != 0)
1187
0
  {
1188
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1189
0
    if (isymbuf == NULL)
1190
0
      isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1191
0
              symtab_hdr->sh_info, 0,
1192
0
              NULL, NULL, NULL);
1193
0
    if (isymbuf == NULL)
1194
0
      return false;
1195
0
  }
1196
1197
0
      for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1198
0
  {
1199
0
    Elf_Internal_Sym *isym;
1200
0
    asection *tsec;
1201
0
    bfd_vma address;
1202
1203
0
    if (local_plt_offsets[idx] == (bfd_vma) -1)
1204
0
      continue;
1205
1206
0
    isym = &isymbuf[idx];
1207
0
    if (isym->st_shndx == SHN_UNDEF)
1208
0
      continue;
1209
0
    else if (isym->st_shndx == SHN_ABS)
1210
0
      tsec = bfd_abs_section_ptr;
1211
0
    else if (isym->st_shndx == SHN_COMMON)
1212
0
      tsec = bfd_com_section_ptr;
1213
0
    else
1214
0
      tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1215
1216
0
    address = (tsec->output_section->vma
1217
0
         + tsec->output_offset
1218
0
         + isym->st_value);
1219
0
    if (address <= 0xffff)
1220
0
      {
1221
0
        local_plt_offsets[idx] = -1;
1222
0
        splt->size -= 4;
1223
0
        *again = true;
1224
0
      }
1225
0
  }
1226
1227
0
      if (isymbuf != NULL
1228
0
    && symtab_hdr->contents != (unsigned char *) isymbuf)
1229
0
  {
1230
0
    if (! info->keep_memory)
1231
0
      free (isymbuf);
1232
0
    else
1233
0
      {
1234
        /* Cache the symbols for elf_link_input_bfd.  */
1235
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
1236
0
      }
1237
0
  }
1238
0
    }
1239
1240
  /* If we changed anything, walk the symbols again to reallocate
1241
     .plt entry addresses.  */
1242
0
  if (*again && splt->size > 0)
1243
0
    {
1244
0
      bfd_vma entry = 0;
1245
1246
0
      elf_link_hash_traverse (elf_hash_table (info),
1247
0
            m32c_relax_plt_realloc, &entry);
1248
1249
0
      for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1250
0
  {
1251
0
    bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1252
0
    unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1253
0
    unsigned int idx;
1254
1255
0
    if (! local_plt_offsets)
1256
0
      continue;
1257
1258
0
    for (idx = 0; idx < nlocals; ++idx)
1259
0
      if (local_plt_offsets[idx] != (bfd_vma) -1)
1260
0
        {
1261
0
    local_plt_offsets[idx] = entry;
1262
0
    entry += 4;
1263
0
        }
1264
0
  }
1265
0
    }
1266
1267
0
  return true;
1268
0
}
1269
1270
static int
1271
compare_reloc (const void *e1, const void *e2)
1272
0
{
1273
0
  const Elf_Internal_Rela *i1 = (const Elf_Internal_Rela *) e1;
1274
0
  const Elf_Internal_Rela *i2 = (const Elf_Internal_Rela *) e2;
1275
1276
0
  if (i1->r_offset == i2->r_offset)
1277
0
    return 0;
1278
0
  else
1279
0
    return i1->r_offset < i2->r_offset ? -1 : 1;
1280
0
}
1281
1282
0
#define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms)
1283
static bfd_vma
1284
m32c_offset_for_reloc (bfd *abfd,
1285
           Elf_Internal_Rela *rel,
1286
           Elf_Internal_Shdr *symtab_hdr,
1287
           bfd_byte *shndx_buf ATTRIBUTE_UNUSED,
1288
           Elf_Internal_Sym *intsyms)
1289
0
{
1290
0
  bfd_vma symval;
1291
1292
  /* Get the value of the symbol referred to by the reloc.  */
1293
0
  if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1294
0
    {
1295
      /* A local symbol.  */
1296
0
      Elf_Internal_Sym *isym;
1297
0
      asection *ssec;
1298
1299
0
      isym = intsyms + ELF32_R_SYM (rel->r_info);
1300
0
      ssec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1301
0
      symval = isym->st_value;
1302
0
      if (ssec)
1303
0
  symval += ssec->output_section->vma
1304
0
    + ssec->output_offset;
1305
0
    }
1306
0
  else
1307
0
    {
1308
0
      unsigned long indx;
1309
0
      struct elf_link_hash_entry *h;
1310
1311
      /* An external symbol.  */
1312
0
      indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1313
0
      h = elf_sym_hashes (abfd)[indx];
1314
0
      BFD_ASSERT (h != NULL);
1315
1316
0
      if (h->root.type != bfd_link_hash_defined
1317
0
    && h->root.type != bfd_link_hash_defweak)
1318
  /* This appears to be a reference to an undefined
1319
     symbol.  Just ignore it--it will be caught by the
1320
     regular reloc processing.  */
1321
0
  return 0;
1322
1323
0
      symval = (h->root.u.def.value
1324
0
    + h->root.u.def.section->output_section->vma
1325
0
    + h->root.u.def.section->output_offset);
1326
0
    }
1327
0
  return symval;
1328
0
}
1329
1330
static int bytes_saved = 0;
1331
1332
static int bytes_to_reloc[] = {
1333
  R_M32C_NONE,
1334
  R_M32C_8,
1335
  R_M32C_16,
1336
  R_M32C_24,
1337
  R_M32C_32
1338
};
1339
1340
/* What we use the bits in a relax reloc addend (R_M32C_RL_*) for.  */
1341
1342
/* Mask for the number of relocs associated with this insn.  */
1343
#define RLA_RELOCS    0x0000000f
1344
/* Number of bytes gas emitted (before gas's relaxing) */
1345
#define RLA_NBYTES    0x00000ff0
1346
1347
/* If the displacement is within the given range and the new encoding
1348
   differs from the old encoding (the index), then the insn can be
1349
   relaxed to the new encoding.  */
1350
typedef const struct {
1351
  int bytes;
1352
  unsigned int max_disp;
1353
  unsigned char new_encoding;
1354
} EncodingTable;
1355
1356
static EncodingTable m16c_addr_encodings[] = {
1357
  { 0,   0,  0 }, /* R0 */
1358
  { 0,   0,  1 }, /* R1 */
1359
  { 0,   0,  2 }, /* R2 */
1360
  { 0,   0,  3 }, /* R3 */
1361
  { 0,   0,  4 }, /* A0 */
1362
  { 0,   0,  5 }, /* A1 */
1363
  { 0,   0,  6 }, /* [A0] */
1364
  { 0,   0,  7 }, /* [A1] */
1365
  { 1,   0,  6 }, /* udsp:8[A0] */
1366
  { 1,   0,  7 }, /* udsp:8[A1] */
1367
  { 1,   0, 10 }, /* udsp:8[SB] */
1368
  { 1,   0, 11 }, /* sdsp:8[FB] */
1369
  { 2, 255,  8 }, /* udsp:16[A0] */
1370
  { 2, 255,  9 }, /* udsp:16[A1] */
1371
  { 2, 255, 10 }, /* udsp:16[SB] */
1372
  { 2,   0, 15 }, /* abs:16 */
1373
};
1374
1375
static EncodingTable m16c_jmpaddr_encodings[] = {
1376
  { 0,   0,  0 }, /* R0 */
1377
  { 0,   0,  1 }, /* R1 */
1378
  { 0,   0,  2 }, /* R2 */
1379
  { 0,   0,  3 }, /* R3 */
1380
  { 0,   0,  4 }, /* A0 */
1381
  { 0,   0,  5 }, /* A1 */
1382
  { 0,   0,  6 }, /* [A0] */
1383
  { 0,   0,  7 }, /* [A1] */
1384
  { 1,   0,  6 }, /* udsp:8[A0] */
1385
  { 1,   0,  7 }, /* udsp:8[A1] */
1386
  { 1,   0, 10 }, /* udsp:8[SB] */
1387
  { 1,   0, 11 }, /* sdsp:8[FB] */
1388
  { 3, 255,  8 }, /* udsp:20[A0] */
1389
  { 3, 255,  9 }, /* udsp:20[A1] */
1390
  { 2, 255, 10 }, /* udsp:16[SB] */
1391
  { 2,   0, 15 }, /* abs:16 */
1392
};
1393
1394
static EncodingTable m32c_addr_encodings[] = {
1395
  { 0,     0,  0 }, /* [A0] */
1396
  { 0,     0,  1 }, /* [A1] */
1397
  { 0,     0,  2 }, /* A0 */
1398
  { 0,     0,  3 }, /* A1 */
1399
  { 1,     0,  0 }, /* udsp:8[A0] */
1400
  { 1,     0,  1 }, /* udsp:8[A1] */
1401
  { 1,     0,  6 }, /* udsp:8[SB] */
1402
  { 1,     0,  7 }, /* sdsp:8[FB] */
1403
  { 2,   255,  4 }, /* udsp:16[A0] */
1404
  { 2,   255,  5 }, /* udsp:16[A1] */
1405
  { 2,   255,  6 }, /* udsp:16[SB] */
1406
  { 2,   127,  7 }, /* sdsp:16[FB] */
1407
  { 3, 65535, 8 }, /* udsp:24[A0] */
1408
  { 3, 65535, 9 }, /* udsp:24[A1] */
1409
  { 3, 65535, 15 }, /* abs24 */
1410
  { 2,     0, 15 }, /* abs16 */
1411
  { 0,     0, 16 }, /* R2 */
1412
  { 0,     0, 17 }, /* R3 */
1413
  { 0,     0, 18 }, /* R0 */
1414
  { 0,     0, 19 }, /* R1 */
1415
  { 0,     0, 20 }, /*  */
1416
  { 0,     0, 21 }, /*  */
1417
  { 0,     0, 22 }, /*  */
1418
  { 0,     0, 23 }, /*  */
1419
  { 0,     0, 24 }, /*  */
1420
  { 0,     0, 25 }, /*  */
1421
  { 0,     0, 26 }, /*  */
1422
  { 0,     0, 27 }, /*  */
1423
  { 0,     0, 28 }, /*  */
1424
  { 0,     0, 29 }, /*  */
1425
  { 0,     0, 30 }, /*  */
1426
  { 0,     0, 31 }, /*  */
1427
};
1428
1429
static bool
1430
m32c_elf_relax_section (bfd *abfd,
1431
      asection *sec,
1432
      struct bfd_link_info *link_info,
1433
      bool *again)
1434
0
{
1435
0
  Elf_Internal_Shdr *symtab_hdr;
1436
0
  Elf_Internal_Shdr *shndx_hdr;
1437
0
  Elf_Internal_Rela *internal_relocs;
1438
0
  Elf_Internal_Rela *free_relocs = NULL;
1439
0
  Elf_Internal_Rela *irel, *irelend, *srel;
1440
0
  bfd_byte * contents = NULL;
1441
0
  bfd_byte * free_contents = NULL;
1442
0
  Elf_Internal_Sym *intsyms = NULL;
1443
0
  Elf_Internal_Sym *free_intsyms = NULL;
1444
0
  bfd_byte *shndx_buf = NULL;
1445
0
  int machine;
1446
1447
0
  if (is_elf_hash_table (link_info->hash)
1448
0
      && abfd == elf_hash_table (link_info)->dynobj
1449
0
      && (sec->flags & SEC_LINKER_CREATED) != 0
1450
0
      && strcmp (sec->name, ".plt") == 0)
1451
0
    return m32c_elf_relax_plt_section (sec, link_info, again);
1452
1453
  /* Assume nothing changes.  */
1454
0
  *again = false;
1455
1456
0
  machine = elf32_m32c_machine (abfd);
1457
1458
  /* We don't have to do anything for a relocatable link, if
1459
     this section does not have relocs, or if this is not a
1460
     code section.  */
1461
0
  if (bfd_link_relocatable (link_info)
1462
0
      || sec->reloc_count == 0
1463
0
      || (sec->flags & SEC_RELOC) == 0
1464
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
1465
0
      || (sec->flags & SEC_CODE) == 0)
1466
0
    return true;
1467
1468
0
  symtab_hdr = & elf_symtab_hdr (abfd);
1469
0
  if (elf_symtab_shndx_list (abfd))
1470
0
    shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
1471
0
  else
1472
0
    shndx_hdr = NULL;
1473
1474
  /* Get the section contents.  */
1475
0
  if (elf_section_data (sec)->this_hdr.contents != NULL)
1476
0
    contents = elf_section_data (sec)->this_hdr.contents;
1477
  /* Go get them off disk.  */
1478
0
  else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1479
0
    goto error_return;
1480
1481
  /* Read this BFD's symbols.  */
1482
  /* Get cached copy if it exists.  */
1483
0
  if (symtab_hdr->contents != NULL)
1484
0
    {
1485
0
      intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1486
0
    }
1487
0
  else
1488
0
    {
1489
0
      intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
1490
0
      symtab_hdr->contents = (bfd_byte *) intsyms;
1491
0
    }
1492
1493
0
  if (shndx_hdr && shndx_hdr->sh_size != 0)
1494
0
    {
1495
0
      size_t amt;
1496
1497
0
      if (_bfd_mul_overflow (symtab_hdr->sh_info,
1498
0
           sizeof (Elf_External_Sym_Shndx), &amt))
1499
0
  {
1500
0
    bfd_set_error (bfd_error_file_too_big);
1501
0
    goto error_return;
1502
0
  }
1503
0
      if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0)
1504
0
  goto error_return;
1505
0
      shndx_buf = _bfd_malloc_and_read (abfd, amt, amt);
1506
0
      if (shndx_buf == NULL)
1507
0
  goto error_return;
1508
0
      shndx_hdr->contents = shndx_buf;
1509
0
    }
1510
1511
  /* Get a copy of the native relocations.  */
1512
0
  internal_relocs = (_bfd_elf_link_read_relocs
1513
0
         (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
1514
0
          link_info->keep_memory));
1515
0
  if (internal_relocs == NULL)
1516
0
    goto error_return;
1517
0
  if (! link_info->keep_memory)
1518
0
    free_relocs = internal_relocs;
1519
1520
  /* The RL_ relocs must be just before the operand relocs they go
1521
     with, so we must sort them to guarantee this.  */
1522
0
  qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
1523
0
   compare_reloc);
1524
1525
  /* Walk through them looking for relaxing opportunities.  */
1526
0
  irelend = internal_relocs + sec->reloc_count;
1527
1528
0
  for (irel = internal_relocs; irel < irelend; irel++)
1529
0
    {
1530
0
      bfd_vma symval;
1531
0
      unsigned char *insn, *gap, *einsn;
1532
0
      bfd_vma pc;
1533
0
      bfd_signed_vma pcrel;
1534
0
      int relax_relocs;
1535
0
      int gap_size;
1536
0
      int new_type;
1537
0
      int posn;
1538
0
      int enc;
1539
0
      EncodingTable *enctbl;
1540
0
      EncodingTable *e;
1541
1542
0
      if (ELF32_R_TYPE(irel->r_info) != R_M32C_RL_JUMP
1543
0
    && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_1ADDR
1544
0
    && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_2ADDR)
1545
0
  continue;
1546
1547
0
      srel = irel;
1548
1549
      /* There will always be room for the relaxed insn, since it is smaller
1550
   than the one it would replace.  */
1551
0
      BFD_ASSERT (irel->r_offset < sec->size);
1552
1553
0
      insn = contents + irel->r_offset;
1554
0
      relax_relocs = irel->r_addend % 16;
1555
1556
      /* Ok, we only have three relocs we care about, and they're all
1557
   fake.  The lower four bits of the addend is always the number
1558
   of following relocs (hence the qsort above) that are assigned
1559
   to this opcode.  The next 8 bits of the addend indicates the
1560
   number of bytes in the insn.  We use the rest of them
1561
   ourselves as flags for the more expensive operations (defines
1562
   above).  The three relocs are:
1563
1564
   RL_JUMP: This marks all direct jump insns.  We check the
1565
    displacement and replace them with shorter jumps if
1566
    they're in range.  We also use this to find JMP.S
1567
    insns and manually shorten them when we delete bytes.
1568
    We have to decode these insns to figure out what to
1569
    do.
1570
1571
   RL_1ADDR: This is a :G or :Q insn, which has a single
1572
    "standard" operand.  We have to extract the type
1573
    field, see if it's a wide displacement, then figure
1574
    out if we can replace it with a narrow displacement.
1575
    We don't have to decode these insns.
1576
1577
   RL_2ADDR: Similarly, but two "standard" operands.  Note that
1578
    r_addend may still be 1, as standard operands don't
1579
    always have displacements.  Gas shouldn't give us one
1580
    with zero operands, but since we don't know which one
1581
    has the displacement, we check them both anyway.
1582
1583
   These all point to the beginning of the insn itself, not the
1584
   operands.
1585
1586
   Note that we only relax one step at a time, relying on the
1587
   linker to call us repeatedly.  Thus, there is no code for
1588
   JMP.A->JMP.B although that will happen in two steps.
1589
   Likewise, for 2ADDR relaxes, we do one operand per cycle.
1590
      */
1591
1592
      /* Get the value of the symbol referred to by the reloc.  Just
1593
   in case this is the last reloc in the list, use the RL's
1594
   addend to choose between this reloc (no addend) or the next
1595
   (yes addend, which means at least one following reloc).  */
1596
0
      srel = irel + (relax_relocs ? 1 : 0);
1597
0
      symval = OFFSET_FOR_RELOC (srel);
1598
1599
      /* Setting gap_size nonzero is the flag which means "something
1600
   shrunk".  */
1601
0
      gap_size = 0;
1602
0
      gap = NULL;
1603
0
      new_type = ELF32_R_TYPE(srel->r_info);
1604
1605
0
      pc = sec->output_section->vma + sec->output_offset
1606
0
  + srel->r_offset;
1607
0
      pcrel = symval - pc + srel->r_addend;
1608
1609
0
      if (machine == bfd_mach_m16c)
1610
0
  {
1611
    /* R8C / M16C */
1612
1613
0
    switch (ELF32_R_TYPE(irel->r_info))
1614
0
      {
1615
1616
0
      case R_M32C_RL_JUMP:
1617
0
        switch (insn[0])
1618
0
    {
1619
0
    case 0xfe: /* jmp.b */
1620
0
      if (pcrel >= 2 && pcrel <= 9)
1621
0
        {
1622
          /* Relax JMP.B -> JMP.S.  We need to get rid of
1623
       the following reloc though. */
1624
0
          insn[0] = 0x60 | (pcrel - 2);
1625
0
          new_type = R_M32C_NONE;
1626
0
          irel->r_addend = 0x10;
1627
0
          gap_size = 1;
1628
0
          gap = insn + 1;
1629
0
        }
1630
0
      break;
1631
1632
0
    case 0xf4: /* jmp.w */
1633
      /* 128 is allowed because it will be one byte closer
1634
         after relaxing.  Likewise for all other pc-rel
1635
         jumps.  */
1636
0
      if (pcrel <= 128 && pcrel >= -128)
1637
0
        {
1638
          /* Relax JMP.W -> JMP.B */
1639
0
          insn[0] = 0xfe;
1640
0
          insn[1] = 0;
1641
0
          new_type = R_M32C_8_PCREL;
1642
0
          gap_size = 1;
1643
0
          gap = insn + 2;
1644
0
        }
1645
0
      break;
1646
1647
0
    case 0xfc: /* jmp.a */
1648
0
      if (pcrel <= 32768 && pcrel >= -32768)
1649
0
        {
1650
          /* Relax JMP.A -> JMP.W */
1651
0
          insn[0] = 0xf4;
1652
0
          insn[1] = 0;
1653
0
          insn[2] = 0;
1654
0
          new_type = R_M32C_16_PCREL;
1655
0
          gap_size = 1;
1656
0
          gap = insn + 3;
1657
0
        }
1658
0
      break;
1659
1660
0
    case 0xfd: /* jsr.a */
1661
0
      if (pcrel <= 32768 && pcrel >= -32768)
1662
0
        {
1663
          /* Relax JSR.A -> JSR.W */
1664
0
          insn[0] = 0xf5;
1665
0
          insn[1] = 0;
1666
0
          insn[2] = 0;
1667
0
          new_type = R_M32C_16_PCREL;
1668
0
          gap_size = 1;
1669
0
          gap = insn + 3;
1670
0
        }
1671
0
      break;
1672
0
    }
1673
0
        break;
1674
1675
0
      case R_M32C_RL_2ADDR:
1676
        /* xxxx xxxx srce dest [src-disp] [dest-disp]*/
1677
1678
0
        enctbl = m16c_addr_encodings;
1679
0
        posn = 2;
1680
0
        enc = (insn[1] >> 4) & 0x0f;
1681
0
        e = & enctbl[enc];
1682
1683
0
        if (srel->r_offset == irel->r_offset + posn
1684
0
      && e->new_encoding != enc
1685
0
      && symval <= e->max_disp)
1686
0
    {
1687
0
      insn[1] &= 0x0f;
1688
0
      insn[1] |= e->new_encoding << 4;
1689
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1690
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1691
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1692
0
      break;
1693
0
    }
1694
0
        if (relax_relocs == 2)
1695
0
    srel ++;
1696
0
        posn += e->bytes;
1697
1698
0
        goto try_1addr_16;
1699
1700
0
      case R_M32C_RL_1ADDR:
1701
        /* xxxx xxxx xxxx dest [disp] */
1702
1703
0
        enctbl = m16c_addr_encodings;
1704
0
        posn = 2;
1705
1706
        /* Check the opcode for jumps.  We know it's safe to
1707
     do this because all 2ADDR insns are at least two
1708
     bytes long.  */
1709
0
        enc = insn[0] * 256 + insn[1];
1710
0
        enc &= 0xfff0;
1711
0
        if (enc == 0x7d20
1712
0
      || enc == 0x7d00
1713
0
      || enc == 0x7d30
1714
0
      || enc == 0x7d10)
1715
0
    {
1716
0
      enctbl = m16c_jmpaddr_encodings;
1717
0
    }
1718
1719
0
      try_1addr_16:
1720
        /* srel, posn, and enc must be set here.  */
1721
1722
0
        symval = OFFSET_FOR_RELOC (srel);
1723
0
        enc = insn[1] & 0x0f;
1724
0
        e = & enctbl[enc];
1725
1726
0
        if (srel->r_offset == irel->r_offset + posn
1727
0
      && e->new_encoding != enc
1728
0
      && symval <= e->max_disp)
1729
0
    {
1730
0
      insn[1] &= 0xf0;
1731
0
      insn[1] |= e->new_encoding;
1732
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1733
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1734
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1735
0
      break;
1736
0
    }
1737
1738
0
        break;
1739
1740
0
      } /* Ends switch (reloc type) for m16c.  */
1741
0
  }
1742
0
      else /* machine == bfd_mach_m32c */
1743
0
  {
1744
    /* M32CM / M32C */
1745
1746
0
    switch (ELF32_R_TYPE(irel->r_info))
1747
0
      {
1748
1749
0
      case R_M32C_RL_JUMP:
1750
0
        switch (insn[0])
1751
0
    {
1752
0
    case 0xbb: /* jmp.b */
1753
0
      if (pcrel >= 2 && pcrel <= 9)
1754
0
        {
1755
0
          int p = pcrel - 2;
1756
          /* Relax JMP.B -> JMP.S.  We need to get rid of
1757
       the following reloc though. */
1758
0
          insn[0] = 0x4a | ((p << 3) & 0x30) | (p & 1);
1759
0
          new_type = R_M32C_NONE;
1760
0
          irel->r_addend = 0x10;
1761
0
          gap_size = 1;
1762
0
          gap = insn + 1;
1763
0
        }
1764
0
      break;
1765
1766
0
    case 0xce: /* jmp.w */
1767
0
      if (pcrel <= 128 && pcrel >= -128)
1768
0
        {
1769
          /* Relax JMP.W -> JMP.B */
1770
0
          insn[0] = 0xbb;
1771
0
          insn[1] = 0;
1772
0
          new_type = R_M32C_8_PCREL;
1773
0
          gap_size = 1;
1774
0
          gap = insn + 2;
1775
0
        }
1776
0
      break;
1777
1778
0
    case 0xcc: /* jmp.a */
1779
0
      if (pcrel <= 32768 && pcrel >= -32768)
1780
0
        {
1781
          /* Relax JMP.A -> JMP.W */
1782
0
          insn[0] = 0xce;
1783
0
          insn[1] = 0;
1784
0
          insn[2] = 0;
1785
0
          new_type = R_M32C_16_PCREL;
1786
0
          gap_size = 1;
1787
0
          gap = insn + 3;
1788
0
        }
1789
0
      break;
1790
1791
0
    case 0xcd: /* jsr.a */
1792
0
      if (pcrel <= 32768 && pcrel >= -32768)
1793
0
        {
1794
          /* Relax JSR.A -> JSR.W */
1795
0
          insn[0] = 0xcf;
1796
0
          insn[1] = 0;
1797
0
          insn[2] = 0;
1798
0
          new_type = R_M32C_16_PCREL;
1799
0
          gap_size = 1;
1800
0
          gap = insn + 3;
1801
0
        }
1802
0
      break;
1803
0
    }
1804
0
        break;
1805
1806
0
      case R_M32C_RL_2ADDR:
1807
        /* xSSS DDDx DDSS xxxx [src-disp] [dest-disp]*/
1808
1809
0
        einsn = insn;
1810
0
        posn = 2;
1811
0
        if (einsn[0] == 1)
1812
0
    {
1813
      /* prefix; remove it as far as the RL reloc is concerned.  */
1814
0
      einsn ++;
1815
0
      posn ++;
1816
0
    }
1817
1818
0
        enctbl = m32c_addr_encodings;
1819
0
        enc = ((einsn[0] & 0x70) >> 2) | ((einsn[1] & 0x30) >> 4);
1820
0
        e = & enctbl[enc];
1821
1822
0
        if (srel->r_offset == irel->r_offset + posn
1823
0
      && e->new_encoding != enc
1824
0
      && symval <= e->max_disp)
1825
0
    {
1826
0
      einsn[0] &= 0x8f;
1827
0
      einsn[0] |= (e->new_encoding & 0x1c) << 2;
1828
0
      einsn[1] &= 0xcf;
1829
0
      einsn[1] |= (e->new_encoding & 0x03) << 4;
1830
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1831
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1832
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1833
0
      break;
1834
0
    }
1835
0
        if (relax_relocs == 2)
1836
0
      srel ++;
1837
0
        posn += e->bytes;
1838
1839
0
        goto try_1addr_32;
1840
1841
0
      case R_M32C_RL_1ADDR:
1842
        /* xxxx DDDx DDxx xxxx [disp] */
1843
1844
0
        einsn = insn;
1845
0
        posn = 2;
1846
0
        if (einsn[0] == 1)
1847
0
    {
1848
      /* prefix; remove it as far as the RL reloc is concerned.  */
1849
0
      einsn ++;
1850
0
      posn ++;
1851
0
    }
1852
1853
0
        enctbl = m32c_addr_encodings;
1854
1855
0
      try_1addr_32:
1856
        /* srel, posn, and enc must be set here.  */
1857
1858
0
        symval = OFFSET_FOR_RELOC (srel);
1859
0
        enc = ((einsn[0] & 0x0e) << 1) |  ((einsn[1] & 0xc0) >> 6);
1860
0
        e = & enctbl[enc];
1861
1862
0
        if (srel->r_offset == irel->r_offset + posn
1863
0
      && e->new_encoding != enc
1864
0
      && symval <= e->max_disp)
1865
0
    {
1866
0
      einsn[0] &= 0xf1;
1867
0
      einsn[0] |= (e->new_encoding & 0x1c) >> 1;
1868
0
      einsn[1] &= 0x3f;
1869
0
      einsn[1] |= (e->new_encoding & 0x03) << 6;
1870
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1871
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1872
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1873
0
      break;
1874
0
    }
1875
1876
0
        break;
1877
1878
0
      } /* Ends switch (reloc type) for m32c.  */
1879
0
  }
1880
1881
0
      if (gap_size == 0)
1882
0
  continue;
1883
1884
0
      *again = true;
1885
1886
0
      srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), new_type);
1887
1888
      /* Note that we've changed the relocs, section contents, etc.  */
1889
0
      elf_section_data (sec)->relocs = internal_relocs;
1890
0
      free_relocs = NULL;
1891
1892
0
      elf_section_data (sec)->this_hdr.contents = contents;
1893
0
      free_contents = NULL;
1894
1895
0
      symtab_hdr->contents = (bfd_byte *) intsyms;
1896
0
      free_intsyms = NULL;
1897
1898
0
      bytes_saved += gap_size;
1899
1900
0
      if (! m32c_elf_relax_delete_bytes(abfd, sec, gap - contents, gap_size))
1901
0
  goto error_return;
1902
1903
0
    } /* next relocation */
1904
1905
0
  free (free_relocs);
1906
0
  free_relocs = NULL;
1907
1908
0
  if (free_contents != NULL)
1909
0
    {
1910
0
      if (! link_info->keep_memory)
1911
0
  free (free_contents);
1912
      /* Cache the section contents for elf_link_input_bfd.  */
1913
0
      else
1914
0
  elf_section_data (sec)->this_hdr.contents = contents;
1915
1916
0
      free_contents = NULL;
1917
0
    }
1918
1919
0
  if (shndx_buf != NULL)
1920
0
    {
1921
0
      shndx_hdr->contents = NULL;
1922
0
      free (shndx_buf);
1923
0
    }
1924
1925
0
  if (free_intsyms != NULL)
1926
0
    {
1927
0
      if (! link_info->keep_memory)
1928
0
  free (free_intsyms);
1929
      /* Cache the symbols for elf_link_input_bfd.  */
1930
0
      else
1931
0
  {
1932
0
    symtab_hdr->contents = NULL /* (unsigned char *) intsyms*/;
1933
0
  }
1934
1935
0
      free_intsyms = NULL;
1936
0
    }
1937
1938
0
  return true;
1939
1940
0
 error_return:
1941
0
  free (free_relocs);
1942
0
  free (free_contents);
1943
0
  if (shndx_buf != NULL)
1944
0
    {
1945
0
      shndx_hdr->contents = NULL;
1946
0
      free (shndx_buf);
1947
0
    }
1948
0
  free (free_intsyms);
1949
0
  return false;
1950
0
}
1951
1952
/* Delete some bytes from a section while relaxing.  */
1953
1954
static bool
1955
m32c_elf_relax_delete_bytes (bfd *abfd,
1956
           asection *sec,
1957
           bfd_vma addr,
1958
           int count)
1959
0
{
1960
0
  Elf_Internal_Shdr *symtab_hdr;
1961
0
  Elf_Internal_Shdr *shndx_hdr;
1962
0
  int sec_shndx;
1963
0
  bfd_byte *contents;
1964
0
  Elf_Internal_Rela *irel;
1965
0
  Elf_Internal_Rela *irelend;
1966
0
  bfd_vma toaddr;
1967
0
  Elf_Internal_Sym *isym;
1968
0
  Elf_Internal_Sym *isymend;
1969
0
  Elf_Internal_Sym *intsyms;
1970
0
  Elf_External_Sym_Shndx *shndx_buf;
1971
0
  Elf_External_Sym_Shndx *shndx;
1972
0
  struct elf_link_hash_entry ** sym_hashes;
1973
0
  struct elf_link_hash_entry ** end_hashes;
1974
0
  unsigned int      symcount;
1975
1976
0
  contents   = elf_section_data (sec)->this_hdr.contents;
1977
1978
0
  toaddr = sec->size;
1979
1980
0
  irel = elf_section_data (sec)->relocs;
1981
0
  irelend = irel + sec->reloc_count;
1982
1983
  /* Actually delete the bytes.  */
1984
0
  memmove (contents + addr, contents + addr + count, (size_t) (toaddr - addr - count));
1985
0
  sec->size -= count;
1986
1987
  /* Adjust all the relocs.  */
1988
0
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel ++)
1989
0
    {
1990
      /* Get the new reloc address.  */
1991
0
      if (irel->r_offset > addr && irel->r_offset < toaddr)
1992
0
  irel->r_offset -= count;
1993
1994
0
      if (ELF32_R_TYPE(irel->r_info) == R_M32C_RL_JUMP
1995
0
    && irel->r_addend == 0x10 /* one byte insn, no relocs */
1996
0
    && irel->r_offset + 1 < addr
1997
0
    && irel->r_offset + 7 > addr)
1998
0
  {
1999
0
    bfd_vma disp;
2000
0
    unsigned char *insn = &contents[irel->r_offset];
2001
0
    disp = *insn;
2002
    /* This is a JMP.S, which we have to manually update. */
2003
0
    if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
2004
0
      {
2005
0
        if ((*insn & 0xf8) != 0x60)
2006
0
    continue;
2007
0
        disp = (disp & 7);
2008
0
      }
2009
0
    else
2010
0
      {
2011
0
        if ((*insn & 0xce) != 0x4a)
2012
0
    continue;
2013
0
        disp = ((disp & 0x30) >> 3) | (disp & 1);
2014
0
      }
2015
0
    if (irel->r_offset + disp + 2 >= addr+count)
2016
0
      {
2017
0
        disp -= count;
2018
0
        if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
2019
0
    {
2020
0
      *insn = (*insn & 0xf8) | disp;
2021
0
    }
2022
0
        else
2023
0
    {
2024
0
      *insn = (*insn & 0xce) | ((disp & 6) << 3) | (disp & 1);
2025
0
    }
2026
0
      }
2027
0
  }
2028
0
    }
2029
2030
  /* Adjust the local symbols defined in this section.  */
2031
0
  symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2032
0
  intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2033
0
  isym = intsyms;
2034
0
  isymend = isym + symtab_hdr->sh_info;
2035
2036
0
  sec_shndx  = _bfd_elf_section_from_bfd_section (abfd, sec);
2037
0
  if (elf_symtab_shndx_list (abfd))
2038
0
    {
2039
0
      shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2040
0
      shndx_buf  = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2041
0
    }
2042
0
  else
2043
0
    {
2044
0
      shndx_hdr = NULL;
2045
0
      shndx_buf = NULL;
2046
0
    }
2047
0
  shndx = shndx_buf;
2048
2049
0
  for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
2050
0
    {
2051
      /* If the symbol is in the range of memory we just moved, we
2052
   have to adjust its value.  */
2053
0
      if ((int) isym->st_shndx == sec_shndx
2054
0
    && isym->st_value > addr
2055
0
    && isym->st_value < toaddr)
2056
0
  {
2057
0
    isym->st_value -= count;
2058
0
  }
2059
      /* If the symbol *spans* the bytes we just deleted (i.e. it's
2060
   *end* is in the moved bytes but it's *start* isn't), then we
2061
   must adjust its size.  */
2062
0
      if ((int) isym->st_shndx == sec_shndx
2063
0
      && isym->st_value < addr
2064
0
    && isym->st_value + isym->st_size > addr
2065
0
    && isym->st_value + isym->st_size < toaddr)
2066
0
  {
2067
0
    isym->st_size -= count;
2068
0
  }
2069
0
    }
2070
2071
  /* Now adjust the global symbols defined in this section.  */
2072
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2073
0
        - symtab_hdr->sh_info);
2074
0
  sym_hashes = elf_sym_hashes (abfd);
2075
0
  end_hashes = sym_hashes + symcount;
2076
2077
0
  for (; sym_hashes < end_hashes; sym_hashes ++)
2078
0
    {
2079
0
      struct elf_link_hash_entry * sym_hash = * sym_hashes;
2080
2081
0
      if (sym_hash &&
2082
0
    (sym_hash->root.type == bfd_link_hash_defined
2083
0
     || sym_hash->root.type == bfd_link_hash_defweak)
2084
0
    && sym_hash->root.u.def.section == sec)
2085
0
  {
2086
0
    if (sym_hash->root.u.def.value > addr
2087
0
        && sym_hash->root.u.def.value < toaddr)
2088
0
      {
2089
0
        sym_hash->root.u.def.value -= count;
2090
0
      }
2091
0
    if (sym_hash->root.u.def.value < addr
2092
0
        && sym_hash->root.u.def.value + sym_hash->size > addr
2093
0
        && sym_hash->root.u.def.value + sym_hash->size < toaddr)
2094
0
      {
2095
0
        sym_hash->size -= count;
2096
0
      }
2097
0
  }
2098
0
    }
2099
2100
0
  return true;
2101
0
}
2102

2103
/* This is for versions of gcc prior to 4.3.  */
2104
static unsigned int
2105
_bfd_m32c_elf_eh_frame_address_size (bfd *abfd,
2106
             const asection *sec ATTRIBUTE_UNUSED)
2107
0
{
2108
0
  if ((elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK) == EF_M32C_CPU_M16C)
2109
0
    return 2;
2110
0
  return 4;
2111
0
}
2112
2113

2114
2115
#define ELF_ARCH    bfd_arch_m32c
2116
#define ELF_MACHINE_CODE  EM_M32C
2117
#define ELF_MACHINE_ALT1  EM_M32C_OLD
2118
#define ELF_MAXPAGESIZE   0x100
2119
2120
#if 0
2121
#define TARGET_BIG_SYM    m32c_elf32_vec
2122
#define TARGET_BIG_NAME   "elf32-m32c"
2123
#else
2124
#define TARGET_LITTLE_SYM   m32c_elf32_vec
2125
#define TARGET_LITTLE_NAME    "elf32-m32c"
2126
#endif
2127
2128
#define elf_info_to_howto_rel     NULL
2129
#define elf_info_to_howto     m32c_info_to_howto_rela
2130
#define elf_backend_object_p      m32c_elf_object_p
2131
#define elf_backend_relocate_section    m32c_elf_relocate_section
2132
#define elf_backend_check_relocs    m32c_elf_check_relocs
2133
#define elf_backend_object_p      m32c_elf_object_p
2134
#define elf_symbol_leading_char     ('_')
2135
#define elf_backend_always_size_sections \
2136
  m32c_elf_always_size_sections
2137
#define elf_backend_finish_dynamic_sections \
2138
  m32c_elf_finish_dynamic_sections
2139
2140
#define elf_backend_can_gc_sections   1
2141
#define elf_backend_eh_frame_address_size _bfd_m32c_elf_eh_frame_address_size
2142
2143
#define bfd_elf32_bfd_reloc_type_lookup   m32c_reloc_type_lookup
2144
#define bfd_elf32_bfd_reloc_name_lookup m32c_reloc_name_lookup
2145
#define bfd_elf32_bfd_relax_section   m32c_elf_relax_section
2146
#define bfd_elf32_bfd_set_private_flags   m32c_elf_set_private_flags
2147
#define bfd_elf32_bfd_merge_private_bfd_data  m32c_elf_merge_private_bfd_data
2148
#define bfd_elf32_bfd_print_private_bfd_data  m32c_elf_print_private_bfd_data
2149
2150
#include "elf32-target.h"