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