Coverage Report

Created: 2025-06-24 06:45

/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-2025 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_early_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
0
  splt->alloced = 1;
796
797
0
  return true;
798
0
}
799

800
/* Function to set the ELF flag bits.  */
801
802
static bool
803
m32c_elf_set_private_flags (bfd *abfd, flagword flags)
804
0
{
805
0
  elf_elfheader (abfd)->e_flags = flags;
806
0
  elf_flags_init (abfd) = true;
807
0
  return true;
808
0
}
809
810
/* Merge backend specific data from an object file to the output
811
   object file when linking.  */
812
813
static bool
814
m32c_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
815
0
{
816
0
  bfd *obfd = info->output_bfd;
817
0
  flagword old_flags, old_partial;
818
0
  flagword new_flags, new_partial;
819
0
  bool error = false;
820
0
  char new_opt[80];
821
0
  char old_opt[80];
822
823
0
  new_opt[0] = old_opt[0] = '\0';
824
0
  new_flags = elf_elfheader (ibfd)->e_flags;
825
0
  old_flags = elf_elfheader (obfd)->e_flags;
826
827
#ifdef DEBUG
828
  _bfd_error_handler
829
    ("old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s, filename = %s",
830
     old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
831
     bfd_get_filename (ibfd));
832
#endif
833
834
0
  if (!elf_flags_init (obfd))
835
0
    {
836
      /* First call, no flags set.  */
837
0
      elf_flags_init (obfd) = true;
838
0
      elf_elfheader (obfd)->e_flags = new_flags;
839
0
    }
840
841
0
  else if (new_flags == old_flags)
842
    /* Compatible flags are ok.  */
843
0
    ;
844
845
0
  else    /* Possibly incompatible flags.  */
846
0
    {
847
      /* Warn if different cpu is used (allow a specific cpu to override
848
   the generic cpu).  */
849
0
      new_partial = (new_flags & EF_M32C_CPU_MASK);
850
0
      old_partial = (old_flags & EF_M32C_CPU_MASK);
851
0
      if (new_partial == old_partial)
852
0
  ;
853
854
0
      else
855
0
  {
856
0
    switch (new_partial)
857
0
      {
858
0
      default:      strcat (new_opt, " -m16c"); break;
859
0
      case EF_M32C_CPU_M16C: strcat (new_opt, " -m16c");  break;
860
0
      case EF_M32C_CPU_M32C:  strcat (new_opt, " -m32c");  break;
861
0
      }
862
863
0
    switch (old_partial)
864
0
      {
865
0
      default:      strcat (old_opt, " -m16c"); break;
866
0
      case EF_M32C_CPU_M16C: strcat (old_opt, " -m16c");  break;
867
0
      case EF_M32C_CPU_M32C:  strcat (old_opt, " -m32c");  break;
868
0
      }
869
0
  }
870
871
      /* Print out any mismatches from above.  */
872
0
      if (new_opt[0])
873
0
  {
874
0
    error = true;
875
0
    _bfd_error_handler
876
      /* xgettext:c-format */
877
0
      (_("%pB: compiled with %s and linked with modules compiled with %s"),
878
0
       ibfd, new_opt, old_opt);
879
0
  }
880
881
0
      new_flags &= ~ EF_M32C_ALL_FLAGS;
882
0
      old_flags &= ~ EF_M32C_ALL_FLAGS;
883
884
      /* Warn about any other mismatches.  */
885
0
      if (new_flags != old_flags)
886
0
  {
887
0
    error = true;
888
0
    _bfd_error_handler
889
      /* xgettext:c-format */
890
0
      (_("%pB: uses different e_flags (%#x) fields"
891
0
         " than previous modules (%#x)"),
892
0
       ibfd, new_flags, old_flags);
893
0
  }
894
0
    }
895
896
0
  if (error)
897
0
    bfd_set_error (bfd_error_bad_value);
898
899
0
  return !error;
900
0
}
901
902

903
static bool
904
m32c_elf_print_private_bfd_data (bfd *abfd, void *ptr)
905
1
{
906
1
  FILE *file = (FILE *) ptr;
907
1
  flagword flags;
908
909
1
  BFD_ASSERT (abfd != NULL && ptr != NULL);
910
911
  /* Print normal ELF private data.  */
912
1
  _bfd_elf_print_private_bfd_data (abfd, ptr);
913
914
1
  flags = elf_elfheader (abfd)->e_flags;
915
1
  fprintf (file, _("private flags = 0x%lx:"), (unsigned long) flags);
916
917
1
  switch (flags & EF_M32C_CPU_MASK)
918
1
    {
919
1
    default:              break;
920
1
    case EF_M32C_CPU_M16C: fprintf (file, " -m16c"); break;
921
0
    case EF_M32C_CPU_M32C:  fprintf (file, " -m32c");  break;
922
1
    }
923
924
1
  fputc ('\n', file);
925
1
  return true;
926
1
}
927
928
/* Return the MACH for an e_flags value.  */
929
930
static int
931
elf32_m32c_machine (bfd *abfd)
932
1.73k
{
933
1.73k
  switch (elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK)
934
1.73k
    {
935
0
    case EF_M32C_CPU_M16C: return bfd_mach_m16c;
936
0
    case EF_M32C_CPU_M32C: return bfd_mach_m32c;
937
1.73k
    }
938
939
1.73k
  return bfd_mach_m16c;
940
1.73k
}
941
942
static bool
943
m32c_elf_object_p (bfd *abfd)
944
1.73k
{
945
1.73k
  bfd_default_set_arch_mach (abfd, bfd_arch_m32c,
946
1.73k
           elf32_m32c_machine (abfd));
947
1.73k
  return true;
948
1.73k
}
949
 
950
951
#ifdef DEBUG
952
void
953
dump_symtab (bfd * abfd, void *internal_syms, void *external_syms)
954
{
955
  size_t locsymcount;
956
  Elf_Internal_Sym *isymbuf;
957
  Elf_Internal_Sym *isymend;
958
  Elf_Internal_Sym *isym;
959
  Elf_Internal_Shdr *symtab_hdr;
960
  bool free_internal = 0, free_external = 0;
961
  char * st_info_str;
962
  char * st_info_stb_str;
963
  char * st_other_str;
964
  char * st_shndx_str;
965
966
  if (! internal_syms)
967
    {
968
      internal_syms = bfd_malloc (1000);
969
      free_internal = 1;
970
    }
971
  if (! external_syms)
972
    {
973
      external_syms = bfd_malloc (1000);
974
      free_external = 1;
975
    }
976
977
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
978
  locsymcount = symtab_hdr->sh_size / get_elf_backend_data(abfd)->s->sizeof_sym;
979
  if (free_internal)
980
    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
981
            symtab_hdr->sh_info, 0,
982
            internal_syms, external_syms, NULL);
983
  else
984
    isymbuf = internal_syms;
985
  isymend = isymbuf + locsymcount;
986
987
  for (isym = isymbuf ; isym < isymend ; isym++)
988
    {
989
      switch (ELF_ST_TYPE (isym->st_info))
990
  {
991
  case STT_FUNC:
992
    st_info_str = "STT_FUNC";
993
    break;
994
995
  case STT_SECTION:
996
    st_info_str = "STT_SECTION";
997
    break;
998
999
  case STT_FILE:
1000
    st_info_str = "STT_FILE";
1001
    break;
1002
1003
  case STT_OBJECT:
1004
    st_info_str = "STT_OBJECT";
1005
    break;
1006
1007
  case STT_TLS:
1008
    st_info_str = "STT_TLS";
1009
    break;
1010
1011
  default:
1012
    st_info_str = "";
1013
  }
1014
1015
      switch (ELF_ST_BIND (isym->st_info))
1016
  {
1017
  case STB_LOCAL:
1018
    st_info_stb_str = "STB_LOCAL";
1019
    break;
1020
1021
  case STB_GLOBAL:
1022
    st_info_stb_str = "STB_GLOBAL";
1023
    break;
1024
1025
  default:
1026
    st_info_stb_str = "";
1027
  }
1028
1029
      switch (ELF_ST_VISIBILITY (isym->st_other))
1030
  {
1031
  case STV_DEFAULT:
1032
    st_other_str = "STV_DEFAULT";
1033
    break;
1034
1035
  case STV_INTERNAL:
1036
    st_other_str = "STV_INTERNAL";
1037
    break;
1038
1039
  case STV_PROTECTED:
1040
    st_other_str = "STV_PROTECTED";
1041
    break;
1042
1043
  default:
1044
    st_other_str = "";
1045
  }
1046
1047
      switch (isym->st_shndx)
1048
  {
1049
  case SHN_ABS:
1050
    st_shndx_str = "SHN_ABS";
1051
    break;
1052
1053
  case SHN_COMMON:
1054
    st_shndx_str = "SHN_COMMON";
1055
    break;
1056
1057
  case SHN_UNDEF:
1058
    st_shndx_str = "SHN_UNDEF";
1059
    break;
1060
1061
  default:
1062
    st_shndx_str = "";
1063
  }
1064
1065
      printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
1066
        "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
1067
        isym,
1068
        (unsigned long) isym->st_value,
1069
        (unsigned long) isym->st_size,
1070
        isym->st_name,
1071
        bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
1072
                 isym->st_name),
1073
        isym->st_info, st_info_str, st_info_stb_str,
1074
        isym->st_other, st_other_str,
1075
        isym->st_shndx, st_shndx_str);
1076
    }
1077
  if (free_internal)
1078
    free (internal_syms);
1079
  if (free_external)
1080
    free (external_syms);
1081
}
1082
1083
char *
1084
m32c_get_reloc (long reloc)
1085
{
1086
  if (0 <= reloc && reloc < R_M32C_max)
1087
    return m32c_elf_howto_table[reloc].name;
1088
  else
1089
    return "";
1090
}
1091
#endif /* DEBUG */
1092
1093
/* Handle relaxing.  */
1094
1095
/* A subroutine of m32c_elf_relax_section.  If the global symbol H
1096
   is within the low 64k, remove any entry for it in the plt.  */
1097
1098
struct relax_plt_data
1099
{
1100
  asection *splt;
1101
  bool *again;
1102
};
1103
1104
static bool
1105
m32c_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1106
0
{
1107
0
  struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1108
1109
0
  if (h->plt.offset != (bfd_vma) -1)
1110
0
    {
1111
0
      bfd_vma address;
1112
1113
0
      if (h->root.type == bfd_link_hash_undefined
1114
0
    || h->root.type == bfd_link_hash_undefweak)
1115
0
  address = 0;
1116
0
      else
1117
0
  address = (h->root.u.def.section->output_section->vma
1118
0
       + h->root.u.def.section->output_offset
1119
0
       + h->root.u.def.value);
1120
1121
0
      if (address <= 0xffff)
1122
0
  {
1123
0
    h->plt.offset = -1;
1124
0
    data->splt->size -= 4;
1125
0
    *data->again = true;
1126
0
  }
1127
0
    }
1128
1129
0
  return true;
1130
0
}
1131
1132
/* A subroutine of m32c_elf_relax_section.  If the global symbol H
1133
   previously had a plt entry, give it a new entry offset.  */
1134
1135
static bool
1136
m32c_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1137
0
{
1138
0
  bfd_vma *entry = (bfd_vma *) xdata;
1139
1140
0
  if (h->plt.offset != (bfd_vma) -1)
1141
0
    {
1142
0
      h->plt.offset = *entry;
1143
0
      *entry += 4;
1144
0
    }
1145
1146
0
  return true;
1147
0
}
1148
1149
static bool
1150
m32c_elf_relax_plt_section (asection *splt,
1151
          struct bfd_link_info *info,
1152
          bool *again)
1153
0
{
1154
0
  struct relax_plt_data relax_plt_data;
1155
0
  bfd *ibfd;
1156
1157
  /* Assume nothing changes.  */
1158
0
  *again = false;
1159
1160
0
  if (bfd_link_relocatable (info))
1161
0
    return true;
1162
1163
  /* Quick check for an empty plt.  */
1164
0
  if (splt->size == 0)
1165
0
    return true;
1166
1167
  /* Map across all global symbols; see which ones happen to
1168
     fall in the low 64k.  */
1169
0
  relax_plt_data.splt = splt;
1170
0
  relax_plt_data.again = again;
1171
0
  elf_link_hash_traverse (elf_hash_table (info), m32c_relax_plt_check,
1172
0
        &relax_plt_data);
1173
1174
  /* Likewise for local symbols, though that's somewhat less convenient
1175
     as we have to walk the list of input bfds and swap in symbol data.  */
1176
0
  for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1177
0
    {
1178
0
      bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1179
0
      Elf_Internal_Shdr *symtab_hdr;
1180
0
      Elf_Internal_Sym *isymbuf = NULL;
1181
0
      unsigned int idx;
1182
1183
0
      if (! local_plt_offsets)
1184
0
  continue;
1185
1186
0
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1187
0
      if (symtab_hdr->sh_info != 0)
1188
0
  {
1189
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1190
0
    if (isymbuf == NULL)
1191
0
      isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1192
0
              symtab_hdr->sh_info, 0,
1193
0
              NULL, NULL, NULL);
1194
0
    if (isymbuf == NULL)
1195
0
      return false;
1196
0
  }
1197
1198
0
      for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1199
0
  {
1200
0
    Elf_Internal_Sym *isym;
1201
0
    asection *tsec;
1202
0
    bfd_vma address;
1203
1204
0
    if (local_plt_offsets[idx] == (bfd_vma) -1)
1205
0
      continue;
1206
1207
0
    isym = &isymbuf[idx];
1208
0
    if (isym->st_shndx == SHN_UNDEF)
1209
0
      continue;
1210
0
    else if (isym->st_shndx == SHN_ABS)
1211
0
      tsec = bfd_abs_section_ptr;
1212
0
    else if (isym->st_shndx == SHN_COMMON)
1213
0
      tsec = bfd_com_section_ptr;
1214
0
    else
1215
0
      tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1216
1217
0
    address = (tsec->output_section->vma
1218
0
         + tsec->output_offset
1219
0
         + isym->st_value);
1220
0
    if (address <= 0xffff)
1221
0
      {
1222
0
        local_plt_offsets[idx] = -1;
1223
0
        splt->size -= 4;
1224
0
        *again = true;
1225
0
      }
1226
0
  }
1227
1228
0
      if (isymbuf != NULL
1229
0
    && symtab_hdr->contents != (unsigned char *) isymbuf)
1230
0
  {
1231
0
    if (! info->keep_memory)
1232
0
      free (isymbuf);
1233
0
    else
1234
0
      {
1235
        /* Cache the symbols for elf_link_input_bfd.  */
1236
0
        symtab_hdr->contents = (unsigned char *) isymbuf;
1237
0
      }
1238
0
  }
1239
0
    }
1240
1241
  /* If we changed anything, walk the symbols again to reallocate
1242
     .plt entry addresses.  */
1243
0
  if (*again && splt->size > 0)
1244
0
    {
1245
0
      bfd_vma entry = 0;
1246
1247
0
      elf_link_hash_traverse (elf_hash_table (info),
1248
0
            m32c_relax_plt_realloc, &entry);
1249
1250
0
      for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1251
0
  {
1252
0
    bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1253
0
    unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1254
0
    unsigned int idx;
1255
1256
0
    if (! local_plt_offsets)
1257
0
      continue;
1258
1259
0
    for (idx = 0; idx < nlocals; ++idx)
1260
0
      if (local_plt_offsets[idx] != (bfd_vma) -1)
1261
0
        {
1262
0
    local_plt_offsets[idx] = entry;
1263
0
    entry += 4;
1264
0
        }
1265
0
  }
1266
0
    }
1267
1268
0
  return true;
1269
0
}
1270
1271
static int
1272
compare_reloc (const void *e1, const void *e2)
1273
0
{
1274
0
  const Elf_Internal_Rela *i1 = (const Elf_Internal_Rela *) e1;
1275
0
  const Elf_Internal_Rela *i2 = (const Elf_Internal_Rela *) e2;
1276
1277
0
  if (i1->r_offset == i2->r_offset)
1278
0
    return 0;
1279
0
  else
1280
0
    return i1->r_offset < i2->r_offset ? -1 : 1;
1281
0
}
1282
1283
0
#define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms)
1284
static bfd_vma
1285
m32c_offset_for_reloc (bfd *abfd,
1286
           Elf_Internal_Rela *rel,
1287
           Elf_Internal_Shdr *symtab_hdr,
1288
           bfd_byte *shndx_buf ATTRIBUTE_UNUSED,
1289
           Elf_Internal_Sym *intsyms)
1290
0
{
1291
0
  bfd_vma symval;
1292
1293
  /* Get the value of the symbol referred to by the reloc.  */
1294
0
  if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1295
0
    {
1296
      /* A local symbol.  */
1297
0
      Elf_Internal_Sym *isym;
1298
0
      asection *ssec;
1299
1300
0
      isym = intsyms + ELF32_R_SYM (rel->r_info);
1301
0
      ssec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1302
0
      symval = isym->st_value;
1303
0
      if (ssec)
1304
0
  symval += ssec->output_section->vma
1305
0
    + ssec->output_offset;
1306
0
    }
1307
0
  else
1308
0
    {
1309
0
      unsigned long indx;
1310
0
      struct elf_link_hash_entry *h;
1311
1312
      /* An external symbol.  */
1313
0
      indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1314
0
      h = elf_sym_hashes (abfd)[indx];
1315
0
      BFD_ASSERT (h != NULL);
1316
1317
0
      if (h->root.type != bfd_link_hash_defined
1318
0
    && h->root.type != bfd_link_hash_defweak)
1319
  /* This appears to be a reference to an undefined
1320
     symbol.  Just ignore it--it will be caught by the
1321
     regular reloc processing.  */
1322
0
  return 0;
1323
1324
0
      symval = (h->root.u.def.value
1325
0
    + h->root.u.def.section->output_section->vma
1326
0
    + h->root.u.def.section->output_offset);
1327
0
    }
1328
0
  return symval;
1329
0
}
1330
1331
static int bytes_saved = 0;
1332
1333
static int bytes_to_reloc[] = {
1334
  R_M32C_NONE,
1335
  R_M32C_8,
1336
  R_M32C_16,
1337
  R_M32C_24,
1338
  R_M32C_32
1339
};
1340
1341
/* What we use the bits in a relax reloc addend (R_M32C_RL_*) for.  */
1342
1343
/* Mask for the number of relocs associated with this insn.  */
1344
#define RLA_RELOCS    0x0000000f
1345
/* Number of bytes gas emitted (before gas's relaxing) */
1346
#define RLA_NBYTES    0x00000ff0
1347
1348
/* If the displacement is within the given range and the new encoding
1349
   differs from the old encoding (the index), then the insn can be
1350
   relaxed to the new encoding.  */
1351
typedef const struct {
1352
  int bytes;
1353
  unsigned int max_disp;
1354
  unsigned char new_encoding;
1355
} EncodingTable;
1356
1357
static EncodingTable m16c_addr_encodings[] = {
1358
  { 0,   0,  0 }, /* R0 */
1359
  { 0,   0,  1 }, /* R1 */
1360
  { 0,   0,  2 }, /* R2 */
1361
  { 0,   0,  3 }, /* R3 */
1362
  { 0,   0,  4 }, /* A0 */
1363
  { 0,   0,  5 }, /* A1 */
1364
  { 0,   0,  6 }, /* [A0] */
1365
  { 0,   0,  7 }, /* [A1] */
1366
  { 1,   0,  6 }, /* udsp:8[A0] */
1367
  { 1,   0,  7 }, /* udsp:8[A1] */
1368
  { 1,   0, 10 }, /* udsp:8[SB] */
1369
  { 1,   0, 11 }, /* sdsp:8[FB] */
1370
  { 2, 255,  8 }, /* udsp:16[A0] */
1371
  { 2, 255,  9 }, /* udsp:16[A1] */
1372
  { 2, 255, 10 }, /* udsp:16[SB] */
1373
  { 2,   0, 15 }, /* abs:16 */
1374
};
1375
1376
static EncodingTable m16c_jmpaddr_encodings[] = {
1377
  { 0,   0,  0 }, /* R0 */
1378
  { 0,   0,  1 }, /* R1 */
1379
  { 0,   0,  2 }, /* R2 */
1380
  { 0,   0,  3 }, /* R3 */
1381
  { 0,   0,  4 }, /* A0 */
1382
  { 0,   0,  5 }, /* A1 */
1383
  { 0,   0,  6 }, /* [A0] */
1384
  { 0,   0,  7 }, /* [A1] */
1385
  { 1,   0,  6 }, /* udsp:8[A0] */
1386
  { 1,   0,  7 }, /* udsp:8[A1] */
1387
  { 1,   0, 10 }, /* udsp:8[SB] */
1388
  { 1,   0, 11 }, /* sdsp:8[FB] */
1389
  { 3, 255,  8 }, /* udsp:20[A0] */
1390
  { 3, 255,  9 }, /* udsp:20[A1] */
1391
  { 2, 255, 10 }, /* udsp:16[SB] */
1392
  { 2,   0, 15 }, /* abs:16 */
1393
};
1394
1395
static EncodingTable m32c_addr_encodings[] = {
1396
  { 0,     0,  0 }, /* [A0] */
1397
  { 0,     0,  1 }, /* [A1] */
1398
  { 0,     0,  2 }, /* A0 */
1399
  { 0,     0,  3 }, /* A1 */
1400
  { 1,     0,  0 }, /* udsp:8[A0] */
1401
  { 1,     0,  1 }, /* udsp:8[A1] */
1402
  { 1,     0,  6 }, /* udsp:8[SB] */
1403
  { 1,     0,  7 }, /* sdsp:8[FB] */
1404
  { 2,   255,  4 }, /* udsp:16[A0] */
1405
  { 2,   255,  5 }, /* udsp:16[A1] */
1406
  { 2,   255,  6 }, /* udsp:16[SB] */
1407
  { 2,   127,  7 }, /* sdsp:16[FB] */
1408
  { 3, 65535, 8 }, /* udsp:24[A0] */
1409
  { 3, 65535, 9 }, /* udsp:24[A1] */
1410
  { 3, 65535, 15 }, /* abs24 */
1411
  { 2,     0, 15 }, /* abs16 */
1412
  { 0,     0, 16 }, /* R2 */
1413
  { 0,     0, 17 }, /* R3 */
1414
  { 0,     0, 18 }, /* R0 */
1415
  { 0,     0, 19 }, /* R1 */
1416
  { 0,     0, 20 }, /*  */
1417
  { 0,     0, 21 }, /*  */
1418
  { 0,     0, 22 }, /*  */
1419
  { 0,     0, 23 }, /*  */
1420
  { 0,     0, 24 }, /*  */
1421
  { 0,     0, 25 }, /*  */
1422
  { 0,     0, 26 }, /*  */
1423
  { 0,     0, 27 }, /*  */
1424
  { 0,     0, 28 }, /*  */
1425
  { 0,     0, 29 }, /*  */
1426
  { 0,     0, 30 }, /*  */
1427
  { 0,     0, 31 }, /*  */
1428
};
1429
1430
static bool
1431
m32c_elf_relax_section (bfd *abfd,
1432
      asection *sec,
1433
      struct bfd_link_info *link_info,
1434
      bool *again)
1435
0
{
1436
0
  Elf_Internal_Shdr *symtab_hdr;
1437
0
  Elf_Internal_Shdr *shndx_hdr;
1438
0
  Elf_Internal_Rela *internal_relocs;
1439
0
  Elf_Internal_Rela *free_relocs = NULL;
1440
0
  Elf_Internal_Rela *irel, *irelend, *srel;
1441
0
  bfd_byte * contents = NULL;
1442
0
  bfd_byte * free_contents = NULL;
1443
0
  Elf_Internal_Sym *intsyms = NULL;
1444
0
  Elf_Internal_Sym *free_intsyms = NULL;
1445
0
  bfd_byte *shndx_buf = NULL;
1446
0
  int machine;
1447
1448
0
  if (is_elf_hash_table (link_info->hash)
1449
0
      && abfd == elf_hash_table (link_info)->dynobj
1450
0
      && (sec->flags & SEC_LINKER_CREATED) != 0
1451
0
      && strcmp (sec->name, ".plt") == 0)
1452
0
    return m32c_elf_relax_plt_section (sec, link_info, again);
1453
1454
  /* Assume nothing changes.  */
1455
0
  *again = false;
1456
1457
0
  machine = elf32_m32c_machine (abfd);
1458
1459
  /* We don't have to do anything for a relocatable link, if
1460
     this section does not have relocs, or if this is not a
1461
     code section.  */
1462
0
  if (bfd_link_relocatable (link_info)
1463
0
      || sec->reloc_count == 0
1464
0
      || (sec->flags & SEC_RELOC) == 0
1465
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
1466
0
      || (sec->flags & SEC_CODE) == 0)
1467
0
    return true;
1468
1469
0
  symtab_hdr = & elf_symtab_hdr (abfd);
1470
0
  if (elf_symtab_shndx_list (abfd))
1471
0
    shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
1472
0
  else
1473
0
    shndx_hdr = NULL;
1474
1475
  /* Get the section contents.  */
1476
0
  if (elf_section_data (sec)->this_hdr.contents != NULL)
1477
0
    contents = elf_section_data (sec)->this_hdr.contents;
1478
  /* Go get them off disk.  */
1479
0
  else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1480
0
    goto error_return;
1481
1482
  /* Read this BFD's symbols.  */
1483
  /* Get cached copy if it exists.  */
1484
0
  if (symtab_hdr->contents != NULL)
1485
0
    {
1486
0
      intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
1487
0
    }
1488
0
  else
1489
0
    {
1490
0
      intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
1491
0
      symtab_hdr->contents = (bfd_byte *) intsyms;
1492
0
    }
1493
1494
0
  if (shndx_hdr && shndx_hdr->sh_size != 0)
1495
0
    {
1496
0
      size_t amt;
1497
1498
0
      if (_bfd_mul_overflow (symtab_hdr->sh_info,
1499
0
           sizeof (Elf_External_Sym_Shndx), &amt))
1500
0
  {
1501
0
    bfd_set_error (bfd_error_file_too_big);
1502
0
    goto error_return;
1503
0
  }
1504
0
      if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0)
1505
0
  goto error_return;
1506
0
      shndx_buf = _bfd_malloc_and_read (abfd, amt, amt);
1507
0
      if (shndx_buf == NULL)
1508
0
  goto error_return;
1509
0
      shndx_hdr->contents = shndx_buf;
1510
0
    }
1511
1512
  /* Get a copy of the native relocations.  */
1513
0
  internal_relocs = (_bfd_elf_link_read_relocs
1514
0
         (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
1515
0
          link_info->keep_memory));
1516
0
  if (internal_relocs == NULL)
1517
0
    goto error_return;
1518
0
  if (! link_info->keep_memory)
1519
0
    free_relocs = internal_relocs;
1520
1521
  /* The RL_ relocs must be just before the operand relocs they go
1522
     with, so we must sort them to guarantee this.  */
1523
0
  qsort (internal_relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
1524
0
   compare_reloc);
1525
1526
  /* Walk through them looking for relaxing opportunities.  */
1527
0
  irelend = internal_relocs + sec->reloc_count;
1528
1529
0
  for (irel = internal_relocs; irel < irelend; irel++)
1530
0
    {
1531
0
      bfd_vma symval;
1532
0
      unsigned char *insn, *gap, *einsn;
1533
0
      bfd_vma pc;
1534
0
      bfd_signed_vma pcrel;
1535
0
      int relax_relocs;
1536
0
      int gap_size;
1537
0
      int new_type;
1538
0
      int posn;
1539
0
      int enc;
1540
0
      EncodingTable *enctbl;
1541
0
      EncodingTable *e;
1542
1543
0
      if (ELF32_R_TYPE(irel->r_info) != R_M32C_RL_JUMP
1544
0
    && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_1ADDR
1545
0
    && ELF32_R_TYPE(irel->r_info) != R_M32C_RL_2ADDR)
1546
0
  continue;
1547
1548
0
      srel = irel;
1549
1550
      /* There will always be room for the relaxed insn, since it is smaller
1551
   than the one it would replace.  */
1552
0
      BFD_ASSERT (irel->r_offset < sec->size);
1553
1554
0
      insn = contents + irel->r_offset;
1555
0
      relax_relocs = irel->r_addend % 16;
1556
1557
      /* Ok, we only have three relocs we care about, and they're all
1558
   fake.  The lower four bits of the addend is always the number
1559
   of following relocs (hence the qsort above) that are assigned
1560
   to this opcode.  The next 8 bits of the addend indicates the
1561
   number of bytes in the insn.  We use the rest of them
1562
   ourselves as flags for the more expensive operations (defines
1563
   above).  The three relocs are:
1564
1565
   RL_JUMP: This marks all direct jump insns.  We check the
1566
    displacement and replace them with shorter jumps if
1567
    they're in range.  We also use this to find JMP.S
1568
    insns and manually shorten them when we delete bytes.
1569
    We have to decode these insns to figure out what to
1570
    do.
1571
1572
   RL_1ADDR: This is a :G or :Q insn, which has a single
1573
    "standard" operand.  We have to extract the type
1574
    field, see if it's a wide displacement, then figure
1575
    out if we can replace it with a narrow displacement.
1576
    We don't have to decode these insns.
1577
1578
   RL_2ADDR: Similarly, but two "standard" operands.  Note that
1579
    r_addend may still be 1, as standard operands don't
1580
    always have displacements.  Gas shouldn't give us one
1581
    with zero operands, but since we don't know which one
1582
    has the displacement, we check them both anyway.
1583
1584
   These all point to the beginning of the insn itself, not the
1585
   operands.
1586
1587
   Note that we only relax one step at a time, relying on the
1588
   linker to call us repeatedly.  Thus, there is no code for
1589
   JMP.A->JMP.B although that will happen in two steps.
1590
   Likewise, for 2ADDR relaxes, we do one operand per cycle.
1591
      */
1592
1593
      /* Get the value of the symbol referred to by the reloc.  Just
1594
   in case this is the last reloc in the list, use the RL's
1595
   addend to choose between this reloc (no addend) or the next
1596
   (yes addend, which means at least one following reloc).  */
1597
0
      srel = irel + (relax_relocs ? 1 : 0);
1598
0
      symval = OFFSET_FOR_RELOC (srel);
1599
1600
      /* Setting gap_size nonzero is the flag which means "something
1601
   shrunk".  */
1602
0
      gap_size = 0;
1603
0
      gap = NULL;
1604
0
      new_type = ELF32_R_TYPE(srel->r_info);
1605
1606
0
      pc = sec->output_section->vma + sec->output_offset
1607
0
  + srel->r_offset;
1608
0
      pcrel = symval - pc + srel->r_addend;
1609
1610
0
      if (machine == bfd_mach_m16c)
1611
0
  {
1612
    /* R8C / M16C */
1613
1614
0
    switch (ELF32_R_TYPE(irel->r_info))
1615
0
      {
1616
1617
0
      case R_M32C_RL_JUMP:
1618
0
        switch (insn[0])
1619
0
    {
1620
0
    case 0xfe: /* jmp.b */
1621
0
      if (pcrel >= 2 && pcrel <= 9)
1622
0
        {
1623
          /* Relax JMP.B -> JMP.S.  We need to get rid of
1624
       the following reloc though. */
1625
0
          insn[0] = 0x60 | (pcrel - 2);
1626
0
          new_type = R_M32C_NONE;
1627
0
          irel->r_addend = 0x10;
1628
0
          gap_size = 1;
1629
0
          gap = insn + 1;
1630
0
        }
1631
0
      break;
1632
1633
0
    case 0xf4: /* jmp.w */
1634
      /* 128 is allowed because it will be one byte closer
1635
         after relaxing.  Likewise for all other pc-rel
1636
         jumps.  */
1637
0
      if (pcrel <= 128 && pcrel >= -128)
1638
0
        {
1639
          /* Relax JMP.W -> JMP.B */
1640
0
          insn[0] = 0xfe;
1641
0
          insn[1] = 0;
1642
0
          new_type = R_M32C_8_PCREL;
1643
0
          gap_size = 1;
1644
0
          gap = insn + 2;
1645
0
        }
1646
0
      break;
1647
1648
0
    case 0xfc: /* jmp.a */
1649
0
      if (pcrel <= 32768 && pcrel >= -32768)
1650
0
        {
1651
          /* Relax JMP.A -> JMP.W */
1652
0
          insn[0] = 0xf4;
1653
0
          insn[1] = 0;
1654
0
          insn[2] = 0;
1655
0
          new_type = R_M32C_16_PCREL;
1656
0
          gap_size = 1;
1657
0
          gap = insn + 3;
1658
0
        }
1659
0
      break;
1660
1661
0
    case 0xfd: /* jsr.a */
1662
0
      if (pcrel <= 32768 && pcrel >= -32768)
1663
0
        {
1664
          /* Relax JSR.A -> JSR.W */
1665
0
          insn[0] = 0xf5;
1666
0
          insn[1] = 0;
1667
0
          insn[2] = 0;
1668
0
          new_type = R_M32C_16_PCREL;
1669
0
          gap_size = 1;
1670
0
          gap = insn + 3;
1671
0
        }
1672
0
      break;
1673
0
    }
1674
0
        break;
1675
1676
0
      case R_M32C_RL_2ADDR:
1677
        /* xxxx xxxx srce dest [src-disp] [dest-disp]*/
1678
1679
0
        enctbl = m16c_addr_encodings;
1680
0
        posn = 2;
1681
0
        enc = (insn[1] >> 4) & 0x0f;
1682
0
        e = & enctbl[enc];
1683
1684
0
        if (srel->r_offset == irel->r_offset + posn
1685
0
      && e->new_encoding != enc
1686
0
      && symval <= e->max_disp)
1687
0
    {
1688
0
      insn[1] &= 0x0f;
1689
0
      insn[1] |= e->new_encoding << 4;
1690
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1691
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1692
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1693
0
      break;
1694
0
    }
1695
0
        if (relax_relocs == 2)
1696
0
    srel ++;
1697
0
        posn += e->bytes;
1698
1699
0
        goto try_1addr_16;
1700
1701
0
      case R_M32C_RL_1ADDR:
1702
        /* xxxx xxxx xxxx dest [disp] */
1703
1704
0
        enctbl = m16c_addr_encodings;
1705
0
        posn = 2;
1706
1707
        /* Check the opcode for jumps.  We know it's safe to
1708
     do this because all 2ADDR insns are at least two
1709
     bytes long.  */
1710
0
        enc = insn[0] * 256 + insn[1];
1711
0
        enc &= 0xfff0;
1712
0
        if (enc == 0x7d20
1713
0
      || enc == 0x7d00
1714
0
      || enc == 0x7d30
1715
0
      || enc == 0x7d10)
1716
0
    {
1717
0
      enctbl = m16c_jmpaddr_encodings;
1718
0
    }
1719
1720
0
      try_1addr_16:
1721
        /* srel, posn, and enc must be set here.  */
1722
1723
0
        symval = OFFSET_FOR_RELOC (srel);
1724
0
        enc = insn[1] & 0x0f;
1725
0
        e = & enctbl[enc];
1726
1727
0
        if (srel->r_offset == irel->r_offset + posn
1728
0
      && e->new_encoding != enc
1729
0
      && symval <= e->max_disp)
1730
0
    {
1731
0
      insn[1] &= 0xf0;
1732
0
      insn[1] |= e->new_encoding;
1733
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1734
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1735
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1736
0
      break;
1737
0
    }
1738
1739
0
        break;
1740
1741
0
      } /* Ends switch (reloc type) for m16c.  */
1742
0
  }
1743
0
      else /* machine == bfd_mach_m32c */
1744
0
  {
1745
    /* M32CM / M32C */
1746
1747
0
    switch (ELF32_R_TYPE(irel->r_info))
1748
0
      {
1749
1750
0
      case R_M32C_RL_JUMP:
1751
0
        switch (insn[0])
1752
0
    {
1753
0
    case 0xbb: /* jmp.b */
1754
0
      if (pcrel >= 2 && pcrel <= 9)
1755
0
        {
1756
0
          int p = pcrel - 2;
1757
          /* Relax JMP.B -> JMP.S.  We need to get rid of
1758
       the following reloc though. */
1759
0
          insn[0] = 0x4a | ((p << 3) & 0x30) | (p & 1);
1760
0
          new_type = R_M32C_NONE;
1761
0
          irel->r_addend = 0x10;
1762
0
          gap_size = 1;
1763
0
          gap = insn + 1;
1764
0
        }
1765
0
      break;
1766
1767
0
    case 0xce: /* jmp.w */
1768
0
      if (pcrel <= 128 && pcrel >= -128)
1769
0
        {
1770
          /* Relax JMP.W -> JMP.B */
1771
0
          insn[0] = 0xbb;
1772
0
          insn[1] = 0;
1773
0
          new_type = R_M32C_8_PCREL;
1774
0
          gap_size = 1;
1775
0
          gap = insn + 2;
1776
0
        }
1777
0
      break;
1778
1779
0
    case 0xcc: /* jmp.a */
1780
0
      if (pcrel <= 32768 && pcrel >= -32768)
1781
0
        {
1782
          /* Relax JMP.A -> JMP.W */
1783
0
          insn[0] = 0xce;
1784
0
          insn[1] = 0;
1785
0
          insn[2] = 0;
1786
0
          new_type = R_M32C_16_PCREL;
1787
0
          gap_size = 1;
1788
0
          gap = insn + 3;
1789
0
        }
1790
0
      break;
1791
1792
0
    case 0xcd: /* jsr.a */
1793
0
      if (pcrel <= 32768 && pcrel >= -32768)
1794
0
        {
1795
          /* Relax JSR.A -> JSR.W */
1796
0
          insn[0] = 0xcf;
1797
0
          insn[1] = 0;
1798
0
          insn[2] = 0;
1799
0
          new_type = R_M32C_16_PCREL;
1800
0
          gap_size = 1;
1801
0
          gap = insn + 3;
1802
0
        }
1803
0
      break;
1804
0
    }
1805
0
        break;
1806
1807
0
      case R_M32C_RL_2ADDR:
1808
        /* xSSS DDDx DDSS xxxx [src-disp] [dest-disp]*/
1809
1810
0
        einsn = insn;
1811
0
        posn = 2;
1812
0
        if (einsn[0] == 1)
1813
0
    {
1814
      /* prefix; remove it as far as the RL reloc is concerned.  */
1815
0
      einsn ++;
1816
0
      posn ++;
1817
0
    }
1818
1819
0
        enctbl = m32c_addr_encodings;
1820
0
        enc = ((einsn[0] & 0x70) >> 2) | ((einsn[1] & 0x30) >> 4);
1821
0
        e = & enctbl[enc];
1822
1823
0
        if (srel->r_offset == irel->r_offset + posn
1824
0
      && e->new_encoding != enc
1825
0
      && symval <= e->max_disp)
1826
0
    {
1827
0
      einsn[0] &= 0x8f;
1828
0
      einsn[0] |= (e->new_encoding & 0x1c) << 2;
1829
0
      einsn[1] &= 0xcf;
1830
0
      einsn[1] |= (e->new_encoding & 0x03) << 4;
1831
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1832
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1833
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1834
0
      break;
1835
0
    }
1836
0
        if (relax_relocs == 2)
1837
0
      srel ++;
1838
0
        posn += e->bytes;
1839
1840
0
        goto try_1addr_32;
1841
1842
0
      case R_M32C_RL_1ADDR:
1843
        /* xxxx DDDx DDxx xxxx [disp] */
1844
1845
0
        einsn = insn;
1846
0
        posn = 2;
1847
0
        if (einsn[0] == 1)
1848
0
    {
1849
      /* prefix; remove it as far as the RL reloc is concerned.  */
1850
0
      einsn ++;
1851
0
      posn ++;
1852
0
    }
1853
1854
0
        enctbl = m32c_addr_encodings;
1855
1856
0
      try_1addr_32:
1857
        /* srel, posn, and enc must be set here.  */
1858
1859
0
        symval = OFFSET_FOR_RELOC (srel);
1860
0
        enc = ((einsn[0] & 0x0e) << 1) |  ((einsn[1] & 0xc0) >> 6);
1861
0
        e = & enctbl[enc];
1862
1863
0
        if (srel->r_offset == irel->r_offset + posn
1864
0
      && e->new_encoding != enc
1865
0
      && symval <= e->max_disp)
1866
0
    {
1867
0
      einsn[0] &= 0xf1;
1868
0
      einsn[0] |= (e->new_encoding & 0x1c) >> 1;
1869
0
      einsn[1] &= 0x3f;
1870
0
      einsn[1] |= (e->new_encoding & 0x03) << 6;
1871
0
      gap_size = e->bytes - enctbl[e->new_encoding].bytes;
1872
0
      gap = insn + posn + enctbl[e->new_encoding].bytes;
1873
0
      new_type = bytes_to_reloc[enctbl[e->new_encoding].bytes];
1874
0
      break;
1875
0
    }
1876
1877
0
        break;
1878
1879
0
      } /* Ends switch (reloc type) for m32c.  */
1880
0
  }
1881
1882
0
      if (gap_size == 0)
1883
0
  continue;
1884
1885
0
      *again = true;
1886
1887
0
      srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), new_type);
1888
1889
      /* Note that we've changed the relocs, section contents, etc.  */
1890
0
      elf_section_data (sec)->relocs = internal_relocs;
1891
0
      free_relocs = NULL;
1892
1893
0
      elf_section_data (sec)->this_hdr.contents = contents;
1894
0
      free_contents = NULL;
1895
1896
0
      symtab_hdr->contents = (bfd_byte *) intsyms;
1897
0
      free_intsyms = NULL;
1898
1899
0
      bytes_saved += gap_size;
1900
1901
0
      if (! m32c_elf_relax_delete_bytes(abfd, sec, gap - contents, gap_size))
1902
0
  goto error_return;
1903
1904
0
    } /* next relocation */
1905
1906
0
  free (free_relocs);
1907
0
  free_relocs = NULL;
1908
1909
0
  if (free_contents != NULL)
1910
0
    {
1911
0
      if (! link_info->keep_memory)
1912
0
  free (free_contents);
1913
      /* Cache the section contents for elf_link_input_bfd.  */
1914
0
      else
1915
0
  elf_section_data (sec)->this_hdr.contents = contents;
1916
1917
0
      free_contents = NULL;
1918
0
    }
1919
1920
0
  if (shndx_buf != NULL)
1921
0
    {
1922
0
      shndx_hdr->contents = NULL;
1923
0
      free (shndx_buf);
1924
0
    }
1925
1926
0
  if (free_intsyms != NULL)
1927
0
    {
1928
0
      if (! link_info->keep_memory)
1929
0
  free (free_intsyms);
1930
      /* Cache the symbols for elf_link_input_bfd.  */
1931
0
      else
1932
0
  {
1933
0
    symtab_hdr->contents = NULL /* (unsigned char *) intsyms*/;
1934
0
  }
1935
1936
0
      free_intsyms = NULL;
1937
0
    }
1938
1939
0
  return true;
1940
1941
0
 error_return:
1942
0
  free (free_relocs);
1943
0
  free (free_contents);
1944
0
  if (shndx_buf != NULL)
1945
0
    {
1946
0
      shndx_hdr->contents = NULL;
1947
0
      free (shndx_buf);
1948
0
    }
1949
0
  free (free_intsyms);
1950
0
  return false;
1951
0
}
1952
1953
/* Delete some bytes from a section while relaxing.  */
1954
1955
static bool
1956
m32c_elf_relax_delete_bytes (bfd *abfd,
1957
           asection *sec,
1958
           bfd_vma addr,
1959
           int count)
1960
0
{
1961
0
  Elf_Internal_Shdr *symtab_hdr;
1962
0
  Elf_Internal_Shdr *shndx_hdr;
1963
0
  int sec_shndx;
1964
0
  bfd_byte *contents;
1965
0
  Elf_Internal_Rela *irel;
1966
0
  Elf_Internal_Rela *irelend;
1967
0
  bfd_vma toaddr;
1968
0
  Elf_Internal_Sym *isym;
1969
0
  Elf_Internal_Sym *isymend;
1970
0
  Elf_Internal_Sym *intsyms;
1971
0
  Elf_External_Sym_Shndx *shndx_buf;
1972
0
  Elf_External_Sym_Shndx *shndx;
1973
0
  struct elf_link_hash_entry ** sym_hashes;
1974
0
  struct elf_link_hash_entry ** end_hashes;
1975
0
  unsigned int      symcount;
1976
1977
0
  contents   = elf_section_data (sec)->this_hdr.contents;
1978
1979
0
  toaddr = sec->size;
1980
1981
0
  irel = elf_section_data (sec)->relocs;
1982
0
  irelend = irel + sec->reloc_count;
1983
1984
  /* Actually delete the bytes.  */
1985
0
  memmove (contents + addr, contents + addr + count, (size_t) (toaddr - addr - count));
1986
0
  sec->size -= count;
1987
1988
  /* Adjust all the relocs.  */
1989
0
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel ++)
1990
0
    {
1991
      /* Get the new reloc address.  */
1992
0
      if (irel->r_offset > addr && irel->r_offset < toaddr)
1993
0
  irel->r_offset -= count;
1994
1995
0
      if (ELF32_R_TYPE(irel->r_info) == R_M32C_RL_JUMP
1996
0
    && irel->r_addend == 0x10 /* one byte insn, no relocs */
1997
0
    && irel->r_offset + 1 < addr
1998
0
    && irel->r_offset + 7 > addr)
1999
0
  {
2000
0
    bfd_vma disp;
2001
0
    unsigned char *insn = &contents[irel->r_offset];
2002
0
    disp = *insn;
2003
    /* This is a JMP.S, which we have to manually update. */
2004
0
    if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
2005
0
      {
2006
0
        if ((*insn & 0xf8) != 0x60)
2007
0
    continue;
2008
0
        disp = (disp & 7);
2009
0
      }
2010
0
    else
2011
0
      {
2012
0
        if ((*insn & 0xce) != 0x4a)
2013
0
    continue;
2014
0
        disp = ((disp & 0x30) >> 3) | (disp & 1);
2015
0
      }
2016
0
    if (irel->r_offset + disp + 2 >= addr+count)
2017
0
      {
2018
0
        disp -= count;
2019
0
        if (elf32_m32c_machine (abfd) == bfd_mach_m16c)
2020
0
    {
2021
0
      *insn = (*insn & 0xf8) | disp;
2022
0
    }
2023
0
        else
2024
0
    {
2025
0
      *insn = (*insn & 0xce) | ((disp & 6) << 3) | (disp & 1);
2026
0
    }
2027
0
      }
2028
0
  }
2029
0
    }
2030
2031
  /* Adjust the local symbols defined in this section.  */
2032
0
  symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
2033
0
  intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2034
0
  isym = intsyms;
2035
0
  isymend = isym + symtab_hdr->sh_info;
2036
2037
0
  sec_shndx  = _bfd_elf_section_from_bfd_section (abfd, sec);
2038
0
  if (elf_symtab_shndx_list (abfd))
2039
0
    {
2040
0
      shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2041
0
      shndx_buf  = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
2042
0
    }
2043
0
  else
2044
0
    {
2045
0
      shndx_hdr = NULL;
2046
0
      shndx_buf = NULL;
2047
0
    }
2048
0
  shndx = shndx_buf;
2049
2050
0
  for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
2051
0
    {
2052
      /* If the symbol is in the range of memory we just moved, we
2053
   have to adjust its value.  */
2054
0
      if ((int) isym->st_shndx == sec_shndx
2055
0
    && isym->st_value > addr
2056
0
    && isym->st_value < toaddr)
2057
0
  {
2058
0
    isym->st_value -= count;
2059
0
  }
2060
      /* If the symbol *spans* the bytes we just deleted (i.e. it's
2061
   *end* is in the moved bytes but it's *start* isn't), then we
2062
   must adjust its size.  */
2063
0
      if ((int) isym->st_shndx == sec_shndx
2064
0
      && isym->st_value < addr
2065
0
    && isym->st_value + isym->st_size > addr
2066
0
    && isym->st_value + isym->st_size < toaddr)
2067
0
  {
2068
0
    isym->st_size -= count;
2069
0
  }
2070
0
    }
2071
2072
  /* Now adjust the global symbols defined in this section.  */
2073
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2074
0
        - symtab_hdr->sh_info);
2075
0
  sym_hashes = elf_sym_hashes (abfd);
2076
0
  end_hashes = sym_hashes + symcount;
2077
2078
0
  for (; sym_hashes < end_hashes; sym_hashes ++)
2079
0
    {
2080
0
      struct elf_link_hash_entry * sym_hash = * sym_hashes;
2081
2082
0
      if (sym_hash &&
2083
0
    (sym_hash->root.type == bfd_link_hash_defined
2084
0
     || sym_hash->root.type == bfd_link_hash_defweak)
2085
0
    && sym_hash->root.u.def.section == sec)
2086
0
  {
2087
0
    if (sym_hash->root.u.def.value > addr
2088
0
        && sym_hash->root.u.def.value < toaddr)
2089
0
      {
2090
0
        sym_hash->root.u.def.value -= count;
2091
0
      }
2092
0
    if (sym_hash->root.u.def.value < addr
2093
0
        && sym_hash->root.u.def.value + sym_hash->size > addr
2094
0
        && sym_hash->root.u.def.value + sym_hash->size < toaddr)
2095
0
      {
2096
0
        sym_hash->size -= count;
2097
0
      }
2098
0
  }
2099
0
    }
2100
2101
0
  return true;
2102
0
}
2103

2104
/* This is for versions of gcc prior to 4.3.  */
2105
static unsigned int
2106
_bfd_m32c_elf_eh_frame_address_size (bfd *abfd,
2107
             const asection *sec ATTRIBUTE_UNUSED)
2108
0
{
2109
0
  if ((elf_elfheader (abfd)->e_flags & EF_M32C_CPU_MASK) == EF_M32C_CPU_M16C)
2110
0
    return 2;
2111
0
  return 4;
2112
0
}
2113
2114

2115
2116
#define ELF_ARCH    bfd_arch_m32c
2117
#define ELF_MACHINE_CODE  EM_M32C
2118
#define ELF_MACHINE_ALT1  EM_M32C_OLD
2119
#define ELF_MAXPAGESIZE   0x100
2120
2121
#if 0
2122
#define TARGET_BIG_SYM    m32c_elf32_vec
2123
#define TARGET_BIG_NAME   "elf32-m32c"
2124
#else
2125
#define TARGET_LITTLE_SYM   m32c_elf32_vec
2126
#define TARGET_LITTLE_NAME    "elf32-m32c"
2127
#endif
2128
2129
#define elf_info_to_howto_rel     NULL
2130
#define elf_info_to_howto     m32c_info_to_howto_rela
2131
#define elf_backend_object_p      m32c_elf_object_p
2132
#define elf_backend_relocate_section    m32c_elf_relocate_section
2133
#define elf_backend_check_relocs    m32c_elf_check_relocs
2134
#define elf_backend_object_p      m32c_elf_object_p
2135
#define elf_symbol_leading_char     ('_')
2136
#define elf_backend_early_size_sections \
2137
  m32c_elf_early_size_sections
2138
#define elf_backend_finish_dynamic_sections \
2139
  m32c_elf_finish_dynamic_sections
2140
2141
#define elf_backend_can_gc_sections   1
2142
#define elf_backend_eh_frame_address_size _bfd_m32c_elf_eh_frame_address_size
2143
2144
#define bfd_elf32_bfd_reloc_type_lookup   m32c_reloc_type_lookup
2145
#define bfd_elf32_bfd_reloc_name_lookup m32c_reloc_name_lookup
2146
#define bfd_elf32_bfd_relax_section   m32c_elf_relax_section
2147
#define bfd_elf32_bfd_set_private_flags   m32c_elf_set_private_flags
2148
#define bfd_elf32_bfd_merge_private_bfd_data  m32c_elf_merge_private_bfd_data
2149
#define bfd_elf32_bfd_print_private_bfd_data  m32c_elf_print_private_bfd_data
2150
2151
#include "elf32-target.h"