1 /* Renesas RX specific support for 32-bit ELF.
2 Copyright (C) 2008-2018 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
23 #include "bfd_stdint.h"
27 #include "libiberty.h"
30 #define RX_OPCODE_BIG_ENDIAN 0
32 /* This is a meta-target that's used only with objcopy, to avoid the
33 endian-swap we would otherwise get. We check for this in
35 const bfd_target rx_elf32_be_ns_vec;
36 const bfd_target rx_elf32_be_vec;
39 char * rx_get_reloc (long);
40 void rx_dump_symtab (bfd *, void *, void *);
43 #define RXREL(n,sz,bit,shift,complain,pcrel) \
44 HOWTO (R_RX_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
45 bfd_elf_generic_reloc, "R_RX_" #n, FALSE, 0, ~0, FALSE)
47 /* Note that the relocations around 0x7f are internal to this file;
48 feel free to move them as needed to avoid conflicts with published
49 relocation numbers. */
51 static reloc_howto_type rx_elf_howto_table [] =
53 RXREL (NONE, 3, 0, 0, dont, FALSE),
54 RXREL (DIR32, 2, 32, 0, signed, FALSE),
55 RXREL (DIR24S, 2, 24, 0, signed, FALSE),
56 RXREL (DIR16, 1, 16, 0, dont, FALSE),
57 RXREL (DIR16U, 1, 16, 0, unsigned, FALSE),
58 RXREL (DIR16S, 1, 16, 0, signed, FALSE),
59 RXREL (DIR8, 0, 8, 0, dont, FALSE),
60 RXREL (DIR8U, 0, 8, 0, unsigned, FALSE),
61 RXREL (DIR8S, 0, 8, 0, signed, FALSE),
62 RXREL (DIR24S_PCREL, 2, 24, 0, signed, TRUE),
63 RXREL (DIR16S_PCREL, 1, 16, 0, signed, TRUE),
64 RXREL (DIR8S_PCREL, 0, 8, 0, signed, TRUE),
65 RXREL (DIR16UL, 1, 16, 2, unsigned, FALSE),
66 RXREL (DIR16UW, 1, 16, 1, unsigned, FALSE),
67 RXREL (DIR8UL, 0, 8, 2, unsigned, FALSE),
68 RXREL (DIR8UW, 0, 8, 1, unsigned, FALSE),
69 RXREL (DIR32_REV, 1, 16, 0, dont, FALSE),
70 RXREL (DIR16_REV, 1, 16, 0, dont, FALSE),
71 RXREL (DIR3U_PCREL, 0, 3, 0, dont, TRUE),
87 RXREL (RH_3_PCREL, 0, 3, 0, signed, TRUE),
88 RXREL (RH_16_OP, 1, 16, 0, signed, FALSE),
89 RXREL (RH_24_OP, 2, 24, 0, signed, FALSE),
90 RXREL (RH_32_OP, 2, 32, 0, signed, FALSE),
91 RXREL (RH_24_UNS, 2, 24, 0, unsigned, FALSE),
92 RXREL (RH_8_NEG, 0, 8, 0, signed, FALSE),
93 RXREL (RH_16_NEG, 1, 16, 0, signed, FALSE),
94 RXREL (RH_24_NEG, 2, 24, 0, signed, FALSE),
95 RXREL (RH_32_NEG, 2, 32, 0, signed, FALSE),
96 RXREL (RH_DIFF, 2, 32, 0, signed, FALSE),
97 RXREL (RH_GPRELB, 1, 16, 0, unsigned, FALSE),
98 RXREL (RH_GPRELW, 1, 16, 0, unsigned, FALSE),
99 RXREL (RH_GPRELL, 1, 16, 0, unsigned, FALSE),
100 RXREL (RH_RELAX, 0, 0, 0, dont, FALSE),
122 RXREL (ABS32, 2, 32, 0, dont, FALSE),
123 RXREL (ABS24S, 2, 24, 0, signed, FALSE),
124 RXREL (ABS16, 1, 16, 0, dont, FALSE),
125 RXREL (ABS16U, 1, 16, 0, unsigned, FALSE),
126 RXREL (ABS16S, 1, 16, 0, signed, FALSE),
127 RXREL (ABS8, 0, 8, 0, dont, FALSE),
128 RXREL (ABS8U, 0, 8, 0, unsigned, FALSE),
129 RXREL (ABS8S, 0, 8, 0, signed, FALSE),
130 RXREL (ABS24S_PCREL, 2, 24, 0, signed, TRUE),
131 RXREL (ABS16S_PCREL, 1, 16, 0, signed, TRUE),
132 RXREL (ABS8S_PCREL, 0, 8, 0, signed, TRUE),
133 RXREL (ABS16UL, 1, 16, 0, unsigned, FALSE),
134 RXREL (ABS16UW, 1, 16, 0, unsigned, FALSE),
135 RXREL (ABS8UL, 0, 8, 0, unsigned, FALSE),
136 RXREL (ABS8UW, 0, 8, 0, unsigned, FALSE),
137 RXREL (ABS32_REV, 2, 32, 0, dont, FALSE),
138 RXREL (ABS16_REV, 1, 16, 0, dont, FALSE),
140 #define STACK_REL_P(x) ((x) <= R_RX_ABS16_REV && (x) >= R_RX_ABS32)
181 /* These are internal. */
182 /* A 5-bit unsigned displacement to a B/W/L address, at bit position 8/12. */
183 /* ---- ---- 4--- 3210. */
184 #define R_RX_RH_ABS5p8B 0x78
185 RXREL (RH_ABS5p8B, 0, 0, 0, dont, FALSE),
186 #define R_RX_RH_ABS5p8W 0x79
187 RXREL (RH_ABS5p8W, 0, 0, 0, dont, FALSE),
188 #define R_RX_RH_ABS5p8L 0x7a
189 RXREL (RH_ABS5p8L, 0, 0, 0, dont, FALSE),
190 /* A 5-bit unsigned displacement to a B/W/L address, at bit position 5/12. */
191 /* ---- -432 1--- 0---. */
192 #define R_RX_RH_ABS5p5B 0x7b
193 RXREL (RH_ABS5p5B, 0, 0, 0, dont, FALSE),
194 #define R_RX_RH_ABS5p5W 0x7c
195 RXREL (RH_ABS5p5W, 0, 0, 0, dont, FALSE),
196 #define R_RX_RH_ABS5p5L 0x7d
197 RXREL (RH_ABS5p5L, 0, 0, 0, dont, FALSE),
198 /* A 4-bit unsigned immediate at bit position 8. */
199 #define R_RX_RH_UIMM4p8 0x7e
200 RXREL (RH_UIMM4p8, 0, 0, 0, dont, FALSE),
201 /* A 4-bit negative unsigned immediate at bit position 8. */
202 #define R_RX_RH_UNEG4p8 0x7f
203 RXREL (RH_UNEG4p8, 0, 0, 0, dont, FALSE),
204 /* End of internal relocs. */
206 RXREL (SYM, 2, 32, 0, dont, FALSE),
207 RXREL (OPneg, 2, 32, 0, dont, FALSE),
208 RXREL (OPadd, 2, 32, 0, dont, FALSE),
209 RXREL (OPsub, 2, 32, 0, dont, FALSE),
210 RXREL (OPmul, 2, 32, 0, dont, FALSE),
211 RXREL (OPdiv, 2, 32, 0, dont, FALSE),
212 RXREL (OPshla, 2, 32, 0, dont, FALSE),
213 RXREL (OPshra, 2, 32, 0, dont, FALSE),
214 RXREL (OPsctsize, 2, 32, 0, dont, FALSE),
215 RXREL (OPscttop, 2, 32, 0, dont, FALSE),
216 RXREL (OPand, 2, 32, 0, dont, FALSE),
217 RXREL (OPor, 2, 32, 0, dont, FALSE),
218 RXREL (OPxor, 2, 32, 0, dont, FALSE),
219 RXREL (OPnot, 2, 32, 0, dont, FALSE),
220 RXREL (OPmod, 2, 32, 0, dont, FALSE),
221 RXREL (OPromtop, 2, 32, 0, dont, FALSE),
222 RXREL (OPramtop, 2, 32, 0, dont, FALSE)
225 /* Map BFD reloc types to RX ELF reloc types. */
229 bfd_reloc_code_real_type bfd_reloc_val;
230 unsigned int rx_reloc_val;
233 static const struct rx_reloc_map rx_reloc_map [] =
235 { BFD_RELOC_NONE, R_RX_NONE },
236 { BFD_RELOC_8, R_RX_DIR8S },
237 { BFD_RELOC_16, R_RX_DIR16S },
238 { BFD_RELOC_24, R_RX_DIR24S },
239 { BFD_RELOC_32, R_RX_DIR32 },
240 { BFD_RELOC_RX_16_OP, R_RX_DIR16 },
241 { BFD_RELOC_RX_DIR3U_PCREL, R_RX_DIR3U_PCREL },
242 { BFD_RELOC_8_PCREL, R_RX_DIR8S_PCREL },
243 { BFD_RELOC_16_PCREL, R_RX_DIR16S_PCREL },
244 { BFD_RELOC_24_PCREL, R_RX_DIR24S_PCREL },
245 { BFD_RELOC_RX_8U, R_RX_DIR8U },
246 { BFD_RELOC_RX_16U, R_RX_DIR16U },
247 { BFD_RELOC_RX_24U, R_RX_RH_24_UNS },
248 { BFD_RELOC_RX_NEG8, R_RX_RH_8_NEG },
249 { BFD_RELOC_RX_NEG16, R_RX_RH_16_NEG },
250 { BFD_RELOC_RX_NEG24, R_RX_RH_24_NEG },
251 { BFD_RELOC_RX_NEG32, R_RX_RH_32_NEG },
252 { BFD_RELOC_RX_DIFF, R_RX_RH_DIFF },
253 { BFD_RELOC_RX_GPRELB, R_RX_RH_GPRELB },
254 { BFD_RELOC_RX_GPRELW, R_RX_RH_GPRELW },
255 { BFD_RELOC_RX_GPRELL, R_RX_RH_GPRELL },
256 { BFD_RELOC_RX_RELAX, R_RX_RH_RELAX },
257 { BFD_RELOC_RX_SYM, R_RX_SYM },
258 { BFD_RELOC_RX_OP_SUBTRACT, R_RX_OPsub },
259 { BFD_RELOC_RX_OP_NEG, R_RX_OPneg },
260 { BFD_RELOC_RX_ABS8, R_RX_ABS8 },
261 { BFD_RELOC_RX_ABS16, R_RX_ABS16 },
262 { BFD_RELOC_RX_ABS16_REV, R_RX_ABS16_REV },
263 { BFD_RELOC_RX_ABS32, R_RX_ABS32 },
264 { BFD_RELOC_RX_ABS32_REV, R_RX_ABS32_REV },
265 { BFD_RELOC_RX_ABS16UL, R_RX_ABS16UL },
266 { BFD_RELOC_RX_ABS16UW, R_RX_ABS16UW },
267 { BFD_RELOC_RX_ABS16U, R_RX_ABS16U }
270 #define BIGE(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG)
272 static reloc_howto_type *
273 rx_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
274 bfd_reloc_code_real_type code)
278 if (code == BFD_RELOC_RX_32_OP)
279 return rx_elf_howto_table + R_RX_DIR32;
281 for (i = ARRAY_SIZE (rx_reloc_map); i--;)
282 if (rx_reloc_map [i].bfd_reloc_val == code)
283 return rx_elf_howto_table + rx_reloc_map[i].rx_reloc_val;
288 static reloc_howto_type *
289 rx_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
293 for (i = 0; i < ARRAY_SIZE (rx_elf_howto_table); i++)
294 if (rx_elf_howto_table[i].name != NULL
295 && strcasecmp (rx_elf_howto_table[i].name, r_name) == 0)
296 return rx_elf_howto_table + i;
301 /* Set the howto pointer for an RX ELF reloc. */
304 rx_info_to_howto_rela (bfd * abfd,
306 Elf_Internal_Rela * dst)
310 r_type = ELF32_R_TYPE (dst->r_info);
311 if (r_type >= (unsigned int) R_RX_max)
313 /* xgettext:c-format */
314 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
316 bfd_set_error (bfd_error_bad_value);
319 cache_ptr->howto = rx_elf_howto_table + r_type;
320 if (cache_ptr->howto->name == NULL)
322 /* xgettext:c-format */
323 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
325 bfd_set_error (bfd_error_bad_value);
332 get_symbol_value (const char * name,
333 struct bfd_link_info * info,
335 asection * input_section,
339 struct bfd_link_hash_entry * h;
341 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
344 || (h->type != bfd_link_hash_defined
345 && h->type != bfd_link_hash_defweak))
346 (*info->callbacks->undefined_symbol)
347 (info, name, input_bfd, input_section, offset, TRUE);
349 value = (h->u.def.value
350 + h->u.def.section->output_section->vma
351 + h->u.def.section->output_offset);
357 get_symbol_value_maybe (const char * name,
358 struct bfd_link_info * info)
361 struct bfd_link_hash_entry * h;
363 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
366 || (h->type != bfd_link_hash_defined
367 && h->type != bfd_link_hash_defweak))
370 value = (h->u.def.value
371 + h->u.def.section->output_section->vma
372 + h->u.def.section->output_offset);
378 get_gp (struct bfd_link_info * info,
383 static bfd_boolean cached = FALSE;
384 static bfd_vma cached_value = 0;
388 cached_value = get_symbol_value ("__gp", info, abfd, sec, offset);
395 get_romstart (struct bfd_link_info * info,
400 static bfd_boolean cached = FALSE;
401 static bfd_vma cached_value = 0;
405 cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
412 get_ramstart (struct bfd_link_info * info,
417 static bfd_boolean cached = FALSE;
418 static bfd_vma cached_value = 0;
422 cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
428 #define NUM_STACK_ENTRIES 16
429 static int32_t rx_stack [ NUM_STACK_ENTRIES ];
430 static unsigned int rx_stack_top;
432 #define RX_STACK_PUSH(val) \
435 if (rx_stack_top < NUM_STACK_ENTRIES) \
436 rx_stack [rx_stack_top ++] = (val); \
438 r = bfd_reloc_dangerous; \
442 #define RX_STACK_POP(dest) \
445 if (rx_stack_top > 0) \
446 (dest) = rx_stack [-- rx_stack_top]; \
448 (dest) = 0, r = bfd_reloc_dangerous; \
452 /* Relocate an RX ELF section.
453 There is some attempt to make this function usable for many architectures,
454 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
455 if only to serve as a learning tool.
457 The RELOCATE_SECTION function is called by the new ELF backend linker
458 to handle the relocations for a section.
460 The relocs are always passed as Rela structures; if the section
461 actually uses Rel structures, the r_addend field will always be
464 This function is responsible for adjusting the section contents as
465 necessary, and (if using Rela relocs and generating a relocatable
466 output file) adjusting the reloc addend as necessary.
468 This function does not have to worry about setting the reloc
469 address or the reloc symbol index.
471 LOCAL_SYMS is a pointer to the swapped in local symbols.
473 LOCAL_SECTIONS is an array giving the section in the input file
474 corresponding to the st_shndx field of each local symbol.
476 The global hash table entry for the global symbols can be found
477 via elf_sym_hashes (input_bfd).
479 When generating relocatable output, this function must handle
480 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
481 going to be the section symbol corresponding to the output
482 section, which means that the addend must be adjusted
486 rx_elf_relocate_section
488 struct bfd_link_info * info,
490 asection * input_section,
492 Elf_Internal_Rela * relocs,
493 Elf_Internal_Sym * local_syms,
494 asection ** local_sections)
496 Elf_Internal_Shdr * symtab_hdr;
497 struct elf_link_hash_entry ** sym_hashes;
498 Elf_Internal_Rela * rel;
499 Elf_Internal_Rela * relend;
500 bfd_boolean pid_mode;
501 bfd_boolean saw_subtract = FALSE;
502 const char * table_default_cache = NULL;
503 bfd_vma table_start_cache = 0;
504 bfd_vma table_end_cache = 0;
506 if (elf_elfheader (output_bfd)->e_flags & E_FLAG_RX_PID)
511 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
512 sym_hashes = elf_sym_hashes (input_bfd);
513 relend = relocs + input_section->reloc_count;
514 for (rel = relocs; rel < relend; rel ++)
516 reloc_howto_type * howto;
517 unsigned long r_symndx;
518 Elf_Internal_Sym * sym;
520 struct elf_link_hash_entry * h;
522 bfd_reloc_status_type r;
523 const char * name = NULL;
524 bfd_boolean unresolved_reloc = TRUE;
527 r_type = ELF32_R_TYPE (rel->r_info);
528 r_symndx = ELF32_R_SYM (rel->r_info);
530 howto = rx_elf_howto_table + ELF32_R_TYPE (rel->r_info);
536 if (rx_stack_top == 0)
537 saw_subtract = FALSE;
539 if (r_symndx < symtab_hdr->sh_info)
541 sym = local_syms + r_symndx;
542 sec = local_sections [r_symndx];
543 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
545 name = bfd_elf_string_from_elf_section
546 (input_bfd, symtab_hdr->sh_link, sym->st_name);
547 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
551 bfd_boolean warned, ignored;
553 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
554 r_symndx, symtab_hdr, sym_hashes, h,
555 sec, relocation, unresolved_reloc,
558 name = h->root.root.string;
561 if (strncmp (name, "$tableentry$default$", 20) == 0)
567 if (table_default_cache != name)
570 /* All relocs for a given table should be to the same
571 (weak) default symbol) so we can use it to detect a
572 cache miss. We use the offset into the table to find
573 the "real" symbol. Calculate and store the table's
576 table_default_cache = name;
578 /* We have already done error checking in rx_table_find(). */
580 buf = (char *) malloc (13 + strlen (name + 20));
582 sprintf (buf, "$tablestart$%s", name + 20);
583 table_start_cache = get_symbol_value (buf,
589 sprintf (buf, "$tableend$%s", name + 20);
590 table_end_cache = get_symbol_value (buf,
599 entry_vma = (input_section->output_section->vma
600 + input_section->output_offset
603 if (table_end_cache <= entry_vma || entry_vma < table_start_cache)
605 /* xgettext:c-format */
606 _bfd_error_handler (_("%pB:%pA: table entry %s outside table"),
607 input_bfd, input_section,
610 else if ((int) (entry_vma - table_start_cache) % 4)
612 /* xgettext:c-format */
613 _bfd_error_handler (_("%pB:%pA: table entry %s not word-aligned within table"),
614 input_bfd, input_section,
619 idx = (int) (entry_vma - table_start_cache) / 4;
621 /* This will look like $tableentry$<N>$<name> */
622 buf = (char *) malloc (12 + 20 + strlen (name + 20));
623 sprintf (buf, "$tableentry$%d$%s", idx, name + 20);
625 h = (struct elf_link_hash_entry *) bfd_link_hash_lookup (info->hash, buf, FALSE, FALSE, TRUE);
629 relocation = (h->root.u.def.value
630 + h->root.u.def.section->output_section->vma
631 + h->root.u.def.section->output_offset);;
638 if (sec != NULL && discarded_section (sec))
639 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
640 rel, 1, relend, howto, 0, contents);
642 if (bfd_link_relocatable (info))
644 /* This is a relocatable link. We don't have to change
645 anything, unless the reloc is against a section symbol,
646 in which case we have to adjust according to where the
647 section symbol winds up in the output section. */
648 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
649 rel->r_addend += sec->output_offset;
653 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
654 /* If the symbol is undefined and weak
655 then the relocation resolves to zero. */
659 if (howto->pc_relative)
661 relocation -= (input_section->output_section->vma
662 + input_section->output_offset
664 if (r_type != R_RX_RH_3_PCREL
665 && r_type != R_RX_DIR3U_PCREL)
669 relocation += rel->r_addend;
675 if (a > (long) relocation || (long) relocation > b) \
676 r = bfd_reloc_overflow
678 if (relocation & m) \
681 (contents[rel->r_offset + (i)])
682 #define WARN_REDHAT(type) \
683 /* xgettext:c-format */ \
685 (_("%pB:%pA: warning: deprecated Red Hat reloc " \
686 "%s detected against: %s"), \
687 input_bfd, input_section, #type, name)
689 /* Check for unsafe relocs in PID mode. These are any relocs where
690 an absolute address is being computed. There are special cases
691 for relocs against symbols that are known to be referenced in
692 crt0.o before the PID base address register has been initialised. */
693 #define UNSAFE_FOR_PID \
698 && sec->flags & SEC_READONLY \
699 && !(input_section->flags & SEC_DEBUGGING) \
700 && strcmp (name, "__pid_base") != 0 \
701 && strcmp (name, "__gp") != 0 \
702 && strcmp (name, "__romdatastart") != 0 \
704 /* xgettext:c-format */ \
705 _bfd_error_handler (_("%pB(%pA): unsafe PID relocation %s " \
706 "at %#" PRIx64 " (against %s in %s)"), \
707 input_bfd, input_section, howto->name, \
708 (uint64_t) (input_section->output_section->vma \
709 + input_section->output_offset \
715 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
724 case R_RX_RH_3_PCREL:
725 WARN_REDHAT ("RX_RH_3_PCREL");
728 OP (0) |= relocation & 0x07;
732 WARN_REDHAT ("RX_RH_8_NEG");
733 relocation = - relocation;
735 case R_RX_DIR8S_PCREL:
754 WARN_REDHAT ("RX_RH_16_NEG");
755 relocation = - relocation;
757 case R_RX_DIR16S_PCREL:
759 RANGE (-32768, 32767);
760 #if RX_OPCODE_BIG_ENDIAN
763 OP (1) = relocation >> 8;
768 WARN_REDHAT ("RX_RH_16_OP");
770 RANGE (-32768, 32767);
771 #if RX_OPCODE_BIG_ENDIAN
773 OP (0) = relocation >> 8;
776 OP (1) = relocation >> 8;
782 RANGE (-32768, 65535);
783 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
786 OP (0) = relocation >> 8;
791 OP (1) = relocation >> 8;
798 #if RX_OPCODE_BIG_ENDIAN
800 OP (0) = relocation >> 8;
803 OP (1) = relocation >> 8;
809 RANGE (-32768, 65536);
810 #if RX_OPCODE_BIG_ENDIAN
812 OP (0) = relocation >> 8;
815 OP (1) = relocation >> 8;
821 RANGE (-32768, 65536);
822 #if RX_OPCODE_BIG_ENDIAN
824 OP (1) = relocation >> 8;
827 OP (0) = relocation >> 8;
831 case R_RX_DIR3U_PCREL:
834 OP (0) |= relocation & 0x07;
839 WARN_REDHAT ("RX_RH_24_NEG");
840 relocation = - relocation;
842 case R_RX_DIR24S_PCREL:
843 RANGE (-0x800000, 0x7fffff);
844 #if RX_OPCODE_BIG_ENDIAN
846 OP (1) = relocation >> 8;
847 OP (0) = relocation >> 16;
850 OP (1) = relocation >> 8;
851 OP (2) = relocation >> 16;
857 WARN_REDHAT ("RX_RH_24_OP");
858 RANGE (-0x800000, 0x7fffff);
859 #if RX_OPCODE_BIG_ENDIAN
861 OP (1) = relocation >> 8;
862 OP (0) = relocation >> 16;
865 OP (1) = relocation >> 8;
866 OP (2) = relocation >> 16;
872 RANGE (-0x800000, 0x7fffff);
873 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
876 OP (1) = relocation >> 8;
877 OP (0) = relocation >> 16;
882 OP (1) = relocation >> 8;
883 OP (2) = relocation >> 16;
889 WARN_REDHAT ("RX_RH_24_UNS");
891 #if RX_OPCODE_BIG_ENDIAN
893 OP (1) = relocation >> 8;
894 OP (0) = relocation >> 16;
897 OP (1) = relocation >> 8;
898 OP (2) = relocation >> 16;
904 WARN_REDHAT ("RX_RH_32_NEG");
905 relocation = - relocation;
906 #if RX_OPCODE_BIG_ENDIAN
908 OP (2) = relocation >> 8;
909 OP (1) = relocation >> 16;
910 OP (0) = relocation >> 24;
913 OP (1) = relocation >> 8;
914 OP (2) = relocation >> 16;
915 OP (3) = relocation >> 24;
921 WARN_REDHAT ("RX_RH_32_OP");
922 #if RX_OPCODE_BIG_ENDIAN
924 OP (2) = relocation >> 8;
925 OP (1) = relocation >> 16;
926 OP (0) = relocation >> 24;
929 OP (1) = relocation >> 8;
930 OP (2) = relocation >> 16;
931 OP (3) = relocation >> 24;
936 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
939 OP (2) = relocation >> 8;
940 OP (1) = relocation >> 16;
941 OP (0) = relocation >> 24;
946 OP (1) = relocation >> 8;
947 OP (2) = relocation >> 16;
948 OP (3) = relocation >> 24;
953 if (BIGE (output_bfd))
956 OP (1) = relocation >> 8;
957 OP (2) = relocation >> 16;
958 OP (3) = relocation >> 24;
963 OP (2) = relocation >> 8;
964 OP (1) = relocation >> 16;
965 OP (0) = relocation >> 24;
972 WARN_REDHAT ("RX_RH_DIFF");
973 val = bfd_get_32 (output_bfd, & OP (0));
975 bfd_put_32 (output_bfd, val, & OP (0));
980 WARN_REDHAT ("RX_RH_GPRELB");
981 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
983 #if RX_OPCODE_BIG_ENDIAN
985 OP (0) = relocation >> 8;
988 OP (1) = relocation >> 8;
993 WARN_REDHAT ("RX_RH_GPRELW");
994 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
998 #if RX_OPCODE_BIG_ENDIAN
1000 OP (0) = relocation >> 8;
1002 OP (0) = relocation;
1003 OP (1) = relocation >> 8;
1007 case R_RX_RH_GPRELL:
1008 WARN_REDHAT ("RX_RH_GPRELL");
1009 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
1013 #if RX_OPCODE_BIG_ENDIAN
1014 OP (1) = relocation;
1015 OP (0) = relocation >> 8;
1017 OP (0) = relocation;
1018 OP (1) = relocation >> 8;
1022 /* Internal relocations just for relaxation: */
1023 case R_RX_RH_ABS5p5B:
1024 RX_STACK_POP (relocation);
1027 OP (0) |= relocation >> 2;
1029 OP (1) |= (relocation << 6) & 0x80;
1030 OP (1) |= (relocation << 3) & 0x08;
1033 case R_RX_RH_ABS5p5W:
1034 RX_STACK_POP (relocation);
1039 OP (0) |= relocation >> 2;
1041 OP (1) |= (relocation << 6) & 0x80;
1042 OP (1) |= (relocation << 3) & 0x08;
1045 case R_RX_RH_ABS5p5L:
1046 RX_STACK_POP (relocation);
1051 OP (0) |= relocation >> 2;
1053 OP (1) |= (relocation << 6) & 0x80;
1054 OP (1) |= (relocation << 3) & 0x08;
1057 case R_RX_RH_ABS5p8B:
1058 RX_STACK_POP (relocation);
1061 OP (0) |= (relocation << 3) & 0x80;
1062 OP (0) |= relocation & 0x0f;
1065 case R_RX_RH_ABS5p8W:
1066 RX_STACK_POP (relocation);
1071 OP (0) |= (relocation << 3) & 0x80;
1072 OP (0) |= relocation & 0x0f;
1075 case R_RX_RH_ABS5p8L:
1076 RX_STACK_POP (relocation);
1081 OP (0) |= (relocation << 3) & 0x80;
1082 OP (0) |= relocation & 0x0f;
1085 case R_RX_RH_UIMM4p8:
1088 OP (0) |= relocation << 4;
1091 case R_RX_RH_UNEG4p8:
1094 OP (0) |= (-relocation) << 4;
1097 /* Complex reloc handling: */
1101 RX_STACK_POP (relocation);
1102 #if RX_OPCODE_BIG_ENDIAN
1103 OP (3) = relocation;
1104 OP (2) = relocation >> 8;
1105 OP (1) = relocation >> 16;
1106 OP (0) = relocation >> 24;
1108 OP (0) = relocation;
1109 OP (1) = relocation >> 8;
1110 OP (2) = relocation >> 16;
1111 OP (3) = relocation >> 24;
1115 case R_RX_ABS32_REV:
1117 RX_STACK_POP (relocation);
1118 #if RX_OPCODE_BIG_ENDIAN
1119 OP (0) = relocation;
1120 OP (1) = relocation >> 8;
1121 OP (2) = relocation >> 16;
1122 OP (3) = relocation >> 24;
1124 OP (3) = relocation;
1125 OP (2) = relocation >> 8;
1126 OP (1) = relocation >> 16;
1127 OP (0) = relocation >> 24;
1131 case R_RX_ABS24S_PCREL:
1134 RX_STACK_POP (relocation);
1135 RANGE (-0x800000, 0x7fffff);
1136 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1138 OP (2) = relocation;
1139 OP (1) = relocation >> 8;
1140 OP (0) = relocation >> 16;
1144 OP (0) = relocation;
1145 OP (1) = relocation >> 8;
1146 OP (2) = relocation >> 16;
1152 RX_STACK_POP (relocation);
1153 RANGE (-32768, 65535);
1154 #if RX_OPCODE_BIG_ENDIAN
1155 OP (1) = relocation;
1156 OP (0) = relocation >> 8;
1158 OP (0) = relocation;
1159 OP (1) = relocation >> 8;
1163 case R_RX_ABS16_REV:
1165 RX_STACK_POP (relocation);
1166 RANGE (-32768, 65535);
1167 #if RX_OPCODE_BIG_ENDIAN
1168 OP (0) = relocation;
1169 OP (1) = relocation >> 8;
1171 OP (1) = relocation;
1172 OP (0) = relocation >> 8;
1176 case R_RX_ABS16S_PCREL:
1178 RX_STACK_POP (relocation);
1179 RANGE (-32768, 32767);
1180 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1182 OP (1) = relocation;
1183 OP (0) = relocation >> 8;
1187 OP (0) = relocation;
1188 OP (1) = relocation >> 8;
1194 RX_STACK_POP (relocation);
1196 #if RX_OPCODE_BIG_ENDIAN
1197 OP (1) = relocation;
1198 OP (0) = relocation >> 8;
1200 OP (0) = relocation;
1201 OP (1) = relocation >> 8;
1207 RX_STACK_POP (relocation);
1210 #if RX_OPCODE_BIG_ENDIAN
1211 OP (1) = relocation;
1212 OP (0) = relocation >> 8;
1214 OP (0) = relocation;
1215 OP (1) = relocation >> 8;
1221 RX_STACK_POP (relocation);
1224 #if RX_OPCODE_BIG_ENDIAN
1225 OP (1) = relocation;
1226 OP (0) = relocation >> 8;
1228 OP (0) = relocation;
1229 OP (1) = relocation >> 8;
1235 RX_STACK_POP (relocation);
1237 OP (0) = relocation;
1242 RX_STACK_POP (relocation);
1244 OP (0) = relocation;
1249 RX_STACK_POP (relocation);
1252 OP (0) = relocation;
1257 RX_STACK_POP (relocation);
1260 OP (0) = relocation;
1266 case R_RX_ABS8S_PCREL:
1267 RX_STACK_POP (relocation);
1269 OP (0) = relocation;
1273 if (r_symndx < symtab_hdr->sh_info)
1274 RX_STACK_PUSH (sec->output_section->vma
1275 + sec->output_offset
1281 && (h->root.type == bfd_link_hash_defined
1282 || h->root.type == bfd_link_hash_defweak))
1283 RX_STACK_PUSH (h->root.u.def.value
1284 + sec->output_section->vma
1285 + sec->output_offset
1289 (_("warning: RX_SYM reloc with an unknown symbol"));
1297 saw_subtract = TRUE;
1300 RX_STACK_PUSH (tmp);
1308 RX_STACK_POP (tmp1);
1309 RX_STACK_POP (tmp2);
1311 RX_STACK_PUSH (tmp1);
1319 saw_subtract = TRUE;
1320 RX_STACK_POP (tmp1);
1321 RX_STACK_POP (tmp2);
1323 RX_STACK_PUSH (tmp2);
1331 RX_STACK_POP (tmp1);
1332 RX_STACK_POP (tmp2);
1334 RX_STACK_PUSH (tmp1);
1342 RX_STACK_POP (tmp1);
1343 RX_STACK_POP (tmp2);
1345 RX_STACK_PUSH (tmp1);
1353 RX_STACK_POP (tmp1);
1354 RX_STACK_POP (tmp2);
1356 RX_STACK_PUSH (tmp1);
1364 RX_STACK_POP (tmp1);
1365 RX_STACK_POP (tmp2);
1367 RX_STACK_PUSH (tmp1);
1371 case R_RX_OPsctsize:
1372 RX_STACK_PUSH (input_section->size);
1376 RX_STACK_PUSH (input_section->output_section->vma);
1383 RX_STACK_POP (tmp1);
1384 RX_STACK_POP (tmp2);
1386 RX_STACK_PUSH (tmp1);
1394 RX_STACK_POP (tmp1);
1395 RX_STACK_POP (tmp2);
1397 RX_STACK_PUSH (tmp1);
1405 RX_STACK_POP (tmp1);
1406 RX_STACK_POP (tmp2);
1408 RX_STACK_PUSH (tmp1);
1418 RX_STACK_PUSH (tmp);
1426 RX_STACK_POP (tmp1);
1427 RX_STACK_POP (tmp2);
1429 RX_STACK_PUSH (tmp1);
1434 RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1438 RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1442 r = bfd_reloc_notsupported;
1446 if (r != bfd_reloc_ok)
1448 const char * msg = NULL;
1452 case bfd_reloc_overflow:
1453 /* Catch the case of a missing function declaration
1454 and emit a more helpful error message. */
1455 if (r_type == R_RX_DIR24S_PCREL)
1456 /* xgettext:c-format */
1457 msg = _("%pB(%pA): error: call to undefined function '%s'");
1459 (*info->callbacks->reloc_overflow)
1460 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1461 input_bfd, input_section, rel->r_offset);
1464 case bfd_reloc_undefined:
1465 (*info->callbacks->undefined_symbol)
1466 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1469 case bfd_reloc_other:
1470 /* xgettext:c-format */
1471 msg = _("%pB(%pA): warning: unaligned access to symbol '%s' in the small data area");
1474 case bfd_reloc_outofrange:
1475 /* xgettext:c-format */
1476 msg = _("%pB(%pA): internal error: out of range error");
1479 case bfd_reloc_notsupported:
1480 /* xgettext:c-format */
1481 msg = _("%pB(%pA): internal error: unsupported relocation error");
1484 case bfd_reloc_dangerous:
1485 /* xgettext:c-format */
1486 msg = _("%pB(%pA): internal error: dangerous relocation");
1490 /* xgettext:c-format */
1491 msg = _("%pB(%pA): internal error: unknown error");
1496 _bfd_error_handler (msg, input_bfd, input_section, name);
1503 /* Relaxation Support. */
1505 /* Progression of relocations from largest operand size to smallest
1509 next_smaller_reloc (int r)
1513 case R_RX_DIR32: return R_RX_DIR24S;
1514 case R_RX_DIR24S: return R_RX_DIR16S;
1515 case R_RX_DIR16S: return R_RX_DIR8S;
1516 case R_RX_DIR8S: return R_RX_NONE;
1518 case R_RX_DIR16: return R_RX_DIR8;
1519 case R_RX_DIR8: return R_RX_NONE;
1521 case R_RX_DIR16U: return R_RX_DIR8U;
1522 case R_RX_DIR8U: return R_RX_NONE;
1524 case R_RX_DIR24S_PCREL: return R_RX_DIR16S_PCREL;
1525 case R_RX_DIR16S_PCREL: return R_RX_DIR8S_PCREL;
1526 case R_RX_DIR8S_PCREL: return R_RX_DIR3U_PCREL;
1528 case R_RX_DIR16UL: return R_RX_DIR8UL;
1529 case R_RX_DIR8UL: return R_RX_NONE;
1530 case R_RX_DIR16UW: return R_RX_DIR8UW;
1531 case R_RX_DIR8UW: return R_RX_NONE;
1533 case R_RX_RH_32_OP: return R_RX_RH_24_OP;
1534 case R_RX_RH_24_OP: return R_RX_RH_16_OP;
1535 case R_RX_RH_16_OP: return R_RX_DIR8;
1537 case R_RX_ABS32: return R_RX_ABS24S;
1538 case R_RX_ABS24S: return R_RX_ABS16S;
1539 case R_RX_ABS16: return R_RX_ABS8;
1540 case R_RX_ABS16U: return R_RX_ABS8U;
1541 case R_RX_ABS16S: return R_RX_ABS8S;
1542 case R_RX_ABS8: return R_RX_NONE;
1543 case R_RX_ABS8U: return R_RX_NONE;
1544 case R_RX_ABS8S: return R_RX_NONE;
1545 case R_RX_ABS24S_PCREL: return R_RX_ABS16S_PCREL;
1546 case R_RX_ABS16S_PCREL: return R_RX_ABS8S_PCREL;
1547 case R_RX_ABS8S_PCREL: return R_RX_NONE;
1548 case R_RX_ABS16UL: return R_RX_ABS8UL;
1549 case R_RX_ABS16UW: return R_RX_ABS8UW;
1550 case R_RX_ABS8UL: return R_RX_NONE;
1551 case R_RX_ABS8UW: return R_RX_NONE;
1556 /* Delete some bytes from a section while relaxing. */
1559 elf32_rx_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1560 Elf_Internal_Rela *alignment_rel, int force_snip,
1561 Elf_Internal_Rela *irelstart)
1563 Elf_Internal_Shdr * symtab_hdr;
1564 unsigned int sec_shndx;
1565 bfd_byte * contents;
1566 Elf_Internal_Rela * irel;
1567 Elf_Internal_Rela * irelend;
1568 Elf_Internal_Sym * isym;
1569 Elf_Internal_Sym * isymend;
1571 unsigned int symcount;
1572 struct elf_link_hash_entry ** sym_hashes;
1573 struct elf_link_hash_entry ** end_hashes;
1578 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1580 contents = elf_section_data (sec)->this_hdr.contents;
1582 /* The deletion must stop at the next alignment boundary, if
1583 ALIGNMENT_REL is non-NULL. */
1586 toaddr = alignment_rel->r_offset;
1588 BFD_ASSERT (toaddr > addr);
1590 /* Actually delete the bytes. */
1591 memmove (contents + addr, contents + addr + count,
1592 (size_t) (toaddr - addr - count));
1594 /* If we don't have an alignment marker to worry about, we can just
1595 shrink the section. Otherwise, we have to fill in the newly
1596 created gap with NOP insns (0x03). */
1600 memset (contents + toaddr - count, 0x03, count);
1603 BFD_ASSERT (irel != NULL || sec->reloc_count == 0);
1604 irelend = irel + sec->reloc_count;
1606 /* Adjust all the relocs. */
1607 for (; irel < irelend; irel++)
1609 /* Get the new reloc address. */
1610 if (irel->r_offset > addr
1611 && (irel->r_offset < toaddr
1612 || (force_snip && irel->r_offset == toaddr)))
1613 irel->r_offset -= count;
1615 /* If we see an ALIGN marker at the end of the gap, we move it
1616 to the beginning of the gap, since marking these gaps is what
1618 if (irel->r_offset == toaddr
1619 && ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
1620 && irel->r_addend & RX_RELAXA_ALIGN)
1621 irel->r_offset -= count;
1624 /* Adjust the local symbols defined in this section. */
1625 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1626 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1627 isymend = isym + symtab_hdr->sh_info;
1629 for (; isym < isymend; isym++)
1631 /* If the symbol is in the range of memory we just moved, we
1632 have to adjust its value. */
1633 if (isym->st_shndx == sec_shndx
1634 && isym->st_value > addr
1635 && isym->st_value < toaddr)
1636 isym->st_value -= count;
1638 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1639 *end* is in the moved bytes but it's *start* isn't), then we
1640 must adjust its size. */
1641 if (isym->st_shndx == sec_shndx
1642 && isym->st_value < addr
1643 && isym->st_value + isym->st_size > addr
1644 && isym->st_value + isym->st_size < toaddr)
1645 isym->st_size -= count;
1648 /* Now adjust the global symbols defined in this section. */
1649 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1650 - symtab_hdr->sh_info);
1651 sym_hashes = elf_sym_hashes (abfd);
1652 end_hashes = sym_hashes + symcount;
1654 for (; sym_hashes < end_hashes; sym_hashes++)
1656 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1658 if ((sym_hash->root.type == bfd_link_hash_defined
1659 || sym_hash->root.type == bfd_link_hash_defweak)
1660 && sym_hash->root.u.def.section == sec)
1662 /* As above, adjust the value if needed. */
1663 if (sym_hash->root.u.def.value > addr
1664 && sym_hash->root.u.def.value < toaddr)
1665 sym_hash->root.u.def.value -= count;
1667 /* As above, adjust the size if needed. */
1668 if (sym_hash->root.u.def.value < addr
1669 && sym_hash->root.u.def.value + sym_hash->size > addr
1670 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1671 sym_hash->size -= count;
1678 /* Used to sort relocs by address. If relocs have the same address,
1679 we maintain their relative order, except that R_RX_RH_RELAX
1680 alignment relocs must be the first reloc for any given address. */
1683 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1687 bfd_boolean swappit;
1689 /* This is almost a classic bubblesort. It's the slowest sort, but
1690 we're taking advantage of the fact that the relocations are
1691 mostly in order already (the assembler emits them that way) and
1692 we need relocs with the same address to remain in the same
1698 for (i = 0; i < count - 1; i ++)
1700 if (r[i].r_offset > r[i + 1].r_offset)
1702 else if (r[i].r_offset < r[i + 1].r_offset)
1704 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1705 && (r[i + 1].r_addend & RX_RELAXA_ALIGN))
1707 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1708 && (r[i + 1].r_addend & RX_RELAXA_ELIGN)
1709 && !(ELF32_R_TYPE (r[i].r_info) == R_RX_RH_RELAX
1710 && (r[i].r_addend & RX_RELAXA_ALIGN)))
1717 Elf_Internal_Rela tmp;
1722 /* If we do move a reloc back, re-scan to see if it
1723 needs to be moved even further back. This avoids
1724 most of the O(n^2) behavior for our cases. */
1734 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1735 rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1736 lrel, abfd, sec, link_info, scale)
1739 rx_offset_for_reloc (bfd * abfd,
1740 Elf_Internal_Rela * rel,
1741 Elf_Internal_Shdr * symtab_hdr,
1742 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1743 Elf_Internal_Sym * intsyms,
1744 Elf_Internal_Rela ** lrel,
1746 asection * input_section,
1747 struct bfd_link_info * info,
1751 bfd_reloc_status_type r;
1755 /* REL is the first of 1..N relocations. We compute the symbol
1756 value for each relocation, then combine them if needed. LREL
1757 gets a pointer to the last relocation used. */
1762 /* Get the value of the symbol referred to by the reloc. */
1763 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1765 /* A local symbol. */
1766 Elf_Internal_Sym *isym;
1769 isym = intsyms + ELF32_R_SYM (rel->r_info);
1771 if (isym->st_shndx == SHN_UNDEF)
1772 ssec = bfd_und_section_ptr;
1773 else if (isym->st_shndx == SHN_ABS)
1774 ssec = bfd_abs_section_ptr;
1775 else if (isym->st_shndx == SHN_COMMON)
1776 ssec = bfd_com_section_ptr;
1778 ssec = bfd_section_from_elf_index (abfd,
1781 /* Initial symbol value. */
1782 symval = isym->st_value;
1784 /* GAS may have made this symbol relative to a section, in
1785 which case, we have to add the addend to find the
1787 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1788 symval += rel->r_addend;
1792 if ((ssec->flags & SEC_MERGE)
1793 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1794 symval = _bfd_merged_section_offset (abfd, & ssec,
1795 elf_section_data (ssec)->sec_info,
1799 /* Now make the offset relative to where the linker is putting it. */
1802 ssec->output_section->vma + ssec->output_offset;
1804 symval += rel->r_addend;
1809 struct elf_link_hash_entry * h;
1811 /* An external symbol. */
1812 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1813 h = elf_sym_hashes (abfd)[indx];
1814 BFD_ASSERT (h != NULL);
1816 if (h->root.type != bfd_link_hash_defined
1817 && h->root.type != bfd_link_hash_defweak)
1819 /* This appears to be a reference to an undefined
1820 symbol. Just ignore it--it will be caught by the
1821 regular reloc processing. */
1827 symval = (h->root.u.def.value
1828 + h->root.u.def.section->output_section->vma
1829 + h->root.u.def.section->output_offset);
1831 symval += rel->r_addend;
1834 switch (ELF32_R_TYPE (rel->r_info))
1837 RX_STACK_PUSH (symval);
1841 RX_STACK_POP (tmp1);
1843 RX_STACK_PUSH (tmp1);
1847 RX_STACK_POP (tmp1);
1848 RX_STACK_POP (tmp2);
1850 RX_STACK_PUSH (tmp1);
1854 RX_STACK_POP (tmp1);
1855 RX_STACK_POP (tmp2);
1857 RX_STACK_PUSH (tmp2);
1861 RX_STACK_POP (tmp1);
1862 RX_STACK_POP (tmp2);
1864 RX_STACK_PUSH (tmp1);
1868 RX_STACK_POP (tmp1);
1869 RX_STACK_POP (tmp2);
1871 RX_STACK_PUSH (tmp1);
1875 RX_STACK_POP (tmp1);
1876 RX_STACK_POP (tmp2);
1878 RX_STACK_PUSH (tmp1);
1882 RX_STACK_POP (tmp1);
1883 RX_STACK_POP (tmp2);
1885 RX_STACK_PUSH (tmp1);
1888 case R_RX_OPsctsize:
1889 RX_STACK_PUSH (input_section->size);
1893 RX_STACK_PUSH (input_section->output_section->vma);
1897 RX_STACK_POP (tmp1);
1898 RX_STACK_POP (tmp2);
1900 RX_STACK_PUSH (tmp1);
1904 RX_STACK_POP (tmp1);
1905 RX_STACK_POP (tmp2);
1907 RX_STACK_PUSH (tmp1);
1911 RX_STACK_POP (tmp1);
1912 RX_STACK_POP (tmp2);
1914 RX_STACK_PUSH (tmp1);
1918 RX_STACK_POP (tmp1);
1920 RX_STACK_PUSH (tmp1);
1924 RX_STACK_POP (tmp1);
1925 RX_STACK_POP (tmp2);
1927 RX_STACK_PUSH (tmp1);
1931 RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1935 RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1943 RX_STACK_POP (symval);
1954 RX_STACK_POP (symval);
1962 RX_STACK_POP (symval);
1975 move_reloc (Elf_Internal_Rela * irel, Elf_Internal_Rela * srel, int delta)
1977 bfd_vma old_offset = srel->r_offset;
1980 while (irel <= srel)
1982 if (irel->r_offset == old_offset)
1983 irel->r_offset += delta;
1988 /* Relax one section. */
1991 elf32_rx_relax_section (bfd * abfd,
1993 struct bfd_link_info * link_info,
1994 bfd_boolean * again,
1995 bfd_boolean allow_pcrel3)
1997 Elf_Internal_Shdr * symtab_hdr;
1998 Elf_Internal_Shdr * shndx_hdr;
1999 Elf_Internal_Rela * internal_relocs;
2000 Elf_Internal_Rela * irel;
2001 Elf_Internal_Rela * srel;
2002 Elf_Internal_Rela * irelend;
2003 Elf_Internal_Rela * next_alignment;
2004 Elf_Internal_Rela * prev_alignment;
2005 bfd_byte * contents = NULL;
2006 bfd_byte * free_contents = NULL;
2007 Elf_Internal_Sym * intsyms = NULL;
2008 Elf_Internal_Sym * free_intsyms = NULL;
2009 Elf_External_Sym_Shndx * shndx_buf = NULL;
2015 int section_alignment_glue;
2016 /* how much to scale the relocation by - 1, 2, or 4. */
2019 /* Assume nothing changes. */
2022 /* We don't have to do anything for a relocatable link, if
2023 this section does not have relocs, or if this is not a
2025 if (bfd_link_relocatable (link_info)
2026 || (sec->flags & SEC_RELOC) == 0
2027 || sec->reloc_count == 0
2028 || (sec->flags & SEC_CODE) == 0)
2031 symtab_hdr = & elf_symtab_hdr (abfd);
2032 if (elf_symtab_shndx_list (abfd))
2033 shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2037 sec_start = sec->output_section->vma + sec->output_offset;
2039 /* Get the section contents. */
2040 if (elf_section_data (sec)->this_hdr.contents != NULL)
2041 contents = elf_section_data (sec)->this_hdr.contents;
2042 /* Go get them off disk. */
2045 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2047 elf_section_data (sec)->this_hdr.contents = contents;
2050 /* Read this BFD's symbols. */
2051 /* Get cached copy if it exists. */
2052 if (symtab_hdr->contents != NULL)
2053 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2056 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2057 symtab_hdr->contents = (bfd_byte *) intsyms;
2060 if (shndx_hdr && shndx_hdr->sh_size != 0)
2064 amt = symtab_hdr->sh_info;
2065 amt *= sizeof (Elf_External_Sym_Shndx);
2066 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2067 if (shndx_buf == NULL)
2069 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2070 || bfd_bread (shndx_buf, amt, abfd) != amt)
2072 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2075 /* Get a copy of the native relocations. */
2076 /* Note - we ignore the setting of link_info->keep_memory when reading
2077 in these relocs. We have to maintain a permanent copy of the relocs
2078 because we are going to walk over them multiple times, adjusting them
2079 as bytes are deleted from the section, and with this relaxation
2080 function itself being called multiple times on the same section... */
2081 internal_relocs = _bfd_elf_link_read_relocs
2082 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, TRUE);
2083 if (internal_relocs == NULL)
2086 /* The RL_ relocs must be just before the operand relocs they go
2087 with, so we must sort them to guarantee this. We use bubblesort
2088 instead of qsort so we can guarantee that relocs with the same
2089 address remain in the same relative order. */
2090 reloc_bubblesort (internal_relocs, sec->reloc_count);
2092 /* Walk through them looking for relaxing opportunities. */
2093 irelend = internal_relocs + sec->reloc_count;
2095 /* This will either be NULL or a pointer to the next alignment
2097 next_alignment = internal_relocs;
2098 /* This will be the previous alignment, although at first it points
2099 to the first real relocation. */
2100 prev_alignment = internal_relocs;
2102 /* We calculate worst case shrinkage caused by alignment directives.
2103 No fool-proof, but better than either ignoring the problem or
2104 doing heavy duty analysis of all the alignment markers in all
2106 section_alignment_glue = 0;
2107 for (irel = internal_relocs; irel < irelend; irel++)
2108 if (ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
2109 && irel->r_addend & RX_RELAXA_ALIGN)
2111 int this_glue = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2113 if (section_alignment_glue < this_glue)
2114 section_alignment_glue = this_glue;
2116 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2118 section_alignment_glue *= 2;
2120 for (irel = internal_relocs; irel < irelend; irel++)
2122 unsigned char *insn;
2125 /* The insns we care about are all marked with one of these. */
2126 if (ELF32_R_TYPE (irel->r_info) != R_RX_RH_RELAX)
2129 if (irel->r_addend & RX_RELAXA_ALIGN
2130 || next_alignment == internal_relocs)
2132 /* When we delete bytes, we need to maintain all the alignments
2133 indicated. In addition, we need to be careful about relaxing
2134 jumps across alignment boundaries - these displacements
2135 *grow* when we delete bytes. For now, don't shrink
2136 displacements across an alignment boundary, just in case.
2137 Note that this only affects relocations to the same
2139 prev_alignment = next_alignment;
2140 next_alignment += 2;
2141 while (next_alignment < irelend
2142 && (ELF32_R_TYPE (next_alignment->r_info) != R_RX_RH_RELAX
2143 || !(next_alignment->r_addend & RX_RELAXA_ELIGN)))
2145 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2146 next_alignment = NULL;
2149 /* When we hit alignment markers, see if we've shrunk enough
2150 before them to reduce the gap without violating the alignment
2152 if (irel->r_addend & RX_RELAXA_ALIGN)
2154 /* At this point, the next relocation *should* be the ELIGN
2156 Elf_Internal_Rela *erel = irel + 1;
2157 unsigned int alignment, nbytes;
2159 if (ELF32_R_TYPE (erel->r_info) != R_RX_RH_RELAX)
2161 if (!(erel->r_addend & RX_RELAXA_ELIGN))
2164 alignment = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2166 if (erel->r_offset - irel->r_offset < alignment)
2169 nbytes = erel->r_offset - irel->r_offset;
2170 nbytes /= alignment;
2171 nbytes *= alignment;
2173 elf32_rx_relax_delete_bytes (abfd, sec, erel->r_offset-nbytes, nbytes, next_alignment,
2174 erel->r_offset == sec->size, internal_relocs);
2180 if (irel->r_addend & RX_RELAXA_ELIGN)
2183 insn = contents + irel->r_offset;
2185 nrelocs = irel->r_addend & RX_RELAXA_RNUM;
2187 /* At this point, we have an insn that is a candidate for linker
2188 relaxation. There are NRELOCS relocs following that may be
2189 relaxed, although each reloc may be made of more than one
2190 reloc entry (such as gp-rel symbols). */
2192 /* Get the value of the symbol referred to by the reloc. Just
2193 in case this is the last reloc in the list, use the RL's
2194 addend to choose between this reloc (no addend) or the next
2195 (yes addend, which means at least one following reloc). */
2197 /* srel points to the "current" reloction for this insn -
2198 actually the last reloc for a given operand, which is the one
2199 we need to update. We check the relaxations in the same
2200 order that the relocations happen, so we'll just push it
2204 pc = sec->output_section->vma + sec->output_offset
2208 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2209 pcrel = symval - pc + srel->r_addend; \
2212 #define SNIPNR(offset, nbytes) \
2213 elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0, internal_relocs);
2214 #define SNIP(offset, nbytes, newtype) \
2215 SNIPNR (offset, nbytes); \
2216 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2218 /* The order of these bit tests must match the order that the
2219 relocs appear in. Since we sorted those by offset, we can
2222 /* Note that the numbers in, say, DSP6 are the bit offsets of
2223 the code fields that describe the operand. Bits number 0 for
2224 the MSB of insn[0]. */
2231 if (irel->r_addend & RX_RELAXA_DSP6)
2236 if (code == 2 && symval/scale <= 255)
2238 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2241 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2242 if (newrel != ELF32_R_TYPE (srel->r_info))
2244 SNIP (3, 1, newrel);
2249 else if (code == 1 && symval == 0)
2252 SNIP (2, 1, R_RX_NONE);
2256 /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */
2257 else if (code == 1 && symval/scale <= 31
2258 /* Decodable bits. */
2259 && (insn[0] & 0xcc) == 0xcc
2261 && (insn[0] & 0x30) != 0x30
2262 /* Register MSBs. */
2263 && (insn[1] & 0x88) == 0x00)
2267 insn[0] = 0x88 | (insn[0] & 0x30);
2268 /* The register fields are in the right place already. */
2270 /* We can't relax this new opcode. */
2273 switch ((insn[0] & 0x30) >> 4)
2276 newrel = R_RX_RH_ABS5p5B;
2279 newrel = R_RX_RH_ABS5p5W;
2282 newrel = R_RX_RH_ABS5p5L;
2286 move_reloc (irel, srel, -2);
2287 SNIP (2, 1, newrel);
2290 /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst. */
2291 else if (code == 1 && symval/scale <= 31
2292 /* Decodable bits. */
2293 && (insn[0] & 0xf8) == 0x58
2294 /* Register MSBs. */
2295 && (insn[1] & 0x88) == 0x00)
2299 insn[0] = 0xb0 | ((insn[0] & 0x04) << 1);
2300 /* The register fields are in the right place already. */
2302 /* We can't relax this new opcode. */
2305 switch ((insn[0] & 0x08) >> 3)
2308 newrel = R_RX_RH_ABS5p5B;
2311 newrel = R_RX_RH_ABS5p5W;
2315 move_reloc (irel, srel, -2);
2316 SNIP (2, 1, newrel);
2320 /* A DSP4 operand always follows a DSP6 operand, even if there's
2321 no relocation for it. We have to read the code out of the
2322 opcode to calculate the offset of the operand. */
2323 if (irel->r_addend & RX_RELAXA_DSP4)
2325 int code6, offset = 0;
2329 code6 = insn[0] & 0x03;
2332 case 0: offset = 2; break;
2333 case 1: offset = 3; break;
2334 case 2: offset = 4; break;
2335 case 3: offset = 2; break;
2338 code = (insn[0] & 0x0c) >> 2;
2340 if (code == 2 && symval / scale <= 255)
2342 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2346 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2347 if (newrel != ELF32_R_TYPE (srel->r_info))
2349 SNIP (offset+1, 1, newrel);
2354 else if (code == 1 && symval == 0)
2357 SNIP (offset, 1, R_RX_NONE);
2360 /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
2361 else if (code == 1 && symval/scale <= 31
2362 /* Decodable bits. */
2363 && (insn[0] & 0xc3) == 0xc3
2365 && (insn[0] & 0x30) != 0x30
2366 /* Register MSBs. */
2367 && (insn[1] & 0x88) == 0x00)
2371 insn[0] = 0x80 | (insn[0] & 0x30);
2372 /* The register fields are in the right place already. */
2374 /* We can't relax this new opcode. */
2377 switch ((insn[0] & 0x30) >> 4)
2380 newrel = R_RX_RH_ABS5p5B;
2383 newrel = R_RX_RH_ABS5p5W;
2386 newrel = R_RX_RH_ABS5p5L;
2390 move_reloc (irel, srel, -2);
2391 SNIP (2, 1, newrel);
2395 /* These always occur alone, but the offset depends on whether
2396 it's a MEMEX opcode (0x06) or not. */
2397 if (irel->r_addend & RX_RELAXA_DSP14)
2402 if (insn[0] == 0x06)
2409 if (code == 2 && symval / scale <= 255)
2411 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2415 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2416 if (newrel != ELF32_R_TYPE (srel->r_info))
2418 SNIP (offset, 1, newrel);
2422 else if (code == 1 && symval == 0)
2425 SNIP (offset, 1, R_RX_NONE);
2436 /* These always occur alone. */
2437 if (irel->r_addend & RX_RELAXA_IMM6)
2443 /* These relocations sign-extend, so we must do signed compares. */
2444 ssymval = (long) symval;
2446 code = insn[0] & 0x03;
2448 if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2450 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2454 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2455 if (newrel != ELF32_R_TYPE (srel->r_info))
2457 SNIP (2, 1, newrel);
2462 else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2464 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2468 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2469 if (newrel != ELF32_R_TYPE (srel->r_info))
2471 SNIP (2, 1, newrel);
2476 /* Special case UIMM8 format: CMP #uimm8,Rdst. */
2477 else if (code == 2 && ssymval <= 255 && ssymval >= 16
2478 /* Decodable bits. */
2479 && (insn[0] & 0xfc) == 0x74
2480 /* Decodable bits. */
2481 && ((insn[1] & 0xf0) == 0x00))
2486 insn[1] = 0x50 | (insn[1] & 0x0f);
2488 /* We can't relax this new opcode. */
2491 if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2492 newrel = R_RX_ABS8U;
2494 newrel = R_RX_DIR8U;
2496 SNIP (2, 1, newrel);
2500 else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2502 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2506 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2507 if (newrel != ELF32_R_TYPE (srel->r_info))
2509 SNIP (2, 1, newrel);
2514 /* Special case UIMM4 format: CMP, MUL, AND, OR. */
2515 else if (code == 1 && ssymval <= 15 && ssymval >= 0
2516 /* Decodable bits and immediate type. */
2518 /* Decodable bits. */
2519 && (insn[1] & 0xc0) == 0x00)
2521 static const int newop[4] = { 1, 3, 4, 5 };
2523 insn[0] = 0x60 | newop[insn[1] >> 4];
2524 /* The register number doesn't move. */
2526 /* We can't relax this new opcode. */
2529 move_reloc (irel, srel, -1);
2531 SNIP (2, 1, R_RX_RH_UIMM4p8);
2535 /* Special case UIMM4 format: ADD -> ADD/SUB. */
2536 else if (code == 1 && ssymval <= 15 && ssymval >= -15
2537 /* Decodable bits and immediate type. */
2539 /* Same register for source and destination. */
2540 && ((insn[1] >> 4) == (insn[1] & 0x0f)))
2544 /* Note that we can't turn "add $0,Rs" into a NOP
2545 because the flags need to be set right. */
2549 insn[0] = 0x60; /* Subtract. */
2550 newrel = R_RX_RH_UNEG4p8;
2554 insn[0] = 0x62; /* Add. */
2555 newrel = R_RX_RH_UIMM4p8;
2558 /* The register number is in the right place. */
2560 /* We can't relax this new opcode. */
2563 move_reloc (irel, srel, -1);
2565 SNIP (2, 1, newrel);
2570 /* These are either matched with a DSP6 (2-byte base) or an id24
2572 if (irel->r_addend & RX_RELAXA_IMM12)
2574 int dspcode, offset = 0;
2579 if ((insn[0] & 0xfc) == 0xfc)
2580 dspcode = 1; /* Just something with one byte operand. */
2582 dspcode = insn[0] & 3;
2585 case 0: offset = 2; break;
2586 case 1: offset = 3; break;
2587 case 2: offset = 4; break;
2588 case 3: offset = 2; break;
2591 /* These relocations sign-extend, so we must do signed compares. */
2592 ssymval = (long) symval;
2594 code = (insn[1] >> 2) & 3;
2595 if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2597 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2601 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2602 if (newrel != ELF32_R_TYPE (srel->r_info))
2604 SNIP (offset, 1, newrel);
2609 else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2611 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2615 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2616 if (newrel != ELF32_R_TYPE (srel->r_info))
2618 SNIP (offset, 1, newrel);
2623 /* Special case UIMM8 format: MOV #uimm8,Rdst. */
2624 else if (code == 2 && ssymval <= 255 && ssymval >= 16
2625 /* Decodable bits. */
2627 /* Decodable bits. */
2628 && ((insn[1] & 0x03) == 0x02))
2633 insn[1] = 0x40 | (insn[1] >> 4);
2635 /* We can't relax this new opcode. */
2638 if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2639 newrel = R_RX_ABS8U;
2641 newrel = R_RX_DIR8U;
2643 SNIP (2, 1, newrel);
2647 else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2649 unsigned int newrel = ELF32_R_TYPE(srel->r_info);
2653 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2654 if (newrel != ELF32_R_TYPE(srel->r_info))
2656 SNIP (offset, 1, newrel);
2661 /* Special case UIMM4 format: MOV #uimm4,Rdst. */
2662 else if (code == 1 && ssymval <= 15 && ssymval >= 0
2663 /* Decodable bits. */
2665 /* Decodable bits. */
2666 && ((insn[1] & 0x03) == 0x02))
2669 insn[1] = insn[1] >> 4;
2671 /* We can't relax this new opcode. */
2674 move_reloc (irel, srel, -1);
2676 SNIP (2, 1, R_RX_RH_UIMM4p8);
2681 if (irel->r_addend & RX_RELAXA_BRA)
2683 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2685 int alignment_glue = 0;
2689 /* Branches over alignment chunks are problematic, as
2690 deleting bytes here makes the branch *further* away. We
2691 can be agressive with branches within this alignment
2692 block, but not branches outside it. */
2693 if ((prev_alignment == NULL
2694 || symval < (bfd_vma)(sec_start + prev_alignment->r_offset))
2695 && (next_alignment == NULL
2696 || symval > (bfd_vma)(sec_start + next_alignment->r_offset)))
2697 alignment_glue = section_alignment_glue;
2699 if (ELF32_R_TYPE(srel[1].r_info) == R_RX_RH_RELAX
2700 && srel[1].r_addend & RX_RELAXA_BRA
2701 && srel[1].r_offset < irel->r_offset + pcrel)
2704 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2706 /* The values we compare PCREL with are not what you'd
2707 expect; they're off by a little to compensate for (1)
2708 where the reloc is relative to the insn, and (2) how much
2709 the insn is going to change when we relax it. */
2711 /* These we have to decode. */
2714 case 0x04: /* BRA pcdsp:24 */
2715 if (-32768 + alignment_glue <= pcrel
2716 && pcrel <= 32765 - alignment_glue)
2719 SNIP (3, 1, newrel);
2724 case 0x38: /* BRA pcdsp:16 */
2725 if (-128 + alignment_glue <= pcrel
2726 && pcrel <= 127 - alignment_glue)
2729 SNIP (2, 1, newrel);
2734 case 0x2e: /* BRA pcdsp:8 */
2735 /* Note that there's a risk here of shortening things so
2736 much that we no longer fit this reloc; it *should*
2737 only happen when you branch across a branch, and that
2738 branch also devolves into BRA.S. "Real" code should
2740 if (max_pcrel3 + alignment_glue <= pcrel
2741 && pcrel <= 10 - alignment_glue
2745 SNIP (1, 1, newrel);
2746 move_reloc (irel, srel, -1);
2751 case 0x05: /* BSR pcdsp:24 */
2752 if (-32768 + alignment_glue <= pcrel
2753 && pcrel <= 32765 - alignment_glue)
2756 SNIP (1, 1, newrel);
2761 case 0x3a: /* BEQ.W pcdsp:16 */
2762 case 0x3b: /* BNE.W pcdsp:16 */
2763 if (-128 + alignment_glue <= pcrel
2764 && pcrel <= 127 - alignment_glue)
2766 insn[0] = 0x20 | (insn[0] & 1);
2767 SNIP (1, 1, newrel);
2772 case 0x20: /* BEQ.B pcdsp:8 */
2773 case 0x21: /* BNE.B pcdsp:8 */
2774 if (max_pcrel3 + alignment_glue <= pcrel
2775 && pcrel - alignment_glue <= 10
2778 insn[0] = 0x10 | ((insn[0] & 1) << 3);
2779 SNIP (1, 1, newrel);
2780 move_reloc (irel, srel, -1);
2785 case 0x16: /* synthetic BNE dsp24 */
2786 case 0x1e: /* synthetic BEQ dsp24 */
2787 if (-32767 + alignment_glue <= pcrel
2788 && pcrel <= 32766 - alignment_glue
2791 if (insn[0] == 0x16)
2795 /* We snip out the bytes at the end else the reloc
2796 will get moved too, and too much. */
2797 SNIP (3, 2, newrel);
2798 move_reloc (irel, srel, -1);
2804 /* Special case - synthetic conditional branches, pcrel24.
2805 Note that EQ and NE have been handled above. */
2806 if ((insn[0] & 0xf0) == 0x20
2809 && srel->r_offset != irel->r_offset + 1
2810 && -32767 + alignment_glue <= pcrel
2811 && pcrel <= 32766 - alignment_glue)
2815 SNIP (5, 1, newrel);
2819 /* Special case - synthetic conditional branches, pcrel16 */
2820 if ((insn[0] & 0xf0) == 0x20
2823 && srel->r_offset != irel->r_offset + 1
2824 && -127 + alignment_glue <= pcrel
2825 && pcrel <= 126 - alignment_glue)
2827 int cond = (insn[0] & 0x0f) ^ 0x01;
2829 insn[0] = 0x20 | cond;
2830 /* By moving the reloc first, we avoid having
2831 delete_bytes move it also. */
2832 move_reloc (irel, srel, -2);
2833 SNIP (2, 3, newrel);
2838 BFD_ASSERT (nrelocs == 0);
2840 /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can
2841 use MOV.bwl #uimm:8, dsp:5[r7] format. This is tricky
2842 because it may have one or two relocations. */
2843 if ((insn[0] & 0xfc) == 0xf8
2844 && (insn[1] & 0x80) == 0x00
2845 && (insn[0] & 0x03) != 0x03)
2847 int dcode, icode, reg, ioff, dscale, ilen;
2848 bfd_vma disp_val = 0;
2850 Elf_Internal_Rela * disp_rel = 0;
2851 Elf_Internal_Rela * imm_rel = 0;
2856 dcode = insn[0] & 0x03;
2857 icode = (insn[1] >> 2) & 0x03;
2858 reg = (insn[1] >> 4) & 0x0f;
2860 ioff = dcode == 1 ? 3 : dcode == 2 ? 4 : 2;
2862 /* Figure out what the dispacement is. */
2863 if (dcode == 1 || dcode == 2)
2865 /* There's a displacement. See if there's a reloc for it. */
2866 if (srel[1].r_offset == irel->r_offset + 2)
2878 #if RX_OPCODE_BIG_ENDIAN
2879 disp_val = insn[2] * 256 + insn[3];
2881 disp_val = insn[2] + insn[3] * 256;
2884 switch (insn[1] & 3)
2900 /* Figure out what the immediate is. */
2901 if (srel[1].r_offset == irel->r_offset + ioff)
2904 imm_val = (long) symval;
2909 unsigned char * ip = insn + ioff;
2914 /* For byte writes, we don't sign extend. Makes the math easier later. */
2918 imm_val = (char) ip[0];
2921 #if RX_OPCODE_BIG_ENDIAN
2922 imm_val = ((char) ip[0] << 8) | ip[1];
2924 imm_val = ((char) ip[1] << 8) | ip[0];
2928 #if RX_OPCODE_BIG_ENDIAN
2929 imm_val = ((char) ip[0] << 16) | (ip[1] << 8) | ip[2];
2931 imm_val = ((char) ip[2] << 16) | (ip[1] << 8) | ip[0];
2935 #if RX_OPCODE_BIG_ENDIAN
2936 imm_val = (ip[0] << 24) | (ip[1] << 16) | (ip[2] << 8) | ip[3];
2938 imm_val = (ip[3] << 24) | (ip[2] << 16) | (ip[1] << 8) | ip[0];
2972 /* The shortcut happens when the immediate is 0..255,
2973 register r0 to r7, and displacement (scaled) 0..31. */
2975 if (0 <= imm_val && imm_val <= 255
2976 && 0 <= reg && reg <= 7
2977 && disp_val / dscale <= 31)
2979 insn[0] = 0x3c | (insn[1] & 0x03);
2980 insn[1] = (((disp_val / dscale) << 3) & 0x80) | (reg << 4) | ((disp_val/dscale) & 0x0f);
2985 int newrel = R_RX_NONE;
2990 newrel = R_RX_RH_ABS5p8B;
2993 newrel = R_RX_RH_ABS5p8W;
2996 newrel = R_RX_RH_ABS5p8L;
2999 disp_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (disp_rel->r_info), newrel);
3000 move_reloc (irel, disp_rel, -1);
3004 imm_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (imm_rel->r_info), R_RX_DIR8U);
3005 move_reloc (disp_rel ? disp_rel : irel,
3007 irel->r_offset - imm_rel->r_offset + 2);
3010 SNIPNR (3, ilen - 3);
3013 /* We can't relax this new opcode. */
3019 /* We can't reliably relax branches to DIR3U_PCREL unless we know
3020 whatever they're branching over won't shrink any more. If we're
3021 basically done here, do one more pass just for branches - but
3022 don't request a pass after that one! */
3023 if (!*again && !allow_pcrel3)
3025 bfd_boolean ignored;
3027 elf32_rx_relax_section (abfd, sec, link_info, &ignored, TRUE);
3033 if (free_contents != NULL)
3034 free (free_contents);
3036 if (shndx_buf != NULL)
3038 shndx_hdr->contents = NULL;
3042 if (free_intsyms != NULL)
3043 free (free_intsyms);
3049 elf32_rx_relax_section_wrapper (bfd * abfd,
3051 struct bfd_link_info * link_info,
3052 bfd_boolean * again)
3054 return elf32_rx_relax_section (abfd, sec, link_info, again, FALSE);
3057 /* Function to set the ELF flag bits. */
3060 rx_elf_set_private_flags (bfd * abfd, flagword flags)
3062 elf_elfheader (abfd)->e_flags = flags;
3063 elf_flags_init (abfd) = TRUE;
3067 static bfd_boolean no_warn_mismatch = FALSE;
3068 static bfd_boolean ignore_lma = TRUE;
3070 void bfd_elf32_rx_set_target_flags (bfd_boolean, bfd_boolean);
3073 bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch,
3074 bfd_boolean user_ignore_lma)
3076 no_warn_mismatch = user_no_warn_mismatch;
3077 ignore_lma = user_ignore_lma;
3080 /* Converts FLAGS into a descriptive string.
3081 Returns a static pointer. */
3084 describe_flags (flagword flags)
3086 static char buf [128];
3090 if (flags & E_FLAG_RX_64BIT_DOUBLES)
3091 strcat (buf, "64-bit doubles");
3093 strcat (buf, "32-bit doubles");
3095 if (flags & E_FLAG_RX_DSP)
3096 strcat (buf, ", dsp");
3098 strcat (buf, ", no dsp");
3100 if (flags & E_FLAG_RX_PID)
3101 strcat (buf, ", pid");
3103 strcat (buf, ", no pid");
3105 if (flags & E_FLAG_RX_ABI)
3106 strcat (buf, ", RX ABI");
3108 strcat (buf, ", GCC ABI");
3110 if (flags & E_FLAG_RX_SINSNS_SET)
3111 strcat (buf, flags & E_FLAG_RX_SINSNS_YES ? ", uses String instructions" : ", bans String instructions");
3116 /* Merge backend specific data from an object file to the output
3117 object file when linking. */
3120 rx_elf_merge_private_bfd_data (bfd * ibfd, struct bfd_link_info *info)
3122 bfd *obfd = info->output_bfd;
3125 bfd_boolean error = FALSE;
3127 new_flags = elf_elfheader (ibfd)->e_flags;
3128 old_flags = elf_elfheader (obfd)->e_flags;
3130 if (!elf_flags_init (obfd))
3132 /* First call, no flags set. */
3133 elf_flags_init (obfd) = TRUE;
3134 elf_elfheader (obfd)->e_flags = new_flags;
3136 else if (old_flags != new_flags)
3138 flagword known_flags;
3140 if (old_flags & E_FLAG_RX_SINSNS_SET)
3142 if ((new_flags & E_FLAG_RX_SINSNS_SET) == 0)
3144 new_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3145 new_flags |= (old_flags & E_FLAG_RX_SINSNS_MASK);
3148 else if (new_flags & E_FLAG_RX_SINSNS_SET)
3150 old_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3151 old_flags |= (new_flags & E_FLAG_RX_SINSNS_MASK);
3154 known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES
3155 | E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK;
3157 if ((old_flags ^ new_flags) & known_flags)
3159 /* Only complain if flag bits we care about do not match.
3160 Other bits may be set, since older binaries did use some
3161 deprecated flags. */
3162 if (no_warn_mismatch)
3164 elf_elfheader (obfd)->e_flags = (new_flags | old_flags) & known_flags;
3168 _bfd_error_handler (_("there is a conflict merging the"
3169 " ELF header flags from %pB"),
3171 _bfd_error_handler (_(" the input file's flags: %s"),
3172 describe_flags (new_flags));
3173 _bfd_error_handler (_(" the output file's flags: %s"),
3174 describe_flags (old_flags));
3179 elf_elfheader (obfd)->e_flags = new_flags & known_flags;
3183 bfd_set_error (bfd_error_bad_value);
3189 rx_elf_print_private_bfd_data (bfd * abfd, void * ptr)
3191 FILE * file = (FILE *) ptr;
3194 BFD_ASSERT (abfd != NULL && ptr != NULL);
3196 /* Print normal ELF private data. */
3197 _bfd_elf_print_private_bfd_data (abfd, ptr);
3199 flags = elf_elfheader (abfd)->e_flags;
3200 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
3202 fprintf (file, "%s", describe_flags (flags));
3206 /* Return the MACH for an e_flags value. */
3209 elf32_rx_machine (bfd * abfd ATTRIBUTE_UNUSED)
3211 #if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_...
3212 Need to sort out how these flag bits are used.
3213 For now we assume that the flags are OK. */
3214 if ((elf_elfheader (abfd)->e_flags & EF_RX_CPU_MASK) == EF_RX_CPU_RX)
3222 rx_elf_object_p (bfd * abfd)
3226 Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
3227 Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd);
3228 int nphdrs = ehdr->e_phnum;
3230 static int saw_be = FALSE;
3231 bfd_vma end_phdroff;
3233 /* We never want to automatically choose the non-swapping big-endian
3234 target. The user can only get that explicitly, such as with -I
3236 if (abfd->xvec == &rx_elf32_be_ns_vec
3237 && abfd->target_defaulted)
3240 /* BFD->target_defaulted is not set to TRUE when a target is chosen
3241 as a fallback, so we check for "scanning" to know when to stop
3242 using the non-swapping target. */
3243 if (abfd->xvec == &rx_elf32_be_ns_vec
3246 if (abfd->xvec == &rx_elf32_be_vec)
3249 bfd_default_set_arch_mach (abfd, bfd_arch_rx,
3250 elf32_rx_machine (abfd));
3252 /* For each PHDR in the object, we must find some section that
3253 corresponds (based on matching file offsets) and use its VMA
3254 information to reconstruct the p_vaddr field we clobbered when we
3256 /* If PT_LOAD headers include the ELF file header or program headers
3257 then the PT_LOAD header does not start with some section contents.
3258 Making adjustments based on the difference between sh_offset and
3259 p_offset is nonsense in such cases. Exclude them. Note that
3260 since standard linker scripts for RX do not use SIZEOF_HEADERS,
3261 the linker won't normally create PT_LOAD segments covering the
3262 headers so this is mainly for passing the ld testsuite.
3263 FIXME. Why are we looking at non-PT_LOAD headers here? */
3264 end_phdroff = ehdr->e_ehsize;
3265 if (ehdr->e_phoff != 0)
3266 end_phdroff = ehdr->e_phoff + nphdrs * ehdr->e_phentsize;
3267 for (i=0; i<nphdrs; i++)
3269 for (u=0; u<elf_tdata(abfd)->num_elf_sections; u++)
3271 Elf_Internal_Shdr *sec = elf_tdata(abfd)->elf_sect_ptr[u];
3273 if (phdr[i].p_filesz
3274 && phdr[i].p_offset >= end_phdroff
3275 && phdr[i].p_offset <= (bfd_vma) sec->sh_offset
3277 && sec->sh_type != SHT_NOBITS
3278 && (bfd_vma)sec->sh_offset <= phdr[i].p_offset + (phdr[i].p_filesz - 1))
3280 /* Found one! The difference between the two addresses,
3281 plus the difference between the two file offsets, is
3282 enough information to reconstruct the lma. */
3284 /* Example where they aren't:
3285 PHDR[1] = lma fffc0100 offset 00002010 size 00000100
3286 SEC[6] = vma 00000050 offset 00002050 size 00000040
3288 The correct LMA for the section is fffc0140 + (2050-2010).
3291 phdr[i].p_vaddr = sec->sh_addr + (sec->sh_offset - phdr[i].p_offset);
3296 /* We must update the bfd sections as well, so we don't stop
3298 bsec = abfd->sections;
3301 if (phdr[i].p_filesz
3302 && phdr[i].p_vaddr <= bsec->vma
3303 && bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1))
3305 bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr);
3317 rx_dump_symtab (bfd * abfd, void * internal_syms, void * external_syms)
3320 Elf_Internal_Sym * isymbuf;
3321 Elf_Internal_Sym * isymend;
3322 Elf_Internal_Sym * isym;
3323 Elf_Internal_Shdr * symtab_hdr;
3324 bfd_boolean free_internal = FALSE, free_external = FALSE;
3326 char * st_info_stb_str;
3327 char * st_other_str;
3328 char * st_shndx_str;
3330 if (! internal_syms)
3332 internal_syms = bfd_malloc (1000);
3335 if (! external_syms)
3337 external_syms = bfd_malloc (1000);
3341 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3342 locsymcount = symtab_hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3344 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3345 symtab_hdr->sh_info, 0,
3346 internal_syms, external_syms, NULL);
3348 isymbuf = internal_syms;
3349 isymend = isymbuf + locsymcount;
3351 for (isym = isymbuf ; isym < isymend ; isym++)
3353 switch (ELF_ST_TYPE (isym->st_info))
3355 case STT_FUNC: st_info_str = "STT_FUNC"; break;
3356 case STT_SECTION: st_info_str = "STT_SECTION"; break;
3357 case STT_FILE: st_info_str = "STT_FILE"; break;
3358 case STT_OBJECT: st_info_str = "STT_OBJECT"; break;
3359 case STT_TLS: st_info_str = "STT_TLS"; break;
3360 default: st_info_str = "";
3362 switch (ELF_ST_BIND (isym->st_info))
3364 case STB_LOCAL: st_info_stb_str = "STB_LOCAL"; break;
3365 case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL"; break;
3366 default: st_info_stb_str = "";
3368 switch (ELF_ST_VISIBILITY (isym->st_other))
3370 case STV_DEFAULT: st_other_str = "STV_DEFAULT"; break;
3371 case STV_INTERNAL: st_other_str = "STV_INTERNAL"; break;
3372 case STV_PROTECTED: st_other_str = "STV_PROTECTED"; break;
3373 default: st_other_str = "";
3375 switch (isym->st_shndx)
3377 case SHN_ABS: st_shndx_str = "SHN_ABS"; break;
3378 case SHN_COMMON: st_shndx_str = "SHN_COMMON"; break;
3379 case SHN_UNDEF: st_shndx_str = "SHN_UNDEF"; break;
3380 default: st_shndx_str = "";
3383 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
3384 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
3386 (unsigned long) isym->st_value,
3387 (unsigned long) isym->st_size,
3389 bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
3391 isym->st_info, st_info_str, st_info_stb_str,
3392 isym->st_other, st_other_str,
3393 isym->st_shndx, st_shndx_str);
3396 free (internal_syms);
3398 free (external_syms);
3402 rx_get_reloc (long reloc)
3404 if (0 <= reloc && reloc < R_RX_max)
3405 return rx_elf_howto_table[reloc].name;
3411 /* We must take care to keep the on-disk copy of any code sections
3412 that are fully linked swapped if the target is big endian, to match
3413 the Renesas tools. */
3415 /* The rule is: big endian object that are final-link executables,
3416 have code sections stored with 32-bit words swapped relative to
3417 what you'd get by default. */
3420 rx_get_section_contents (bfd * abfd,
3424 bfd_size_type count)
3426 int exec = (abfd->flags & EXEC_P) ? 1 : 0;
3427 int s_code = (section->flags & SEC_CODE) ? 1 : 0;
3431 fprintf (stderr, "dj: get %ld %ld from %s %s e%d sc%d %08lx:%08lx\n",
3432 (long) offset, (long) count, section->name,
3433 bfd_big_endian(abfd) ? "be" : "le",
3434 exec, s_code, (long unsigned) section->filepos,
3435 (long unsigned) offset);
3438 if (exec && s_code && bfd_big_endian (abfd))
3440 char * cloc = (char *) location;
3441 bfd_size_type cnt, end_cnt;
3445 /* Fetch and swap unaligned bytes at the beginning. */
3450 rv = _bfd_generic_get_section_contents (abfd, section, buf,
3455 bfd_putb32 (bfd_getl32 (buf), buf);
3457 cnt = 4 - (offset % 4);
3461 memcpy (location, buf + (offset % 4), cnt);
3468 end_cnt = count % 4;
3470 /* Fetch and swap the middle bytes. */
3473 rv = _bfd_generic_get_section_contents (abfd, section, cloc, offset,
3478 for (cnt = count; cnt >= 4; cnt -= 4, cloc += 4)
3479 bfd_putb32 (bfd_getl32 (cloc), cloc);
3482 /* Fetch and swap the end bytes. */
3487 /* Fetch the end bytes. */
3488 rv = _bfd_generic_get_section_contents (abfd, section, buf,
3489 offset + count - end_cnt, 4);
3493 bfd_putb32 (bfd_getl32 (buf), buf);
3494 memcpy (cloc, buf, end_cnt);
3498 rv = _bfd_generic_get_section_contents (abfd, section, location, offset, count);
3505 rx2_set_section_contents (bfd * abfd,
3507 const void * location,
3509 bfd_size_type count)
3513 fprintf (stderr, " set sec %s %08x loc %p offset %#x count %#x\n",
3514 section->name, (unsigned) section->vma, location, (int) offset, (int) count);
3515 for (i = 0; i < count; i++)
3517 if (i % 16 == 0 && i > 0)
3518 fprintf (stderr, "\n");
3520 if (i % 16 && i % 4 == 0)
3521 fprintf (stderr, " ");
3524 fprintf (stderr, " %08x:", (int) (section->vma + offset + i));
3526 fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3528 fprintf (stderr, "\n");
3530 return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3532 #define _bfd_elf_set_section_contents rx2_set_section_contents
3536 rx_set_section_contents (bfd * abfd,
3538 const void * location,
3540 bfd_size_type count)
3542 bfd_boolean exec = (abfd->flags & EXEC_P) ? TRUE : FALSE;
3543 bfd_boolean s_code = (section->flags & SEC_CODE) ? TRUE : FALSE;
3545 char * swapped_data = NULL;
3547 bfd_vma caddr = section->vma + offset;
3549 bfd_size_type scount;
3554 fprintf (stderr, "\ndj: set %ld %ld to %s %s e%d sc%d\n",
3555 (long) offset, (long) count, section->name,
3556 bfd_big_endian (abfd) ? "be" : "le",
3559 for (i = 0; i < count; i++)
3561 int a = section->vma + offset + i;
3563 if (a % 16 == 0 && a > 0)
3564 fprintf (stderr, "\n");
3566 if (a % 16 && a % 4 == 0)
3567 fprintf (stderr, " ");
3569 if (a % 16 == 0 || i == 0)
3570 fprintf (stderr, " %08x:", (int) (section->vma + offset + i));
3572 fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3575 fprintf (stderr, "\n");
3578 if (! exec || ! s_code || ! bfd_big_endian (abfd))
3579 return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3581 while (count > 0 && caddr > 0 && caddr % 4)
3585 case 0: faddr = offset + 3; break;
3586 case 1: faddr = offset + 1; break;
3587 case 2: faddr = offset - 1; break;
3588 case 3: faddr = offset - 3; break;
3591 rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3595 location = (bfd_byte *) location + 1;
3601 scount = (int)(count / 4) * 4;
3604 char * cloc = (char *) location;
3606 swapped_data = (char *) bfd_alloc (abfd, count);
3608 for (i = 0; i < count; i += 4)
3610 bfd_vma v = bfd_getl32 (cloc + i);
3611 bfd_putb32 (v, swapped_data + i);
3614 rv = _bfd_elf_set_section_contents (abfd, section, swapped_data, offset, scount);
3621 location = (bfd_byte *) location + scount;
3626 caddr = section->vma + offset;
3631 case 0: faddr = offset + 3; break;
3632 case 1: faddr = offset + 1; break;
3633 case 2: faddr = offset - 1; break;
3634 case 3: faddr = offset - 3; break;
3636 rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3640 location = (bfd_byte *) location + 1;
3651 rx_final_link (bfd * abfd, struct bfd_link_info * info)
3655 for (o = abfd->sections; o != NULL; o = o->next)
3658 fprintf (stderr, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n",
3659 o->name, o->flags, o->vma, o->lma, o->size, o->rawsize);
3661 if (o->flags & SEC_CODE
3662 && bfd_big_endian (abfd)
3666 fprintf (stderr, "adjusting...\n");
3668 o->size += 4 - (o->size % 4);
3672 return bfd_elf_final_link (abfd, info);
3676 elf32_rx_modify_program_headers (bfd * abfd ATTRIBUTE_UNUSED,
3677 struct bfd_link_info * info ATTRIBUTE_UNUSED)
3679 const struct elf_backend_data * bed;
3680 struct elf_obj_tdata * tdata;
3681 Elf_Internal_Phdr * phdr;
3685 bed = get_elf_backend_data (abfd);
3686 tdata = elf_tdata (abfd);
3688 count = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
3691 for (i = count; i-- != 0;)
3692 if (phdr[i].p_type == PT_LOAD)
3694 /* The Renesas tools expect p_paddr to be zero. However,
3695 there is no other way to store the writable data in ROM for
3696 startup initialization. So, we let the linker *think*
3697 we're using paddr and vaddr the "usual" way, but at the
3698 last minute we move the paddr into the vaddr (which is what
3699 the simulator uses) and zero out paddr. Note that this
3700 does not affect the section headers, just the program
3701 headers. We hope. */
3702 phdr[i].p_vaddr = phdr[i].p_paddr;
3703 #if 0 /* If we zero out p_paddr, then the LMA in the section table
3705 phdr[i].p_paddr = 0;
3712 /* The default literal sections should always be marked as "code" (i.e.,
3713 SHF_EXECINSTR). This is particularly important for big-endian mode
3714 when we do not want their contents byte reversed. */
3715 static const struct bfd_elf_special_section elf32_rx_special_sections[] =
3717 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3718 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3719 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3720 { NULL, 0, 0, 0, 0 }
3725 struct bfd_link_info *info;
3726 bfd_vma table_start;
3728 bfd_vma *table_handlers;
3729 bfd_vma table_default_handler;
3730 struct bfd_link_hash_entry **table_entries;
3731 struct bfd_link_hash_entry *table_default_entry;
3736 rx_table_find (struct bfd_hash_entry *vent, void *vinfo)
3738 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3739 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3740 const char *name; /* of the symbol we've found */
3744 const char *tname; /* name of the table */
3745 bfd_vma start_addr, end_addr;
3747 struct bfd_link_hash_entry * h;
3749 /* We're looking for globally defined symbols of the form
3750 $tablestart$<NAME>. */
3751 if (ent->type != bfd_link_hash_defined
3752 && ent->type != bfd_link_hash_defweak)
3755 name = ent->root.string;
3756 sec = ent->u.def.section;
3759 if (strncmp (name, "$tablestart$", 12))
3762 sec->flags |= SEC_KEEP;
3766 start_addr = ent->u.def.value;
3768 /* At this point, we can't build the table but we can (and must)
3769 find all the related symbols and mark their sections as SEC_KEEP
3770 so we don't garbage collect them. */
3772 buf = (char *) malloc (12 + 10 + strlen (tname));
3774 sprintf (buf, "$tableend$%s", tname);
3775 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3776 if (!h || (h->type != bfd_link_hash_defined
3777 && h->type != bfd_link_hash_defweak))
3779 /* xgettext:c-format */
3780 _bfd_error_handler (_("%pB:%pA: table %s missing corresponding %s"),
3781 abfd, sec, name, buf);
3785 if (h->u.def.section != ent->u.def.section)
3787 /* xgettext:c-format */
3788 _bfd_error_handler (_("%pB:%pA: %s and %s must be in the same input section"),
3789 h->u.def.section->owner, h->u.def.section,
3794 end_addr = h->u.def.value;
3796 sprintf (buf, "$tableentry$default$%s", tname);
3797 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3798 if (h && (h->type == bfd_link_hash_defined
3799 || h->type == bfd_link_hash_defweak))
3801 h->u.def.section->flags |= SEC_KEEP;
3804 for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3806 sprintf (buf, "$tableentry$%d$%s", idx, tname);
3807 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3808 if (h && (h->type == bfd_link_hash_defined
3809 || h->type == bfd_link_hash_defweak))
3811 h->u.def.section->flags |= SEC_KEEP;
3815 /* Return TRUE to keep scanning, FALSE to end the traversal. */
3819 /* We need to check for table entry symbols and build the tables, and
3820 we need to do it before the linker does garbage collection. This function is
3821 called once per input object file. */
3824 (bfd * abfd ATTRIBUTE_UNUSED,
3825 struct bfd_link_info * info ATTRIBUTE_UNUSED)
3827 RX_Table_Info stuff;
3831 bfd_hash_traverse (&(info->hash->table), rx_table_find, &stuff);
3838 rx_table_map_2 (struct bfd_hash_entry *vent, void *vinfo)
3840 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3841 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3846 /* See if the symbol ENT has an address listed in the table, and
3847 isn't a debug/special symbol. If so, put it in the table. */
3849 if (ent->type != bfd_link_hash_defined
3850 && ent->type != bfd_link_hash_defweak)
3853 name = ent->root.string;
3855 if (name[0] == '$' || name[0] == '.' || name[0] < ' ')
3858 addr = (ent->u.def.value
3859 + ent->u.def.section->output_section->vma
3860 + ent->u.def.section->output_offset);
3862 for (idx = 0; idx < info->table_size; idx ++)
3863 if (addr == info->table_handlers[idx])
3864 info->table_entries[idx] = ent;
3866 if (addr == info->table_default_handler)
3867 info->table_default_entry = ent;
3873 rx_table_map (struct bfd_hash_entry *vent, void *vinfo)
3875 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3876 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3877 const char *name; /* of the symbol we've found */
3879 const char *tname; /* name of the table */
3880 bfd_vma start_addr, end_addr;
3882 struct bfd_link_hash_entry * h;
3885 /* We're looking for globally defined symbols of the form
3886 $tablestart$<NAME>. */
3887 if (ent->type != bfd_link_hash_defined
3888 && ent->type != bfd_link_hash_defweak)
3891 name = ent->root.string;
3893 if (strncmp (name, "$tablestart$", 12))
3897 start_addr = (ent->u.def.value
3898 + ent->u.def.section->output_section->vma
3899 + ent->u.def.section->output_offset);
3901 buf = (char *) malloc (12 + 10 + strlen (tname));
3903 sprintf (buf, "$tableend$%s", tname);
3904 end_addr = get_symbol_value_maybe (buf, info->info);
3906 sprintf (buf, "$tableentry$default$%s", tname);
3907 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3910 info->table_default_handler = (h->u.def.value
3911 + h->u.def.section->output_section->vma
3912 + h->u.def.section->output_offset);
3915 /* Zero is a valid handler address! */
3916 info->table_default_handler = (bfd_vma) (-1);
3917 info->table_default_entry = NULL;
3919 info->table_start = start_addr;
3920 info->table_size = (int) (end_addr - start_addr) / 4;
3921 info->table_handlers = (bfd_vma *) malloc (info->table_size * sizeof (bfd_vma));
3922 info->table_entries = (struct bfd_link_hash_entry **) malloc (info->table_size * sizeof (struct bfd_link_hash_entry));
3924 for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3926 sprintf (buf, "$tableentry$%d$%s", idx, tname);
3927 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3928 if (h && (h->type == bfd_link_hash_defined
3929 || h->type == bfd_link_hash_defweak))
3931 info->table_handlers[idx] = (h->u.def.value
3932 + h->u.def.section->output_section->vma
3933 + h->u.def.section->output_offset);
3936 info->table_handlers[idx] = info->table_default_handler;
3937 info->table_entries[idx] = NULL;
3942 bfd_hash_traverse (&(info->info->hash->table), rx_table_map_2, info);
3944 fprintf (info->mapfile, "\nRX Vector Table: %s has %d entries at 0x%08" BFD_VMA_FMT "x\n\n",
3945 tname, info->table_size, start_addr);
3947 if (info->table_default_entry)
3948 fprintf (info->mapfile, " default handler is: %s at 0x%08" BFD_VMA_FMT "x\n",
3949 info->table_default_entry->root.string,
3950 info->table_default_handler);
3951 else if (info->table_default_handler != (bfd_vma)(-1))
3952 fprintf (info->mapfile, " default handler is at 0x%08" BFD_VMA_FMT "x\n",
3953 info->table_default_handler);
3955 fprintf (info->mapfile, " no default handler\n");
3958 for (idx = 0; idx < info->table_size; idx ++)
3960 if (info->table_handlers[idx] == info->table_default_handler)
3963 fprintf (info->mapfile, " . . .\n");
3969 fprintf (info->mapfile, " 0x%08" BFD_VMA_FMT "x [%3d] ", start_addr + 4 * idx, idx);
3971 if (info->table_handlers[idx] == (bfd_vma) (-1))
3972 fprintf (info->mapfile, "(no handler found)\n");
3974 else if (info->table_handlers[idx] == info->table_default_handler)
3976 if (info->table_default_entry)
3977 fprintf (info->mapfile, "(default)\n");
3979 fprintf (info->mapfile, "(default)\n");
3982 else if (info->table_entries[idx])
3984 fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x %s\n", info->table_handlers[idx], info->table_entries[idx]->root.string);
3989 fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x ???\n", info->table_handlers[idx]);
3993 fprintf (info->mapfile, " . . .\n");
3999 rx_additional_link_map_text (bfd *obfd, struct bfd_link_info *info, FILE *mapfile)
4001 /* We scan the symbol table looking for $tableentry$'s, and for
4002 each, try to deduce which handlers go with which entries. */
4004 RX_Table_Info stuff;
4008 stuff.mapfile = mapfile;
4009 bfd_hash_traverse (&(info->hash->table), rx_table_map, &stuff);
4013 #define ELF_ARCH bfd_arch_rx
4014 #define ELF_MACHINE_CODE EM_RX
4015 #define ELF_MAXPAGESIZE 0x1000
4017 #define TARGET_BIG_SYM rx_elf32_be_vec
4018 #define TARGET_BIG_NAME "elf32-rx-be"
4020 #define TARGET_LITTLE_SYM rx_elf32_le_vec
4021 #define TARGET_LITTLE_NAME "elf32-rx-le"
4023 #define elf_info_to_howto_rel NULL
4024 #define elf_info_to_howto rx_info_to_howto_rela
4025 #define elf_backend_object_p rx_elf_object_p
4026 #define elf_backend_relocate_section rx_elf_relocate_section
4027 #define elf_symbol_leading_char ('_')
4028 #define elf_backend_can_gc_sections 1
4029 #define elf_backend_modify_program_headers elf32_rx_modify_program_headers
4031 #define bfd_elf32_bfd_reloc_type_lookup rx_reloc_type_lookup
4032 #define bfd_elf32_bfd_reloc_name_lookup rx_reloc_name_lookup
4033 #define bfd_elf32_bfd_set_private_flags rx_elf_set_private_flags
4034 #define bfd_elf32_bfd_merge_private_bfd_data rx_elf_merge_private_bfd_data
4035 #define bfd_elf32_bfd_print_private_bfd_data rx_elf_print_private_bfd_data
4036 #define bfd_elf32_get_section_contents rx_get_section_contents
4037 #define bfd_elf32_set_section_contents rx_set_section_contents
4038 #define bfd_elf32_bfd_final_link rx_final_link
4039 #define bfd_elf32_bfd_relax_section elf32_rx_relax_section_wrapper
4040 #define elf_backend_special_sections elf32_rx_special_sections
4041 #define elf_backend_check_directives rx_check_directives
4043 #include "elf32-target.h"
4045 /* We define a second big-endian target that doesn't have the custom
4046 section get/set hooks, for times when we want to preserve the
4047 pre-swapped .text sections (like objcopy). */
4049 #undef TARGET_BIG_SYM
4050 #define TARGET_BIG_SYM rx_elf32_be_ns_vec
4051 #undef TARGET_BIG_NAME
4052 #define TARGET_BIG_NAME "elf32-rx-be-ns"
4053 #undef TARGET_LITTLE_SYM
4055 #undef bfd_elf32_get_section_contents
4056 #undef bfd_elf32_set_section_contents
4059 #define elf32_bed elf32_rx_be_ns_bed
4061 #include "elf32-target.h"