Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/elf32-rx.c
Line
Count
Source
1
/* Renesas RX specific support for 32-bit ELF.
2
   Copyright (C) 2008-2026 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/rx.h"
26
#include "libiberty.h"
27
#include "elf32-rx.h"
28
29
#define RX_OPCODE_BIG_ENDIAN 0
30
31
/* This is a meta-target that's used only with objcopy, to avoid the
32
   endian-swap we would otherwise get.  We check for this in
33
   rx_elf_object_p().  */
34
const bfd_target rx_elf32_be_ns_vec;
35
const bfd_target rx_elf32_be_vec;
36
37
#ifdef DEBUG
38
char * rx_get_reloc (long);
39
void rx_dump_symtab (bfd *, void *, void *);
40
#endif
41
42
#define RXREL(n,sz,bit,shift,complain,pcrel)             \
43
  HOWTO (R_RX_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
44
   bfd_elf_generic_reloc, "R_RX_" #n, false, 0, ~0, false)
45
46
/* Note that the relocations around 0x7f are internal to this file;
47
   feel free to move them as needed to avoid conflicts with published
48
   relocation numbers.  */
49
50
static reloc_howto_type rx_elf_howto_table [] =
51
{
52
  RXREL (NONE,         0,  0, 0, dont,     false),
53
  RXREL (DIR32,        4, 32, 0, signed,   false),
54
  RXREL (DIR24S,       4, 24, 0, signed,   false),
55
  RXREL (DIR16,        2, 16, 0, dont,     false),
56
  RXREL (DIR16U,       2, 16, 0, unsigned, false),
57
  RXREL (DIR16S,       2, 16, 0, signed,   false),
58
  RXREL (DIR8,         1,  8, 0, dont,     false),
59
  RXREL (DIR8U,        1,  8, 0, unsigned, false),
60
  RXREL (DIR8S,        1,  8, 0, signed,   false),
61
  RXREL (DIR24S_PCREL, 4, 24, 0, signed,   true),
62
  RXREL (DIR16S_PCREL, 2, 16, 0, signed,   true),
63
  RXREL (DIR8S_PCREL,  1,  8, 0, signed,   true),
64
  RXREL (DIR16UL,      2, 16, 2, unsigned, false),
65
  RXREL (DIR16UW,      2, 16, 1, unsigned, false),
66
  RXREL (DIR8UL,       1,  8, 2, unsigned, false),
67
  RXREL (DIR8UW,       1,  8, 1, unsigned, false),
68
  RXREL (DIR32_REV,    2, 16, 0, dont,     false),
69
  RXREL (DIR16_REV,    2, 16, 0, dont,     false),
70
  RXREL (DIR3U_PCREL,  1,  3, 0, dont,     true),
71
72
  EMPTY_HOWTO (0x13),
73
  EMPTY_HOWTO (0x14),
74
  EMPTY_HOWTO (0x15),
75
  EMPTY_HOWTO (0x16),
76
  EMPTY_HOWTO (0x17),
77
  EMPTY_HOWTO (0x18),
78
  EMPTY_HOWTO (0x19),
79
  EMPTY_HOWTO (0x1a),
80
  EMPTY_HOWTO (0x1b),
81
  EMPTY_HOWTO (0x1c),
82
  EMPTY_HOWTO (0x1d),
83
  EMPTY_HOWTO (0x1e),
84
  EMPTY_HOWTO (0x1f),
85
86
  RXREL (RH_3_PCREL, 1,  3, 0, signed,   true),
87
  RXREL (RH_16_OP,   2, 16, 0, signed,   false),
88
  RXREL (RH_24_OP,   4, 24, 0, signed,   false),
89
  RXREL (RH_32_OP,   4, 32, 0, signed,   false),
90
  RXREL (RH_24_UNS,  4, 24, 0, unsigned, false),
91
  RXREL (RH_8_NEG,   1,  8, 0, signed,   false),
92
  RXREL (RH_16_NEG,  2, 16, 0, signed,   false),
93
  RXREL (RH_24_NEG,  4, 24, 0, signed,   false),
94
  RXREL (RH_32_NEG,  4, 32, 0, signed,   false),
95
  RXREL (RH_DIFF,    4, 32, 0, signed,   false),
96
  RXREL (RH_GPRELB,  2, 16, 0, unsigned, false),
97
  RXREL (RH_GPRELW,  2, 16, 0, unsigned, false),
98
  RXREL (RH_GPRELL,  2, 16, 0, unsigned, false),
99
  RXREL (RH_RELAX,   0,  0, 0, dont,   false),
100
101
  EMPTY_HOWTO (0x2e),
102
  EMPTY_HOWTO (0x2f),
103
  EMPTY_HOWTO (0x30),
104
  EMPTY_HOWTO (0x31),
105
  EMPTY_HOWTO (0x32),
106
  EMPTY_HOWTO (0x33),
107
  EMPTY_HOWTO (0x34),
108
  EMPTY_HOWTO (0x35),
109
  EMPTY_HOWTO (0x36),
110
  EMPTY_HOWTO (0x37),
111
  EMPTY_HOWTO (0x38),
112
  EMPTY_HOWTO (0x39),
113
  EMPTY_HOWTO (0x3a),
114
  EMPTY_HOWTO (0x3b),
115
  EMPTY_HOWTO (0x3c),
116
  EMPTY_HOWTO (0x3d),
117
  EMPTY_HOWTO (0x3e),
118
  EMPTY_HOWTO (0x3f),
119
  EMPTY_HOWTO (0x40),
120
121
  RXREL (ABS32,        4, 32, 0, dont,     false),
122
  RXREL (ABS24S,       4, 24, 0, signed,   false),
123
  RXREL (ABS16,        2, 16, 0, dont,     false),
124
  RXREL (ABS16U,       2, 16, 0, unsigned, false),
125
  RXREL (ABS16S,       2, 16, 0, signed,   false),
126
  RXREL (ABS8,         1,  8, 0, dont,     false),
127
  RXREL (ABS8U,        1,  8, 0, unsigned, false),
128
  RXREL (ABS8S,        1,  8, 0, signed,   false),
129
  RXREL (ABS24S_PCREL, 4, 24, 0, signed,   true),
130
  RXREL (ABS16S_PCREL, 2, 16, 0, signed,   true),
131
  RXREL (ABS8S_PCREL,  1,  8, 0, signed,   true),
132
  RXREL (ABS16UL,      2, 16, 0, unsigned, false),
133
  RXREL (ABS16UW,      2, 16, 0, unsigned, false),
134
  RXREL (ABS8UL,       1,  8, 0, unsigned, false),
135
  RXREL (ABS8UW,       1,  8, 0, unsigned, false),
136
  RXREL (ABS32_REV,    4, 32, 0, dont,     false),
137
  RXREL (ABS16_REV,    2, 16, 0, dont,     false),
138
139
0
#define STACK_REL_P(x) ((x) <= R_RX_ABS16_REV && (x) >= R_RX_ABS32)
140
141
  EMPTY_HOWTO (0x52),
142
  EMPTY_HOWTO (0x53),
143
  EMPTY_HOWTO (0x54),
144
  EMPTY_HOWTO (0x55),
145
  EMPTY_HOWTO (0x56),
146
  EMPTY_HOWTO (0x57),
147
  EMPTY_HOWTO (0x58),
148
  EMPTY_HOWTO (0x59),
149
  EMPTY_HOWTO (0x5a),
150
  EMPTY_HOWTO (0x5b),
151
  EMPTY_HOWTO (0x5c),
152
  EMPTY_HOWTO (0x5d),
153
  EMPTY_HOWTO (0x5e),
154
  EMPTY_HOWTO (0x5f),
155
  EMPTY_HOWTO (0x60),
156
  EMPTY_HOWTO (0x61),
157
  EMPTY_HOWTO (0x62),
158
  EMPTY_HOWTO (0x63),
159
  EMPTY_HOWTO (0x64),
160
  EMPTY_HOWTO (0x65),
161
  EMPTY_HOWTO (0x66),
162
  EMPTY_HOWTO (0x67),
163
  EMPTY_HOWTO (0x68),
164
  EMPTY_HOWTO (0x69),
165
  EMPTY_HOWTO (0x6a),
166
  EMPTY_HOWTO (0x6b),
167
  EMPTY_HOWTO (0x6c),
168
  EMPTY_HOWTO (0x6d),
169
  EMPTY_HOWTO (0x6e),
170
  EMPTY_HOWTO (0x6f),
171
  EMPTY_HOWTO (0x70),
172
  EMPTY_HOWTO (0x71),
173
  EMPTY_HOWTO (0x72),
174
  EMPTY_HOWTO (0x73),
175
  EMPTY_HOWTO (0x74),
176
  EMPTY_HOWTO (0x75),
177
  EMPTY_HOWTO (0x76),
178
  EMPTY_HOWTO (0x77),
179
180
  /* These are internal.  */
181
  /* A 5-bit unsigned displacement to a B/W/L address, at bit position 8/12.  */
182
  /* ---- ----   4--- 3210.  */
183
0
#define R_RX_RH_ABS5p8B 0x78
184
  RXREL (RH_ABS5p8B,   0,  0, 0, dont,     false),
185
0
#define R_RX_RH_ABS5p8W 0x79
186
  RXREL (RH_ABS5p8W,   0,  0, 0, dont,     false),
187
0
#define R_RX_RH_ABS5p8L 0x7a
188
  RXREL (RH_ABS5p8L,   0,  0, 0, dont,     false),
189
  /* A 5-bit unsigned displacement to a B/W/L address, at bit position 5/12.  */
190
  /* ---- -432   1--- 0---.  */
191
0
#define R_RX_RH_ABS5p5B 0x7b
192
  RXREL (RH_ABS5p5B,   0,  0, 0, dont,     false),
193
0
#define R_RX_RH_ABS5p5W 0x7c
194
  RXREL (RH_ABS5p5W,   0,  0, 0, dont,     false),
195
0
#define R_RX_RH_ABS5p5L 0x7d
196
  RXREL (RH_ABS5p5L,   0,  0, 0, dont,     false),
197
  /* A 4-bit unsigned immediate at bit position 8.  */
198
0
#define R_RX_RH_UIMM4p8 0x7e
199
  RXREL (RH_UIMM4p8,   0,  0, 0, dont,     false),
200
  /* A 4-bit negative unsigned immediate at bit position 8.  */
201
0
#define R_RX_RH_UNEG4p8 0x7f
202
  RXREL (RH_UNEG4p8,   0,  0, 0, dont,     false),
203
  /* End of internal relocs.  */
204
205
  RXREL (SYM,     4, 32, 0, dont, false),
206
  RXREL (OPneg,     4, 32, 0, dont, false),
207
  RXREL (OPadd,     4, 32, 0, dont, false),
208
  RXREL (OPsub,     4, 32, 0, dont, false),
209
  RXREL (OPmul,     4, 32, 0, dont, false),
210
  RXREL (OPdiv,     4, 32, 0, dont, false),
211
  RXREL (OPshla,    4, 32, 0, dont, false),
212
  RXREL (OPshra,    4, 32, 0, dont, false),
213
  RXREL (OPsctsize, 4, 32, 0, dont, false),
214
215
  EMPTY_HOWTO (0x89),
216
  EMPTY_HOWTO (0x8a),
217
  EMPTY_HOWTO (0x8b),
218
  EMPTY_HOWTO (0x8c),
219
220
  RXREL (OPscttop,  4, 32, 0, dont, false),
221
222
  EMPTY_HOWTO (0x8e),
223
  EMPTY_HOWTO (0x8f),
224
225
  RXREL (OPand,     4, 32, 0, dont, false),
226
  RXREL (OPor,      4, 32, 0, dont, false),
227
  RXREL (OPxor,     4, 32, 0, dont, false),
228
  RXREL (OPnot,     4, 32, 0, dont, false),
229
  RXREL (OPmod,     4, 32, 0, dont, false),
230
  RXREL (OPromtop,  4, 32, 0, dont, false),
231
  RXREL (OPramtop,  4, 32, 0, dont, false)
232
};
233

234
/* Map BFD reloc types to RX ELF reloc types.  */
235
236
struct rx_reloc_map
237
{
238
  bfd_reloc_code_real_type  bfd_reloc_val;
239
  unsigned int        rx_reloc_val;
240
};
241
242
static const struct rx_reloc_map rx_reloc_map [] =
243
{
244
  { BFD_RELOC_NONE,   R_RX_NONE },
245
  { BFD_RELOC_8,    R_RX_DIR8S },
246
  { BFD_RELOC_16,   R_RX_DIR16S },
247
  { BFD_RELOC_24,   R_RX_DIR24S },
248
  { BFD_RELOC_32,   R_RX_DIR32 },
249
  { BFD_RELOC_RX_16_OP,   R_RX_DIR16 },
250
  { BFD_RELOC_RX_DIR3U_PCREL, R_RX_DIR3U_PCREL },
251
  { BFD_RELOC_8_PCREL,    R_RX_DIR8S_PCREL },
252
  { BFD_RELOC_16_PCREL,   R_RX_DIR16S_PCREL },
253
  { BFD_RELOC_24_PCREL,   R_RX_DIR24S_PCREL },
254
  { BFD_RELOC_RX_8U,    R_RX_DIR8U },
255
  { BFD_RELOC_RX_16U,   R_RX_DIR16U },
256
  { BFD_RELOC_RX_24U,   R_RX_RH_24_UNS },
257
  { BFD_RELOC_RX_NEG8,    R_RX_RH_8_NEG },
258
  { BFD_RELOC_RX_NEG16,   R_RX_RH_16_NEG },
259
  { BFD_RELOC_RX_NEG24,   R_RX_RH_24_NEG },
260
  { BFD_RELOC_RX_NEG32,   R_RX_RH_32_NEG },
261
  { BFD_RELOC_RX_DIFF,    R_RX_RH_DIFF },
262
  { BFD_RELOC_RX_GPRELB,  R_RX_RH_GPRELB },
263
  { BFD_RELOC_RX_GPRELW,  R_RX_RH_GPRELW },
264
  { BFD_RELOC_RX_GPRELL,  R_RX_RH_GPRELL },
265
  { BFD_RELOC_RX_RELAX,   R_RX_RH_RELAX },
266
  { BFD_RELOC_RX_SYM,   R_RX_SYM },
267
  { BFD_RELOC_RX_OP_SUBTRACT, R_RX_OPsub },
268
  { BFD_RELOC_RX_OP_NEG,  R_RX_OPneg },
269
  { BFD_RELOC_RX_ABS8,    R_RX_ABS8 },
270
  { BFD_RELOC_RX_ABS16,   R_RX_ABS16 },
271
  { BFD_RELOC_RX_ABS16_REV, R_RX_ABS16_REV },
272
  { BFD_RELOC_RX_ABS32,   R_RX_ABS32 },
273
  { BFD_RELOC_RX_ABS32_REV, R_RX_ABS32_REV },
274
  { BFD_RELOC_RX_ABS16UL, R_RX_ABS16UL },
275
  { BFD_RELOC_RX_ABS16UW, R_RX_ABS16UW },
276
  { BFD_RELOC_RX_ABS16U,  R_RX_ABS16U }
277
};
278
279
0
#define BIGE(abfd)       ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG)
280
281
static reloc_howto_type *
282
rx_reloc_type_lookup (bfd *          abfd ATTRIBUTE_UNUSED,
283
          bfd_reloc_code_real_type code)
284
0
{
285
0
  unsigned int i;
286
287
0
  if (code == BFD_RELOC_RX_32_OP)
288
0
    return rx_elf_howto_table + R_RX_DIR32;
289
290
0
  for (i = ARRAY_SIZE (rx_reloc_map); i--;)
291
0
    if (rx_reloc_map [i].bfd_reloc_val == code)
292
0
      return rx_elf_howto_table + rx_reloc_map[i].rx_reloc_val;
293
294
0
  return NULL;
295
0
}
296
297
static reloc_howto_type *
298
rx_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
299
0
{
300
0
  unsigned int i;
301
302
0
  for (i = 0; i < ARRAY_SIZE (rx_elf_howto_table); i++)
303
0
    if (rx_elf_howto_table[i].name != NULL
304
0
  && strcasecmp (rx_elf_howto_table[i].name, r_name) == 0)
305
0
      return rx_elf_howto_table + i;
306
307
0
  return NULL;
308
0
}
309
310
/* Set the howto pointer for an RX ELF reloc.  */
311
312
static bool
313
rx_info_to_howto_rela (bfd *       abfd,
314
           arelent *     cache_ptr,
315
           Elf_Internal_Rela * dst)
316
0
{
317
0
  unsigned int r_type;
318
319
0
  r_type = ELF32_R_TYPE (dst->r_info);
320
0
  BFD_ASSERT (R_RX_max == ARRAY_SIZE (rx_elf_howto_table));
321
0
  if (r_type >= ARRAY_SIZE (rx_elf_howto_table))
322
0
    {
323
      /* xgettext:c-format */
324
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
325
0
        abfd, r_type);
326
0
      bfd_set_error (bfd_error_bad_value);
327
0
      return false;
328
0
    }
329
0
  cache_ptr->howto = rx_elf_howto_table + r_type;
330
0
  if (cache_ptr->howto->name == NULL)
331
0
    {
332
      /* xgettext:c-format */
333
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
334
0
        abfd, r_type);
335
0
      bfd_set_error (bfd_error_bad_value);
336
0
      return false;
337
0
    }
338
0
  return true;
339
0
}
340

341
static bfd_vma
342
get_symbol_value (const char *      name,
343
      struct bfd_link_info *  info,
344
      bfd *       input_bfd,
345
      asection *      input_section,
346
      int       offset)
347
0
{
348
0
  bfd_vma value = 0;
349
0
  struct bfd_link_hash_entry * h;
350
351
0
  h = bfd_link_hash_lookup (info->hash, name, false, false, true);
352
353
0
  if (h == NULL
354
0
      || (h->type != bfd_link_hash_defined
355
0
    && h->type != bfd_link_hash_defweak))
356
0
    (*info->callbacks->undefined_symbol)
357
0
      (info, name, input_bfd, input_section, offset, true);
358
0
  else
359
0
    value = (h->u.def.value
360
0
       + h->u.def.section->output_section->vma
361
0
       + h->u.def.section->output_offset);
362
363
0
  return value;
364
0
}
365
366
static bfd_vma
367
get_symbol_value_maybe (const char *    name,
368
      struct bfd_link_info *  info)
369
0
{
370
0
  bfd_vma value = 0;
371
0
  struct bfd_link_hash_entry * h;
372
373
0
  h = bfd_link_hash_lookup (info->hash, name, false, false, true);
374
375
0
  if (h == NULL
376
0
      || (h->type != bfd_link_hash_defined
377
0
    && h->type != bfd_link_hash_defweak))
378
0
    return 0;
379
0
  else
380
0
    value = (h->u.def.value
381
0
       + h->u.def.section->output_section->vma
382
0
       + h->u.def.section->output_offset);
383
384
0
  return value;
385
0
}
386
387
static bfd_vma
388
get_gp (struct bfd_link_info *  info,
389
  bfd *     abfd,
390
  asection *    sec,
391
  int     offset)
392
0
{
393
0
  static bool cached = false;
394
0
  static bfd_vma cached_value = 0;
395
396
0
  if (!cached)
397
0
    {
398
0
      cached_value = get_symbol_value ("__gp", info, abfd, sec, offset);
399
0
      cached = true;
400
0
    }
401
0
  return cached_value;
402
0
}
403
404
static bfd_vma
405
get_romstart (struct bfd_link_info *  info,
406
        bfd *         abfd,
407
        asection *        sec,
408
        int         offset)
409
0
{
410
0
  static bool cached = false;
411
0
  static bfd_vma cached_value = 0;
412
413
0
  if (!cached)
414
0
    {
415
0
      cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
416
0
      cached = true;
417
0
    }
418
0
  return cached_value;
419
0
}
420
421
static bfd_vma
422
get_ramstart (struct bfd_link_info *  info,
423
        bfd *         abfd,
424
        asection *        sec,
425
        int         offset)
426
0
{
427
0
  static bool cached = false;
428
0
  static bfd_vma cached_value = 0;
429
430
0
  if (!cached)
431
0
    {
432
0
      cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
433
0
      cached = true;
434
0
    }
435
0
  return cached_value;
436
0
}
437
438
0
#define NUM_STACK_ENTRIES 16
439
static int32_t rx_stack [ NUM_STACK_ENTRIES ];
440
static unsigned int rx_stack_top;
441
442
#define RX_STACK_PUSH(val)      \
443
0
  do            \
444
0
    {           \
445
0
      if (rx_stack_top < NUM_STACK_ENTRIES) \
446
0
  rx_stack [rx_stack_top ++] = (val); \
447
0
      else          \
448
0
  r = bfd_reloc_dangerous;   \
449
0
    }           \
450
0
  while (0)
451
452
#define RX_STACK_POP(dest)      \
453
0
  do            \
454
0
    {           \
455
0
      if (rx_stack_top > 0)     \
456
0
  (dest) = rx_stack [-- rx_stack_top]; \
457
0
      else          \
458
0
  (dest) = 0, r = bfd_reloc_dangerous; \
459
0
    }           \
460
0
  while (0)
461
462
/* Relocate an RX ELF section.
463
   There is some attempt to make this function usable for many architectures,
464
   both USE_REL and USE_RELA ['twould be nice if such a critter existed],
465
   if only to serve as a learning tool.
466
467
   The RELOCATE_SECTION function is called by the new ELF backend linker
468
   to handle the relocations for a section.
469
470
   The relocs are always passed as Rela structures; if the section
471
   actually uses Rel structures, the r_addend field will always be
472
   zero.
473
474
   This function is responsible for adjusting the section contents as
475
   necessary, and (if using Rela relocs and generating a relocatable
476
   output file) adjusting the reloc addend as necessary.
477
478
   This function does not have to worry about setting the reloc
479
   address or the reloc symbol index.
480
481
   LOCAL_SYMS is a pointer to the swapped in local symbols.
482
483
   LOCAL_SECTIONS is an array giving the section in the input file
484
   corresponding to the st_shndx field of each local symbol.
485
486
   The global hash table entry for the global symbols can be found
487
   via elf_sym_hashes (input_bfd).
488
489
   When generating relocatable output, this function must handle
490
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
491
   going to be the section symbol corresponding to the output
492
   section, which means that the addend must be adjusted
493
   accordingly.  */
494
495
static int
496
rx_elf_relocate_section
497
    (bfd *         output_bfd,
498
     struct bfd_link_info *  info,
499
     bfd *         input_bfd,
500
     asection *        input_section,
501
     bfd_byte *        contents,
502
     Elf_Internal_Rela *     relocs,
503
     Elf_Internal_Sym *      local_syms,
504
     asection **       local_sections)
505
0
{
506
0
  Elf_Internal_Shdr *symtab_hdr;
507
0
  struct elf_link_hash_entry **sym_hashes;
508
0
  Elf_Internal_Rela *rel;
509
0
  Elf_Internal_Rela *relend;
510
0
  bool pid_mode;
511
0
  bool saw_subtract = false;
512
0
  const char *table_default_cache = NULL;
513
0
  bfd_vma table_start_cache = 0;
514
0
  bfd_vma table_end_cache = 0;
515
516
0
  if (elf_elfheader (output_bfd)->e_flags & E_FLAG_RX_PID)
517
0
    pid_mode = true;
518
0
  else
519
0
    pid_mode = false;
520
521
0
  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
522
0
  sym_hashes = elf_sym_hashes (input_bfd);
523
0
  relend     = relocs + input_section->reloc_count;
524
0
  for (rel = relocs; rel < relend; rel ++)
525
0
    {
526
0
      reloc_howto_type *howto;
527
0
      unsigned long r_symndx;
528
0
      Elf_Internal_Sym *sym;
529
0
      asection *sec;
530
0
      struct elf_link_hash_entry *h;
531
0
      bfd_vma relocation;
532
0
      bfd_reloc_status_type r;
533
0
      const char * name = NULL;
534
0
      bool unresolved_reloc = true;
535
0
      int r_type;
536
537
0
      r_type = ELF32_R_TYPE (rel->r_info);
538
0
      r_symndx = ELF32_R_SYM (rel->r_info);
539
540
0
      howto  = rx_elf_howto_table + ELF32_R_TYPE (rel->r_info);
541
0
      h      = NULL;
542
0
      sym    = NULL;
543
0
      sec    = NULL;
544
0
      relocation = 0;
545
546
0
      if (rx_stack_top == 0)
547
0
  saw_subtract = false;
548
549
0
      if (r_symndx < symtab_hdr->sh_info)
550
0
  {
551
0
    sym = local_syms + r_symndx;
552
0
    sec = local_sections [r_symndx];
553
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
554
555
0
    name = bfd_elf_string_from_elf_section
556
0
      (input_bfd, symtab_hdr->sh_link, sym->st_name);
557
0
    name = sym->st_name == 0 ? bfd_section_name (sec) : name;
558
0
  }
559
0
      else
560
0
  {
561
0
    bool warned, ignored;
562
563
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
564
0
           r_symndx, symtab_hdr, sym_hashes, h,
565
0
           sec, relocation, unresolved_reloc,
566
0
           warned, ignored);
567
568
0
    name = h->root.root.string;
569
0
  }
570
571
0
      if (startswith (name, "$tableentry$default$"))
572
0
  {
573
0
    bfd_vma entry_vma;
574
0
    int idx;
575
0
    char *buf;
576
577
0
    if (table_default_cache != name)
578
0
      {
579
580
        /* All relocs for a given table should be to the same
581
     (weak) default symbol) so we can use it to detect a
582
     cache miss.  We use the offset into the table to find
583
     the "real" symbol.  Calculate and store the table's
584
     offset here.  */
585
586
0
        table_default_cache = name;
587
588
        /* We have already done error checking in rx_table_find().  */
589
590
0
        buf = (char *) bfd_malloc (13 + strlen (name + 20));
591
0
        if (buf == NULL)
592
0
    return false;
593
594
0
        sprintf (buf, "$tablestart$%s", name + 20);
595
0
        table_start_cache = get_symbol_value (buf,
596
0
                info,
597
0
                input_bfd,
598
0
                input_section,
599
0
                rel->r_offset);
600
601
0
        sprintf (buf, "$tableend$%s", name + 20);
602
0
        table_end_cache = get_symbol_value (buf,
603
0
              info,
604
0
              input_bfd,
605
0
              input_section,
606
0
              rel->r_offset);
607
608
0
        free (buf);
609
0
      }
610
611
0
    entry_vma = (input_section->output_section->vma
612
0
           + input_section->output_offset
613
0
           + rel->r_offset);
614
615
0
    if (table_end_cache <= entry_vma || entry_vma < table_start_cache)
616
0
      {
617
        /* xgettext:c-format */
618
0
        _bfd_error_handler (_("%pB:%pA: table entry %s outside table"),
619
0
          input_bfd, input_section,
620
0
          name);
621
0
      }
622
0
    else if ((int) (entry_vma - table_start_cache) % 4)
623
0
      {
624
        /* xgettext:c-format */
625
0
        _bfd_error_handler (_("%pB:%pA: table entry %s not word-aligned within table"),
626
0
          input_bfd, input_section,
627
0
          name);
628
0
      }
629
0
    else
630
0
      {
631
0
        idx = (int) (entry_vma - table_start_cache) / 4;
632
633
        /* This will look like $tableentry$<N>$<name> */
634
0
        buf = (char *) bfd_malloc (12 + 20 + strlen (name + 20));
635
0
        if (buf == NULL)
636
0
    return false;
637
638
0
        sprintf (buf, "$tableentry$%d$%s", idx, name + 20);
639
640
0
        h = (struct elf_link_hash_entry *) bfd_link_hash_lookup (info->hash, buf, false, false, true);
641
642
0
        if (h)
643
0
    {
644
0
      relocation = (h->root.u.def.value
645
0
        + h->root.u.def.section->output_section->vma
646
0
        + h->root.u.def.section->output_offset);;
647
0
    }
648
649
0
        free (buf);
650
0
      }
651
0
  }
652
653
0
      if (sec != NULL && discarded_section (sec))
654
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
655
0
           rel, 1, relend, R_RX_NONE,
656
0
           howto, 0, contents);
657
658
0
      if (bfd_link_relocatable (info))
659
0
  {
660
    /* This is a relocatable link.  We don't have to change
661
       anything, unless the reloc is against a section symbol,
662
       in which case we have to adjust according to where the
663
       section symbol winds up in the output section.  */
664
0
    if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
665
0
      rel->r_addend += sec->output_offset;
666
0
    continue;
667
0
  }
668
669
0
      if (h != NULL && h->root.type == bfd_link_hash_undefweak)
670
  /* If the symbol is undefined and weak
671
     then the relocation resolves to zero.  */
672
0
  relocation = 0;
673
0
      else
674
0
  {
675
0
    if (howto->pc_relative)
676
0
      {
677
0
        relocation -= (input_section->output_section->vma
678
0
           + input_section->output_offset
679
0
           + rel->r_offset);
680
0
        if (r_type != R_RX_RH_3_PCREL
681
0
      && r_type != R_RX_DIR3U_PCREL)
682
0
    relocation ++;
683
0
      }
684
685
0
    relocation += rel->r_addend;
686
0
  }
687
688
0
      r = bfd_reloc_ok;
689
690
0
#define RANGE(a,b) \
691
0
  if (a > (long) relocation || (long) relocation > b)   \
692
0
    r = bfd_reloc_overflow
693
0
#define ALIGN(m) \
694
0
  if (relocation & m)           \
695
0
    r = bfd_reloc_other
696
0
#define OP(i) \
697
0
  (contents[rel->r_offset + (i)])
698
0
#define WARN_REDHAT(type) \
699
  /* xgettext:c-format */          \
700
0
  _bfd_error_handler            \
701
0
    (_("%pB:%pA: warning: deprecated Red Hat reloc "    \
702
0
       "%s detected against: %s"),        \
703
0
     input_bfd, input_section, #type, name)
704
705
      /* Check for unsafe relocs in PID mode.  These are any relocs where
706
   an absolute address is being computed.  There are special cases
707
   for relocs against symbols that are known to be referenced in
708
   crt0.o before the PID base address register has been initialised.  */
709
0
#define UNSAFE_FOR_PID              \
710
0
  do                  \
711
0
    {                 \
712
0
      if (pid_mode              \
713
0
    && sec != NULL            \
714
0
    && sec->flags & SEC_READONLY          \
715
0
    && !(input_section->flags & SEC_DEBUGGING)     \
716
0
    && strcmp (name, "__pid_base") != 0        \
717
0
    && strcmp (name, "__gp") != 0          \
718
0
    && strcmp (name, "__romdatastart") != 0      \
719
0
    && !saw_subtract)           \
720
  /* xgettext:c-format */            \
721
0
  _bfd_error_handler (_("%pB(%pA): unsafe PID relocation %s "  \
722
0
            "at %#" PRIx64 " (against %s in %s)"),  \
723
0
          input_bfd, input_section, howto->name,  \
724
0
          (uint64_t) (input_section->output_section->vma \
725
0
          + input_section->output_offset  \
726
0
          + rel->r_offset),   \
727
0
          name, sec->name);       \
728
0
    }                 \
729
0
  while (0)
730
731
      /* Opcode relocs are always big endian.  Data relocs are bi-endian.  */
732
0
      switch (r_type)
733
0
  {
734
0
  case R_RX_NONE:
735
0
    break;
736
737
0
  case R_RX_RH_RELAX:
738
0
    break;
739
740
0
  case R_RX_RH_3_PCREL:
741
0
    WARN_REDHAT ("RX_RH_3_PCREL");
742
0
    RANGE (3, 10);
743
0
    OP (0) &= 0xf8;
744
0
    OP (0) |= relocation & 0x07;
745
0
    break;
746
747
0
  case R_RX_RH_8_NEG:
748
0
    WARN_REDHAT ("RX_RH_8_NEG");
749
0
    relocation = - relocation;
750
    /* Fall through.  */
751
0
  case R_RX_DIR8S_PCREL:
752
0
    UNSAFE_FOR_PID;
753
0
    RANGE (-128, 127);
754
0
    OP (0) = relocation;
755
0
    break;
756
757
0
  case R_RX_DIR8S:
758
0
    UNSAFE_FOR_PID;
759
0
    RANGE (-128, 255);
760
0
    OP (0) = relocation;
761
0
    break;
762
763
0
  case R_RX_DIR8U:
764
0
    UNSAFE_FOR_PID;
765
0
    RANGE (0, 255);
766
0
    OP (0) = relocation;
767
0
    break;
768
769
0
  case R_RX_RH_16_NEG:
770
0
    WARN_REDHAT ("RX_RH_16_NEG");
771
0
    relocation = - relocation;
772
    /* Fall through.  */
773
0
  case R_RX_DIR16S_PCREL:
774
0
    UNSAFE_FOR_PID;
775
0
    RANGE (-32768, 32767);
776
#if RX_OPCODE_BIG_ENDIAN
777
#else
778
0
    OP (0) = relocation;
779
0
    OP (1) = relocation >> 8;
780
0
#endif
781
0
    break;
782
783
0
  case R_RX_RH_16_OP:
784
0
    WARN_REDHAT ("RX_RH_16_OP");
785
0
    UNSAFE_FOR_PID;
786
0
    RANGE (-32768, 32767);
787
#if RX_OPCODE_BIG_ENDIAN
788
    OP (1) = relocation;
789
    OP (0) = relocation >> 8;
790
#else
791
0
    OP (0) = relocation;
792
0
    OP (1) = relocation >> 8;
793
0
#endif
794
0
    break;
795
796
0
  case R_RX_DIR16S:
797
0
    UNSAFE_FOR_PID;
798
0
    RANGE (-32768, 65535);
799
0
    if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
800
0
      {
801
0
        OP (1) = relocation;
802
0
        OP (0) = relocation >> 8;
803
0
      }
804
0
    else
805
0
      {
806
0
        OP (0) = relocation;
807
0
        OP (1) = relocation >> 8;
808
0
      }
809
0
    break;
810
811
0
  case R_RX_DIR16U:
812
0
    UNSAFE_FOR_PID;
813
0
    RANGE (0, 65536);
814
#if RX_OPCODE_BIG_ENDIAN
815
    OP (1) = relocation;
816
    OP (0) = relocation >> 8;
817
#else
818
0
    OP (0) = relocation;
819
0
    OP (1) = relocation >> 8;
820
0
#endif
821
0
    break;
822
823
0
  case R_RX_DIR16:
824
0
    UNSAFE_FOR_PID;
825
0
    RANGE (-32768, 65536);
826
#if RX_OPCODE_BIG_ENDIAN
827
    OP (1) = relocation;
828
    OP (0) = relocation >> 8;
829
#else
830
0
    OP (0) = relocation;
831
0
    OP (1) = relocation >> 8;
832
0
#endif
833
0
    break;
834
835
0
  case R_RX_DIR16_REV:
836
0
    UNSAFE_FOR_PID;
837
0
    RANGE (-32768, 65536);
838
#if RX_OPCODE_BIG_ENDIAN
839
    OP (0) = relocation;
840
    OP (1) = relocation >> 8;
841
#else
842
0
    OP (1) = relocation;
843
0
    OP (0) = relocation >> 8;
844
0
#endif
845
0
    break;
846
847
0
  case R_RX_DIR3U_PCREL:
848
0
    RANGE (3, 10);
849
0
    OP (0) &= 0xf8;
850
0
    OP (0) |= relocation & 0x07;
851
0
    break;
852
853
0
  case R_RX_RH_24_NEG:
854
0
    UNSAFE_FOR_PID;
855
0
    WARN_REDHAT ("RX_RH_24_NEG");
856
0
    relocation = - relocation;
857
    /* Fall through.  */
858
0
  case R_RX_DIR24S_PCREL:
859
0
    RANGE (-0x800000, 0x7fffff);
860
#if RX_OPCODE_BIG_ENDIAN
861
    OP (2) = relocation;
862
    OP (1) = relocation >> 8;
863
    OP (0) = relocation >> 16;
864
#else
865
0
    OP (0) = relocation;
866
0
    OP (1) = relocation >> 8;
867
0
    OP (2) = relocation >> 16;
868
0
#endif
869
0
    break;
870
871
0
  case R_RX_RH_24_OP:
872
0
    UNSAFE_FOR_PID;
873
0
    WARN_REDHAT ("RX_RH_24_OP");
874
0
    RANGE (-0x800000, 0x7fffff);
875
#if RX_OPCODE_BIG_ENDIAN
876
    OP (2) = relocation;
877
    OP (1) = relocation >> 8;
878
    OP (0) = relocation >> 16;
879
#else
880
0
    OP (0) = relocation;
881
0
    OP (1) = relocation >> 8;
882
0
    OP (2) = relocation >> 16;
883
0
#endif
884
0
    break;
885
886
0
  case R_RX_DIR24S:
887
0
    UNSAFE_FOR_PID;
888
0
    RANGE (-0x800000, 0x7fffff);
889
0
    if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
890
0
      {
891
0
        OP (2) = relocation;
892
0
        OP (1) = relocation >> 8;
893
0
        OP (0) = relocation >> 16;
894
0
      }
895
0
    else
896
0
      {
897
0
        OP (0) = relocation;
898
0
        OP (1) = relocation >> 8;
899
0
        OP (2) = relocation >> 16;
900
0
      }
901
0
    break;
902
903
0
  case R_RX_RH_24_UNS:
904
0
    UNSAFE_FOR_PID;
905
0
    WARN_REDHAT ("RX_RH_24_UNS");
906
0
    RANGE (0, 0xffffff);
907
#if RX_OPCODE_BIG_ENDIAN
908
    OP (2) = relocation;
909
    OP (1) = relocation >> 8;
910
    OP (0) = relocation >> 16;
911
#else
912
0
    OP (0) = relocation;
913
0
    OP (1) = relocation >> 8;
914
0
    OP (2) = relocation >> 16;
915
0
#endif
916
0
    break;
917
918
0
  case R_RX_RH_32_NEG:
919
0
    UNSAFE_FOR_PID;
920
0
    WARN_REDHAT ("RX_RH_32_NEG");
921
0
    relocation = - relocation;
922
#if RX_OPCODE_BIG_ENDIAN
923
    OP (3) = relocation;
924
    OP (2) = relocation >> 8;
925
    OP (1) = relocation >> 16;
926
    OP (0) = relocation >> 24;
927
#else
928
0
    OP (0) = relocation;
929
0
    OP (1) = relocation >> 8;
930
0
    OP (2) = relocation >> 16;
931
0
    OP (3) = relocation >> 24;
932
0
#endif
933
0
    break;
934
935
0
  case R_RX_RH_32_OP:
936
0
    UNSAFE_FOR_PID;
937
0
    WARN_REDHAT ("RX_RH_32_OP");
938
#if RX_OPCODE_BIG_ENDIAN
939
    OP (3) = relocation;
940
    OP (2) = relocation >> 8;
941
    OP (1) = relocation >> 16;
942
    OP (0) = relocation >> 24;
943
#else
944
0
    OP (0) = relocation;
945
0
    OP (1) = relocation >> 8;
946
0
    OP (2) = relocation >> 16;
947
0
    OP (3) = relocation >> 24;
948
0
#endif
949
0
    break;
950
951
0
  case R_RX_DIR32:
952
0
    if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
953
0
      {
954
0
        OP (3) = relocation;
955
0
        OP (2) = relocation >> 8;
956
0
        OP (1) = relocation >> 16;
957
0
        OP (0) = relocation >> 24;
958
0
      }
959
0
    else
960
0
      {
961
0
        OP (0) = relocation;
962
0
        OP (1) = relocation >> 8;
963
0
        OP (2) = relocation >> 16;
964
0
        OP (3) = relocation >> 24;
965
0
      }
966
0
    break;
967
968
0
  case R_RX_DIR32_REV:
969
0
    if (BIGE (output_bfd))
970
0
      {
971
0
        OP (0) = relocation;
972
0
        OP (1) = relocation >> 8;
973
0
        OP (2) = relocation >> 16;
974
0
        OP (3) = relocation >> 24;
975
0
      }
976
0
    else
977
0
      {
978
0
        OP (3) = relocation;
979
0
        OP (2) = relocation >> 8;
980
0
        OP (1) = relocation >> 16;
981
0
        OP (0) = relocation >> 24;
982
0
      }
983
0
    break;
984
985
0
  case R_RX_RH_DIFF:
986
0
    {
987
0
      bfd_vma val;
988
0
      WARN_REDHAT ("RX_RH_DIFF");
989
0
      val = bfd_get_32 (output_bfd, & OP (0));
990
0
      val -= relocation;
991
0
      bfd_put_32 (output_bfd, val, & OP (0));
992
0
    }
993
0
    break;
994
995
0
  case R_RX_RH_GPRELB:
996
0
    WARN_REDHAT ("RX_RH_GPRELB");
997
0
    relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
998
0
    RANGE (0, 65535);
999
#if RX_OPCODE_BIG_ENDIAN
1000
    OP (1) = relocation;
1001
    OP (0) = relocation >> 8;
1002
#else
1003
0
    OP (0) = relocation;
1004
0
    OP (1) = relocation >> 8;
1005
0
#endif
1006
0
    break;
1007
1008
0
  case R_RX_RH_GPRELW:
1009
0
    WARN_REDHAT ("RX_RH_GPRELW");
1010
0
    relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
1011
0
    ALIGN (1);
1012
0
    relocation >>= 1;
1013
0
    RANGE (0, 65535);
1014
#if RX_OPCODE_BIG_ENDIAN
1015
    OP (1) = relocation;
1016
    OP (0) = relocation >> 8;
1017
#else
1018
0
    OP (0) = relocation;
1019
0
    OP (1) = relocation >> 8;
1020
0
#endif
1021
0
    break;
1022
1023
0
  case R_RX_RH_GPRELL:
1024
0
    WARN_REDHAT ("RX_RH_GPRELL");
1025
0
    relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
1026
0
    ALIGN (3);
1027
0
    relocation >>= 2;
1028
0
    RANGE (0, 65535);
1029
#if RX_OPCODE_BIG_ENDIAN
1030
    OP (1) = relocation;
1031
    OP (0) = relocation >> 8;
1032
#else
1033
0
    OP (0) = relocation;
1034
0
    OP (1) = relocation >> 8;
1035
0
#endif
1036
0
    break;
1037
1038
  /* Internal relocations just for relaxation:  */
1039
0
  case R_RX_RH_ABS5p5B:
1040
0
    RX_STACK_POP (relocation);
1041
0
    RANGE (0, 31);
1042
0
    OP (0) &= 0xf8;
1043
0
    OP (0) |= relocation >> 2;
1044
0
    OP (1) &= 0x77;
1045
0
    OP (1) |= (relocation << 6) & 0x80;
1046
0
    OP (1) |= (relocation << 3) & 0x08;
1047
0
    break;
1048
1049
0
  case R_RX_RH_ABS5p5W:
1050
0
    RX_STACK_POP (relocation);
1051
0
    RANGE (0, 62);
1052
0
    ALIGN (1);
1053
0
    relocation >>= 1;
1054
0
    OP (0) &= 0xf8;
1055
0
    OP (0) |= relocation >> 2;
1056
0
    OP (1) &= 0x77;
1057
0
    OP (1) |= (relocation << 6) & 0x80;
1058
0
    OP (1) |= (relocation << 3) & 0x08;
1059
0
    break;
1060
1061
0
  case R_RX_RH_ABS5p5L:
1062
0
    RX_STACK_POP (relocation);
1063
0
    RANGE (0, 124);
1064
0
    ALIGN (3);
1065
0
    relocation >>= 2;
1066
0
    OP (0) &= 0xf8;
1067
0
    OP (0) |= relocation >> 2;
1068
0
    OP (1) &= 0x77;
1069
0
    OP (1) |= (relocation << 6) & 0x80;
1070
0
    OP (1) |= (relocation << 3) & 0x08;
1071
0
    break;
1072
1073
0
  case R_RX_RH_ABS5p8B:
1074
0
    RX_STACK_POP (relocation);
1075
0
    RANGE (0, 31);
1076
0
    OP (0) &= 0x70;
1077
0
    OP (0) |= (relocation << 3) & 0x80;
1078
0
    OP (0) |= relocation & 0x0f;
1079
0
    break;
1080
1081
0
  case R_RX_RH_ABS5p8W:
1082
0
    RX_STACK_POP (relocation);
1083
0
    RANGE (0, 62);
1084
0
    ALIGN (1);
1085
0
    relocation >>= 1;
1086
0
    OP (0) &= 0x70;
1087
0
    OP (0) |= (relocation << 3) & 0x80;
1088
0
    OP (0) |= relocation & 0x0f;
1089
0
    break;
1090
1091
0
  case R_RX_RH_ABS5p8L:
1092
0
    RX_STACK_POP (relocation);
1093
0
    RANGE (0, 124);
1094
0
    ALIGN (3);
1095
0
    relocation >>= 2;
1096
0
    OP (0) &= 0x70;
1097
0
    OP (0) |= (relocation << 3) & 0x80;
1098
0
    OP (0) |= relocation & 0x0f;
1099
0
    break;
1100
1101
0
  case R_RX_RH_UIMM4p8:
1102
0
    RANGE (0, 15);
1103
0
    OP (0) &= 0x0f;
1104
0
    OP (0) |= relocation << 4;
1105
0
    break;
1106
1107
0
  case R_RX_RH_UNEG4p8:
1108
0
    RANGE (-15, 0);
1109
0
    OP (0) &= 0x0f;
1110
0
    OP (0) |= (-relocation) << 4;
1111
0
    break;
1112
1113
    /* Complex reloc handling:  */
1114
1115
0
  case R_RX_ABS32:
1116
0
    UNSAFE_FOR_PID;
1117
0
    RX_STACK_POP (relocation);
1118
#if RX_OPCODE_BIG_ENDIAN
1119
    OP (3) = relocation;
1120
    OP (2) = relocation >> 8;
1121
    OP (1) = relocation >> 16;
1122
    OP (0) = relocation >> 24;
1123
#else
1124
0
    OP (0) = relocation;
1125
0
    OP (1) = relocation >> 8;
1126
0
    OP (2) = relocation >> 16;
1127
0
    OP (3) = relocation >> 24;
1128
0
#endif
1129
0
    break;
1130
1131
0
  case R_RX_ABS32_REV:
1132
0
    UNSAFE_FOR_PID;
1133
0
    RX_STACK_POP (relocation);
1134
#if RX_OPCODE_BIG_ENDIAN
1135
    OP (0) = relocation;
1136
    OP (1) = relocation >> 8;
1137
    OP (2) = relocation >> 16;
1138
    OP (3) = relocation >> 24;
1139
#else
1140
0
    OP (3) = relocation;
1141
0
    OP (2) = relocation >> 8;
1142
0
    OP (1) = relocation >> 16;
1143
0
    OP (0) = relocation >> 24;
1144
0
#endif
1145
0
    break;
1146
1147
0
  case R_RX_ABS24S_PCREL:
1148
0
  case R_RX_ABS24S:
1149
0
    UNSAFE_FOR_PID;
1150
0
    RX_STACK_POP (relocation);
1151
0
    RANGE (-0x800000, 0x7fffff);
1152
0
    if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1153
0
      {
1154
0
        OP (2) = relocation;
1155
0
        OP (1) = relocation >> 8;
1156
0
        OP (0) = relocation >> 16;
1157
0
      }
1158
0
    else
1159
0
      {
1160
0
        OP (0) = relocation;
1161
0
        OP (1) = relocation >> 8;
1162
0
        OP (2) = relocation >> 16;
1163
0
      }
1164
0
    break;
1165
1166
0
  case R_RX_ABS16:
1167
0
    UNSAFE_FOR_PID;
1168
0
    RX_STACK_POP (relocation);
1169
0
    RANGE (-32768, 65535);
1170
#if RX_OPCODE_BIG_ENDIAN
1171
    OP (1) = relocation;
1172
    OP (0) = relocation >> 8;
1173
#else
1174
0
    OP (0) = relocation;
1175
0
    OP (1) = relocation >> 8;
1176
0
#endif
1177
0
    break;
1178
1179
0
  case R_RX_ABS16_REV:
1180
0
    UNSAFE_FOR_PID;
1181
0
    RX_STACK_POP (relocation);
1182
0
    RANGE (-32768, 65535);
1183
#if RX_OPCODE_BIG_ENDIAN
1184
    OP (0) = relocation;
1185
    OP (1) = relocation >> 8;
1186
#else
1187
0
    OP (1) = relocation;
1188
0
    OP (0) = relocation >> 8;
1189
0
#endif
1190
0
    break;
1191
1192
0
  case R_RX_ABS16S_PCREL:
1193
0
  case R_RX_ABS16S:
1194
0
    RX_STACK_POP (relocation);
1195
0
    RANGE (-32768, 32767);
1196
0
    if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1197
0
      {
1198
0
        OP (1) = relocation;
1199
0
        OP (0) = relocation >> 8;
1200
0
      }
1201
0
    else
1202
0
      {
1203
0
        OP (0) = relocation;
1204
0
        OP (1) = relocation >> 8;
1205
0
      }
1206
0
    break;
1207
1208
0
  case R_RX_ABS16U:
1209
0
    UNSAFE_FOR_PID;
1210
0
    RX_STACK_POP (relocation);
1211
0
    RANGE (0, 65536);
1212
#if RX_OPCODE_BIG_ENDIAN
1213
    OP (1) = relocation;
1214
    OP (0) = relocation >> 8;
1215
#else
1216
0
    OP (0) = relocation;
1217
0
    OP (1) = relocation >> 8;
1218
0
#endif
1219
0
    break;
1220
1221
0
  case R_RX_ABS16UL:
1222
0
    UNSAFE_FOR_PID;
1223
0
    RX_STACK_POP (relocation);
1224
0
    relocation >>= 2;
1225
0
    RANGE (0, 65536);
1226
#if RX_OPCODE_BIG_ENDIAN
1227
    OP (1) = relocation;
1228
    OP (0) = relocation >> 8;
1229
#else
1230
0
    OP (0) = relocation;
1231
0
    OP (1) = relocation >> 8;
1232
0
#endif
1233
0
    break;
1234
1235
0
  case R_RX_ABS16UW:
1236
0
    UNSAFE_FOR_PID;
1237
0
    RX_STACK_POP (relocation);
1238
0
    relocation >>= 1;
1239
0
    RANGE (0, 65536);
1240
#if RX_OPCODE_BIG_ENDIAN
1241
    OP (1) = relocation;
1242
    OP (0) = relocation >> 8;
1243
#else
1244
0
    OP (0) = relocation;
1245
0
    OP (1) = relocation >> 8;
1246
0
#endif
1247
0
    break;
1248
1249
0
  case R_RX_ABS8:
1250
0
    UNSAFE_FOR_PID;
1251
0
    RX_STACK_POP (relocation);
1252
0
    RANGE (-128, 255);
1253
0
    OP (0) = relocation;
1254
0
    break;
1255
1256
0
  case R_RX_ABS8U:
1257
0
    UNSAFE_FOR_PID;
1258
0
    RX_STACK_POP (relocation);
1259
0
    RANGE (0, 255);
1260
0
    OP (0) = relocation;
1261
0
    break;
1262
1263
0
  case R_RX_ABS8UL:
1264
0
    UNSAFE_FOR_PID;
1265
0
    RX_STACK_POP (relocation);
1266
0
    relocation >>= 2;
1267
0
    RANGE (0, 255);
1268
0
    OP (0) = relocation;
1269
0
    break;
1270
1271
0
  case R_RX_ABS8UW:
1272
0
    UNSAFE_FOR_PID;
1273
0
    RX_STACK_POP (relocation);
1274
0
    relocation >>= 1;
1275
0
    RANGE (0, 255);
1276
0
    OP (0) = relocation;
1277
0
    break;
1278
1279
0
  case R_RX_ABS8S:
1280
0
    UNSAFE_FOR_PID;
1281
    /* Fall through.  */
1282
0
  case R_RX_ABS8S_PCREL:
1283
0
    RX_STACK_POP (relocation);
1284
0
    RANGE (-128, 127);
1285
0
    OP (0) = relocation;
1286
0
    break;
1287
1288
0
  case R_RX_SYM:
1289
0
    if (r_symndx < symtab_hdr->sh_info)
1290
0
      RX_STACK_PUSH (sec->output_section->vma
1291
0
         + sec->output_offset
1292
0
         + sym->st_value
1293
0
         + rel->r_addend);
1294
0
    else
1295
0
      {
1296
0
        if (h != NULL
1297
0
      && (h->root.type == bfd_link_hash_defined
1298
0
          || h->root.type == bfd_link_hash_defweak))
1299
0
    RX_STACK_PUSH (h->root.u.def.value
1300
0
             + sec->output_section->vma
1301
0
             + sec->output_offset
1302
0
             + rel->r_addend);
1303
0
        else
1304
0
    _bfd_error_handler
1305
0
      (_("warning: RX_SYM reloc with an unknown symbol"));
1306
0
      }
1307
0
    break;
1308
1309
0
  case R_RX_OPneg:
1310
0
    {
1311
0
      int32_t tmp;
1312
1313
0
      saw_subtract = true;
1314
0
      RX_STACK_POP (tmp);
1315
0
      tmp = - tmp;
1316
0
      RX_STACK_PUSH (tmp);
1317
0
    }
1318
0
    break;
1319
1320
0
  case R_RX_OPadd:
1321
0
    {
1322
0
      int32_t tmp1, tmp2;
1323
1324
0
      RX_STACK_POP (tmp1);
1325
0
      RX_STACK_POP (tmp2);
1326
0
      tmp1 += tmp2;
1327
0
      RX_STACK_PUSH (tmp1);
1328
0
    }
1329
0
    break;
1330
1331
0
  case R_RX_OPsub:
1332
0
    {
1333
0
      int32_t tmp1, tmp2;
1334
1335
0
      saw_subtract = true;
1336
0
      RX_STACK_POP (tmp1);
1337
0
      RX_STACK_POP (tmp2);
1338
0
      tmp2 -= tmp1;
1339
0
      RX_STACK_PUSH (tmp2);
1340
0
    }
1341
0
    break;
1342
1343
0
  case R_RX_OPmul:
1344
0
    {
1345
0
      int32_t tmp1, tmp2;
1346
1347
0
      RX_STACK_POP (tmp1);
1348
0
      RX_STACK_POP (tmp2);
1349
0
      tmp1 *= tmp2;
1350
0
      RX_STACK_PUSH (tmp1);
1351
0
    }
1352
0
    break;
1353
1354
0
  case R_RX_OPdiv:
1355
0
    {
1356
0
      int32_t tmp1, tmp2;
1357
1358
0
      RX_STACK_POP (tmp1);
1359
0
      RX_STACK_POP (tmp2);
1360
0
      tmp1 /= tmp2;
1361
0
      RX_STACK_PUSH (tmp1);
1362
0
    }
1363
0
    break;
1364
1365
0
  case R_RX_OPshla:
1366
0
    {
1367
0
      int32_t tmp1, tmp2;
1368
1369
0
      RX_STACK_POP (tmp1);
1370
0
      RX_STACK_POP (tmp2);
1371
0
      tmp1 <<= tmp2;
1372
0
      RX_STACK_PUSH (tmp1);
1373
0
    }
1374
0
    break;
1375
1376
0
  case R_RX_OPshra:
1377
0
    {
1378
0
      int32_t tmp1, tmp2;
1379
1380
0
      RX_STACK_POP (tmp1);
1381
0
      RX_STACK_POP (tmp2);
1382
0
      tmp1 >>= tmp2;
1383
0
      RX_STACK_PUSH (tmp1);
1384
0
    }
1385
0
    break;
1386
1387
0
  case R_RX_OPsctsize:
1388
0
    RX_STACK_PUSH (input_section->size);
1389
0
    break;
1390
1391
0
  case R_RX_OPscttop:
1392
0
    RX_STACK_PUSH (input_section->output_section->vma);
1393
0
    break;
1394
1395
0
  case R_RX_OPand:
1396
0
    {
1397
0
      int32_t tmp1, tmp2;
1398
1399
0
      RX_STACK_POP (tmp1);
1400
0
      RX_STACK_POP (tmp2);
1401
0
      tmp1 &= tmp2;
1402
0
      RX_STACK_PUSH (tmp1);
1403
0
    }
1404
0
    break;
1405
1406
0
  case R_RX_OPor:
1407
0
    {
1408
0
      int32_t tmp1, tmp2;
1409
1410
0
      RX_STACK_POP (tmp1);
1411
0
      RX_STACK_POP (tmp2);
1412
0
      tmp1 |= tmp2;
1413
0
      RX_STACK_PUSH (tmp1);
1414
0
    }
1415
0
    break;
1416
1417
0
  case R_RX_OPxor:
1418
0
    {
1419
0
      int32_t tmp1, tmp2;
1420
1421
0
      RX_STACK_POP (tmp1);
1422
0
      RX_STACK_POP (tmp2);
1423
0
      tmp1 ^= tmp2;
1424
0
      RX_STACK_PUSH (tmp1);
1425
0
    }
1426
0
    break;
1427
1428
0
  case R_RX_OPnot:
1429
0
    {
1430
0
      int32_t tmp;
1431
1432
0
      RX_STACK_POP (tmp);
1433
0
      tmp = ~ tmp;
1434
0
      RX_STACK_PUSH (tmp);
1435
0
    }
1436
0
    break;
1437
1438
0
  case R_RX_OPmod:
1439
0
    {
1440
0
      int32_t tmp1, tmp2;
1441
1442
0
      RX_STACK_POP (tmp1);
1443
0
      RX_STACK_POP (tmp2);
1444
0
      tmp1 %= tmp2;
1445
0
      RX_STACK_PUSH (tmp1);
1446
0
    }
1447
0
    break;
1448
1449
0
  case R_RX_OPromtop:
1450
0
    RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1451
0
    break;
1452
1453
0
  case R_RX_OPramtop:
1454
0
    RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1455
0
    break;
1456
1457
0
  default:
1458
0
    r = bfd_reloc_notsupported;
1459
0
    break;
1460
0
  }
1461
1462
0
      if (r != bfd_reloc_ok)
1463
0
  {
1464
0
    const char * msg = NULL;
1465
1466
0
    switch (r)
1467
0
      {
1468
0
      case bfd_reloc_overflow:
1469
        /* Catch the case of a missing function declaration
1470
     and emit a more helpful error message.  */
1471
0
        if (r_type == R_RX_DIR24S_PCREL)
1472
    /* xgettext:c-format */
1473
0
    msg = _("%pB(%pA): error: call to undefined function '%s'");
1474
0
        else
1475
0
    (*info->callbacks->reloc_overflow)
1476
0
      (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1477
0
       input_bfd, input_section, rel->r_offset);
1478
0
        break;
1479
1480
0
      case bfd_reloc_undefined:
1481
0
        (*info->callbacks->undefined_symbol)
1482
0
    (info, name, input_bfd, input_section, rel->r_offset, true);
1483
0
        break;
1484
1485
0
      case bfd_reloc_other:
1486
        /* xgettext:c-format */
1487
0
        msg = _("%pB(%pA): warning: unaligned access to symbol '%s' in the small data area");
1488
0
        break;
1489
1490
0
      case bfd_reloc_outofrange:
1491
        /* xgettext:c-format */
1492
0
        msg = _("%pB(%pA): internal error: out of range error");
1493
0
        break;
1494
1495
0
      case bfd_reloc_notsupported:
1496
        /* xgettext:c-format */
1497
0
        msg = _("%pB(%pA): internal error: unsupported relocation error");
1498
0
        break;
1499
1500
0
      case bfd_reloc_dangerous:
1501
        /* xgettext:c-format */
1502
0
        msg = _("%pB(%pA): internal error: dangerous relocation");
1503
0
        break;
1504
1505
0
      default:
1506
        /* xgettext:c-format */
1507
0
        msg = _("%pB(%pA): internal error: unknown error");
1508
0
        break;
1509
0
      }
1510
1511
0
    if (msg)
1512
0
      _bfd_error_handler (msg, input_bfd, input_section, name);
1513
0
  }
1514
0
    }
1515
1516
0
  return true;
1517
0
}
1518

1519
/* Relaxation Support.  */
1520
1521
/* Progression of relocations from largest operand size to smallest
1522
   operand size.  */
1523
1524
static int
1525
next_smaller_reloc (int r)
1526
0
{
1527
0
  switch (r)
1528
0
    {
1529
0
    case R_RX_DIR32:    return R_RX_DIR24S;
1530
0
    case R_RX_DIR24S:   return R_RX_DIR16S;
1531
0
    case R_RX_DIR16S:   return R_RX_DIR8S;
1532
0
    case R_RX_DIR8S:    return R_RX_NONE;
1533
1534
0
    case R_RX_DIR16:    return R_RX_DIR8;
1535
0
    case R_RX_DIR8:   return R_RX_NONE;
1536
1537
0
    case R_RX_DIR16U:   return R_RX_DIR8U;
1538
0
    case R_RX_DIR8U:    return R_RX_NONE;
1539
1540
0
    case R_RX_DIR24S_PCREL: return R_RX_DIR16S_PCREL;
1541
0
    case R_RX_DIR16S_PCREL: return R_RX_DIR8S_PCREL;
1542
0
    case R_RX_DIR8S_PCREL:  return R_RX_DIR3U_PCREL;
1543
1544
0
    case R_RX_DIR16UL:    return R_RX_DIR8UL;
1545
0
    case R_RX_DIR8UL:   return R_RX_NONE;
1546
0
    case R_RX_DIR16UW:    return R_RX_DIR8UW;
1547
0
    case R_RX_DIR8UW:   return R_RX_NONE;
1548
1549
0
    case R_RX_RH_32_OP:   return R_RX_RH_24_OP;
1550
0
    case R_RX_RH_24_OP:   return R_RX_RH_16_OP;
1551
0
    case R_RX_RH_16_OP:   return R_RX_DIR8;
1552
1553
0
    case R_RX_ABS32:    return R_RX_ABS24S;
1554
0
    case R_RX_ABS24S:   return R_RX_ABS16S;
1555
0
    case R_RX_ABS16:    return R_RX_ABS8;
1556
0
    case R_RX_ABS16U:   return R_RX_ABS8U;
1557
0
    case R_RX_ABS16S:   return R_RX_ABS8S;
1558
0
    case R_RX_ABS8:   return R_RX_NONE;
1559
0
    case R_RX_ABS8U:    return R_RX_NONE;
1560
0
    case R_RX_ABS8S:    return R_RX_NONE;
1561
0
    case R_RX_ABS24S_PCREL: return R_RX_ABS16S_PCREL;
1562
0
    case R_RX_ABS16S_PCREL: return R_RX_ABS8S_PCREL;
1563
0
    case R_RX_ABS8S_PCREL:  return R_RX_NONE;
1564
0
    case R_RX_ABS16UL:    return R_RX_ABS8UL;
1565
0
    case R_RX_ABS16UW:    return R_RX_ABS8UW;
1566
0
    case R_RX_ABS8UL:   return R_RX_NONE;
1567
0
    case R_RX_ABS8UW:   return R_RX_NONE;
1568
0
    }
1569
0
  return r;
1570
0
};
1571
1572
/* Delete some bytes from a section while relaxing.  */
1573
1574
static bool
1575
elf32_rx_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1576
           Elf_Internal_Rela *alignment_rel, int force_snip,
1577
           Elf_Internal_Rela *irelstart)
1578
0
{
1579
0
  Elf_Internal_Shdr * symtab_hdr;
1580
0
  unsigned int        sec_shndx;
1581
0
  bfd_byte *        contents;
1582
0
  Elf_Internal_Rela * irel;
1583
0
  Elf_Internal_Rela * irelend;
1584
0
  Elf_Internal_Sym *  isym;
1585
0
  Elf_Internal_Sym *  isymend;
1586
0
  bfd_vma       toaddr;
1587
0
  unsigned int        symcount;
1588
0
  struct elf_link_hash_entry ** sym_hashes;
1589
0
  struct elf_link_hash_entry ** end_hashes;
1590
1591
0
  if (!alignment_rel)
1592
0
    force_snip = 1;
1593
1594
0
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1595
1596
0
  contents = elf_section_data (sec)->this_hdr.contents;
1597
1598
  /* The deletion must stop at the next alignment boundary, if
1599
     ALIGNMENT_REL is non-NULL.  */
1600
0
  toaddr = sec->size;
1601
0
  if (alignment_rel)
1602
0
    toaddr = alignment_rel->r_offset;
1603
1604
0
  BFD_ASSERT (toaddr > addr);
1605
1606
  /* Actually delete the bytes.  */
1607
0
  memmove (contents + addr, contents + addr + count,
1608
0
     (size_t) (toaddr - addr - count));
1609
1610
  /* If we don't have an alignment marker to worry about, we can just
1611
     shrink the section.  Otherwise, we have to fill in the newly
1612
     created gap with NOP insns (0x03).  */
1613
0
  if (force_snip)
1614
0
    sec->size -= count;
1615
0
  else
1616
0
    memset (contents + toaddr - count, 0x03, count);
1617
1618
0
  irel = irelstart;
1619
0
  BFD_ASSERT (irel != NULL || sec->reloc_count == 0);
1620
0
  irelend = irel + sec->reloc_count;
1621
1622
  /* Adjust all the relocs.  */
1623
0
  for (; irel < irelend; irel++)
1624
0
    {
1625
      /* Get the new reloc address.  */
1626
0
      if (irel->r_offset > addr
1627
0
    && (irel->r_offset < toaddr
1628
0
        || (force_snip && irel->r_offset == toaddr)))
1629
0
  irel->r_offset -= count;
1630
1631
      /* If we see an ALIGN marker at the end of the gap, we move it
1632
   to the beginning of the gap, since marking these gaps is what
1633
   they're for.  */
1634
0
      if (irel->r_offset == toaddr
1635
0
    && ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
1636
0
    && irel->r_addend & RX_RELAXA_ALIGN)
1637
0
  irel->r_offset -= count;
1638
0
    }
1639
1640
  /* Adjust the local symbols defined in this section.  */
1641
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1642
0
  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1643
0
  isymend = isym + symtab_hdr->sh_info;
1644
1645
0
  for (; isym < isymend; isym++)
1646
0
    {
1647
      /* If the symbol is in the range of memory we just moved, we
1648
   have to adjust its value.  */
1649
0
      if (isym->st_shndx == sec_shndx
1650
0
    && isym->st_value > addr
1651
0
    && isym->st_value < toaddr)
1652
0
  isym->st_value -= count;
1653
1654
      /* If the symbol *spans* the bytes we just deleted (i.e. it's
1655
   *end* is in the moved bytes but it's *start* isn't), then we
1656
   must adjust its size.  */
1657
0
      if (isym->st_shndx == sec_shndx
1658
0
    && isym->st_value < addr
1659
0
    && isym->st_value + isym->st_size > addr
1660
0
    && isym->st_value + isym->st_size < toaddr)
1661
0
  isym->st_size -= count;
1662
0
    }
1663
1664
  /* Now adjust the global symbols defined in this section.  */
1665
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1666
0
        - symtab_hdr->sh_info);
1667
0
  sym_hashes = elf_sym_hashes (abfd);
1668
0
  end_hashes = sym_hashes + symcount;
1669
1670
0
  for (; sym_hashes < end_hashes; sym_hashes++)
1671
0
    {
1672
0
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
1673
1674
0
      if ((sym_hash->root.type == bfd_link_hash_defined
1675
0
     || sym_hash->root.type == bfd_link_hash_defweak)
1676
0
    && sym_hash->root.u.def.section == sec)
1677
0
  {
1678
    /* As above, adjust the value if needed.  */
1679
0
    if (sym_hash->root.u.def.value > addr
1680
0
        && sym_hash->root.u.def.value < toaddr)
1681
0
      sym_hash->root.u.def.value -= count;
1682
1683
    /* As above, adjust the size if needed.  */
1684
0
    if (sym_hash->root.u.def.value < addr
1685
0
        && sym_hash->root.u.def.value + sym_hash->size > addr
1686
0
        && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1687
0
      sym_hash->size -= count;
1688
0
  }
1689
0
    }
1690
1691
0
  return true;
1692
0
}
1693
1694
/* Used to sort relocs by address.  If relocs have the same address,
1695
   we maintain their relative order, except that R_RX_RH_RELAX
1696
   alignment relocs must be the first reloc for any given address.  */
1697
1698
static void
1699
reloc_bubblesort (Elf_Internal_Rela * r, int count)
1700
0
{
1701
0
  int i;
1702
0
  bool again;
1703
0
  bool swappit;
1704
1705
  /* This is almost a classic bubblesort.  It's the slowest sort, but
1706
     we're taking advantage of the fact that the relocations are
1707
     mostly in order already (the assembler emits them that way) and
1708
     we need relocs with the same address to remain in the same
1709
     relative order.  */
1710
0
  again = true;
1711
0
  while (again)
1712
0
    {
1713
0
      again = false;
1714
0
      for (i = 0; i < count - 1; i ++)
1715
0
  {
1716
0
    if (r[i].r_offset > r[i + 1].r_offset)
1717
0
      swappit = true;
1718
0
    else if (r[i].r_offset < r[i + 1].r_offset)
1719
0
      swappit = false;
1720
0
    else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1721
0
       && (r[i + 1].r_addend & RX_RELAXA_ALIGN))
1722
0
      swappit = true;
1723
0
    else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1724
0
       && (r[i + 1].r_addend & RX_RELAXA_ELIGN)
1725
0
       && !(ELF32_R_TYPE (r[i].r_info) == R_RX_RH_RELAX
1726
0
      && (r[i].r_addend & RX_RELAXA_ALIGN)))
1727
0
      swappit = true;
1728
0
    else
1729
0
      swappit = false;
1730
1731
0
    if (swappit)
1732
0
      {
1733
0
        Elf_Internal_Rela tmp;
1734
1735
0
        tmp = r[i];
1736
0
        r[i] = r[i + 1];
1737
0
        r[i + 1] = tmp;
1738
        /* If we do move a reloc back, re-scan to see if it
1739
     needs to be moved even further back.  This avoids
1740
     most of the O(n^2) behavior for our cases.  */
1741
0
        if (i > 0)
1742
0
    i -= 2;
1743
0
        again = true;
1744
0
      }
1745
0
  }
1746
0
    }
1747
0
}
1748
1749
1750
#define OFFSET_FOR_RELOC(rel, lrel, scale) \
1751
0
  rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1752
0
           lrel, abfd, sec, link_info, scale)
1753
1754
static bfd_vma
1755
rx_offset_for_reloc (bfd *          abfd,
1756
         Elf_Internal_Rela *      rel,
1757
         Elf_Internal_Shdr *      symtab_hdr,
1758
         bfd_byte *         shndx_buf ATTRIBUTE_UNUSED,
1759
         Elf_Internal_Sym *       intsyms,
1760
         Elf_Internal_Rela **     lrel,
1761
         bfd *          input_bfd,
1762
         asection *         input_section,
1763
         struct bfd_link_info *   info,
1764
         int *          scale)
1765
0
{
1766
0
  bfd_vma symval;
1767
0
  bfd_reloc_status_type r;
1768
1769
0
  *scale = 1;
1770
1771
  /* REL is the first of 1..N relocations.  We compute the symbol
1772
     value for each relocation, then combine them if needed.  LREL
1773
     gets a pointer to the last relocation used.  */
1774
0
  while (1)
1775
0
    {
1776
0
      int32_t tmp1, tmp2;
1777
1778
      /* Get the value of the symbol referred to by the reloc.  */
1779
0
      if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1780
0
  {
1781
    /* A local symbol.  */
1782
0
    Elf_Internal_Sym *isym;
1783
0
    asection *ssec;
1784
1785
0
    isym = intsyms + ELF32_R_SYM (rel->r_info);
1786
1787
0
    if (isym->st_shndx == SHN_UNDEF)
1788
0
      ssec = bfd_und_section_ptr;
1789
0
    else if (isym->st_shndx == SHN_ABS)
1790
0
      ssec = bfd_abs_section_ptr;
1791
0
    else if (isym->st_shndx == SHN_COMMON)
1792
0
      ssec = bfd_com_section_ptr;
1793
0
    else
1794
0
      ssec = bfd_section_from_elf_index (abfd,
1795
0
                 isym->st_shndx);
1796
1797
    /* Initial symbol value.  */
1798
0
    symval = isym->st_value;
1799
1800
    /* GAS may have made this symbol relative to a section, in
1801
       which case, we have to add the addend to find the
1802
       symbol.  */
1803
0
    if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1804
0
      symval += rel->r_addend;
1805
1806
0
    if (ssec)
1807
0
      {
1808
0
        if ((ssec->flags & SEC_MERGE)
1809
0
      && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1810
0
    symval = _bfd_merged_section_offset (abfd, & ssec, symval);
1811
0
      }
1812
1813
    /* Now make the offset relative to where the linker is putting it.  */
1814
0
    if (ssec)
1815
0
      symval +=
1816
0
        ssec->output_section->vma + ssec->output_offset;
1817
1818
0
    symval += rel->r_addend;
1819
0
  }
1820
0
      else
1821
0
  {
1822
0
    unsigned long indx;
1823
0
    struct elf_link_hash_entry * h;
1824
1825
    /* An external symbol.  */
1826
0
    indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1827
0
    h = elf_sym_hashes (abfd)[indx];
1828
0
    BFD_ASSERT (h != NULL);
1829
1830
0
    if (h->root.type != bfd_link_hash_defined
1831
0
        && h->root.type != bfd_link_hash_defweak)
1832
0
      {
1833
        /* This appears to be a reference to an undefined
1834
     symbol.  Just ignore it--it will be caught by the
1835
     regular reloc processing.  */
1836
0
        if (lrel)
1837
0
    *lrel = rel;
1838
0
        return 0;
1839
0
      }
1840
1841
0
    symval = (h->root.u.def.value
1842
0
        + h->root.u.def.section->output_section->vma
1843
0
        + h->root.u.def.section->output_offset);
1844
1845
0
    symval += rel->r_addend;
1846
0
  }
1847
1848
0
      switch (ELF32_R_TYPE (rel->r_info))
1849
0
  {
1850
0
  case R_RX_SYM:
1851
0
    RX_STACK_PUSH (symval);
1852
0
    break;
1853
1854
0
  case R_RX_OPneg:
1855
0
    RX_STACK_POP (tmp1);
1856
0
    tmp1 = - tmp1;
1857
0
    RX_STACK_PUSH (tmp1);
1858
0
    break;
1859
1860
0
  case R_RX_OPadd:
1861
0
    RX_STACK_POP (tmp1);
1862
0
    RX_STACK_POP (tmp2);
1863
0
    tmp1 += tmp2;
1864
0
    RX_STACK_PUSH (tmp1);
1865
0
    break;
1866
1867
0
  case R_RX_OPsub:
1868
0
    RX_STACK_POP (tmp1);
1869
0
    RX_STACK_POP (tmp2);
1870
0
    tmp2 -= tmp1;
1871
0
    RX_STACK_PUSH (tmp2);
1872
0
    break;
1873
1874
0
  case R_RX_OPmul:
1875
0
    RX_STACK_POP (tmp1);
1876
0
    RX_STACK_POP (tmp2);
1877
0
    tmp1 *= tmp2;
1878
0
    RX_STACK_PUSH (tmp1);
1879
0
    break;
1880
1881
0
  case R_RX_OPdiv:
1882
0
    RX_STACK_POP (tmp1);
1883
0
    RX_STACK_POP (tmp2);
1884
0
    tmp1 /= tmp2;
1885
0
    RX_STACK_PUSH (tmp1);
1886
0
    break;
1887
1888
0
  case R_RX_OPshla:
1889
0
    RX_STACK_POP (tmp1);
1890
0
    RX_STACK_POP (tmp2);
1891
0
    tmp1 <<= tmp2;
1892
0
    RX_STACK_PUSH (tmp1);
1893
0
    break;
1894
1895
0
  case R_RX_OPshra:
1896
0
    RX_STACK_POP (tmp1);
1897
0
    RX_STACK_POP (tmp2);
1898
0
    tmp1 >>= tmp2;
1899
0
    RX_STACK_PUSH (tmp1);
1900
0
    break;
1901
1902
0
  case R_RX_OPsctsize:
1903
0
    RX_STACK_PUSH (input_section->size);
1904
0
    break;
1905
1906
0
  case R_RX_OPscttop:
1907
0
    RX_STACK_PUSH (input_section->output_section->vma);
1908
0
    break;
1909
1910
0
  case R_RX_OPand:
1911
0
    RX_STACK_POP (tmp1);
1912
0
    RX_STACK_POP (tmp2);
1913
0
    tmp1 &= tmp2;
1914
0
    RX_STACK_PUSH (tmp1);
1915
0
    break;
1916
1917
0
  case R_RX_OPor:
1918
0
    RX_STACK_POP (tmp1);
1919
0
    RX_STACK_POP (tmp2);
1920
0
    tmp1 |= tmp2;
1921
0
    RX_STACK_PUSH (tmp1);
1922
0
    break;
1923
1924
0
  case R_RX_OPxor:
1925
0
    RX_STACK_POP (tmp1);
1926
0
    RX_STACK_POP (tmp2);
1927
0
    tmp1 ^= tmp2;
1928
0
    RX_STACK_PUSH (tmp1);
1929
0
    break;
1930
1931
0
  case R_RX_OPnot:
1932
0
    RX_STACK_POP (tmp1);
1933
0
    tmp1 = ~ tmp1;
1934
0
    RX_STACK_PUSH (tmp1);
1935
0
    break;
1936
1937
0
  case R_RX_OPmod:
1938
0
    RX_STACK_POP (tmp1);
1939
0
    RX_STACK_POP (tmp2);
1940
0
    tmp1 %= tmp2;
1941
0
    RX_STACK_PUSH (tmp1);
1942
0
    break;
1943
1944
0
  case R_RX_OPromtop:
1945
0
    RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1946
0
    break;
1947
1948
0
  case R_RX_OPramtop:
1949
0
    RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1950
0
    break;
1951
1952
0
  case R_RX_DIR16UL:
1953
0
  case R_RX_DIR8UL:
1954
0
  case R_RX_ABS16UL:
1955
0
  case R_RX_ABS8UL:
1956
0
    if (rx_stack_top)
1957
0
      RX_STACK_POP (symval);
1958
0
    if (lrel)
1959
0
      *lrel = rel;
1960
0
    *scale = 4;
1961
0
    return symval;
1962
1963
0
  case R_RX_DIR16UW:
1964
0
  case R_RX_DIR8UW:
1965
0
  case R_RX_ABS16UW:
1966
0
  case R_RX_ABS8UW:
1967
0
    if (rx_stack_top)
1968
0
      RX_STACK_POP (symval);
1969
0
    if (lrel)
1970
0
      *lrel = rel;
1971
0
    *scale = 2;
1972
0
    return symval;
1973
1974
0
  default:
1975
0
    if (rx_stack_top)
1976
0
      RX_STACK_POP (symval);
1977
0
    if (lrel)
1978
0
      *lrel = rel;
1979
0
    return symval;
1980
0
  }
1981
1982
0
      rel ++;
1983
0
    }
1984
  /* FIXME.  */
1985
0
  (void) r;
1986
0
}
1987
1988
static void
1989
move_reloc (Elf_Internal_Rela * irel, Elf_Internal_Rela * srel, int delta)
1990
0
{
1991
0
  bfd_vma old_offset = srel->r_offset;
1992
1993
0
  irel ++;
1994
0
  while (irel <= srel)
1995
0
    {
1996
0
      if (irel->r_offset == old_offset)
1997
0
  irel->r_offset += delta;
1998
0
      irel ++;
1999
0
    }
2000
0
}
2001
2002
/* Relax one section.  */
2003
2004
static bool
2005
elf32_rx_relax_section (bfd *abfd,
2006
      asection *sec,
2007
      struct bfd_link_info *link_info,
2008
      bool *again,
2009
      bool allow_pcrel3)
2010
0
{
2011
0
  Elf_Internal_Shdr *symtab_hdr;
2012
0
  Elf_Internal_Shdr *shndx_hdr;
2013
0
  Elf_Internal_Rela *internal_relocs;
2014
0
  Elf_Internal_Rela *irel;
2015
0
  Elf_Internal_Rela *srel;
2016
0
  Elf_Internal_Rela *irelend;
2017
0
  Elf_Internal_Rela *next_alignment;
2018
0
  Elf_Internal_Rela *prev_alignment;
2019
0
  bfd_byte *contents = NULL;
2020
0
  bfd_byte *free_contents = NULL;
2021
0
  Elf_Internal_Sym *intsyms = NULL;
2022
0
  Elf_Internal_Sym *free_intsyms = NULL;
2023
0
  bfd_byte *shndx_buf = NULL;
2024
0
  bfd_vma pc;
2025
0
  bfd_vma sec_start;
2026
0
  bfd_vma symval = 0;
2027
0
  int pcrel = 0;
2028
0
  int code = 0;
2029
0
  int section_alignment_glue;
2030
  /* how much to scale the relocation by - 1, 2, or 4.  */
2031
0
  int scale;
2032
2033
  /* Assume nothing changes.  */
2034
0
  *again = false;
2035
2036
  /* We don't have to do anything for a relocatable link, if
2037
     this section does not have relocs, or if this is not a
2038
     code section.  */
2039
0
  if (bfd_link_relocatable (link_info)
2040
0
      || sec->reloc_count == 0
2041
0
      || (sec->flags & SEC_RELOC) == 0
2042
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
2043
0
      || (sec->flags & SEC_CODE) == 0)
2044
0
    return true;
2045
2046
0
  symtab_hdr = & elf_symtab_hdr (abfd);
2047
0
  if (elf_symtab_shndx_list (abfd))
2048
0
    shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2049
0
  else
2050
0
    shndx_hdr = NULL;
2051
2052
0
  sec_start = sec->output_section->vma + sec->output_offset;
2053
2054
  /* Get the section contents.  */
2055
0
  if (elf_section_data (sec)->this_hdr.contents != NULL)
2056
0
    contents = elf_section_data (sec)->this_hdr.contents;
2057
  /* Go get them off disk.  */
2058
0
  else
2059
0
    {
2060
0
      if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2061
0
  goto error_return;
2062
0
      elf_section_data (sec)->this_hdr.contents = contents;
2063
0
    }
2064
2065
  /* Read this BFD's symbols.  */
2066
  /* Get cached copy if it exists.  */
2067
0
  if (symtab_hdr->contents != NULL)
2068
0
    intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2069
0
  else
2070
0
    {
2071
0
      intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2072
0
      symtab_hdr->contents = (bfd_byte *) intsyms;
2073
0
    }
2074
2075
0
  if (shndx_hdr && shndx_hdr->sh_size != 0)
2076
0
    {
2077
0
      size_t amt;
2078
2079
0
      if (_bfd_mul_overflow (symtab_hdr->sh_info,
2080
0
           sizeof (Elf_External_Sym_Shndx), &amt))
2081
0
  {
2082
0
    bfd_set_error (bfd_error_file_too_big);
2083
0
    goto error_return;
2084
0
  }
2085
0
      if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0)
2086
0
  goto error_return;
2087
0
      shndx_buf = _bfd_malloc_and_read (abfd, amt, amt);
2088
0
      if (shndx_buf == NULL)
2089
0
  goto error_return;
2090
0
      shndx_hdr->contents = shndx_buf;
2091
0
    }
2092
2093
  /* Get a copy of the native relocations.  */
2094
  /* Note - we ignore the setting of link_info->keep_memory when reading
2095
     in these relocs.  We have to maintain a permanent copy of the relocs
2096
     because we are going to walk over them multiple times, adjusting them
2097
     as bytes are deleted from the section, and with this relaxation
2098
     function itself being called multiple times on the same section...  */
2099
0
  internal_relocs = _bfd_elf_link_read_relocs
2100
0
    (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, true);
2101
0
  if (internal_relocs == NULL)
2102
0
    goto error_return;
2103
2104
  /* The RL_ relocs must be just before the operand relocs they go
2105
     with, so we must sort them to guarantee this.  We use bubblesort
2106
     instead of qsort so we can guarantee that relocs with the same
2107
     address remain in the same relative order.  */
2108
0
  reloc_bubblesort (internal_relocs, sec->reloc_count);
2109
2110
  /* Walk through them looking for relaxing opportunities.  */
2111
0
  irelend = internal_relocs + sec->reloc_count;
2112
2113
  /* This will either be NULL or a pointer to the next alignment
2114
     relocation.  */
2115
0
  next_alignment = internal_relocs;
2116
  /* This will be the previous alignment, although at first it points
2117
     to the first real relocation.  */
2118
0
  prev_alignment = internal_relocs;
2119
2120
  /* We calculate worst case shrinkage caused by alignment directives.
2121
     No fool-proof, but better than either ignoring the problem or
2122
     doing heavy duty analysis of all the alignment markers in all
2123
     input sections.  */
2124
0
  section_alignment_glue = 0;
2125
0
  for (irel = internal_relocs; irel < irelend; irel++)
2126
0
      if (ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
2127
0
    && irel->r_addend & RX_RELAXA_ALIGN)
2128
0
  {
2129
0
    int this_glue = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2130
2131
0
    if (section_alignment_glue < this_glue)
2132
0
      section_alignment_glue = this_glue;
2133
0
  }
2134
  /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2135
     shrinkage.  */
2136
0
  section_alignment_glue *= 2;
2137
2138
0
  for (irel = internal_relocs; irel < irelend; irel++)
2139
0
    {
2140
0
      unsigned char *insn;
2141
0
      int nrelocs;
2142
2143
      /* The insns we care about are all marked with one of these.  */
2144
0
      if (ELF32_R_TYPE (irel->r_info) != R_RX_RH_RELAX)
2145
0
  continue;
2146
2147
0
      if (irel->r_addend & RX_RELAXA_ALIGN
2148
0
    || next_alignment == internal_relocs)
2149
0
  {
2150
    /* When we delete bytes, we need to maintain all the alignments
2151
       indicated.  In addition, we need to be careful about relaxing
2152
       jumps across alignment boundaries - these displacements
2153
       *grow* when we delete bytes.  For now, don't shrink
2154
       displacements across an alignment boundary, just in case.
2155
       Note that this only affects relocations to the same
2156
       section.  */
2157
0
    prev_alignment = next_alignment;
2158
0
    next_alignment += 2;
2159
0
    while (next_alignment < irelend
2160
0
     && (ELF32_R_TYPE (next_alignment->r_info) != R_RX_RH_RELAX
2161
0
         || !(next_alignment->r_addend & RX_RELAXA_ELIGN)))
2162
0
      next_alignment ++;
2163
0
    if (next_alignment >= irelend || next_alignment->r_offset == 0)
2164
0
      next_alignment = NULL;
2165
0
  }
2166
2167
      /* When we hit alignment markers, see if we've shrunk enough
2168
   before them to reduce the gap without violating the alignment
2169
   requirements.  */
2170
0
      if (irel->r_addend & RX_RELAXA_ALIGN)
2171
0
  {
2172
    /* At this point, the next relocation *should* be the ELIGN
2173
       end marker.  */
2174
0
    Elf_Internal_Rela *erel = irel + 1;
2175
0
    unsigned int alignment, nbytes;
2176
2177
0
    if (ELF32_R_TYPE (erel->r_info) != R_RX_RH_RELAX)
2178
0
      continue;
2179
0
    if (!(erel->r_addend & RX_RELAXA_ELIGN))
2180
0
      continue;
2181
2182
0
    alignment = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2183
2184
0
    if (erel->r_offset - irel->r_offset < alignment)
2185
0
      continue;
2186
2187
0
    nbytes = erel->r_offset - irel->r_offset;
2188
0
    nbytes /= alignment;
2189
0
    nbytes *= alignment;
2190
2191
0
    elf32_rx_relax_delete_bytes (abfd, sec, erel->r_offset-nbytes, nbytes, next_alignment,
2192
0
               erel->r_offset == sec->size, internal_relocs);
2193
0
    *again = true;
2194
2195
0
    continue;
2196
0
  }
2197
2198
0
      if (irel->r_addend & RX_RELAXA_ELIGN)
2199
0
    continue;
2200
2201
0
      insn = contents + irel->r_offset;
2202
2203
0
      nrelocs = irel->r_addend & RX_RELAXA_RNUM;
2204
2205
      /* At this point, we have an insn that is a candidate for linker
2206
   relaxation.  There are NRELOCS relocs following that may be
2207
   relaxed, although each reloc may be made of more than one
2208
   reloc entry (such as gp-rel symbols).  */
2209
2210
      /* Get the value of the symbol referred to by the reloc.  Just
2211
   in case this is the last reloc in the list, use the RL's
2212
   addend to choose between this reloc (no addend) or the next
2213
   (yes addend, which means at least one following reloc).  */
2214
2215
      /* srel points to the "current" reloction for this insn -
2216
   actually the last reloc for a given operand, which is the one
2217
   we need to update.  We check the relaxations in the same
2218
   order that the relocations happen, so we'll just push it
2219
   along as we go.  */
2220
0
      srel = irel;
2221
2222
0
      pc = sec->output_section->vma + sec->output_offset
2223
0
  + srel->r_offset;
2224
2225
0
#define GET_RELOC \
2226
0
      symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2227
0
      pcrel = symval - pc + srel->r_addend; \
2228
0
      nrelocs --;
2229
2230
0
#define SNIPNR(offset, nbytes) \
2231
0
      elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0, internal_relocs);
2232
0
#define SNIP(offset, nbytes, newtype) \
2233
0
  SNIPNR (offset, nbytes);            \
2234
0
  srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2235
2236
      /* The order of these bit tests must match the order that the
2237
   relocs appear in.  Since we sorted those by offset, we can
2238
   predict them.  */
2239
2240
      /* Note that the numbers in, say, DSP6 are the bit offsets of
2241
   the code fields that describe the operand.  Bits number 0 for
2242
   the MSB of insn[0].  */
2243
2244
      /* DSP* codes:
2245
     0  00  [reg]
2246
     1  01  dsp:8[reg]
2247
     2  10  dsp:16[reg]
2248
     3  11  reg  */
2249
0
      if (irel->r_addend & RX_RELAXA_DSP6)
2250
0
  {
2251
0
    GET_RELOC;
2252
2253
0
    code = insn[0] & 3;
2254
0
    if (code == 2 && symval/scale <= 255)
2255
0
      {
2256
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2257
0
        insn[0] &= 0xfc;
2258
0
        insn[0] |= 0x01;
2259
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2260
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2261
0
    {
2262
0
      SNIP (3, 1, newrel);
2263
0
      *again = true;
2264
0
    }
2265
0
      }
2266
2267
0
    else if (code == 1 && symval == 0)
2268
0
      {
2269
0
        insn[0] &= 0xfc;
2270
0
        SNIP (2, 1, R_RX_NONE);
2271
0
        *again = true;
2272
0
      }
2273
2274
    /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst.  */
2275
0
    else if (code == 1 && symval/scale <= 31
2276
       /* Decodable bits.  */
2277
0
       && (insn[0] & 0xcc) == 0xcc
2278
       /* Width.  */
2279
0
       && (insn[0] & 0x30) != 0x30
2280
       /* Register MSBs.  */
2281
0
       && (insn[1] & 0x88)  == 0x00)
2282
0
      {
2283
0
        int newrel = 0;
2284
2285
0
        insn[0] = 0x88 | (insn[0] & 0x30);
2286
        /* The register fields are in the right place already.  */
2287
2288
        /* We can't relax this new opcode.  */
2289
0
        irel->r_addend = 0;
2290
2291
0
        switch ((insn[0] & 0x30) >> 4)
2292
0
    {
2293
0
    case 0:
2294
0
      newrel = R_RX_RH_ABS5p5B;
2295
0
      break;
2296
0
    case 1:
2297
0
      newrel = R_RX_RH_ABS5p5W;
2298
0
      break;
2299
0
    case 2:
2300
0
      newrel = R_RX_RH_ABS5p5L;
2301
0
      break;
2302
0
    }
2303
2304
0
        move_reloc (irel, srel, -2);
2305
0
        SNIP (2, 1, newrel);
2306
0
      }
2307
2308
    /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst.  */
2309
0
    else if (code == 1 && symval/scale <= 31
2310
       /* Decodable bits.  */
2311
0
       && (insn[0] & 0xf8) == 0x58
2312
       /* Register MSBs.  */
2313
0
       && (insn[1] & 0x88)  == 0x00)
2314
0
      {
2315
0
        int newrel = 0;
2316
2317
0
        insn[0] = 0xb0 | ((insn[0] & 0x04) << 1);
2318
        /* The register fields are in the right place already.  */
2319
2320
        /* We can't relax this new opcode.  */
2321
0
        irel->r_addend = 0;
2322
2323
0
        switch ((insn[0] & 0x08) >> 3)
2324
0
    {
2325
0
    case 0:
2326
0
      newrel = R_RX_RH_ABS5p5B;
2327
0
      break;
2328
0
    case 1:
2329
0
      newrel = R_RX_RH_ABS5p5W;
2330
0
      break;
2331
0
    }
2332
2333
0
        move_reloc (irel, srel, -2);
2334
0
        SNIP (2, 1, newrel);
2335
0
      }
2336
0
  }
2337
2338
      /* A DSP4 operand always follows a DSP6 operand, even if there's
2339
   no relocation for it.  We have to read the code out of the
2340
   opcode to calculate the offset of the operand.  */
2341
0
      if (irel->r_addend & RX_RELAXA_DSP4)
2342
0
  {
2343
0
    int code6, offset = 0;
2344
2345
0
    GET_RELOC;
2346
2347
0
    code6 = insn[0] & 0x03;
2348
0
    switch (code6)
2349
0
      {
2350
0
      case 0: offset = 2; break;
2351
0
      case 1: offset = 3; break;
2352
0
      case 2: offset = 4; break;
2353
0
      case 3: offset = 2; break;
2354
0
      }
2355
2356
0
    code = (insn[0] & 0x0c) >> 2;
2357
2358
0
    if (code == 2 && symval / scale <= 255)
2359
0
      {
2360
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2361
2362
0
        insn[0] &= 0xf3;
2363
0
        insn[0] |= 0x04;
2364
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2365
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2366
0
    {
2367
0
      SNIP (offset+1, 1, newrel);
2368
0
      *again = true;
2369
0
    }
2370
0
      }
2371
2372
0
    else if (code == 1 && symval == 0)
2373
0
      {
2374
0
        insn[0] &= 0xf3;
2375
0
        SNIP (offset, 1, R_RX_NONE);
2376
0
        *again = true;
2377
0
      }
2378
    /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
2379
0
    else if (code == 1 && symval/scale <= 31
2380
       /* Decodable bits.  */
2381
0
       && (insn[0] & 0xc3) == 0xc3
2382
       /* Width.  */
2383
0
       && (insn[0] & 0x30) != 0x30
2384
       /* Register MSBs.  */
2385
0
       && (insn[1] & 0x88)  == 0x00)
2386
0
      {
2387
0
        int newrel = 0;
2388
2389
0
        insn[0] = 0x80 | (insn[0] & 0x30);
2390
        /* The register fields are in the right place already.  */
2391
2392
        /* We can't relax this new opcode.  */
2393
0
        irel->r_addend = 0;
2394
2395
0
        switch ((insn[0] & 0x30) >> 4)
2396
0
    {
2397
0
    case 0:
2398
0
      newrel = R_RX_RH_ABS5p5B;
2399
0
      break;
2400
0
    case 1:
2401
0
      newrel = R_RX_RH_ABS5p5W;
2402
0
      break;
2403
0
    case 2:
2404
0
      newrel = R_RX_RH_ABS5p5L;
2405
0
      break;
2406
0
    }
2407
2408
0
        move_reloc (irel, srel, -2);
2409
0
        SNIP (2, 1, newrel);
2410
0
      }
2411
0
  }
2412
2413
      /* These always occur alone, but the offset depends on whether
2414
   it's a MEMEX opcode (0x06) or not.  */
2415
0
      if (irel->r_addend & RX_RELAXA_DSP14)
2416
0
  {
2417
0
    int offset;
2418
0
    GET_RELOC;
2419
2420
0
    if (insn[0] == 0x06)
2421
0
      offset = 3;
2422
0
    else
2423
0
      offset = 4;
2424
2425
0
    code = insn[1] & 3;
2426
2427
0
    if (code == 2 && symval / scale <= 255)
2428
0
      {
2429
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2430
2431
0
        insn[1] &= 0xfc;
2432
0
        insn[1] |= 0x01;
2433
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2434
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2435
0
    {
2436
0
      SNIP (offset, 1, newrel);
2437
0
      *again = true;
2438
0
    }
2439
0
      }
2440
0
    else if (code == 1 && symval == 0)
2441
0
      {
2442
0
        insn[1] &= 0xfc;
2443
0
        SNIP (offset, 1, R_RX_NONE);
2444
0
        *again = true;
2445
0
      }
2446
0
  }
2447
2448
      /* IMM* codes:
2449
     0  00  imm:32
2450
     1  01  simm:8
2451
     2  10  simm:16
2452
     3  11  simm:24.  */
2453
2454
      /* These always occur alone.  */
2455
0
      if (irel->r_addend & RX_RELAXA_IMM6)
2456
0
  {
2457
0
    long ssymval;
2458
2459
0
    GET_RELOC;
2460
2461
    /* These relocations sign-extend, so we must do signed compares.  */
2462
0
    ssymval = (long) symval;
2463
2464
0
    code = insn[0] & 0x03;
2465
2466
0
    if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2467
0
      {
2468
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2469
2470
0
        insn[0] &= 0xfc;
2471
0
        insn[0] |= 0x03;
2472
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2473
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2474
0
    {
2475
0
      SNIP (2, 1, newrel);
2476
0
      *again = true;
2477
0
    }
2478
0
      }
2479
2480
0
    else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2481
0
      {
2482
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2483
2484
0
        insn[0] &= 0xfc;
2485
0
        insn[0] |= 0x02;
2486
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2487
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2488
0
    {
2489
0
      SNIP (2, 1, newrel);
2490
0
      *again = true;
2491
0
    }
2492
0
      }
2493
2494
    /* Special case UIMM8 format: CMP #uimm8,Rdst.  */
2495
0
    else if (code == 2 && ssymval <= 255 && ssymval >= 16
2496
       /* Decodable bits.  */
2497
0
       && (insn[0] & 0xfc) == 0x74
2498
       /* Decodable bits.  */
2499
0
       && ((insn[1] & 0xf0) == 0x00))
2500
0
      {
2501
0
        int newrel;
2502
2503
0
        insn[0] = 0x75;
2504
0
        insn[1] = 0x50 | (insn[1] & 0x0f);
2505
2506
        /* We can't relax this new opcode.  */
2507
0
        irel->r_addend = 0;
2508
2509
0
        if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2510
0
    newrel = R_RX_ABS8U;
2511
0
        else
2512
0
    newrel = R_RX_DIR8U;
2513
2514
0
        SNIP (2, 1, newrel);
2515
0
        *again = true;
2516
0
      }
2517
2518
0
    else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2519
0
      {
2520
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2521
2522
0
        insn[0] &= 0xfc;
2523
0
        insn[0] |= 0x01;
2524
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2525
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2526
0
    {
2527
0
      SNIP (2, 1, newrel);
2528
0
      *again = true;
2529
0
    }
2530
0
      }
2531
2532
    /* Special case UIMM4 format: CMP, MUL, AND, OR.  */
2533
0
    else if (code == 1 && ssymval <= 15 && ssymval >= 0
2534
       /* Decodable bits and immediate type.  */
2535
0
       && insn[0] == 0x75
2536
       /* Decodable bits.  */
2537
0
       && (insn[1] & 0xc0)  == 0x00)
2538
0
      {
2539
0
        static const int newop[4] = { 1, 3, 4, 5 };
2540
2541
0
        insn[0] = 0x60 | newop[insn[1] >> 4];
2542
        /* The register number doesn't move.  */
2543
2544
        /* We can't relax this new opcode.  */
2545
0
        irel->r_addend = 0;
2546
2547
0
        move_reloc (irel, srel, -1);
2548
2549
0
        SNIP (2, 1, R_RX_RH_UIMM4p8);
2550
0
        *again = true;
2551
0
      }
2552
2553
    /* Special case UIMM4 format: ADD -> ADD/SUB.  */
2554
0
    else if (code == 1 && ssymval <= 15 && ssymval >= -15
2555
       /* Decodable bits and immediate type.  */
2556
0
       && insn[0] == 0x71
2557
       /* Same register for source and destination.  */
2558
0
       && ((insn[1] >> 4) == (insn[1] & 0x0f)))
2559
0
      {
2560
0
        int newrel;
2561
2562
        /* Note that we can't turn "add $0,Rs" into a NOP
2563
     because the flags need to be set right.  */
2564
2565
0
        if (ssymval < 0)
2566
0
    {
2567
0
      insn[0] = 0x60; /* Subtract.  */
2568
0
      newrel = R_RX_RH_UNEG4p8;
2569
0
    }
2570
0
        else
2571
0
    {
2572
0
      insn[0] = 0x62; /* Add.  */
2573
0
      newrel = R_RX_RH_UIMM4p8;
2574
0
    }
2575
2576
        /* The register number is in the right place.  */
2577
2578
        /* We can't relax this new opcode.  */
2579
0
        irel->r_addend = 0;
2580
2581
0
        move_reloc (irel, srel, -1);
2582
2583
0
        SNIP (2, 1, newrel);
2584
0
        *again = true;
2585
0
      }
2586
0
  }
2587
2588
      /* These are either matched with a DSP6 (2-byte base) or an id24
2589
   (3-byte base).  */
2590
0
      if (irel->r_addend & RX_RELAXA_IMM12)
2591
0
  {
2592
0
    int dspcode, offset = 0;
2593
0
    long ssymval;
2594
2595
0
    GET_RELOC;
2596
2597
0
    if ((insn[0] & 0xfc) == 0xfc)
2598
0
      dspcode = 1; /* Just something with one byte operand.  */
2599
0
    else
2600
0
      dspcode = insn[0] & 3;
2601
0
    switch (dspcode)
2602
0
      {
2603
0
      case 0: offset = 2; break;
2604
0
      case 1: offset = 3; break;
2605
0
      case 2: offset = 4; break;
2606
0
      case 3: offset = 2; break;
2607
0
      }
2608
2609
    /* These relocations sign-extend, so we must do signed compares.  */
2610
0
    ssymval = (long) symval;
2611
2612
0
    code = (insn[1] >> 2) & 3;
2613
0
    if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2614
0
      {
2615
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2616
2617
0
        insn[1] &= 0xf3;
2618
0
        insn[1] |= 0x0c;
2619
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2620
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2621
0
    {
2622
0
      SNIP (offset, 1, newrel);
2623
0
      *again = true;
2624
0
    }
2625
0
      }
2626
2627
0
    else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2628
0
      {
2629
0
        unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2630
2631
0
        insn[1] &= 0xf3;
2632
0
        insn[1] |= 0x08;
2633
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2634
0
        if (newrel != ELF32_R_TYPE (srel->r_info))
2635
0
    {
2636
0
      SNIP (offset, 1, newrel);
2637
0
      *again = true;
2638
0
    }
2639
0
      }
2640
2641
    /* Special case UIMM8 format: MOV #uimm8,Rdst.  */
2642
0
    else if (code == 2 && ssymval <= 255 && ssymval >= 16
2643
       /* Decodable bits.  */
2644
0
       && insn[0] == 0xfb
2645
       /* Decodable bits.  */
2646
0
       && ((insn[1] & 0x03) == 0x02))
2647
0
      {
2648
0
        int newrel;
2649
2650
0
        insn[0] = 0x75;
2651
0
        insn[1] = 0x40 | (insn[1] >> 4);
2652
2653
        /* We can't relax this new opcode.  */
2654
0
        irel->r_addend = 0;
2655
2656
0
        if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2657
0
    newrel = R_RX_ABS8U;
2658
0
        else
2659
0
    newrel = R_RX_DIR8U;
2660
2661
0
        SNIP (2, 1, newrel);
2662
0
        *again = true;
2663
0
      }
2664
2665
0
    else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2666
0
      {
2667
0
        unsigned int newrel = ELF32_R_TYPE(srel->r_info);
2668
2669
0
        insn[1] &= 0xf3;
2670
0
        insn[1] |= 0x04;
2671
0
        newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2672
0
        if (newrel != ELF32_R_TYPE(srel->r_info))
2673
0
    {
2674
0
      SNIP (offset, 1, newrel);
2675
0
      *again = true;
2676
0
    }
2677
0
      }
2678
2679
    /* Special case UIMM4 format: MOV #uimm4,Rdst.  */
2680
0
    else if (code == 1 && ssymval <= 15 && ssymval >= 0
2681
       /* Decodable bits.  */
2682
0
       && insn[0] == 0xfb
2683
       /* Decodable bits.  */
2684
0
       && ((insn[1] & 0x03) == 0x02))
2685
0
      {
2686
0
        insn[0] = 0x66;
2687
0
        insn[1] = insn[1] >> 4;
2688
2689
        /* We can't relax this new opcode.  */
2690
0
        irel->r_addend = 0;
2691
2692
0
        move_reloc (irel, srel, -1);
2693
2694
0
        SNIP (2, 1, R_RX_RH_UIMM4p8);
2695
0
        *again = true;
2696
0
      }
2697
0
  }
2698
2699
0
      if (irel->r_addend & RX_RELAXA_BRA)
2700
0
  {
2701
0
    unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2702
0
    int max_pcrel3 = 4;
2703
0
    int alignment_glue = 0;
2704
2705
0
    GET_RELOC;
2706
2707
    /* Branches over alignment chunks are problematic, as
2708
       deleting bytes here makes the branch *further* away.  We
2709
       can be agressive with branches within this alignment
2710
       block, but not branches outside it.  */
2711
0
    if ((prev_alignment == NULL
2712
0
         || symval < (bfd_vma)(sec_start + prev_alignment->r_offset))
2713
0
        && (next_alignment == NULL
2714
0
      || symval > (bfd_vma)(sec_start + next_alignment->r_offset)))
2715
0
      alignment_glue = section_alignment_glue;
2716
2717
0
    if (ELF32_R_TYPE(srel[1].r_info) == R_RX_RH_RELAX
2718
0
        && srel[1].r_addend & RX_RELAXA_BRA
2719
0
        && srel[1].r_offset < irel->r_offset + pcrel)
2720
0
      max_pcrel3 ++;
2721
2722
0
    newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2723
2724
    /* The values we compare PCREL with are not what you'd
2725
       expect; they're off by a little to compensate for (1)
2726
       where the reloc is relative to the insn, and (2) how much
2727
       the insn is going to change when we relax it.  */
2728
2729
    /* These we have to decode.  */
2730
0
    switch (insn[0])
2731
0
      {
2732
0
      case 0x04: /* BRA pcdsp:24 */
2733
0
        if (-32768 + alignment_glue <= pcrel
2734
0
      && pcrel <= 32765 - alignment_glue)
2735
0
    {
2736
0
      insn[0] = 0x38;
2737
0
      SNIP (3, 1, newrel);
2738
0
      *again = true;
2739
0
    }
2740
0
        break;
2741
2742
0
      case 0x38: /* BRA pcdsp:16 */
2743
0
        if (-128 + alignment_glue <= pcrel
2744
0
      && pcrel <= 127 - alignment_glue)
2745
0
    {
2746
0
      insn[0] = 0x2e;
2747
0
      SNIP (2, 1, newrel);
2748
0
      *again = true;
2749
0
    }
2750
0
        break;
2751
2752
0
      case 0x2e: /* BRA pcdsp:8 */
2753
        /* Note that there's a risk here of shortening things so
2754
     much that we no longer fit this reloc; it *should*
2755
     only happen when you branch across a branch, and that
2756
     branch also devolves into BRA.S.  "Real" code should
2757
     be OK.  */
2758
0
        if (max_pcrel3 + alignment_glue <= pcrel
2759
0
      && pcrel <= 10 - alignment_glue
2760
0
      && allow_pcrel3)
2761
0
    {
2762
0
      insn[0] = 0x08;
2763
0
      SNIP (1, 1, newrel);
2764
0
      move_reloc (irel, srel, -1);
2765
0
      *again = true;
2766
0
    }
2767
0
        break;
2768
2769
0
      case 0x05: /* BSR pcdsp:24 */
2770
0
        if (-32768 + alignment_glue <= pcrel
2771
0
      && pcrel <= 32765 - alignment_glue)
2772
0
    {
2773
0
      insn[0] = 0x39;
2774
0
      SNIP (1, 1, newrel);
2775
0
      *again = true;
2776
0
    }
2777
0
        break;
2778
2779
0
      case 0x3a: /* BEQ.W pcdsp:16 */
2780
0
      case 0x3b: /* BNE.W pcdsp:16 */
2781
0
        if (-128 + alignment_glue <= pcrel
2782
0
      && pcrel <= 127 - alignment_glue)
2783
0
    {
2784
0
      insn[0] = 0x20 | (insn[0] & 1);
2785
0
      SNIP (1, 1, newrel);
2786
0
      *again = true;
2787
0
    }
2788
0
        break;
2789
2790
0
      case 0x20: /* BEQ.B pcdsp:8 */
2791
0
      case 0x21: /* BNE.B pcdsp:8 */
2792
0
        if (max_pcrel3 + alignment_glue <= pcrel
2793
0
      && pcrel - alignment_glue <= 10
2794
0
      && allow_pcrel3)
2795
0
    {
2796
0
      insn[0] = 0x10 | ((insn[0] & 1) << 3);
2797
0
      SNIP (1, 1, newrel);
2798
0
      move_reloc (irel, srel, -1);
2799
0
      *again = true;
2800
0
    }
2801
0
        break;
2802
2803
0
      case 0x16: /* synthetic BNE dsp24 */
2804
0
      case 0x1e: /* synthetic BEQ dsp24 */
2805
0
        if (-32767 + alignment_glue <= pcrel
2806
0
      && pcrel <= 32766 - alignment_glue
2807
0
      && insn[1] == 0x04)
2808
0
    {
2809
0
      if (insn[0] == 0x16)
2810
0
        insn[0] = 0x3b;
2811
0
      else
2812
0
        insn[0] = 0x3a;
2813
      /* We snip out the bytes at the end else the reloc
2814
         will get moved too, and too much.  */
2815
0
      SNIP (3, 2, newrel);
2816
0
      move_reloc (irel, srel, -1);
2817
0
      *again = true;
2818
0
    }
2819
0
        break;
2820
0
      }
2821
2822
    /* Special case - synthetic conditional branches, pcrel24.
2823
       Note that EQ and NE have been handled above.  */
2824
0
    if ((insn[0] & 0xf0) == 0x20
2825
0
        && insn[1] == 0x06
2826
0
        && insn[2] == 0x04
2827
0
        && srel->r_offset != irel->r_offset + 1
2828
0
        && -32767 + alignment_glue <= pcrel
2829
0
        && pcrel <= 32766 - alignment_glue)
2830
0
      {
2831
0
        insn[1] = 0x05;
2832
0
        insn[2] = 0x38;
2833
0
        SNIP (5, 1, newrel);
2834
0
        *again = true;
2835
0
      }
2836
2837
    /* Special case - synthetic conditional branches, pcrel16 */
2838
0
    if ((insn[0] & 0xf0) == 0x20
2839
0
        && insn[1] == 0x05
2840
0
        && insn[2] == 0x38
2841
0
        && srel->r_offset != irel->r_offset + 1
2842
0
        && -127 + alignment_glue <= pcrel
2843
0
        && pcrel <= 126 - alignment_glue)
2844
0
      {
2845
0
        int cond = (insn[0] & 0x0f) ^ 0x01;
2846
2847
0
        insn[0] = 0x20 | cond;
2848
        /* By moving the reloc first, we avoid having
2849
     delete_bytes move it also.  */
2850
0
        move_reloc (irel, srel, -2);
2851
0
        SNIP (2, 3, newrel);
2852
0
        *again = true;
2853
0
      }
2854
0
  }
2855
2856
0
      BFD_ASSERT (nrelocs == 0);
2857
2858
      /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can
2859
   use MOV.bwl #uimm:8, dsp:5[r7] format.  This is tricky
2860
   because it may have one or two relocations.  */
2861
0
      if ((insn[0] & 0xfc) == 0xf8
2862
0
    && (insn[1] & 0x80) == 0x00
2863
0
    && (insn[0] & 0x03) != 0x03)
2864
0
  {
2865
0
    int dcode, icode, reg, ioff, dscale, ilen;
2866
0
    bfd_vma disp_val = 0;
2867
0
    long imm_val = 0;
2868
0
    Elf_Internal_Rela * disp_rel = 0;
2869
0
    Elf_Internal_Rela * imm_rel = 0;
2870
2871
    /* Reset this.  */
2872
0
    srel = irel;
2873
2874
0
    dcode = insn[0] & 0x03;
2875
0
    icode = (insn[1] >> 2) & 0x03;
2876
0
    reg = (insn[1] >> 4) & 0x0f;
2877
2878
0
    ioff = dcode == 1 ? 3 : dcode == 2 ? 4 : 2;
2879
2880
    /* Figure out what the dispacement is.  */
2881
0
    if (dcode == 1 || dcode == 2)
2882
0
      {
2883
        /* There's a displacement.  See if there's a reloc for it.  */
2884
0
        if (srel[1].r_offset == irel->r_offset + 2)
2885
0
    {
2886
0
      GET_RELOC;
2887
0
      disp_val = symval;
2888
0
      disp_rel = srel;
2889
0
    }
2890
0
        else
2891
0
    {
2892
0
      if (dcode == 1)
2893
0
        disp_val = insn[2];
2894
0
      else
2895
0
        {
2896
#if RX_OPCODE_BIG_ENDIAN
2897
          disp_val = insn[2] * 256 + insn[3];
2898
#else
2899
0
          disp_val = insn[2] + insn[3] * 256;
2900
0
#endif
2901
0
        }
2902
0
      switch (insn[1] & 3)
2903
0
        {
2904
0
        case 1:
2905
0
          disp_val *= 2;
2906
0
          scale = 2;
2907
0
          break;
2908
0
        case 2:
2909
0
          disp_val *= 4;
2910
0
          scale = 4;
2911
0
          break;
2912
0
        }
2913
0
    }
2914
0
      }
2915
2916
0
    dscale = scale;
2917
2918
    /* Figure out what the immediate is.  */
2919
0
    if (srel[1].r_offset == irel->r_offset + ioff)
2920
0
      {
2921
0
        GET_RELOC;
2922
0
        imm_val = (long) symval;
2923
0
        imm_rel = srel;
2924
0
      }
2925
0
    else
2926
0
      {
2927
0
        unsigned char * ip = insn + ioff;
2928
2929
0
        switch (icode)
2930
0
    {
2931
0
    case 1:
2932
      /* For byte writes, we don't sign extend.  Makes the math easier later.  */
2933
0
      if (scale == 1)
2934
0
        imm_val = ip[0];
2935
0
      else
2936
0
        imm_val = (char) ip[0];
2937
0
      break;
2938
0
    case 2:
2939
#if RX_OPCODE_BIG_ENDIAN
2940
      imm_val = ((char) ip[0] << 8) | ip[1];
2941
#else
2942
0
      imm_val = ((char) ip[1] << 8) | ip[0];
2943
0
#endif
2944
0
      break;
2945
0
    case 3:
2946
#if RX_OPCODE_BIG_ENDIAN
2947
      imm_val = ((char) ip[0] << 16) | (ip[1] << 8) | ip[2];
2948
#else
2949
0
      imm_val = ((char) ip[2] << 16) | (ip[1] << 8) | ip[0];
2950
0
#endif
2951
0
      break;
2952
0
    case 0:
2953
#if RX_OPCODE_BIG_ENDIAN
2954
      imm_val = ((unsigned) ip[0] << 24) | (ip[1] << 16) | (ip[2] << 8) | ip[3];
2955
#else
2956
0
      imm_val = ((unsigned) ip[3] << 24) | (ip[2] << 16) | (ip[1] << 8) | ip[0];
2957
0
#endif
2958
0
      break;
2959
0
    }
2960
0
      }
2961
2962
0
    ilen = 2;
2963
2964
0
    switch (dcode)
2965
0
      {
2966
0
      case 1:
2967
0
        ilen += 1;
2968
0
        break;
2969
0
      case 2:
2970
0
        ilen += 2;
2971
0
        break;
2972
0
      }
2973
2974
0
    switch (icode)
2975
0
      {
2976
0
      case 1:
2977
0
        ilen += 1;
2978
0
        break;
2979
0
      case 2:
2980
0
        ilen += 2;
2981
0
        break;
2982
0
      case 3:
2983
0
        ilen += 3;
2984
0
        break;
2985
0
      case 4:
2986
0
        ilen += 4;
2987
0
        break;
2988
0
      }
2989
2990
    /* The shortcut happens when the immediate is 0..255,
2991
       register r0 to r7, and displacement (scaled) 0..31.  */
2992
2993
0
    if (0 <= imm_val && imm_val <= 255
2994
0
        && 0 <= reg && reg <= 7
2995
0
        && disp_val / dscale <= 31)
2996
0
      {
2997
0
        insn[0] = 0x3c | (insn[1] & 0x03);
2998
0
        insn[1] = (((disp_val / dscale) << 3) & 0x80) | (reg << 4) | ((disp_val/dscale) & 0x0f);
2999
0
        insn[2] = imm_val;
3000
3001
0
        if (disp_rel)
3002
0
    {
3003
0
      int newrel = R_RX_NONE;
3004
3005
0
      switch (dscale)
3006
0
        {
3007
0
        case 1:
3008
0
          newrel = R_RX_RH_ABS5p8B;
3009
0
          break;
3010
0
        case 2:
3011
0
          newrel = R_RX_RH_ABS5p8W;
3012
0
          break;
3013
0
        case 4:
3014
0
          newrel = R_RX_RH_ABS5p8L;
3015
0
          break;
3016
0
        }
3017
0
      disp_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (disp_rel->r_info), newrel);
3018
0
      move_reloc (irel, disp_rel, -1);
3019
0
    }
3020
0
        if (imm_rel)
3021
0
    {
3022
0
      imm_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (imm_rel->r_info), R_RX_DIR8U);
3023
0
      move_reloc (disp_rel ? disp_rel : irel,
3024
0
            imm_rel,
3025
0
            irel->r_offset - imm_rel->r_offset + 2);
3026
0
    }
3027
3028
0
        SNIPNR (3, ilen - 3);
3029
0
        *again = true;
3030
3031
        /* We can't relax this new opcode.  */
3032
0
        irel->r_addend = 0;
3033
0
      }
3034
0
  }
3035
0
    }
3036
3037
  /* We can't reliably relax branches to DIR3U_PCREL unless we know
3038
     whatever they're branching over won't shrink any more.  If we're
3039
     basically done here, do one more pass just for branches - but
3040
     don't request a pass after that one!  */
3041
0
  if (!*again && !allow_pcrel3)
3042
0
    {
3043
0
      bool ignored;
3044
3045
0
      elf32_rx_relax_section (abfd, sec, link_info, &ignored, true);
3046
0
    }
3047
3048
0
  return true;
3049
3050
0
 error_return:
3051
0
  free (free_contents);
3052
3053
0
  if (shndx_buf != NULL)
3054
0
    {
3055
0
      shndx_hdr->contents = NULL;
3056
0
      free (shndx_buf);
3057
0
    }
3058
3059
0
  free (free_intsyms);
3060
3061
0
  return false;
3062
0
}
3063
3064
static bool
3065
elf32_rx_relax_section_wrapper (bfd *abfd,
3066
        asection *sec,
3067
        struct bfd_link_info *link_info,
3068
        bool *again)
3069
0
{
3070
0
  return elf32_rx_relax_section (abfd, sec, link_info, again, false);
3071
0
}
3072

3073
/* Function to set the ELF flag bits.  */
3074
3075
static bool
3076
rx_elf_set_private_flags (bfd * abfd, flagword flags)
3077
0
{
3078
0
  elf_elfheader (abfd)->e_flags = flags;
3079
0
  elf_flags_init (abfd) = true;
3080
0
  return true;
3081
0
}
3082
3083
static bool no_warn_mismatch = false;
3084
static bool ignore_lma = true;
3085
3086
void bfd_elf32_rx_set_target_flags (bool, bool);
3087
3088
void
3089
bfd_elf32_rx_set_target_flags (bool user_no_warn_mismatch,
3090
             bool user_ignore_lma)
3091
0
{
3092
0
  no_warn_mismatch = user_no_warn_mismatch;
3093
0
  ignore_lma = user_ignore_lma;
3094
0
}
3095
3096
/* Converts FLAGS into a descriptive string.
3097
   Returns a static pointer.  */
3098
3099
static const char *
3100
describe_flags (flagword flags, char *buf)
3101
2.45k
{
3102
2.45k
  buf[0] = 0;
3103
3104
2.45k
  if (flags & E_FLAG_RX_64BIT_DOUBLES)
3105
27
    strcat (buf, "64-bit doubles");
3106
2.42k
  else
3107
2.42k
    strcat (buf, "32-bit doubles");
3108
3109
2.45k
  if (flags & E_FLAG_RX_DSP)
3110
57
    strcat (buf, ", dsp");
3111
2.39k
  else
3112
2.39k
    strcat (buf, ", no dsp");
3113
3114
2.45k
  if (flags & E_FLAG_RX_PID)
3115
36
    strcat (buf, ", pid");
3116
2.42k
  else
3117
2.42k
    strcat (buf, ", no pid");
3118
3119
2.45k
  if (flags & E_FLAG_RX_ABI)
3120
65
    strcat (buf, ", RX ABI");
3121
2.39k
  else
3122
2.39k
    strcat (buf, ", GCC ABI");
3123
3124
2.45k
  if (flags & E_FLAG_RX_SINSNS_SET)
3125
38
    strcat (buf, flags & E_FLAG_RX_SINSNS_YES ? ", uses String instructions" : ", bans String instructions");
3126
3127
2.45k
  return buf;
3128
2.45k
}
3129
3130
/* Merge backend specific data from an object file to the output
3131
   object file when linking.  */
3132
3133
static bool
3134
rx_elf_merge_private_bfd_data (bfd * ibfd, struct bfd_link_info *info)
3135
0
{
3136
0
  bfd *obfd = info->output_bfd;
3137
0
  flagword old_flags;
3138
0
  flagword new_flags;
3139
0
  bool error = false;
3140
3141
0
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3142
0
    return true;
3143
3144
0
  new_flags = elf_elfheader (ibfd)->e_flags;
3145
0
  old_flags = elf_elfheader (obfd)->e_flags;
3146
3147
0
  if (!elf_flags_init (obfd))
3148
0
    {
3149
      /* First call, no flags set.  */
3150
0
      elf_flags_init (obfd) = true;
3151
0
      elf_elfheader (obfd)->e_flags = new_flags;
3152
0
    }
3153
0
  else if (old_flags != new_flags)
3154
0
    {
3155
0
      flagword known_flags;
3156
3157
0
      if (old_flags & E_FLAG_RX_SINSNS_SET)
3158
0
  {
3159
0
    if ((new_flags & E_FLAG_RX_SINSNS_SET) == 0)
3160
0
      {
3161
0
        new_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3162
0
        new_flags |= (old_flags & E_FLAG_RX_SINSNS_MASK);
3163
0
      }
3164
0
  }
3165
0
      else if (new_flags & E_FLAG_RX_SINSNS_SET)
3166
0
  {
3167
0
    old_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3168
0
    old_flags |= (new_flags & E_FLAG_RX_SINSNS_MASK);
3169
0
  }
3170
3171
0
      known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES
3172
0
  | E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK;
3173
3174
0
      if ((old_flags ^ new_flags) & known_flags)
3175
0
  {
3176
    /* Only complain if flag bits we care about do not match.
3177
       Other bits may be set, since older binaries did use some
3178
       deprecated flags.  */
3179
0
    if (no_warn_mismatch)
3180
0
      {
3181
0
        elf_elfheader (obfd)->e_flags = (new_flags | old_flags) & known_flags;
3182
0
      }
3183
0
    else
3184
0
      {
3185
0
        char buf[128];
3186
3187
0
        _bfd_error_handler (_("there is a conflict merging the"
3188
0
            " ELF header flags from %pB"),
3189
0
          ibfd);
3190
0
        _bfd_error_handler (_("  the input  file's flags: %s"),
3191
0
          describe_flags (new_flags, buf));
3192
0
        _bfd_error_handler (_("  the output file's flags: %s"),
3193
0
          describe_flags (old_flags, buf));
3194
0
        error = true;
3195
0
      }
3196
0
  }
3197
0
      else
3198
0
  elf_elfheader (obfd)->e_flags = new_flags & known_flags;
3199
0
    }
3200
3201
0
  if (error)
3202
0
    bfd_set_error (bfd_error_bad_value);
3203
3204
0
  return !error;
3205
0
}
3206

3207
static bool
3208
rx_elf_print_private_bfd_data (bfd * abfd, void * ptr)
3209
2.45k
{
3210
2.45k
  FILE * file = (FILE *) ptr;
3211
2.45k
  flagword flags;
3212
2.45k
  char buf[128];
3213
3214
2.45k
  BFD_ASSERT (abfd != NULL && ptr != NULL);
3215
3216
  /* Print normal ELF private data.  */
3217
2.45k
  _bfd_elf_print_private_bfd_data (abfd, ptr);
3218
3219
2.45k
  flags = elf_elfheader (abfd)->e_flags;
3220
2.45k
  fprintf (file, _("private flags = 0x%lx:"), (long) flags);
3221
3222
2.45k
  fprintf (file, "%s", describe_flags (flags, buf));
3223
2.45k
  return true;
3224
2.45k
}
3225
3226
/* Return the MACH for an e_flags value.  */
3227
3228
static int
3229
elf32_rx_machine (bfd * abfd ATTRIBUTE_UNUSED)
3230
6.14k
{
3231
#if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_...
3232
   Need to sort out how these flag bits are used.
3233
   For now we assume that the flags are OK.  */
3234
  if ((elf_elfheader (abfd)->e_flags & EF_RX_CPU_MASK) == EF_RX_CPU_RX)
3235
#endif
3236
6.14k
    if ((elf_elfheader (abfd)->e_flags & E_FLAG_RX_V2))
3237
5.01k
      return bfd_mach_rx_v2;
3238
1.13k
    else if ((elf_elfheader (abfd)->e_flags & E_FLAG_RX_V3))
3239
543
      return bfd_mach_rx_v3;
3240
594
    else
3241
594
      return bfd_mach_rx;
3242
3243
0
  return 0;
3244
6.14k
}
3245
3246
static bool
3247
rx_elf_object_p (bfd * abfd)
3248
8.62k
{
3249
8.62k
  int i;
3250
8.62k
  unsigned int u;
3251
8.62k
  Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
3252
8.62k
  Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd);
3253
8.62k
  int nphdrs = ehdr->e_phnum;
3254
8.62k
  sec_ptr bsec;
3255
8.62k
  static int saw_be = false;
3256
8.62k
  bfd_vma end_phdroff;
3257
3258
  /* We never want to automatically choose the non-swapping big-endian
3259
     target.  The user can only get that explicitly, such as with -I
3260
     and objcopy.  */
3261
8.62k
  if (abfd->xvec == &rx_elf32_be_ns_vec
3262
2.48k
      && abfd->target_defaulted)
3263
2.46k
    return false;
3264
3265
  /* BFD->target_defaulted is not set to TRUE when a target is chosen
3266
     as a fallback, so we check for "scanning" to know when to stop
3267
     using the non-swapping target.  */
3268
6.16k
  if (abfd->xvec == &rx_elf32_be_ns_vec
3269
18
      && saw_be)
3270
18
    return false;
3271
6.14k
  if (abfd->xvec == &rx_elf32_be_vec)
3272
4.95k
    saw_be = true;
3273
3274
6.14k
  bfd_default_set_arch_mach (abfd, bfd_arch_rx,
3275
6.14k
           elf32_rx_machine (abfd));
3276
3277
  /* For each PHDR in the object, we must find some section that
3278
     corresponds (based on matching file offsets) and use its VMA
3279
     information to reconstruct the p_vaddr field we clobbered when we
3280
     wrote it out.  */
3281
  /* If PT_LOAD headers include the ELF file header or program headers
3282
     then the PT_LOAD header does not start with some section contents.
3283
     Making adjustments based on the difference between sh_offset and
3284
     p_offset is nonsense in such cases.  Exclude them.  Note that
3285
     since standard linker scripts for RX do not use SIZEOF_HEADERS,
3286
     the linker won't normally create PT_LOAD segments covering the
3287
     headers so this is mainly for passing the ld testsuite.
3288
     FIXME.  Why are we looking at non-PT_LOAD headers here?  */
3289
6.14k
  end_phdroff = ehdr->e_ehsize;
3290
6.14k
  if (ehdr->e_phoff != 0)
3291
5.42k
    end_phdroff = ehdr->e_phoff + nphdrs * ehdr->e_phentsize;
3292
123k
  for (i=0; i<nphdrs; i++)
3293
116k
    {
3294
227k
      for (u=0; u<elf_tdata(abfd)->num_elf_sections; u++)
3295
116k
  {
3296
116k
    Elf_Internal_Shdr *sec = elf_tdata(abfd)->elf_sect_ptr[u];
3297
3298
116k
    if (phdr[i].p_filesz
3299
84.4k
        && phdr[i].p_offset >= end_phdroff
3300
56.1k
        && phdr[i].p_offset <= (bfd_vma) sec->sh_offset
3301
23.5k
        && sec->sh_size > 0
3302
19.9k
        && sec->sh_type != SHT_NOBITS
3303
17.8k
        && (bfd_vma)sec->sh_offset <= phdr[i].p_offset + (phdr[i].p_filesz - 1))
3304
6.24k
      {
3305
        /* Found one!  The difference between the two addresses,
3306
     plus the difference between the two file offsets, is
3307
     enough information to reconstruct the lma.  */
3308
3309
        /* Example where they aren't:
3310
     PHDR[1] = lma fffc0100 offset 00002010 size 00000100
3311
     SEC[6]  = vma 00000050 offset 00002050 size 00000040
3312
3313
     The correct LMA for the section is fffc0140 + (2050-2010).
3314
        */
3315
3316
6.24k
        phdr[i].p_vaddr = sec->sh_addr + (sec->sh_offset - phdr[i].p_offset);
3317
6.24k
        break;
3318
6.24k
      }
3319
116k
  }
3320
3321
      /* We must update the bfd sections as well, so we don't stop
3322
   with one match.  */
3323
116k
      bsec = abfd->sections;
3324
166k
      while (bsec)
3325
49.2k
  {
3326
49.2k
    if (phdr[i].p_filesz
3327
36.6k
        && phdr[i].p_vaddr <= bsec->vma
3328
20.6k
        && bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1))
3329
6.62k
      {
3330
6.62k
        bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr);
3331
6.62k
      }
3332
49.2k
    bsec = bsec->next;
3333
49.2k
  }
3334
116k
    }
3335
3336
6.14k
  return true;
3337
6.16k
}
3338
3339
static bool
3340
rx_linux_object_p (bfd * abfd)
3341
0
{
3342
0
  bfd_default_set_arch_mach (abfd, bfd_arch_rx, elf32_rx_machine (abfd));
3343
0
  return true;
3344
0
}
3345
 
3346
3347
#ifdef DEBUG
3348
void
3349
rx_dump_symtab (bfd * abfd, void * internal_syms, void * external_syms)
3350
{
3351
  size_t locsymcount;
3352
  Elf_Internal_Sym * isymbuf;
3353
  Elf_Internal_Sym * isymend;
3354
  Elf_Internal_Sym * isym;
3355
  Elf_Internal_Shdr * symtab_hdr;
3356
  char * st_info_str;
3357
  char * st_info_stb_str;
3358
  char * st_other_str;
3359
  char * st_shndx_str;
3360
3361
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3362
  locsymcount = symtab_hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3363
  if (!internal_syms)
3364
    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3365
            symtab_hdr->sh_info, 0,
3366
            internal_syms, external_syms, NULL);
3367
  else
3368
    isymbuf = internal_syms;
3369
  isymend = isymbuf + locsymcount;
3370
3371
  for (isym = isymbuf ; isym < isymend ; isym++)
3372
    {
3373
      switch (ELF_ST_TYPE (isym->st_info))
3374
  {
3375
  case STT_FUNC: st_info_str = "STT_FUNC"; break;
3376
  case STT_SECTION: st_info_str = "STT_SECTION"; break;
3377
  case STT_FILE: st_info_str = "STT_FILE"; break;
3378
  case STT_OBJECT: st_info_str = "STT_OBJECT"; break;
3379
  case STT_TLS: st_info_str = "STT_TLS"; break;
3380
  default: st_info_str = "";
3381
  }
3382
      switch (ELF_ST_BIND (isym->st_info))
3383
  {
3384
  case STB_LOCAL: st_info_stb_str = "STB_LOCAL"; break;
3385
  case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL"; break;
3386
  default: st_info_stb_str = "";
3387
  }
3388
      switch (ELF_ST_VISIBILITY (isym->st_other))
3389
  {
3390
  case STV_DEFAULT: st_other_str = "STV_DEFAULT"; break;
3391
  case STV_INTERNAL: st_other_str = "STV_INTERNAL"; break;
3392
  case STV_PROTECTED: st_other_str = "STV_PROTECTED"; break;
3393
  default: st_other_str = "";
3394
  }
3395
      switch (isym->st_shndx)
3396
  {
3397
  case SHN_ABS: st_shndx_str = "SHN_ABS"; break;
3398
  case SHN_COMMON: st_shndx_str = "SHN_COMMON"; break;
3399
  case SHN_UNDEF: st_shndx_str = "SHN_UNDEF"; break;
3400
  default: st_shndx_str = "";
3401
  }
3402
3403
      printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
3404
        "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
3405
        isym,
3406
        (unsigned long) isym->st_value,
3407
        (unsigned long) isym->st_size,
3408
        isym->st_name,
3409
        bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
3410
                 isym->st_name),
3411
        isym->st_info, st_info_str, st_info_stb_str,
3412
        isym->st_other, st_other_str,
3413
        isym->st_shndx, st_shndx_str);
3414
    }
3415
}
3416
3417
char *
3418
rx_get_reloc (long reloc)
3419
{
3420
  if (0 <= reloc && reloc < R_RX_max)
3421
    return rx_elf_howto_table[reloc].name;
3422
  return "";
3423
}
3424
#endif /* DEBUG */
3425
3426

3427
/* We must take care to keep the on-disk copy of any code sections
3428
   that are fully linked swapped if the target is big endian, to match
3429
   the Renesas tools.  */
3430
3431
/* The rule is: big endian object that are final-link executables,
3432
   have code sections stored with 32-bit words swapped relative to
3433
   what you'd get by default.  */
3434
3435
static bool
3436
rx_get_section_contents (bfd *         abfd,
3437
       sec_ptr       section,
3438
       void *        location,
3439
       file_ptr      offset,
3440
       bfd_size_type count)
3441
89.8k
{
3442
89.8k
  int exec = (abfd->flags & EXEC_P) ? 1 : 0;
3443
89.8k
  int s_code = (section->flags & SEC_CODE) ? 1 : 0;
3444
89.8k
  bool rv;
3445
3446
#ifdef DJDEBUG
3447
  fprintf (stderr, "dj: get %ld %ld from %s  %s e%d sc%d  %08lx:%08lx\n",
3448
     (long) offset, (long) count, section->name,
3449
     bfd_big_endian(abfd) ? "be" : "le",
3450
     exec, s_code, (long unsigned) section->filepos,
3451
     (long unsigned) offset);
3452
#endif
3453
3454
89.8k
  if (exec && s_code && bfd_big_endian (abfd))
3455
0
    {
3456
0
      char * cloc = (char *) location;
3457
0
      bfd_size_type cnt, end_cnt;
3458
3459
0
      rv = true;
3460
3461
      /* Fetch and swap unaligned bytes at the beginning.  */
3462
0
      if (offset % 4)
3463
0
  {
3464
0
    char buf[4];
3465
3466
0
    rv = _bfd_generic_get_section_contents (abfd, section, buf,
3467
0
              (offset & -4), 4);
3468
0
    if (!rv)
3469
0
      return false;
3470
3471
0
    bfd_putb32 (bfd_getl32 (buf), buf);
3472
3473
0
    cnt = 4 - (offset % 4);
3474
0
    if (cnt > count)
3475
0
      cnt = count;
3476
3477
0
    memcpy (location, buf + (offset % 4), cnt);
3478
3479
0
    count -= cnt;
3480
0
    offset += cnt;
3481
0
    cloc += count;
3482
0
  }
3483
3484
0
      end_cnt = count % 4;
3485
3486
      /* Fetch and swap the middle bytes.  */
3487
0
      if (count >= 4)
3488
0
  {
3489
0
    rv = _bfd_generic_get_section_contents (abfd, section, cloc, offset,
3490
0
              count - end_cnt);
3491
0
    if (!rv)
3492
0
      return false;
3493
3494
0
    for (cnt = count; cnt >= 4; cnt -= 4, cloc += 4)
3495
0
      bfd_putb32 (bfd_getl32 (cloc), cloc);
3496
0
  }
3497
3498
      /* Fetch and swap the end bytes.  */
3499
0
      if (end_cnt > 0)
3500
0
  {
3501
0
    char buf[4];
3502
3503
    /* Fetch the end bytes.  */
3504
0
    rv = _bfd_generic_get_section_contents (abfd, section, buf,
3505
0
              offset + count - end_cnt, 4);
3506
0
    if (!rv)
3507
0
      return false;
3508
3509
0
    bfd_putb32 (bfd_getl32 (buf), buf);
3510
0
    memcpy (cloc, buf, end_cnt);
3511
0
  }
3512
0
    }
3513
89.8k
  else
3514
89.8k
    rv = _bfd_generic_get_section_contents (abfd, section, location, offset, count);
3515
3516
89.8k
  return rv;
3517
89.8k
}
3518
3519
#ifdef DJDEBUG
3520
static bool
3521
rx2_set_section_contents (bfd *        abfd,
3522
       sec_ptr       section,
3523
       const void *  location,
3524
       file_ptr      offset,
3525
       bfd_size_type count)
3526
{
3527
  bfd_size_type i;
3528
3529
  fprintf (stderr, "   set sec %s %08x loc %p offset %#x count %#x\n",
3530
     section->name, (unsigned) section->vma, location, (int) offset, (int) count);
3531
  for (i = 0; i < count; i++)
3532
    {
3533
      if (i % 16 == 0 && i > 0)
3534
  fprintf (stderr, "\n");
3535
3536
      if (i % 16  && i % 4 == 0)
3537
  fprintf (stderr, " ");
3538
3539
      if (i % 16 == 0)
3540
  fprintf (stderr, "      %08x:", (int) (section->vma + offset + i));
3541
3542
      fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3543
    }
3544
  fprintf (stderr, "\n");
3545
3546
  return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3547
}
3548
#define _bfd_elf_set_section_contents rx2_set_section_contents
3549
#endif
3550
3551
static bool
3552
rx_set_section_contents (bfd *         abfd,
3553
       sec_ptr       section,
3554
       const void *  location,
3555
       file_ptr      offset,
3556
       bfd_size_type count)
3557
0
{
3558
0
  bool exec = (abfd->flags & EXEC_P) != 0;
3559
0
  bool s_code = (section->flags & SEC_CODE) != 0;
3560
0
  bool rv;
3561
0
  char * swapped_data = NULL;
3562
0
  bfd_size_type i;
3563
0
  bfd_vma caddr = section->vma + offset;
3564
0
  file_ptr faddr = 0;
3565
0
  bfd_size_type scount;
3566
3567
#ifdef DJDEBUG
3568
  bfd_size_type i;
3569
3570
  fprintf (stderr, "\ndj: set %ld %ld to %s  %s e%d sc%d\n",
3571
     (long) offset, (long) count, section->name,
3572
     bfd_big_endian (abfd) ? "be" : "le",
3573
     exec, s_code);
3574
3575
  for (i = 0; i < count; i++)
3576
    {
3577
      int a = section->vma + offset + i;
3578
3579
      if (a % 16 == 0 && a > 0)
3580
  fprintf (stderr, "\n");
3581
3582
      if (a % 16  && a % 4 == 0)
3583
  fprintf (stderr, " ");
3584
3585
      if (a % 16 == 0 || i == 0)
3586
  fprintf (stderr, "      %08x:", (int) (section->vma + offset + i));
3587
3588
      fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3589
    }
3590
3591
  fprintf (stderr, "\n");
3592
#endif
3593
3594
0
  if (! exec || ! s_code || ! bfd_big_endian (abfd))
3595
0
    return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3596
3597
0
  while (count > 0 && caddr > 0 && caddr % 4)
3598
0
    {
3599
0
      switch (caddr % 4)
3600
0
  {
3601
0
  case 0: faddr = offset + 3; break;
3602
0
  case 1: faddr = offset + 1; break;
3603
0
  case 2: faddr = offset - 1; break;
3604
0
  case 3: faddr = offset - 3; break;
3605
0
  }
3606
3607
0
      rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3608
0
      if (! rv)
3609
0
  return rv;
3610
3611
0
      location = (bfd_byte *) location + 1;
3612
0
      offset ++;
3613
0
      count --;
3614
0
      caddr ++;
3615
0
    }
3616
3617
0
  scount = (int)(count / 4) * 4;
3618
0
  if (scount > 0)
3619
0
    {
3620
0
      char * cloc = (char *) location;
3621
3622
0
      swapped_data = (char *) bfd_alloc (abfd, count);
3623
0
      if (swapped_data == NULL)
3624
0
  return false;
3625
3626
0
      for (i = 0; i < count; i += 4)
3627
0
  {
3628
0
    bfd_vma v = bfd_getl32 (cloc + i);
3629
0
    bfd_putb32 (v, swapped_data + i);
3630
0
  }
3631
3632
0
      rv = _bfd_elf_set_section_contents (abfd, section, swapped_data, offset, scount);
3633
3634
0
      if (!rv)
3635
0
  return rv;
3636
0
    }
3637
3638
0
  count -= scount;
3639
0
  location = (bfd_byte *) location + scount;
3640
0
  offset += scount;
3641
3642
0
  if (count > 0)
3643
0
    {
3644
0
      caddr = section->vma + offset;
3645
0
      while (count > 0)
3646
0
  {
3647
0
    switch (caddr % 4)
3648
0
      {
3649
0
      case 0: faddr = offset + 3; break;
3650
0
      case 1: faddr = offset + 1; break;
3651
0
      case 2: faddr = offset - 1; break;
3652
0
      case 3: faddr = offset - 3; break;
3653
0
      }
3654
0
    rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3655
0
    if (! rv)
3656
0
      return rv;
3657
3658
0
    location = (bfd_byte *) location + 1;
3659
0
    offset ++;
3660
0
    count --;
3661
0
    caddr ++;
3662
0
  }
3663
0
    }
3664
3665
0
  return true;
3666
0
}
3667
3668
static bool
3669
rx_final_link (bfd * abfd, struct bfd_link_info * info)
3670
0
{
3671
0
  asection * o;
3672
3673
0
  for (o = abfd->sections; o != NULL; o = o->next)
3674
0
    {
3675
#ifdef DJDEBUG
3676
      fprintf (stderr, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n",
3677
         o->name, o->flags, o->vma, o->lma, o->size, o->rawsize);
3678
#endif
3679
0
      if (o->flags & SEC_CODE
3680
0
    && bfd_big_endian (abfd)
3681
0
    && o->size % 4)
3682
0
  {
3683
#ifdef DJDEBUG
3684
    fprintf (stderr, "adjusting...\n");
3685
#endif
3686
0
    o->size += 4 - (o->size % 4);
3687
0
  }
3688
0
    }
3689
3690
0
  return _bfd_elf_final_link (abfd, info);
3691
0
}
3692
3693
static bool
3694
elf32_rx_modify_headers (bfd *abfd, struct bfd_link_info *info)
3695
1
{
3696
1
  elf_backend_data *bed;
3697
1
  struct elf_obj_tdata * tdata;
3698
1
  Elf_Internal_Phdr * phdr;
3699
1
  unsigned int count;
3700
1
  unsigned int i;
3701
3702
1
  bed = get_elf_backend_data (abfd);
3703
1
  tdata = elf_tdata (abfd);
3704
1
  phdr = tdata->phdr;
3705
1
  count = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
3706
3707
1
  if (ignore_lma)
3708
1
    for (i = count; i-- != 0;)
3709
0
      if (phdr[i].p_type == PT_LOAD)
3710
0
  {
3711
    /* The Renesas tools expect p_paddr to be zero.  However,
3712
       there is no other way to store the writable data in ROM for
3713
       startup initialization.  So, we let the linker *think*
3714
       we're using paddr and vaddr the "usual" way, but at the
3715
       last minute we move the paddr into the vaddr (which is what
3716
       the simulator uses) and zero out paddr.  Note that this
3717
       does not affect the section headers, just the program
3718
       headers.  We hope.  */
3719
0
    phdr[i].p_vaddr = phdr[i].p_paddr;
3720
#if 0   /* If we zero out p_paddr, then the LMA in the section table
3721
       becomes wrong.  */
3722
    phdr[i].p_paddr = 0;
3723
#endif
3724
0
  }
3725
3726
1
  return _bfd_elf_modify_headers (abfd, info);
3727
1
}
3728
3729
/* The default literal sections should always be marked as "code" (i.e.,
3730
   SHF_EXECINSTR).  This is particularly important for big-endian mode
3731
   when we do not want their contents byte reversed.  */
3732
static const struct bfd_elf_special_section elf32_rx_special_sections[] =
3733
{
3734
  { STRING_COMMA_LEN (".init_array"),  0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3735
  { STRING_COMMA_LEN (".fini_array"),  0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3736
  { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3737
  { NULL,      0,  0, 0,      0 }
3738
};
3739

3740
typedef struct {
3741
  bfd *abfd;
3742
  struct bfd_link_info *info;
3743
  bfd_vma table_start;
3744
  int table_size;
3745
  bfd_vma *table_handlers;
3746
  bfd_vma table_default_handler;
3747
  struct bfd_link_hash_entry **table_entries;
3748
  struct bfd_link_hash_entry *table_default_entry;
3749
  FILE *mapfile;
3750
} RX_Table_Info;
3751
3752
static bool
3753
rx_table_find (struct bfd_hash_entry *vent, void *vinfo)
3754
0
{
3755
0
  RX_Table_Info *info = (RX_Table_Info *)vinfo;
3756
0
  struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3757
0
  const char *name; /* of the symbol we've found */
3758
0
  asection *sec;
3759
0
  struct bfd *abfd;
3760
0
  int idx;
3761
0
  const char *tname; /* name of the table */
3762
0
  bfd_vma start_addr, end_addr;
3763
0
  char *buf;
3764
0
  struct bfd_link_hash_entry * h;
3765
3766
  /* We're looking for globally defined symbols of the form
3767
     $tablestart$<NAME>.  */
3768
0
  if (ent->type != bfd_link_hash_defined
3769
0
      && ent->type != bfd_link_hash_defweak)
3770
0
    return true;
3771
3772
0
  name = ent->root.string;
3773
0
  sec = ent->u.def.section;
3774
0
  abfd = sec->owner;
3775
3776
0
  if (!startswith (name, "$tablestart$"))
3777
0
    return true;
3778
3779
0
  sec->flags |= SEC_KEEP;
3780
3781
0
  tname = name + 12;
3782
3783
0
  start_addr = ent->u.def.value;
3784
3785
  /* At this point, we can't build the table but we can (and must)
3786
     find all the related symbols and mark their sections as SEC_KEEP
3787
     so we don't garbage collect them.  */
3788
3789
0
  buf = (char *) bfd_malloc (12 + 10 + strlen (tname));
3790
0
  if (buf == NULL)
3791
0
    return false;
3792
3793
0
  sprintf (buf, "$tableend$%s", tname);
3794
0
  h = bfd_link_hash_lookup (info->info->hash, buf, false, false, true);
3795
0
  if (!h || (h->type != bfd_link_hash_defined
3796
0
       && h->type != bfd_link_hash_defweak))
3797
0
    {
3798
      /* xgettext:c-format */
3799
0
      _bfd_error_handler (_("%pB:%pA: table %s missing corresponding %s"),
3800
0
        abfd, sec, name, buf);
3801
0
      return true;
3802
0
    }
3803
3804
0
  if (h->u.def.section != ent->u.def.section)
3805
0
    {
3806
      /* xgettext:c-format */
3807
0
      _bfd_error_handler (_("%pB:%pA: %s and %s must be in the same input section"),
3808
0
        h->u.def.section->owner, h->u.def.section,
3809
0
        name, buf);
3810
0
      return true;
3811
0
    }
3812
3813
0
  end_addr = h->u.def.value;
3814
3815
0
  sprintf (buf, "$tableentry$default$%s", tname);
3816
0
  h = bfd_link_hash_lookup (info->info->hash, buf, false, false, true);
3817
0
  if (h && (h->type == bfd_link_hash_defined
3818
0
      || h->type == bfd_link_hash_defweak))
3819
0
    {
3820
0
      h->u.def.section->flags |= SEC_KEEP;
3821
0
    }
3822
3823
0
  for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3824
0
    {
3825
0
      sprintf (buf, "$tableentry$%d$%s", idx, tname);
3826
0
      h = bfd_link_hash_lookup (info->info->hash, buf, false, false, true);
3827
0
      if (h && (h->type == bfd_link_hash_defined
3828
0
    || h->type == bfd_link_hash_defweak))
3829
0
  {
3830
0
    h->u.def.section->flags |= SEC_KEEP;
3831
0
  }
3832
0
    }
3833
3834
  /* Return TRUE to keep scanning, FALSE to end the traversal.  */
3835
0
  return true;
3836
0
}
3837
3838
/* We need to check for table entry symbols and build the tables, and
3839
   we need to do it before the linker does garbage collection.  This function is
3840
   called once per input object file.  */
3841
static bool
3842
rx_check_directives
3843
    (bfd *           abfd ATTRIBUTE_UNUSED,
3844
     struct bfd_link_info *    info ATTRIBUTE_UNUSED)
3845
0
{
3846
0
  RX_Table_Info stuff;
3847
3848
0
  stuff.abfd = abfd;
3849
0
  stuff.info = info;
3850
0
  bfd_hash_traverse (&(info->hash->table), rx_table_find, &stuff);
3851
3852
0
  return true;
3853
0
}
3854
3855

3856
static bool
3857
rx_table_map_2 (struct bfd_hash_entry *vent, void *vinfo)
3858
0
{
3859
0
  RX_Table_Info *info = (RX_Table_Info *)vinfo;
3860
0
  struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3861
0
  int idx;
3862
0
  const char *name;
3863
0
  bfd_vma addr;
3864
3865
  /* See if the symbol ENT has an address listed in the table, and
3866
     isn't a debug/special symbol.  If so, put it in the table.  */
3867
3868
0
  if (ent->type != bfd_link_hash_defined
3869
0
      && ent->type != bfd_link_hash_defweak)
3870
0
    return true;
3871
3872
0
  name = ent->root.string;
3873
3874
0
  if (name[0] == '$' || name[0] == '.' || name[0] < ' ')
3875
0
    return true;
3876
3877
0
  addr = (ent->u.def.value
3878
0
    + ent->u.def.section->output_section->vma
3879
0
    + ent->u.def.section->output_offset);
3880
3881
0
  for (idx = 0; idx < info->table_size; idx ++)
3882
0
    if (addr == info->table_handlers[idx])
3883
0
      info->table_entries[idx] = ent;
3884
3885
0
  if (addr == info->table_default_handler)
3886
0
    info->table_default_entry = ent;
3887
3888
0
  return true;
3889
0
}
3890
3891
static bool
3892
rx_table_map (struct bfd_hash_entry *vent, void *vinfo)
3893
0
{
3894
0
  RX_Table_Info *info = (RX_Table_Info *)vinfo;
3895
0
  struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3896
0
  const char *name; /* of the symbol we've found */
3897
0
  int idx;
3898
0
  const char *tname; /* name of the table */
3899
0
  bfd_vma start_addr, end_addr;
3900
0
  char *buf;
3901
0
  struct bfd_link_hash_entry * h;
3902
0
  int need_elipses;
3903
3904
  /* We're looking for globally defined symbols of the form
3905
     $tablestart$<NAME>.  */
3906
0
  if (ent->type != bfd_link_hash_defined
3907
0
      && ent->type != bfd_link_hash_defweak)
3908
0
    return true;
3909
3910
0
  name = ent->root.string;
3911
3912
0
  if (!startswith (name, "$tablestart$"))
3913
0
    return true;
3914
3915
0
  tname = name + 12;
3916
0
  start_addr = (ent->u.def.value
3917
0
    + ent->u.def.section->output_section->vma
3918
0
    + ent->u.def.section->output_offset);
3919
3920
0
  buf = (char *) bfd_malloc (12 + 10 + strlen (tname));
3921
0
  if (buf == NULL)
3922
0
    return false;
3923
3924
0
  sprintf (buf, "$tableend$%s", tname);
3925
0
  end_addr = get_symbol_value_maybe (buf, info->info);
3926
3927
0
  sprintf (buf, "$tableentry$default$%s", tname);
3928
0
  h = bfd_link_hash_lookup (info->info->hash, buf, false, false, true);
3929
0
  if (h)
3930
0
    {
3931
0
      info->table_default_handler = (h->u.def.value
3932
0
             + h->u.def.section->output_section->vma
3933
0
             + h->u.def.section->output_offset);
3934
0
    }
3935
0
  else
3936
    /* Zero is a valid handler address!  */
3937
0
    info->table_default_handler = (bfd_vma) (-1);
3938
0
  info->table_default_entry = NULL;
3939
3940
0
  info->table_start = start_addr;
3941
0
  info->table_size = (int) (end_addr - start_addr) / 4;
3942
0
  info->table_handlers = (bfd_vma *)
3943
0
    bfd_malloc (info->table_size * sizeof (bfd_vma));
3944
0
  if (info->table_handlers == NULL)
3945
0
    {
3946
0
      free (buf);
3947
0
      return false;
3948
0
    }
3949
0
  info->table_entries = (struct bfd_link_hash_entry **)
3950
0
    bfd_malloc (info->table_size * sizeof (struct bfd_link_hash_entry));
3951
0
  if (info->table_entries == NULL)
3952
0
    {
3953
0
      free (info->table_handlers);
3954
0
      free (buf);
3955
0
      return false;
3956
0
    }
3957
3958
0
  for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3959
0
    {
3960
0
      sprintf (buf, "$tableentry$%d$%s", idx, tname);
3961
0
      h = bfd_link_hash_lookup (info->info->hash, buf, false, false, true);
3962
0
      if (h && (h->type == bfd_link_hash_defined
3963
0
    || h->type == bfd_link_hash_defweak))
3964
0
  {
3965
0
    info->table_handlers[idx] = (h->u.def.value
3966
0
               + h->u.def.section->output_section->vma
3967
0
               + h->u.def.section->output_offset);
3968
0
  }
3969
0
      else
3970
0
  info->table_handlers[idx] = info->table_default_handler;
3971
0
      info->table_entries[idx] = NULL;
3972
0
    }
3973
3974
0
  free (buf);
3975
3976
0
  bfd_hash_traverse (&(info->info->hash->table), rx_table_map_2, info);
3977
3978
0
  fprintf (info->mapfile,
3979
0
     "\nRX Vector Table: %s has %d entries at 0x%08" PRIx64 "\n\n",
3980
0
     tname, info->table_size, (uint64_t) start_addr);
3981
3982
0
  if (info->table_default_entry)
3983
0
    fprintf (info->mapfile, "  default handler is: %s at 0x%08" PRIx64 "\n",
3984
0
       info->table_default_entry->root.string,
3985
0
       (uint64_t) info->table_default_handler);
3986
0
  else if (info->table_default_handler != (bfd_vma)(-1))
3987
0
    fprintf (info->mapfile, "  default handler is at 0x%08" PRIx64 "\n",
3988
0
       (uint64_t) info->table_default_handler);
3989
0
  else
3990
0
    fprintf (info->mapfile, "  no default handler\n");
3991
3992
0
  need_elipses = 1;
3993
0
  for (idx = 0; idx < info->table_size; idx ++)
3994
0
    {
3995
0
      if (info->table_handlers[idx] == info->table_default_handler)
3996
0
  {
3997
0
    if (need_elipses)
3998
0
      fprintf (info->mapfile, "  . . .\n");
3999
0
    need_elipses = 0;
4000
0
    continue;
4001
0
  }
4002
0
      need_elipses = 1;
4003
4004
0
      fprintf (info->mapfile,
4005
0
         "  0x%08" PRIx64 " [%3d] ", (uint64_t) start_addr + 4 * idx, idx);
4006
4007
0
      if (info->table_handlers[idx] == (bfd_vma) (-1))
4008
0
  fprintf (info->mapfile, "(no handler found)\n");
4009
4010
0
      else if (info->table_handlers[idx] == info->table_default_handler)
4011
0
  {
4012
0
    if (info->table_default_entry)
4013
0
      fprintf (info->mapfile, "(default)\n");
4014
0
    else
4015
0
      fprintf (info->mapfile, "(default)\n");
4016
0
  }
4017
4018
0
      else if (info->table_entries[idx])
4019
0
  {
4020
0
    fprintf (info->mapfile, "0x%08" PRIx64 " %s\n",
4021
0
       (uint64_t) info->table_handlers[idx],
4022
0
       info->table_entries[idx]->root.string);
4023
0
  }
4024
4025
0
      else
4026
0
  {
4027
0
    fprintf (info->mapfile, "0x%08" PRIx64 " ???\n",
4028
0
       (uint64_t) info->table_handlers[idx]);
4029
0
  }
4030
0
    }
4031
0
  if (need_elipses)
4032
0
    fprintf (info->mapfile, "  . . .\n");
4033
4034
0
  return true;
4035
0
}
4036
4037
void
4038
rx_additional_link_map_text (bfd *obfd, struct bfd_link_info *info, FILE *mapfile)
4039
0
{
4040
  /* We scan the symbol table looking for $tableentry$'s, and for
4041
     each, try to deduce which handlers go with which entries.  */
4042
4043
0
  RX_Table_Info stuff;
4044
4045
0
  stuff.abfd = obfd;
4046
0
  stuff.info = info;
4047
0
  stuff.mapfile = mapfile;
4048
0
  bfd_hash_traverse (&(info->hash->table), rx_table_map, &stuff);
4049
0
}
4050
4051

4052
#define ELF_ARCH    bfd_arch_rx
4053
#define ELF_MACHINE_CODE  EM_RX
4054
#define ELF_MAXPAGESIZE   0x1000
4055
4056
#define TARGET_BIG_SYM    rx_elf32_be_vec
4057
#define TARGET_BIG_NAME   "elf32-rx-be"
4058
4059
#define TARGET_LITTLE_SYM rx_elf32_le_vec
4060
#define TARGET_LITTLE_NAME  "elf32-rx-le"
4061
4062
#define elf_info_to_howto_rel     NULL
4063
#define elf_info_to_howto     rx_info_to_howto_rela
4064
#define elf_backend_object_p      rx_elf_object_p
4065
#define elf_backend_relocate_section    rx_elf_relocate_section
4066
#define elf_symbol_leading_char     ('_')
4067
#define elf_backend_can_gc_sections   1
4068
#define elf_backend_modify_headers    elf32_rx_modify_headers
4069
4070
#define bfd_elf32_bfd_reloc_type_lookup   rx_reloc_type_lookup
4071
#define bfd_elf32_bfd_reloc_name_lookup   rx_reloc_name_lookup
4072
#define bfd_elf32_bfd_set_private_flags   rx_elf_set_private_flags
4073
#define bfd_elf32_bfd_merge_private_bfd_data  rx_elf_merge_private_bfd_data
4074
#define bfd_elf32_bfd_print_private_bfd_data  rx_elf_print_private_bfd_data
4075
#define bfd_elf32_get_section_contents    rx_get_section_contents
4076
#define bfd_elf32_set_section_contents    rx_set_section_contents
4077
#define bfd_elf32_bfd_final_link    rx_final_link
4078
#define bfd_elf32_bfd_relax_section   elf32_rx_relax_section_wrapper
4079
#define elf_backend_special_sections    elf32_rx_special_sections
4080
#define elf_backend_check_directives    rx_check_directives
4081
4082
#include "elf32-target.h"
4083
4084
/* We define a second big-endian target that doesn't have the custom
4085
   section get/set hooks, for times when we want to preserve the
4086
   pre-swapped .text sections (like objcopy).  */
4087
4088
#undef  TARGET_BIG_SYM
4089
#define TARGET_BIG_SYM    rx_elf32_be_ns_vec
4090
#undef  TARGET_BIG_NAME
4091
#define TARGET_BIG_NAME   "elf32-rx-be-ns"
4092
#undef  TARGET_LITTLE_SYM
4093
4094
#undef bfd_elf32_get_section_contents
4095
#undef bfd_elf32_set_section_contents
4096
4097
#undef  elf32_bed
4098
#define elf32_bed       elf32_rx_be_ns_bed
4099
4100
#include "elf32-target.h"
4101
4102
#undef  TARGET_LITTLE_SYM
4103
#define TARGET_LITTLE_SYM rx_elf32_linux_le_vec
4104
#undef  TARGET_LITTLE_NAME
4105
#define TARGET_LITTLE_NAME  "elf32-rx-linux"
4106
#undef  TARGET_BIG_SYM
4107
#undef  TARGET_BIG_NAME
4108
4109
#undef  elf_backend_object_p
4110
#define elf_backend_object_p      rx_linux_object_p
4111
#undef  elf_symbol_leading_char
4112
#undef  elf32_bed
4113
#define elf32_bed       elf32_rx_le_linux_bed
4114
4115
#include "elf32-target.h"