1 /* Renesas RX specific support for 32-bit ELF.
2 Copyright (C) 2008-2016 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #include "bfd_stdint.h"
26 #include "libiberty.h"
29 #define RX_OPCODE_BIG_ENDIAN 0
31 /* This is a meta-target that's used only with objcopy, to avoid the
32 endian-swap we would otherwise get. We check for this in
34 const bfd_target rx_elf32_be_ns_vec;
35 const bfd_target rx_elf32_be_vec;
38 char * rx_get_reloc (long);
39 void rx_dump_symtab (bfd *, void *, void *);
42 #define RXREL(n,sz,bit,shift,complain,pcrel) \
43 HOWTO (R_RX_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
44 bfd_elf_generic_reloc, "R_RX_" #n, FALSE, 0, ~0, FALSE)
46 /* Note that the relocations around 0x7f are internal to this file;
47 feel free to move them as needed to avoid conflicts with published
48 relocation numbers. */
50 static reloc_howto_type rx_elf_howto_table [] =
52 RXREL (NONE, 3, 0, 0, dont, FALSE),
53 RXREL (DIR32, 2, 32, 0, signed, FALSE),
54 RXREL (DIR24S, 2, 24, 0, signed, FALSE),
55 RXREL (DIR16, 1, 16, 0, dont, FALSE),
56 RXREL (DIR16U, 1, 16, 0, unsigned, FALSE),
57 RXREL (DIR16S, 1, 16, 0, signed, FALSE),
58 RXREL (DIR8, 0, 8, 0, dont, FALSE),
59 RXREL (DIR8U, 0, 8, 0, unsigned, FALSE),
60 RXREL (DIR8S, 0, 8, 0, signed, FALSE),
61 RXREL (DIR24S_PCREL, 2, 24, 0, signed, TRUE),
62 RXREL (DIR16S_PCREL, 1, 16, 0, signed, TRUE),
63 RXREL (DIR8S_PCREL, 0, 8, 0, signed, TRUE),
64 RXREL (DIR16UL, 1, 16, 2, unsigned, FALSE),
65 RXREL (DIR16UW, 1, 16, 1, unsigned, FALSE),
66 RXREL (DIR8UL, 0, 8, 2, unsigned, FALSE),
67 RXREL (DIR8UW, 0, 8, 1, unsigned, FALSE),
68 RXREL (DIR32_REV, 1, 16, 0, dont, FALSE),
69 RXREL (DIR16_REV, 1, 16, 0, dont, FALSE),
70 RXREL (DIR3U_PCREL, 0, 3, 0, dont, TRUE),
86 RXREL (RH_3_PCREL, 0, 3, 0, signed, TRUE),
87 RXREL (RH_16_OP, 1, 16, 0, signed, FALSE),
88 RXREL (RH_24_OP, 2, 24, 0, signed, FALSE),
89 RXREL (RH_32_OP, 2, 32, 0, signed, FALSE),
90 RXREL (RH_24_UNS, 2, 24, 0, unsigned, FALSE),
91 RXREL (RH_8_NEG, 0, 8, 0, signed, FALSE),
92 RXREL (RH_16_NEG, 1, 16, 0, signed, FALSE),
93 RXREL (RH_24_NEG, 2, 24, 0, signed, FALSE),
94 RXREL (RH_32_NEG, 2, 32, 0, signed, FALSE),
95 RXREL (RH_DIFF, 2, 32, 0, signed, FALSE),
96 RXREL (RH_GPRELB, 1, 16, 0, unsigned, FALSE),
97 RXREL (RH_GPRELW, 1, 16, 0, unsigned, FALSE),
98 RXREL (RH_GPRELL, 1, 16, 0, unsigned, FALSE),
99 RXREL (RH_RELAX, 0, 0, 0, dont, FALSE),
121 RXREL (ABS32, 2, 32, 0, dont, FALSE),
122 RXREL (ABS24S, 2, 24, 0, signed, FALSE),
123 RXREL (ABS16, 1, 16, 0, dont, FALSE),
124 RXREL (ABS16U, 1, 16, 0, unsigned, FALSE),
125 RXREL (ABS16S, 1, 16, 0, signed, FALSE),
126 RXREL (ABS8, 0, 8, 0, dont, FALSE),
127 RXREL (ABS8U, 0, 8, 0, unsigned, FALSE),
128 RXREL (ABS8S, 0, 8, 0, signed, FALSE),
129 RXREL (ABS24S_PCREL, 2, 24, 0, signed, TRUE),
130 RXREL (ABS16S_PCREL, 1, 16, 0, signed, TRUE),
131 RXREL (ABS8S_PCREL, 0, 8, 0, signed, TRUE),
132 RXREL (ABS16UL, 1, 16, 0, unsigned, FALSE),
133 RXREL (ABS16UW, 1, 16, 0, unsigned, FALSE),
134 RXREL (ABS8UL, 0, 8, 0, unsigned, FALSE),
135 RXREL (ABS8UW, 0, 8, 0, unsigned, FALSE),
136 RXREL (ABS32_REV, 2, 32, 0, dont, FALSE),
137 RXREL (ABS16_REV, 1, 16, 0, dont, FALSE),
139 #define STACK_REL_P(x) ((x) <= R_RX_ABS16_REV && (x) >= R_RX_ABS32)
180 /* These are internal. */
181 /* A 5-bit unsigned displacement to a B/W/L address, at bit position 8/12. */
182 /* ---- ---- 4--- 3210. */
183 #define R_RX_RH_ABS5p8B 0x78
184 RXREL (RH_ABS5p8B, 0, 0, 0, dont, FALSE),
185 #define R_RX_RH_ABS5p8W 0x79
186 RXREL (RH_ABS5p8W, 0, 0, 0, dont, FALSE),
187 #define R_RX_RH_ABS5p8L 0x7a
188 RXREL (RH_ABS5p8L, 0, 0, 0, dont, FALSE),
189 /* A 5-bit unsigned displacement to a B/W/L address, at bit position 5/12. */
190 /* ---- -432 1--- 0---. */
191 #define R_RX_RH_ABS5p5B 0x7b
192 RXREL (RH_ABS5p5B, 0, 0, 0, dont, FALSE),
193 #define R_RX_RH_ABS5p5W 0x7c
194 RXREL (RH_ABS5p5W, 0, 0, 0, dont, FALSE),
195 #define R_RX_RH_ABS5p5L 0x7d
196 RXREL (RH_ABS5p5L, 0, 0, 0, dont, FALSE),
197 /* A 4-bit unsigned immediate at bit position 8. */
198 #define R_RX_RH_UIMM4p8 0x7e
199 RXREL (RH_UIMM4p8, 0, 0, 0, dont, FALSE),
200 /* A 4-bit negative unsigned immediate at bit position 8. */
201 #define R_RX_RH_UNEG4p8 0x7f
202 RXREL (RH_UNEG4p8, 0, 0, 0, dont, FALSE),
203 /* End of internal relocs. */
205 RXREL (SYM, 2, 32, 0, dont, FALSE),
206 RXREL (OPneg, 2, 32, 0, dont, FALSE),
207 RXREL (OPadd, 2, 32, 0, dont, FALSE),
208 RXREL (OPsub, 2, 32, 0, dont, FALSE),
209 RXREL (OPmul, 2, 32, 0, dont, FALSE),
210 RXREL (OPdiv, 2, 32, 0, dont, FALSE),
211 RXREL (OPshla, 2, 32, 0, dont, FALSE),
212 RXREL (OPshra, 2, 32, 0, dont, FALSE),
213 RXREL (OPsctsize, 2, 32, 0, dont, FALSE),
214 RXREL (OPscttop, 2, 32, 0, dont, FALSE),
215 RXREL (OPand, 2, 32, 0, dont, FALSE),
216 RXREL (OPor, 2, 32, 0, dont, FALSE),
217 RXREL (OPxor, 2, 32, 0, dont, FALSE),
218 RXREL (OPnot, 2, 32, 0, dont, FALSE),
219 RXREL (OPmod, 2, 32, 0, dont, FALSE),
220 RXREL (OPromtop, 2, 32, 0, dont, FALSE),
221 RXREL (OPramtop, 2, 32, 0, dont, FALSE)
224 /* Map BFD reloc types to RX ELF reloc types. */
228 bfd_reloc_code_real_type bfd_reloc_val;
229 unsigned int rx_reloc_val;
232 static const struct rx_reloc_map rx_reloc_map [] =
234 { BFD_RELOC_NONE, R_RX_NONE },
235 { BFD_RELOC_8, R_RX_DIR8S },
236 { BFD_RELOC_16, R_RX_DIR16S },
237 { BFD_RELOC_24, R_RX_DIR24S },
238 { BFD_RELOC_32, R_RX_DIR32 },
239 { BFD_RELOC_RX_16_OP, R_RX_DIR16 },
240 { BFD_RELOC_RX_DIR3U_PCREL, R_RX_DIR3U_PCREL },
241 { BFD_RELOC_8_PCREL, R_RX_DIR8S_PCREL },
242 { BFD_RELOC_16_PCREL, R_RX_DIR16S_PCREL },
243 { BFD_RELOC_24_PCREL, R_RX_DIR24S_PCREL },
244 { BFD_RELOC_RX_8U, R_RX_DIR8U },
245 { BFD_RELOC_RX_16U, R_RX_DIR16U },
246 { BFD_RELOC_RX_24U, R_RX_RH_24_UNS },
247 { BFD_RELOC_RX_NEG8, R_RX_RH_8_NEG },
248 { BFD_RELOC_RX_NEG16, R_RX_RH_16_NEG },
249 { BFD_RELOC_RX_NEG24, R_RX_RH_24_NEG },
250 { BFD_RELOC_RX_NEG32, R_RX_RH_32_NEG },
251 { BFD_RELOC_RX_DIFF, R_RX_RH_DIFF },
252 { BFD_RELOC_RX_GPRELB, R_RX_RH_GPRELB },
253 { BFD_RELOC_RX_GPRELW, R_RX_RH_GPRELW },
254 { BFD_RELOC_RX_GPRELL, R_RX_RH_GPRELL },
255 { BFD_RELOC_RX_RELAX, R_RX_RH_RELAX },
256 { BFD_RELOC_RX_SYM, R_RX_SYM },
257 { BFD_RELOC_RX_OP_SUBTRACT, R_RX_OPsub },
258 { BFD_RELOC_RX_OP_NEG, R_RX_OPneg },
259 { BFD_RELOC_RX_ABS8, R_RX_ABS8 },
260 { BFD_RELOC_RX_ABS16, R_RX_ABS16 },
261 { BFD_RELOC_RX_ABS16_REV, R_RX_ABS16_REV },
262 { BFD_RELOC_RX_ABS32, R_RX_ABS32 },
263 { BFD_RELOC_RX_ABS32_REV, R_RX_ABS32_REV },
264 { BFD_RELOC_RX_ABS16UL, R_RX_ABS16UL },
265 { BFD_RELOC_RX_ABS16UW, R_RX_ABS16UW },
266 { BFD_RELOC_RX_ABS16U, R_RX_ABS16U }
269 #define BIGE(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG)
271 static reloc_howto_type *
272 rx_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
273 bfd_reloc_code_real_type code)
277 if (code == BFD_RELOC_RX_32_OP)
278 return rx_elf_howto_table + R_RX_DIR32;
280 for (i = ARRAY_SIZE (rx_reloc_map); i--;)
281 if (rx_reloc_map [i].bfd_reloc_val == code)
282 return rx_elf_howto_table + rx_reloc_map[i].rx_reloc_val;
287 static reloc_howto_type *
288 rx_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
292 for (i = 0; i < ARRAY_SIZE (rx_elf_howto_table); i++)
293 if (rx_elf_howto_table[i].name != NULL
294 && strcasecmp (rx_elf_howto_table[i].name, r_name) == 0)
295 return rx_elf_howto_table + i;
300 /* Set the howto pointer for an RX ELF reloc. */
303 rx_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
305 Elf_Internal_Rela * dst)
309 r_type = ELF32_R_TYPE (dst->r_info);
310 if (r_type >= (unsigned int) R_RX_max)
312 _bfd_error_handler (_("%B: invalid RX reloc number: %d"), abfd, r_type);
315 cache_ptr->howto = rx_elf_howto_table + r_type;
319 get_symbol_value (const char * name,
320 struct bfd_link_info * info,
322 asection * input_section,
326 struct bfd_link_hash_entry * h;
328 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
331 || (h->type != bfd_link_hash_defined
332 && h->type != bfd_link_hash_defweak))
333 (*info->callbacks->undefined_symbol)
334 (info, name, input_bfd, input_section, offset, TRUE);
336 value = (h->u.def.value
337 + h->u.def.section->output_section->vma
338 + h->u.def.section->output_offset);
344 get_symbol_value_maybe (const char * name,
345 struct bfd_link_info * info)
348 struct bfd_link_hash_entry * h;
350 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
353 || (h->type != bfd_link_hash_defined
354 && h->type != bfd_link_hash_defweak))
357 value = (h->u.def.value
358 + h->u.def.section->output_section->vma
359 + h->u.def.section->output_offset);
365 get_gp (struct bfd_link_info * info,
370 static bfd_boolean cached = FALSE;
371 static bfd_vma cached_value = 0;
375 cached_value = get_symbol_value ("__gp", info, abfd, sec, offset);
382 get_romstart (struct bfd_link_info * info,
387 static bfd_boolean cached = FALSE;
388 static bfd_vma cached_value = 0;
392 cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
399 get_ramstart (struct bfd_link_info * info,
404 static bfd_boolean cached = FALSE;
405 static bfd_vma cached_value = 0;
409 cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
415 #define NUM_STACK_ENTRIES 16
416 static int32_t rx_stack [ NUM_STACK_ENTRIES ];
417 static unsigned int rx_stack_top;
419 #define RX_STACK_PUSH(val) \
422 if (rx_stack_top < NUM_STACK_ENTRIES) \
423 rx_stack [rx_stack_top ++] = (val); \
425 r = bfd_reloc_dangerous; \
429 #define RX_STACK_POP(dest) \
432 if (rx_stack_top > 0) \
433 (dest) = rx_stack [-- rx_stack_top]; \
435 (dest) = 0, r = bfd_reloc_dangerous; \
439 /* Relocate an RX ELF section.
440 There is some attempt to make this function usable for many architectures,
441 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
442 if only to serve as a learning tool.
444 The RELOCATE_SECTION function is called by the new ELF backend linker
445 to handle the relocations for a section.
447 The relocs are always passed as Rela structures; if the section
448 actually uses Rel structures, the r_addend field will always be
451 This function is responsible for adjusting the section contents as
452 necessary, and (if using Rela relocs and generating a relocatable
453 output file) adjusting the reloc addend as necessary.
455 This function does not have to worry about setting the reloc
456 address or the reloc symbol index.
458 LOCAL_SYMS is a pointer to the swapped in local symbols.
460 LOCAL_SECTIONS is an array giving the section in the input file
461 corresponding to the st_shndx field of each local symbol.
463 The global hash table entry for the global symbols can be found
464 via elf_sym_hashes (input_bfd).
466 When generating relocatable output, this function must handle
467 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
468 going to be the section symbol corresponding to the output
469 section, which means that the addend must be adjusted
473 rx_elf_relocate_section
475 struct bfd_link_info * info,
477 asection * input_section,
479 Elf_Internal_Rela * relocs,
480 Elf_Internal_Sym * local_syms,
481 asection ** local_sections)
483 Elf_Internal_Shdr * symtab_hdr;
484 struct elf_link_hash_entry ** sym_hashes;
485 Elf_Internal_Rela * rel;
486 Elf_Internal_Rela * relend;
487 bfd_boolean pid_mode;
488 bfd_boolean saw_subtract = FALSE;
489 const char * table_default_cache = NULL;
490 bfd_vma table_start_cache = 0;
491 bfd_vma table_end_cache = 0;
493 if (elf_elfheader (output_bfd)->e_flags & E_FLAG_RX_PID)
498 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
499 sym_hashes = elf_sym_hashes (input_bfd);
500 relend = relocs + input_section->reloc_count;
501 for (rel = relocs; rel < relend; rel ++)
503 reloc_howto_type * howto;
504 unsigned long r_symndx;
505 Elf_Internal_Sym * sym;
507 struct elf_link_hash_entry * h;
509 bfd_reloc_status_type r;
510 const char * name = NULL;
511 bfd_boolean unresolved_reloc = TRUE;
514 r_type = ELF32_R_TYPE (rel->r_info);
515 r_symndx = ELF32_R_SYM (rel->r_info);
517 howto = rx_elf_howto_table + ELF32_R_TYPE (rel->r_info);
523 if (rx_stack_top == 0)
524 saw_subtract = FALSE;
526 if (r_symndx < symtab_hdr->sh_info)
528 sym = local_syms + r_symndx;
529 sec = local_sections [r_symndx];
530 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
532 name = bfd_elf_string_from_elf_section
533 (input_bfd, symtab_hdr->sh_link, sym->st_name);
534 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
538 bfd_boolean warned, ignored;
540 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
541 r_symndx, symtab_hdr, sym_hashes, h,
542 sec, relocation, unresolved_reloc,
545 name = h->root.root.string;
548 if (strncmp (name, "$tableentry$default$", 20) == 0)
554 if (table_default_cache != name)
557 /* All relocs for a given table should be to the same
558 (weak) default symbol) so we can use it to detect a
559 cache miss. We use the offset into the table to find
560 the "real" symbol. Calculate and store the table's
563 table_default_cache = name;
565 /* We have already done error checking in rx_table_find(). */
567 buf = (char *) malloc (13 + strlen (name + 20));
569 sprintf (buf, "$tablestart$%s", name + 20);
570 table_start_cache = get_symbol_value (buf,
576 sprintf (buf, "$tableend$%s", name + 20);
577 table_end_cache = get_symbol_value (buf,
586 entry_vma = (input_section->output_section->vma
587 + input_section->output_offset
590 if (table_end_cache <= entry_vma || entry_vma < table_start_cache)
592 _bfd_error_handler (_("%B:%A: table entry %s outside table"),
593 input_bfd, input_section,
596 else if ((int) (entry_vma - table_start_cache) % 4)
598 _bfd_error_handler (_("%B:%A: table entry %s not word-aligned within table"),
599 input_bfd, input_section,
604 idx = (int) (entry_vma - table_start_cache) / 4;
606 /* This will look like $tableentry$<N>$<name> */
607 buf = (char *) malloc (12 + 20 + strlen (name + 20));
608 sprintf (buf, "$tableentry$%d$%s", idx, name + 20);
610 h = (struct elf_link_hash_entry *) bfd_link_hash_lookup (info->hash, buf, FALSE, FALSE, TRUE);
614 relocation = (h->root.u.def.value
615 + h->root.u.def.section->output_section->vma
616 + h->root.u.def.section->output_offset);;
623 if (sec != NULL && discarded_section (sec))
624 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
625 rel, 1, relend, howto, 0, contents);
627 if (bfd_link_relocatable (info))
629 /* This is a relocatable link. We don't have to change
630 anything, unless the reloc is against a section symbol,
631 in which case we have to adjust according to where the
632 section symbol winds up in the output section. */
633 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
634 rel->r_addend += sec->output_offset;
638 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
639 /* If the symbol is undefined and weak
640 then the relocation resolves to zero. */
644 if (howto->pc_relative)
646 relocation -= (input_section->output_section->vma
647 + input_section->output_offset
649 if (r_type != R_RX_RH_3_PCREL
650 && r_type != R_RX_DIR3U_PCREL)
654 relocation += rel->r_addend;
659 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
660 #define ALIGN(m) if (relocation & m) r = bfd_reloc_other;
661 #define OP(i) (contents[rel->r_offset + (i)])
662 #define WARN_REDHAT(type) \
663 _bfd_error_handler (_("%B:%A: Warning: deprecated Red Hat reloc " type " detected against: %s."), \
664 input_bfd, input_section, name)
666 /* Check for unsafe relocs in PID mode. These are any relocs where
667 an absolute address is being computed. There are special cases
668 for relocs against symbols that are known to be referenced in
669 crt0.o before the PID base address register has been initialised. */
670 #define UNSAFE_FOR_PID \
675 && sec->flags & SEC_READONLY \
676 && !(input_section->flags & SEC_DEBUGGING) \
677 && strcmp (name, "__pid_base") != 0 \
678 && strcmp (name, "__gp") != 0 \
679 && strcmp (name, "__romdatastart") != 0 \
681 _bfd_error_handler (_("%B(%A): unsafe PID relocation %s at 0x%08lx (against %s in %s)"), \
682 input_bfd, input_section, howto->name, \
683 input_section->output_section->vma + input_section->output_offset + rel->r_offset, \
688 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
697 case R_RX_RH_3_PCREL:
698 WARN_REDHAT ("RX_RH_3_PCREL");
701 OP (0) |= relocation & 0x07;
705 WARN_REDHAT ("RX_RH_8_NEG");
706 relocation = - relocation;
708 case R_RX_DIR8S_PCREL:
727 WARN_REDHAT ("RX_RH_16_NEG");
728 relocation = - relocation;
730 case R_RX_DIR16S_PCREL:
732 RANGE (-32768, 32767);
733 #if RX_OPCODE_BIG_ENDIAN
736 OP (1) = relocation >> 8;
741 WARN_REDHAT ("RX_RH_16_OP");
743 RANGE (-32768, 32767);
744 #if RX_OPCODE_BIG_ENDIAN
746 OP (0) = relocation >> 8;
749 OP (1) = relocation >> 8;
755 RANGE (-32768, 65535);
756 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
759 OP (0) = relocation >> 8;
764 OP (1) = relocation >> 8;
771 #if RX_OPCODE_BIG_ENDIAN
773 OP (0) = relocation >> 8;
776 OP (1) = relocation >> 8;
782 RANGE (-32768, 65536);
783 #if RX_OPCODE_BIG_ENDIAN
785 OP (0) = relocation >> 8;
788 OP (1) = relocation >> 8;
794 RANGE (-32768, 65536);
795 #if RX_OPCODE_BIG_ENDIAN
797 OP (1) = relocation >> 8;
800 OP (0) = relocation >> 8;
804 case R_RX_DIR3U_PCREL:
807 OP (0) |= relocation & 0x07;
812 WARN_REDHAT ("RX_RH_24_NEG");
813 relocation = - relocation;
815 case R_RX_DIR24S_PCREL:
816 RANGE (-0x800000, 0x7fffff);
817 #if RX_OPCODE_BIG_ENDIAN
819 OP (1) = relocation >> 8;
820 OP (0) = relocation >> 16;
823 OP (1) = relocation >> 8;
824 OP (2) = relocation >> 16;
830 WARN_REDHAT ("RX_RH_24_OP");
831 RANGE (-0x800000, 0x7fffff);
832 #if RX_OPCODE_BIG_ENDIAN
834 OP (1) = relocation >> 8;
835 OP (0) = relocation >> 16;
838 OP (1) = relocation >> 8;
839 OP (2) = relocation >> 16;
845 RANGE (-0x800000, 0x7fffff);
846 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
849 OP (1) = relocation >> 8;
850 OP (0) = relocation >> 16;
855 OP (1) = relocation >> 8;
856 OP (2) = relocation >> 16;
862 WARN_REDHAT ("RX_RH_24_UNS");
864 #if RX_OPCODE_BIG_ENDIAN
866 OP (1) = relocation >> 8;
867 OP (0) = relocation >> 16;
870 OP (1) = relocation >> 8;
871 OP (2) = relocation >> 16;
877 WARN_REDHAT ("RX_RH_32_NEG");
878 relocation = - relocation;
879 #if RX_OPCODE_BIG_ENDIAN
881 OP (2) = relocation >> 8;
882 OP (1) = relocation >> 16;
883 OP (0) = relocation >> 24;
886 OP (1) = relocation >> 8;
887 OP (2) = relocation >> 16;
888 OP (3) = relocation >> 24;
894 WARN_REDHAT ("RX_RH_32_OP");
895 #if RX_OPCODE_BIG_ENDIAN
897 OP (2) = relocation >> 8;
898 OP (1) = relocation >> 16;
899 OP (0) = relocation >> 24;
902 OP (1) = relocation >> 8;
903 OP (2) = relocation >> 16;
904 OP (3) = relocation >> 24;
909 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
912 OP (2) = relocation >> 8;
913 OP (1) = relocation >> 16;
914 OP (0) = relocation >> 24;
919 OP (1) = relocation >> 8;
920 OP (2) = relocation >> 16;
921 OP (3) = relocation >> 24;
926 if (BIGE (output_bfd))
929 OP (1) = relocation >> 8;
930 OP (2) = relocation >> 16;
931 OP (3) = relocation >> 24;
936 OP (2) = relocation >> 8;
937 OP (1) = relocation >> 16;
938 OP (0) = relocation >> 24;
945 WARN_REDHAT ("RX_RH_DIFF");
946 val = bfd_get_32 (output_bfd, & OP (0));
948 bfd_put_32 (output_bfd, val, & OP (0));
953 WARN_REDHAT ("RX_RH_GPRELB");
954 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
956 #if RX_OPCODE_BIG_ENDIAN
958 OP (0) = relocation >> 8;
961 OP (1) = relocation >> 8;
966 WARN_REDHAT ("RX_RH_GPRELW");
967 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
971 #if RX_OPCODE_BIG_ENDIAN
973 OP (0) = relocation >> 8;
976 OP (1) = relocation >> 8;
981 WARN_REDHAT ("RX_RH_GPRELL");
982 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
986 #if RX_OPCODE_BIG_ENDIAN
988 OP (0) = relocation >> 8;
991 OP (1) = relocation >> 8;
995 /* Internal relocations just for relaxation: */
996 case R_RX_RH_ABS5p5B:
997 RX_STACK_POP (relocation);
1000 OP (0) |= relocation >> 2;
1002 OP (1) |= (relocation << 6) & 0x80;
1003 OP (1) |= (relocation << 3) & 0x08;
1006 case R_RX_RH_ABS5p5W:
1007 RX_STACK_POP (relocation);
1012 OP (0) |= relocation >> 2;
1014 OP (1) |= (relocation << 6) & 0x80;
1015 OP (1) |= (relocation << 3) & 0x08;
1018 case R_RX_RH_ABS5p5L:
1019 RX_STACK_POP (relocation);
1024 OP (0) |= relocation >> 2;
1026 OP (1) |= (relocation << 6) & 0x80;
1027 OP (1) |= (relocation << 3) & 0x08;
1030 case R_RX_RH_ABS5p8B:
1031 RX_STACK_POP (relocation);
1034 OP (0) |= (relocation << 3) & 0x80;
1035 OP (0) |= relocation & 0x0f;
1038 case R_RX_RH_ABS5p8W:
1039 RX_STACK_POP (relocation);
1044 OP (0) |= (relocation << 3) & 0x80;
1045 OP (0) |= relocation & 0x0f;
1048 case R_RX_RH_ABS5p8L:
1049 RX_STACK_POP (relocation);
1054 OP (0) |= (relocation << 3) & 0x80;
1055 OP (0) |= relocation & 0x0f;
1058 case R_RX_RH_UIMM4p8:
1061 OP (0) |= relocation << 4;
1064 case R_RX_RH_UNEG4p8:
1067 OP (0) |= (-relocation) << 4;
1070 /* Complex reloc handling: */
1074 RX_STACK_POP (relocation);
1075 #if RX_OPCODE_BIG_ENDIAN
1076 OP (3) = relocation;
1077 OP (2) = relocation >> 8;
1078 OP (1) = relocation >> 16;
1079 OP (0) = relocation >> 24;
1081 OP (0) = relocation;
1082 OP (1) = relocation >> 8;
1083 OP (2) = relocation >> 16;
1084 OP (3) = relocation >> 24;
1088 case R_RX_ABS32_REV:
1090 RX_STACK_POP (relocation);
1091 #if RX_OPCODE_BIG_ENDIAN
1092 OP (0) = relocation;
1093 OP (1) = relocation >> 8;
1094 OP (2) = relocation >> 16;
1095 OP (3) = relocation >> 24;
1097 OP (3) = relocation;
1098 OP (2) = relocation >> 8;
1099 OP (1) = relocation >> 16;
1100 OP (0) = relocation >> 24;
1104 case R_RX_ABS24S_PCREL:
1107 RX_STACK_POP (relocation);
1108 RANGE (-0x800000, 0x7fffff);
1109 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1111 OP (2) = relocation;
1112 OP (1) = relocation >> 8;
1113 OP (0) = relocation >> 16;
1117 OP (0) = relocation;
1118 OP (1) = relocation >> 8;
1119 OP (2) = relocation >> 16;
1125 RX_STACK_POP (relocation);
1126 RANGE (-32768, 65535);
1127 #if RX_OPCODE_BIG_ENDIAN
1128 OP (1) = relocation;
1129 OP (0) = relocation >> 8;
1131 OP (0) = relocation;
1132 OP (1) = relocation >> 8;
1136 case R_RX_ABS16_REV:
1138 RX_STACK_POP (relocation);
1139 RANGE (-32768, 65535);
1140 #if RX_OPCODE_BIG_ENDIAN
1141 OP (0) = relocation;
1142 OP (1) = relocation >> 8;
1144 OP (1) = relocation;
1145 OP (0) = relocation >> 8;
1149 case R_RX_ABS16S_PCREL:
1151 RX_STACK_POP (relocation);
1152 RANGE (-32768, 32767);
1153 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1155 OP (1) = relocation;
1156 OP (0) = relocation >> 8;
1160 OP (0) = relocation;
1161 OP (1) = relocation >> 8;
1167 RX_STACK_POP (relocation);
1169 #if RX_OPCODE_BIG_ENDIAN
1170 OP (1) = relocation;
1171 OP (0) = relocation >> 8;
1173 OP (0) = relocation;
1174 OP (1) = relocation >> 8;
1180 RX_STACK_POP (relocation);
1183 #if RX_OPCODE_BIG_ENDIAN
1184 OP (1) = relocation;
1185 OP (0) = relocation >> 8;
1187 OP (0) = relocation;
1188 OP (1) = relocation >> 8;
1194 RX_STACK_POP (relocation);
1197 #if RX_OPCODE_BIG_ENDIAN
1198 OP (1) = relocation;
1199 OP (0) = relocation >> 8;
1201 OP (0) = relocation;
1202 OP (1) = relocation >> 8;
1208 RX_STACK_POP (relocation);
1210 OP (0) = relocation;
1215 RX_STACK_POP (relocation);
1217 OP (0) = relocation;
1222 RX_STACK_POP (relocation);
1225 OP (0) = relocation;
1230 RX_STACK_POP (relocation);
1233 OP (0) = relocation;
1239 case R_RX_ABS8S_PCREL:
1240 RX_STACK_POP (relocation);
1242 OP (0) = relocation;
1246 if (r_symndx < symtab_hdr->sh_info)
1247 RX_STACK_PUSH (sec->output_section->vma
1248 + sec->output_offset
1254 && (h->root.type == bfd_link_hash_defined
1255 || h->root.type == bfd_link_hash_defweak))
1256 RX_STACK_PUSH (h->root.u.def.value
1257 + sec->output_section->vma
1258 + sec->output_offset
1261 _bfd_error_handler (_("Warning: RX_SYM reloc with an unknown symbol"));
1269 saw_subtract = TRUE;
1272 RX_STACK_PUSH (tmp);
1280 RX_STACK_POP (tmp1);
1281 RX_STACK_POP (tmp2);
1283 RX_STACK_PUSH (tmp1);
1291 saw_subtract = TRUE;
1292 RX_STACK_POP (tmp1);
1293 RX_STACK_POP (tmp2);
1295 RX_STACK_PUSH (tmp2);
1303 RX_STACK_POP (tmp1);
1304 RX_STACK_POP (tmp2);
1306 RX_STACK_PUSH (tmp1);
1314 RX_STACK_POP (tmp1);
1315 RX_STACK_POP (tmp2);
1317 RX_STACK_PUSH (tmp1);
1325 RX_STACK_POP (tmp1);
1326 RX_STACK_POP (tmp2);
1328 RX_STACK_PUSH (tmp1);
1336 RX_STACK_POP (tmp1);
1337 RX_STACK_POP (tmp2);
1339 RX_STACK_PUSH (tmp1);
1343 case R_RX_OPsctsize:
1344 RX_STACK_PUSH (input_section->size);
1348 RX_STACK_PUSH (input_section->output_section->vma);
1355 RX_STACK_POP (tmp1);
1356 RX_STACK_POP (tmp2);
1358 RX_STACK_PUSH (tmp1);
1366 RX_STACK_POP (tmp1);
1367 RX_STACK_POP (tmp2);
1369 RX_STACK_PUSH (tmp1);
1377 RX_STACK_POP (tmp1);
1378 RX_STACK_POP (tmp2);
1380 RX_STACK_PUSH (tmp1);
1390 RX_STACK_PUSH (tmp);
1398 RX_STACK_POP (tmp1);
1399 RX_STACK_POP (tmp2);
1401 RX_STACK_PUSH (tmp1);
1406 RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1410 RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1414 r = bfd_reloc_notsupported;
1418 if (r != bfd_reloc_ok)
1420 const char * msg = NULL;
1424 case bfd_reloc_overflow:
1425 /* Catch the case of a missing function declaration
1426 and emit a more helpful error message. */
1427 if (r_type == R_RX_DIR24S_PCREL)
1428 msg = _("%B(%A): error: call to undefined function '%s'");
1430 (*info->callbacks->reloc_overflow)
1431 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1432 input_bfd, input_section, rel->r_offset);
1435 case bfd_reloc_undefined:
1436 (*info->callbacks->undefined_symbol)
1437 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1440 case bfd_reloc_other:
1441 msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
1444 case bfd_reloc_outofrange:
1445 msg = _("%B(%A): internal error: out of range error");
1448 case bfd_reloc_notsupported:
1449 msg = _("%B(%A): internal error: unsupported relocation error");
1452 case bfd_reloc_dangerous:
1453 msg = _("%B(%A): internal error: dangerous relocation");
1457 msg = _("%B(%A): internal error: unknown error");
1462 _bfd_error_handler (msg, input_bfd, input_section, name);
1469 /* Relaxation Support. */
1471 /* Progression of relocations from largest operand size to smallest
1475 next_smaller_reloc (int r)
1479 case R_RX_DIR32: return R_RX_DIR24S;
1480 case R_RX_DIR24S: return R_RX_DIR16S;
1481 case R_RX_DIR16S: return R_RX_DIR8S;
1482 case R_RX_DIR8S: return R_RX_NONE;
1484 case R_RX_DIR16: return R_RX_DIR8;
1485 case R_RX_DIR8: return R_RX_NONE;
1487 case R_RX_DIR16U: return R_RX_DIR8U;
1488 case R_RX_DIR8U: return R_RX_NONE;
1490 case R_RX_DIR24S_PCREL: return R_RX_DIR16S_PCREL;
1491 case R_RX_DIR16S_PCREL: return R_RX_DIR8S_PCREL;
1492 case R_RX_DIR8S_PCREL: return R_RX_DIR3U_PCREL;
1494 case R_RX_DIR16UL: return R_RX_DIR8UL;
1495 case R_RX_DIR8UL: return R_RX_NONE;
1496 case R_RX_DIR16UW: return R_RX_DIR8UW;
1497 case R_RX_DIR8UW: return R_RX_NONE;
1499 case R_RX_RH_32_OP: return R_RX_RH_24_OP;
1500 case R_RX_RH_24_OP: return R_RX_RH_16_OP;
1501 case R_RX_RH_16_OP: return R_RX_DIR8;
1503 case R_RX_ABS32: return R_RX_ABS24S;
1504 case R_RX_ABS24S: return R_RX_ABS16S;
1505 case R_RX_ABS16: return R_RX_ABS8;
1506 case R_RX_ABS16U: return R_RX_ABS8U;
1507 case R_RX_ABS16S: return R_RX_ABS8S;
1508 case R_RX_ABS8: return R_RX_NONE;
1509 case R_RX_ABS8U: return R_RX_NONE;
1510 case R_RX_ABS8S: return R_RX_NONE;
1511 case R_RX_ABS24S_PCREL: return R_RX_ABS16S_PCREL;
1512 case R_RX_ABS16S_PCREL: return R_RX_ABS8S_PCREL;
1513 case R_RX_ABS8S_PCREL: return R_RX_NONE;
1514 case R_RX_ABS16UL: return R_RX_ABS8UL;
1515 case R_RX_ABS16UW: return R_RX_ABS8UW;
1516 case R_RX_ABS8UL: return R_RX_NONE;
1517 case R_RX_ABS8UW: return R_RX_NONE;
1522 /* Delete some bytes from a section while relaxing. */
1525 elf32_rx_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1526 Elf_Internal_Rela *alignment_rel, int force_snip,
1527 Elf_Internal_Rela *irelstart)
1529 Elf_Internal_Shdr * symtab_hdr;
1530 unsigned int sec_shndx;
1531 bfd_byte * contents;
1532 Elf_Internal_Rela * irel;
1533 Elf_Internal_Rela * irelend;
1534 Elf_Internal_Sym * isym;
1535 Elf_Internal_Sym * isymend;
1537 unsigned int symcount;
1538 struct elf_link_hash_entry ** sym_hashes;
1539 struct elf_link_hash_entry ** end_hashes;
1544 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1546 contents = elf_section_data (sec)->this_hdr.contents;
1548 /* The deletion must stop at the next alignment boundary, if
1549 ALIGNMENT_REL is non-NULL. */
1552 toaddr = alignment_rel->r_offset;
1554 BFD_ASSERT (toaddr > addr);
1556 /* Actually delete the bytes. */
1557 memmove (contents + addr, contents + addr + count,
1558 (size_t) (toaddr - addr - count));
1560 /* If we don't have an alignment marker to worry about, we can just
1561 shrink the section. Otherwise, we have to fill in the newly
1562 created gap with NOP insns (0x03). */
1566 memset (contents + toaddr - count, 0x03, count);
1569 BFD_ASSERT (irel != NULL || sec->reloc_count == 0);
1570 irelend = irel + sec->reloc_count;
1572 /* Adjust all the relocs. */
1573 for (; irel < irelend; irel++)
1575 /* Get the new reloc address. */
1576 if (irel->r_offset > addr
1577 && (irel->r_offset < toaddr
1578 || (force_snip && irel->r_offset == toaddr)))
1579 irel->r_offset -= count;
1581 /* If we see an ALIGN marker at the end of the gap, we move it
1582 to the beginning of the gap, since marking these gaps is what
1584 if (irel->r_offset == toaddr
1585 && ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
1586 && irel->r_addend & RX_RELAXA_ALIGN)
1587 irel->r_offset -= count;
1590 /* Adjust the local symbols defined in this section. */
1591 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1592 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1593 isymend = isym + symtab_hdr->sh_info;
1595 for (; isym < isymend; isym++)
1597 /* If the symbol is in the range of memory we just moved, we
1598 have to adjust its value. */
1599 if (isym->st_shndx == sec_shndx
1600 && isym->st_value > addr
1601 && isym->st_value < toaddr)
1602 isym->st_value -= count;
1604 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1605 *end* is in the moved bytes but it's *start* isn't), then we
1606 must adjust its size. */
1607 if (isym->st_shndx == sec_shndx
1608 && isym->st_value < addr
1609 && isym->st_value + isym->st_size > addr
1610 && isym->st_value + isym->st_size < toaddr)
1611 isym->st_size -= count;
1614 /* Now adjust the global symbols defined in this section. */
1615 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1616 - symtab_hdr->sh_info);
1617 sym_hashes = elf_sym_hashes (abfd);
1618 end_hashes = sym_hashes + symcount;
1620 for (; sym_hashes < end_hashes; sym_hashes++)
1622 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1624 if ((sym_hash->root.type == bfd_link_hash_defined
1625 || sym_hash->root.type == bfd_link_hash_defweak)
1626 && sym_hash->root.u.def.section == sec)
1628 /* As above, adjust the value if needed. */
1629 if (sym_hash->root.u.def.value > addr
1630 && sym_hash->root.u.def.value < toaddr)
1631 sym_hash->root.u.def.value -= count;
1633 /* As above, adjust the size if needed. */
1634 if (sym_hash->root.u.def.value < addr
1635 && sym_hash->root.u.def.value + sym_hash->size > addr
1636 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1637 sym_hash->size -= count;
1644 /* Used to sort relocs by address. If relocs have the same address,
1645 we maintain their relative order, except that R_RX_RH_RELAX
1646 alignment relocs must be the first reloc for any given address. */
1649 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1653 bfd_boolean swappit;
1655 /* This is almost a classic bubblesort. It's the slowest sort, but
1656 we're taking advantage of the fact that the relocations are
1657 mostly in order already (the assembler emits them that way) and
1658 we need relocs with the same address to remain in the same
1664 for (i = 0; i < count - 1; i ++)
1666 if (r[i].r_offset > r[i + 1].r_offset)
1668 else if (r[i].r_offset < r[i + 1].r_offset)
1670 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1671 && (r[i + 1].r_addend & RX_RELAXA_ALIGN))
1673 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1674 && (r[i + 1].r_addend & RX_RELAXA_ELIGN)
1675 && !(ELF32_R_TYPE (r[i].r_info) == R_RX_RH_RELAX
1676 && (r[i].r_addend & RX_RELAXA_ALIGN)))
1683 Elf_Internal_Rela tmp;
1688 /* If we do move a reloc back, re-scan to see if it
1689 needs to be moved even further back. This avoids
1690 most of the O(n^2) behavior for our cases. */
1700 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1701 rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1702 lrel, abfd, sec, link_info, scale)
1705 rx_offset_for_reloc (bfd * abfd,
1706 Elf_Internal_Rela * rel,
1707 Elf_Internal_Shdr * symtab_hdr,
1708 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1709 Elf_Internal_Sym * intsyms,
1710 Elf_Internal_Rela ** lrel,
1712 asection * input_section,
1713 struct bfd_link_info * info,
1717 bfd_reloc_status_type r;
1721 /* REL is the first of 1..N relocations. We compute the symbol
1722 value for each relocation, then combine them if needed. LREL
1723 gets a pointer to the last relocation used. */
1728 /* Get the value of the symbol referred to by the reloc. */
1729 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1731 /* A local symbol. */
1732 Elf_Internal_Sym *isym;
1735 isym = intsyms + ELF32_R_SYM (rel->r_info);
1737 if (isym->st_shndx == SHN_UNDEF)
1738 ssec = bfd_und_section_ptr;
1739 else if (isym->st_shndx == SHN_ABS)
1740 ssec = bfd_abs_section_ptr;
1741 else if (isym->st_shndx == SHN_COMMON)
1742 ssec = bfd_com_section_ptr;
1744 ssec = bfd_section_from_elf_index (abfd,
1747 /* Initial symbol value. */
1748 symval = isym->st_value;
1750 /* GAS may have made this symbol relative to a section, in
1751 which case, we have to add the addend to find the
1753 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1754 symval += rel->r_addend;
1758 if ((ssec->flags & SEC_MERGE)
1759 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1760 symval = _bfd_merged_section_offset (abfd, & ssec,
1761 elf_section_data (ssec)->sec_info,
1765 /* Now make the offset relative to where the linker is putting it. */
1768 ssec->output_section->vma + ssec->output_offset;
1770 symval += rel->r_addend;
1775 struct elf_link_hash_entry * h;
1777 /* An external symbol. */
1778 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1779 h = elf_sym_hashes (abfd)[indx];
1780 BFD_ASSERT (h != NULL);
1782 if (h->root.type != bfd_link_hash_defined
1783 && h->root.type != bfd_link_hash_defweak)
1785 /* This appears to be a reference to an undefined
1786 symbol. Just ignore it--it will be caught by the
1787 regular reloc processing. */
1793 symval = (h->root.u.def.value
1794 + h->root.u.def.section->output_section->vma
1795 + h->root.u.def.section->output_offset);
1797 symval += rel->r_addend;
1800 switch (ELF32_R_TYPE (rel->r_info))
1803 RX_STACK_PUSH (symval);
1807 RX_STACK_POP (tmp1);
1809 RX_STACK_PUSH (tmp1);
1813 RX_STACK_POP (tmp1);
1814 RX_STACK_POP (tmp2);
1816 RX_STACK_PUSH (tmp1);
1820 RX_STACK_POP (tmp1);
1821 RX_STACK_POP (tmp2);
1823 RX_STACK_PUSH (tmp2);
1827 RX_STACK_POP (tmp1);
1828 RX_STACK_POP (tmp2);
1830 RX_STACK_PUSH (tmp1);
1834 RX_STACK_POP (tmp1);
1835 RX_STACK_POP (tmp2);
1837 RX_STACK_PUSH (tmp1);
1841 RX_STACK_POP (tmp1);
1842 RX_STACK_POP (tmp2);
1844 RX_STACK_PUSH (tmp1);
1848 RX_STACK_POP (tmp1);
1849 RX_STACK_POP (tmp2);
1851 RX_STACK_PUSH (tmp1);
1854 case R_RX_OPsctsize:
1855 RX_STACK_PUSH (input_section->size);
1859 RX_STACK_PUSH (input_section->output_section->vma);
1863 RX_STACK_POP (tmp1);
1864 RX_STACK_POP (tmp2);
1866 RX_STACK_PUSH (tmp1);
1870 RX_STACK_POP (tmp1);
1871 RX_STACK_POP (tmp2);
1873 RX_STACK_PUSH (tmp1);
1877 RX_STACK_POP (tmp1);
1878 RX_STACK_POP (tmp2);
1880 RX_STACK_PUSH (tmp1);
1884 RX_STACK_POP (tmp1);
1886 RX_STACK_PUSH (tmp1);
1890 RX_STACK_POP (tmp1);
1891 RX_STACK_POP (tmp2);
1893 RX_STACK_PUSH (tmp1);
1897 RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1901 RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1909 RX_STACK_POP (symval);
1920 RX_STACK_POP (symval);
1928 RX_STACK_POP (symval);
1941 move_reloc (Elf_Internal_Rela * irel, Elf_Internal_Rela * srel, int delta)
1943 bfd_vma old_offset = srel->r_offset;
1946 while (irel <= srel)
1948 if (irel->r_offset == old_offset)
1949 irel->r_offset += delta;
1954 /* Relax one section. */
1957 elf32_rx_relax_section (bfd * abfd,
1959 struct bfd_link_info * link_info,
1960 bfd_boolean * again,
1961 bfd_boolean allow_pcrel3)
1963 Elf_Internal_Shdr * symtab_hdr;
1964 Elf_Internal_Shdr * shndx_hdr;
1965 Elf_Internal_Rela * internal_relocs;
1966 Elf_Internal_Rela * irel;
1967 Elf_Internal_Rela * srel;
1968 Elf_Internal_Rela * irelend;
1969 Elf_Internal_Rela * next_alignment;
1970 Elf_Internal_Rela * prev_alignment;
1971 bfd_byte * contents = NULL;
1972 bfd_byte * free_contents = NULL;
1973 Elf_Internal_Sym * intsyms = NULL;
1974 Elf_Internal_Sym * free_intsyms = NULL;
1975 Elf_External_Sym_Shndx * shndx_buf = NULL;
1981 int section_alignment_glue;
1982 /* how much to scale the relocation by - 1, 2, or 4. */
1985 /* Assume nothing changes. */
1988 /* We don't have to do anything for a relocatable link, if
1989 this section does not have relocs, or if this is not a
1991 if (bfd_link_relocatable (link_info)
1992 || (sec->flags & SEC_RELOC) == 0
1993 || sec->reloc_count == 0
1994 || (sec->flags & SEC_CODE) == 0)
1997 symtab_hdr = & elf_symtab_hdr (abfd);
1998 if (elf_symtab_shndx_list (abfd))
1999 shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2003 sec_start = sec->output_section->vma + sec->output_offset;
2005 /* Get the section contents. */
2006 if (elf_section_data (sec)->this_hdr.contents != NULL)
2007 contents = elf_section_data (sec)->this_hdr.contents;
2008 /* Go get them off disk. */
2011 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2013 elf_section_data (sec)->this_hdr.contents = contents;
2016 /* Read this BFD's symbols. */
2017 /* Get cached copy if it exists. */
2018 if (symtab_hdr->contents != NULL)
2019 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2022 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2023 symtab_hdr->contents = (bfd_byte *) intsyms;
2026 if (shndx_hdr && shndx_hdr->sh_size != 0)
2030 amt = symtab_hdr->sh_info;
2031 amt *= sizeof (Elf_External_Sym_Shndx);
2032 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2033 if (shndx_buf == NULL)
2035 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2036 || bfd_bread (shndx_buf, amt, abfd) != amt)
2038 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2041 /* Get a copy of the native relocations. */
2042 /* Note - we ignore the setting of link_info->keep_memory when reading
2043 in these relocs. We have to maintain a permanent copy of the relocs
2044 because we are going to walk over them multiple times, adjusting them
2045 as bytes are deleted from the section, and with this relaxation
2046 function itself being called multiple times on the same section... */
2047 internal_relocs = _bfd_elf_link_read_relocs
2048 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, TRUE);
2049 if (internal_relocs == NULL)
2052 /* The RL_ relocs must be just before the operand relocs they go
2053 with, so we must sort them to guarantee this. We use bubblesort
2054 instead of qsort so we can guarantee that relocs with the same
2055 address remain in the same relative order. */
2056 reloc_bubblesort (internal_relocs, sec->reloc_count);
2058 /* Walk through them looking for relaxing opportunities. */
2059 irelend = internal_relocs + sec->reloc_count;
2061 /* This will either be NULL or a pointer to the next alignment
2063 next_alignment = internal_relocs;
2064 /* This will be the previous alignment, although at first it points
2065 to the first real relocation. */
2066 prev_alignment = internal_relocs;
2068 /* We calculate worst case shrinkage caused by alignment directives.
2069 No fool-proof, but better than either ignoring the problem or
2070 doing heavy duty analysis of all the alignment markers in all
2072 section_alignment_glue = 0;
2073 for (irel = internal_relocs; irel < irelend; irel++)
2074 if (ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
2075 && irel->r_addend & RX_RELAXA_ALIGN)
2077 int this_glue = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2079 if (section_alignment_glue < this_glue)
2080 section_alignment_glue = this_glue;
2082 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2084 section_alignment_glue *= 2;
2086 for (irel = internal_relocs; irel < irelend; irel++)
2088 unsigned char *insn;
2091 /* The insns we care about are all marked with one of these. */
2092 if (ELF32_R_TYPE (irel->r_info) != R_RX_RH_RELAX)
2095 if (irel->r_addend & RX_RELAXA_ALIGN
2096 || next_alignment == internal_relocs)
2098 /* When we delete bytes, we need to maintain all the alignments
2099 indicated. In addition, we need to be careful about relaxing
2100 jumps across alignment boundaries - these displacements
2101 *grow* when we delete bytes. For now, don't shrink
2102 displacements across an alignment boundary, just in case.
2103 Note that this only affects relocations to the same
2105 prev_alignment = next_alignment;
2106 next_alignment += 2;
2107 while (next_alignment < irelend
2108 && (ELF32_R_TYPE (next_alignment->r_info) != R_RX_RH_RELAX
2109 || !(next_alignment->r_addend & RX_RELAXA_ELIGN)))
2111 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2112 next_alignment = NULL;
2115 /* When we hit alignment markers, see if we've shrunk enough
2116 before them to reduce the gap without violating the alignment
2118 if (irel->r_addend & RX_RELAXA_ALIGN)
2120 /* At this point, the next relocation *should* be the ELIGN
2122 Elf_Internal_Rela *erel = irel + 1;
2123 unsigned int alignment, nbytes;
2125 if (ELF32_R_TYPE (erel->r_info) != R_RX_RH_RELAX)
2127 if (!(erel->r_addend & RX_RELAXA_ELIGN))
2130 alignment = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2132 if (erel->r_offset - irel->r_offset < alignment)
2135 nbytes = erel->r_offset - irel->r_offset;
2136 nbytes /= alignment;
2137 nbytes *= alignment;
2139 elf32_rx_relax_delete_bytes (abfd, sec, erel->r_offset-nbytes, nbytes, next_alignment,
2140 erel->r_offset == sec->size, internal_relocs);
2146 if (irel->r_addend & RX_RELAXA_ELIGN)
2149 insn = contents + irel->r_offset;
2151 nrelocs = irel->r_addend & RX_RELAXA_RNUM;
2153 /* At this point, we have an insn that is a candidate for linker
2154 relaxation. There are NRELOCS relocs following that may be
2155 relaxed, although each reloc may be made of more than one
2156 reloc entry (such as gp-rel symbols). */
2158 /* Get the value of the symbol referred to by the reloc. Just
2159 in case this is the last reloc in the list, use the RL's
2160 addend to choose between this reloc (no addend) or the next
2161 (yes addend, which means at least one following reloc). */
2163 /* srel points to the "current" reloction for this insn -
2164 actually the last reloc for a given operand, which is the one
2165 we need to update. We check the relaxations in the same
2166 order that the relocations happen, so we'll just push it
2170 pc = sec->output_section->vma + sec->output_offset
2174 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2175 pcrel = symval - pc + srel->r_addend; \
2178 #define SNIPNR(offset, nbytes) \
2179 elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0, internal_relocs);
2180 #define SNIP(offset, nbytes, newtype) \
2181 SNIPNR (offset, nbytes); \
2182 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2184 /* The order of these bit tests must match the order that the
2185 relocs appear in. Since we sorted those by offset, we can
2188 /* Note that the numbers in, say, DSP6 are the bit offsets of
2189 the code fields that describe the operand. Bits number 0 for
2190 the MSB of insn[0]. */
2197 if (irel->r_addend & RX_RELAXA_DSP6)
2202 if (code == 2 && symval/scale <= 255)
2204 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2207 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2208 if (newrel != ELF32_R_TYPE (srel->r_info))
2210 SNIP (3, 1, newrel);
2215 else if (code == 1 && symval == 0)
2218 SNIP (2, 1, R_RX_NONE);
2222 /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */
2223 else if (code == 1 && symval/scale <= 31
2224 /* Decodable bits. */
2225 && (insn[0] & 0xcc) == 0xcc
2227 && (insn[0] & 0x30) != 0x30
2228 /* Register MSBs. */
2229 && (insn[1] & 0x88) == 0x00)
2233 insn[0] = 0x88 | (insn[0] & 0x30);
2234 /* The register fields are in the right place already. */
2236 /* We can't relax this new opcode. */
2239 switch ((insn[0] & 0x30) >> 4)
2242 newrel = R_RX_RH_ABS5p5B;
2245 newrel = R_RX_RH_ABS5p5W;
2248 newrel = R_RX_RH_ABS5p5L;
2252 move_reloc (irel, srel, -2);
2253 SNIP (2, 1, newrel);
2256 /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst. */
2257 else if (code == 1 && symval/scale <= 31
2258 /* Decodable bits. */
2259 && (insn[0] & 0xf8) == 0x58
2260 /* Register MSBs. */
2261 && (insn[1] & 0x88) == 0x00)
2265 insn[0] = 0xb0 | ((insn[0] & 0x04) << 1);
2266 /* The register fields are in the right place already. */
2268 /* We can't relax this new opcode. */
2271 switch ((insn[0] & 0x08) >> 3)
2274 newrel = R_RX_RH_ABS5p5B;
2277 newrel = R_RX_RH_ABS5p5W;
2281 move_reloc (irel, srel, -2);
2282 SNIP (2, 1, newrel);
2286 /* A DSP4 operand always follows a DSP6 operand, even if there's
2287 no relocation for it. We have to read the code out of the
2288 opcode to calculate the offset of the operand. */
2289 if (irel->r_addend & RX_RELAXA_DSP4)
2291 int code6, offset = 0;
2295 code6 = insn[0] & 0x03;
2298 case 0: offset = 2; break;
2299 case 1: offset = 3; break;
2300 case 2: offset = 4; break;
2301 case 3: offset = 2; break;
2304 code = (insn[0] & 0x0c) >> 2;
2306 if (code == 2 && symval / scale <= 255)
2308 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2312 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2313 if (newrel != ELF32_R_TYPE (srel->r_info))
2315 SNIP (offset+1, 1, newrel);
2320 else if (code == 1 && symval == 0)
2323 SNIP (offset, 1, R_RX_NONE);
2326 /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
2327 else if (code == 1 && symval/scale <= 31
2328 /* Decodable bits. */
2329 && (insn[0] & 0xc3) == 0xc3
2331 && (insn[0] & 0x30) != 0x30
2332 /* Register MSBs. */
2333 && (insn[1] & 0x88) == 0x00)
2337 insn[0] = 0x80 | (insn[0] & 0x30);
2338 /* The register fields are in the right place already. */
2340 /* We can't relax this new opcode. */
2343 switch ((insn[0] & 0x30) >> 4)
2346 newrel = R_RX_RH_ABS5p5B;
2349 newrel = R_RX_RH_ABS5p5W;
2352 newrel = R_RX_RH_ABS5p5L;
2356 move_reloc (irel, srel, -2);
2357 SNIP (2, 1, newrel);
2361 /* These always occur alone, but the offset depends on whether
2362 it's a MEMEX opcode (0x06) or not. */
2363 if (irel->r_addend & RX_RELAXA_DSP14)
2368 if (insn[0] == 0x06)
2375 if (code == 2 && symval / scale <= 255)
2377 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2381 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2382 if (newrel != ELF32_R_TYPE (srel->r_info))
2384 SNIP (offset, 1, newrel);
2388 else if (code == 1 && symval == 0)
2391 SNIP (offset, 1, R_RX_NONE);
2402 /* These always occur alone. */
2403 if (irel->r_addend & RX_RELAXA_IMM6)
2409 /* These relocations sign-extend, so we must do signed compares. */
2410 ssymval = (long) symval;
2412 code = insn[0] & 0x03;
2414 if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2416 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2420 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2421 if (newrel != ELF32_R_TYPE (srel->r_info))
2423 SNIP (2, 1, newrel);
2428 else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2430 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2434 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2435 if (newrel != ELF32_R_TYPE (srel->r_info))
2437 SNIP (2, 1, newrel);
2442 /* Special case UIMM8 format: CMP #uimm8,Rdst. */
2443 else if (code == 2 && ssymval <= 255 && ssymval >= 16
2444 /* Decodable bits. */
2445 && (insn[0] & 0xfc) == 0x74
2446 /* Decodable bits. */
2447 && ((insn[1] & 0xf0) == 0x00))
2452 insn[1] = 0x50 | (insn[1] & 0x0f);
2454 /* We can't relax this new opcode. */
2457 if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2458 newrel = R_RX_ABS8U;
2460 newrel = R_RX_DIR8U;
2462 SNIP (2, 1, newrel);
2466 else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2468 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2472 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2473 if (newrel != ELF32_R_TYPE (srel->r_info))
2475 SNIP (2, 1, newrel);
2480 /* Special case UIMM4 format: CMP, MUL, AND, OR. */
2481 else if (code == 1 && ssymval <= 15 && ssymval >= 0
2482 /* Decodable bits and immediate type. */
2484 /* Decodable bits. */
2485 && (insn[1] & 0xc0) == 0x00)
2487 static const int newop[4] = { 1, 3, 4, 5 };
2489 insn[0] = 0x60 | newop[insn[1] >> 4];
2490 /* The register number doesn't move. */
2492 /* We can't relax this new opcode. */
2495 move_reloc (irel, srel, -1);
2497 SNIP (2, 1, R_RX_RH_UIMM4p8);
2501 /* Special case UIMM4 format: ADD -> ADD/SUB. */
2502 else if (code == 1 && ssymval <= 15 && ssymval >= -15
2503 /* Decodable bits and immediate type. */
2505 /* Same register for source and destination. */
2506 && ((insn[1] >> 4) == (insn[1] & 0x0f)))
2510 /* Note that we can't turn "add $0,Rs" into a NOP
2511 because the flags need to be set right. */
2515 insn[0] = 0x60; /* Subtract. */
2516 newrel = R_RX_RH_UNEG4p8;
2520 insn[0] = 0x62; /* Add. */
2521 newrel = R_RX_RH_UIMM4p8;
2524 /* The register number is in the right place. */
2526 /* We can't relax this new opcode. */
2529 move_reloc (irel, srel, -1);
2531 SNIP (2, 1, newrel);
2536 /* These are either matched with a DSP6 (2-byte base) or an id24
2538 if (irel->r_addend & RX_RELAXA_IMM12)
2540 int dspcode, offset = 0;
2545 if ((insn[0] & 0xfc) == 0xfc)
2546 dspcode = 1; /* Just something with one byte operand. */
2548 dspcode = insn[0] & 3;
2551 case 0: offset = 2; break;
2552 case 1: offset = 3; break;
2553 case 2: offset = 4; break;
2554 case 3: offset = 2; break;
2557 /* These relocations sign-extend, so we must do signed compares. */
2558 ssymval = (long) symval;
2560 code = (insn[1] >> 2) & 3;
2561 if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2563 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2567 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2568 if (newrel != ELF32_R_TYPE (srel->r_info))
2570 SNIP (offset, 1, newrel);
2575 else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2577 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2581 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2582 if (newrel != ELF32_R_TYPE (srel->r_info))
2584 SNIP (offset, 1, newrel);
2589 /* Special case UIMM8 format: MOV #uimm8,Rdst. */
2590 else if (code == 2 && ssymval <= 255 && ssymval >= 16
2591 /* Decodable bits. */
2593 /* Decodable bits. */
2594 && ((insn[1] & 0x03) == 0x02))
2599 insn[1] = 0x40 | (insn[1] >> 4);
2601 /* We can't relax this new opcode. */
2604 if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2605 newrel = R_RX_ABS8U;
2607 newrel = R_RX_DIR8U;
2609 SNIP (2, 1, newrel);
2613 else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2615 unsigned int newrel = ELF32_R_TYPE(srel->r_info);
2619 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2620 if (newrel != ELF32_R_TYPE(srel->r_info))
2622 SNIP (offset, 1, newrel);
2627 /* Special case UIMM4 format: MOV #uimm4,Rdst. */
2628 else if (code == 1 && ssymval <= 15 && ssymval >= 0
2629 /* Decodable bits. */
2631 /* Decodable bits. */
2632 && ((insn[1] & 0x03) == 0x02))
2635 insn[1] = insn[1] >> 4;
2637 /* We can't relax this new opcode. */
2640 move_reloc (irel, srel, -1);
2642 SNIP (2, 1, R_RX_RH_UIMM4p8);
2647 if (irel->r_addend & RX_RELAXA_BRA)
2649 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2651 int alignment_glue = 0;
2655 /* Branches over alignment chunks are problematic, as
2656 deleting bytes here makes the branch *further* away. We
2657 can be agressive with branches within this alignment
2658 block, but not branches outside it. */
2659 if ((prev_alignment == NULL
2660 || symval < (bfd_vma)(sec_start + prev_alignment->r_offset))
2661 && (next_alignment == NULL
2662 || symval > (bfd_vma)(sec_start + next_alignment->r_offset)))
2663 alignment_glue = section_alignment_glue;
2665 if (ELF32_R_TYPE(srel[1].r_info) == R_RX_RH_RELAX
2666 && srel[1].r_addend & RX_RELAXA_BRA
2667 && srel[1].r_offset < irel->r_offset + pcrel)
2670 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2672 /* The values we compare PCREL with are not what you'd
2673 expect; they're off by a little to compensate for (1)
2674 where the reloc is relative to the insn, and (2) how much
2675 the insn is going to change when we relax it. */
2677 /* These we have to decode. */
2680 case 0x04: /* BRA pcdsp:24 */
2681 if (-32768 + alignment_glue <= pcrel
2682 && pcrel <= 32765 - alignment_glue)
2685 SNIP (3, 1, newrel);
2690 case 0x38: /* BRA pcdsp:16 */
2691 if (-128 + alignment_glue <= pcrel
2692 && pcrel <= 127 - alignment_glue)
2695 SNIP (2, 1, newrel);
2700 case 0x2e: /* BRA pcdsp:8 */
2701 /* Note that there's a risk here of shortening things so
2702 much that we no longer fit this reloc; it *should*
2703 only happen when you branch across a branch, and that
2704 branch also devolves into BRA.S. "Real" code should
2706 if (max_pcrel3 + alignment_glue <= pcrel
2707 && pcrel <= 10 - alignment_glue
2711 SNIP (1, 1, newrel);
2712 move_reloc (irel, srel, -1);
2717 case 0x05: /* BSR pcdsp:24 */
2718 if (-32768 + alignment_glue <= pcrel
2719 && pcrel <= 32765 - alignment_glue)
2722 SNIP (1, 1, newrel);
2727 case 0x3a: /* BEQ.W pcdsp:16 */
2728 case 0x3b: /* BNE.W pcdsp:16 */
2729 if (-128 + alignment_glue <= pcrel
2730 && pcrel <= 127 - alignment_glue)
2732 insn[0] = 0x20 | (insn[0] & 1);
2733 SNIP (1, 1, newrel);
2738 case 0x20: /* BEQ.B pcdsp:8 */
2739 case 0x21: /* BNE.B pcdsp:8 */
2740 if (max_pcrel3 + alignment_glue <= pcrel
2741 && pcrel - alignment_glue <= 10
2744 insn[0] = 0x10 | ((insn[0] & 1) << 3);
2745 SNIP (1, 1, newrel);
2746 move_reloc (irel, srel, -1);
2751 case 0x16: /* synthetic BNE dsp24 */
2752 case 0x1e: /* synthetic BEQ dsp24 */
2753 if (-32767 + alignment_glue <= pcrel
2754 && pcrel <= 32766 - alignment_glue
2757 if (insn[0] == 0x16)
2761 /* We snip out the bytes at the end else the reloc
2762 will get moved too, and too much. */
2763 SNIP (3, 2, newrel);
2764 move_reloc (irel, srel, -1);
2770 /* Special case - synthetic conditional branches, pcrel24.
2771 Note that EQ and NE have been handled above. */
2772 if ((insn[0] & 0xf0) == 0x20
2775 && srel->r_offset != irel->r_offset + 1
2776 && -32767 + alignment_glue <= pcrel
2777 && pcrel <= 32766 - alignment_glue)
2781 SNIP (5, 1, newrel);
2785 /* Special case - synthetic conditional branches, pcrel16 */
2786 if ((insn[0] & 0xf0) == 0x20
2789 && srel->r_offset != irel->r_offset + 1
2790 && -127 + alignment_glue <= pcrel
2791 && pcrel <= 126 - alignment_glue)
2793 int cond = (insn[0] & 0x0f) ^ 0x01;
2795 insn[0] = 0x20 | cond;
2796 /* By moving the reloc first, we avoid having
2797 delete_bytes move it also. */
2798 move_reloc (irel, srel, -2);
2799 SNIP (2, 3, newrel);
2804 BFD_ASSERT (nrelocs == 0);
2806 /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can
2807 use MOV.bwl #uimm:8, dsp:5[r7] format. This is tricky
2808 because it may have one or two relocations. */
2809 if ((insn[0] & 0xfc) == 0xf8
2810 && (insn[1] & 0x80) == 0x00
2811 && (insn[0] & 0x03) != 0x03)
2813 int dcode, icode, reg, ioff, dscale, ilen;
2814 bfd_vma disp_val = 0;
2816 Elf_Internal_Rela * disp_rel = 0;
2817 Elf_Internal_Rela * imm_rel = 0;
2822 dcode = insn[0] & 0x03;
2823 icode = (insn[1] >> 2) & 0x03;
2824 reg = (insn[1] >> 4) & 0x0f;
2826 ioff = dcode == 1 ? 3 : dcode == 2 ? 4 : 2;
2828 /* Figure out what the dispacement is. */
2829 if (dcode == 1 || dcode == 2)
2831 /* There's a displacement. See if there's a reloc for it. */
2832 if (srel[1].r_offset == irel->r_offset + 2)
2844 #if RX_OPCODE_BIG_ENDIAN
2845 disp_val = insn[2] * 256 + insn[3];
2847 disp_val = insn[2] + insn[3] * 256;
2850 switch (insn[1] & 3)
2866 /* Figure out what the immediate is. */
2867 if (srel[1].r_offset == irel->r_offset + ioff)
2870 imm_val = (long) symval;
2875 unsigned char * ip = insn + ioff;
2880 /* For byte writes, we don't sign extend. Makes the math easier later. */
2884 imm_val = (char) ip[0];
2887 #if RX_OPCODE_BIG_ENDIAN
2888 imm_val = ((char) ip[0] << 8) | ip[1];
2890 imm_val = ((char) ip[1] << 8) | ip[0];
2894 #if RX_OPCODE_BIG_ENDIAN
2895 imm_val = ((char) ip[0] << 16) | (ip[1] << 8) | ip[2];
2897 imm_val = ((char) ip[2] << 16) | (ip[1] << 8) | ip[0];
2901 #if RX_OPCODE_BIG_ENDIAN
2902 imm_val = (ip[0] << 24) | (ip[1] << 16) | (ip[2] << 8) | ip[3];
2904 imm_val = (ip[3] << 24) | (ip[2] << 16) | (ip[1] << 8) | ip[0];
2938 /* The shortcut happens when the immediate is 0..255,
2939 register r0 to r7, and displacement (scaled) 0..31. */
2941 if (0 <= imm_val && imm_val <= 255
2942 && 0 <= reg && reg <= 7
2943 && disp_val / dscale <= 31)
2945 insn[0] = 0x3c | (insn[1] & 0x03);
2946 insn[1] = (((disp_val / dscale) << 3) & 0x80) | (reg << 4) | ((disp_val/dscale) & 0x0f);
2951 int newrel = R_RX_NONE;
2956 newrel = R_RX_RH_ABS5p8B;
2959 newrel = R_RX_RH_ABS5p8W;
2962 newrel = R_RX_RH_ABS5p8L;
2965 disp_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (disp_rel->r_info), newrel);
2966 move_reloc (irel, disp_rel, -1);
2970 imm_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (imm_rel->r_info), R_RX_DIR8U);
2971 move_reloc (disp_rel ? disp_rel : irel,
2973 irel->r_offset - imm_rel->r_offset + 2);
2976 SNIPNR (3, ilen - 3);
2979 /* We can't relax this new opcode. */
2985 /* We can't reliably relax branches to DIR3U_PCREL unless we know
2986 whatever they're branching over won't shrink any more. If we're
2987 basically done here, do one more pass just for branches - but
2988 don't request a pass after that one! */
2989 if (!*again && !allow_pcrel3)
2991 bfd_boolean ignored;
2993 elf32_rx_relax_section (abfd, sec, link_info, &ignored, TRUE);
2999 if (free_contents != NULL)
3000 free (free_contents);
3002 if (shndx_buf != NULL)
3004 shndx_hdr->contents = NULL;
3008 if (free_intsyms != NULL)
3009 free (free_intsyms);
3015 elf32_rx_relax_section_wrapper (bfd * abfd,
3017 struct bfd_link_info * link_info,
3018 bfd_boolean * again)
3020 return elf32_rx_relax_section (abfd, sec, link_info, again, FALSE);
3023 /* Function to set the ELF flag bits. */
3026 rx_elf_set_private_flags (bfd * abfd, flagword flags)
3028 elf_elfheader (abfd)->e_flags = flags;
3029 elf_flags_init (abfd) = TRUE;
3033 static bfd_boolean no_warn_mismatch = FALSE;
3034 static bfd_boolean ignore_lma = TRUE;
3036 void bfd_elf32_rx_set_target_flags (bfd_boolean, bfd_boolean);
3039 bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch,
3040 bfd_boolean user_ignore_lma)
3042 no_warn_mismatch = user_no_warn_mismatch;
3043 ignore_lma = user_ignore_lma;
3046 /* Converts FLAGS into a descriptive string.
3047 Returns a static pointer. */
3050 describe_flags (flagword flags)
3052 static char buf [128];
3056 if (flags & E_FLAG_RX_64BIT_DOUBLES)
3057 strcat (buf, "64-bit doubles");
3059 strcat (buf, "32-bit doubles");
3061 if (flags & E_FLAG_RX_DSP)
3062 strcat (buf, ", dsp");
3064 strcat (buf, ", no dsp");
3066 if (flags & E_FLAG_RX_PID)
3067 strcat (buf, ", pid");
3069 strcat (buf, ", no pid");
3071 if (flags & E_FLAG_RX_ABI)
3072 strcat (buf, ", RX ABI");
3074 strcat (buf, ", GCC ABI");
3076 if (flags & E_FLAG_RX_SINSNS_SET)
3077 strcat (buf, flags & E_FLAG_RX_SINSNS_YES ? ", uses String instructions" : ", bans String instructions");
3082 /* Merge backend specific data from an object file to the output
3083 object file when linking. */
3086 rx_elf_merge_private_bfd_data (bfd * ibfd, struct bfd_link_info *info)
3088 bfd *obfd = info->output_bfd;
3091 bfd_boolean error = FALSE;
3093 new_flags = elf_elfheader (ibfd)->e_flags;
3094 old_flags = elf_elfheader (obfd)->e_flags;
3096 if (!elf_flags_init (obfd))
3098 /* First call, no flags set. */
3099 elf_flags_init (obfd) = TRUE;
3100 elf_elfheader (obfd)->e_flags = new_flags;
3102 else if (old_flags != new_flags)
3104 flagword known_flags;
3106 if (old_flags & E_FLAG_RX_SINSNS_SET)
3108 if ((new_flags & E_FLAG_RX_SINSNS_SET) == 0)
3110 new_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3111 new_flags |= (old_flags & E_FLAG_RX_SINSNS_MASK);
3114 else if (new_flags & E_FLAG_RX_SINSNS_SET)
3116 old_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3117 old_flags |= (new_flags & E_FLAG_RX_SINSNS_MASK);
3120 known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES
3121 | E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK;
3123 if ((old_flags ^ new_flags) & known_flags)
3125 /* Only complain if flag bits we care about do not match.
3126 Other bits may be set, since older binaries did use some
3127 deprecated flags. */
3128 if (no_warn_mismatch)
3130 elf_elfheader (obfd)->e_flags = (new_flags | old_flags) & known_flags;
3134 _bfd_error_handler ("There is a conflict merging the ELF header flags from %s",
3135 bfd_get_filename (ibfd));
3136 _bfd_error_handler (" the input file's flags: %s",
3137 describe_flags (new_flags));
3138 _bfd_error_handler (" the output file's flags: %s",
3139 describe_flags (old_flags));
3144 elf_elfheader (obfd)->e_flags = new_flags & known_flags;
3148 bfd_set_error (bfd_error_bad_value);
3154 rx_elf_print_private_bfd_data (bfd * abfd, void * ptr)
3156 FILE * file = (FILE *) ptr;
3159 BFD_ASSERT (abfd != NULL && ptr != NULL);
3161 /* Print normal ELF private data. */
3162 _bfd_elf_print_private_bfd_data (abfd, ptr);
3164 flags = elf_elfheader (abfd)->e_flags;
3165 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
3167 fprintf (file, "%s", describe_flags (flags));
3171 /* Return the MACH for an e_flags value. */
3174 elf32_rx_machine (bfd * abfd ATTRIBUTE_UNUSED)
3176 #if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_...
3177 Need to sort out how these flag bits are used.
3178 For now we assume that the flags are OK. */
3179 if ((elf_elfheader (abfd)->e_flags & EF_RX_CPU_MASK) == EF_RX_CPU_RX)
3187 rx_elf_object_p (bfd * abfd)
3191 Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
3192 int nphdrs = elf_elfheader (abfd)->e_phnum;
3194 static int saw_be = FALSE;
3196 /* We never want to automatically choose the non-swapping big-endian
3197 target. The user can only get that explicitly, such as with -I
3199 if (abfd->xvec == &rx_elf32_be_ns_vec
3200 && abfd->target_defaulted)
3203 /* BFD->target_defaulted is not set to TRUE when a target is chosen
3204 as a fallback, so we check for "scanning" to know when to stop
3205 using the non-swapping target. */
3206 if (abfd->xvec == &rx_elf32_be_ns_vec
3209 if (abfd->xvec == &rx_elf32_be_vec)
3212 bfd_default_set_arch_mach (abfd, bfd_arch_rx,
3213 elf32_rx_machine (abfd));
3215 /* For each PHDR in the object, we must find some section that
3216 corresponds (based on matching file offsets) and use its VMA
3217 information to reconstruct the p_vaddr field we clobbered when we
3219 for (i=0; i<nphdrs; i++)
3221 for (u=0; u<elf_tdata(abfd)->num_elf_sections; u++)
3223 Elf_Internal_Shdr *sec = elf_tdata(abfd)->elf_sect_ptr[u];
3225 if (phdr[i].p_filesz
3226 && phdr[i].p_offset <= (bfd_vma) sec->sh_offset
3228 && sec->sh_type != SHT_NOBITS
3229 && (bfd_vma)sec->sh_offset <= phdr[i].p_offset + (phdr[i].p_filesz - 1))
3231 /* Found one! The difference between the two addresses,
3232 plus the difference between the two file offsets, is
3233 enough information to reconstruct the lma. */
3235 /* Example where they aren't:
3236 PHDR[1] = lma fffc0100 offset 00002010 size 00000100
3237 SEC[6] = vma 00000050 offset 00002050 size 00000040
3239 The correct LMA for the section is fffc0140 + (2050-2010).
3242 phdr[i].p_vaddr = sec->sh_addr + (sec->sh_offset - phdr[i].p_offset);
3247 /* We must update the bfd sections as well, so we don't stop
3249 bsec = abfd->sections;
3252 if (phdr[i].p_filesz
3253 && phdr[i].p_vaddr <= bsec->vma
3254 && bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1))
3256 bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr);
3268 rx_dump_symtab (bfd * abfd, void * internal_syms, void * external_syms)
3271 Elf_Internal_Sym * isymbuf;
3272 Elf_Internal_Sym * isymend;
3273 Elf_Internal_Sym * isym;
3274 Elf_Internal_Shdr * symtab_hdr;
3275 bfd_boolean free_internal = FALSE, free_external = FALSE;
3277 char * st_info_stb_str;
3278 char * st_other_str;
3279 char * st_shndx_str;
3281 if (! internal_syms)
3283 internal_syms = bfd_malloc (1000);
3286 if (! external_syms)
3288 external_syms = bfd_malloc (1000);
3292 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3293 locsymcount = symtab_hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3295 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3296 symtab_hdr->sh_info, 0,
3297 internal_syms, external_syms, NULL);
3299 isymbuf = internal_syms;
3300 isymend = isymbuf + locsymcount;
3302 for (isym = isymbuf ; isym < isymend ; isym++)
3304 switch (ELF_ST_TYPE (isym->st_info))
3306 case STT_FUNC: st_info_str = "STT_FUNC"; break;
3307 case STT_SECTION: st_info_str = "STT_SECTION"; break;
3308 case STT_FILE: st_info_str = "STT_FILE"; break;
3309 case STT_OBJECT: st_info_str = "STT_OBJECT"; break;
3310 case STT_TLS: st_info_str = "STT_TLS"; break;
3311 default: st_info_str = "";
3313 switch (ELF_ST_BIND (isym->st_info))
3315 case STB_LOCAL: st_info_stb_str = "STB_LOCAL"; break;
3316 case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL"; break;
3317 default: st_info_stb_str = "";
3319 switch (ELF_ST_VISIBILITY (isym->st_other))
3321 case STV_DEFAULT: st_other_str = "STV_DEFAULT"; break;
3322 case STV_INTERNAL: st_other_str = "STV_INTERNAL"; break;
3323 case STV_PROTECTED: st_other_str = "STV_PROTECTED"; break;
3324 default: st_other_str = "";
3326 switch (isym->st_shndx)
3328 case SHN_ABS: st_shndx_str = "SHN_ABS"; break;
3329 case SHN_COMMON: st_shndx_str = "SHN_COMMON"; break;
3330 case SHN_UNDEF: st_shndx_str = "SHN_UNDEF"; break;
3331 default: st_shndx_str = "";
3334 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
3335 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
3337 (unsigned long) isym->st_value,
3338 (unsigned long) isym->st_size,
3340 bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
3342 isym->st_info, st_info_str, st_info_stb_str,
3343 isym->st_other, st_other_str,
3344 isym->st_shndx, st_shndx_str);
3347 free (internal_syms);
3349 free (external_syms);
3353 rx_get_reloc (long reloc)
3355 if (0 <= reloc && reloc < R_RX_max)
3356 return rx_elf_howto_table[reloc].name;
3362 /* We must take care to keep the on-disk copy of any code sections
3363 that are fully linked swapped if the target is big endian, to match
3364 the Renesas tools. */
3366 /* The rule is: big endian object that are final-link executables,
3367 have code sections stored with 32-bit words swapped relative to
3368 what you'd get by default. */
3371 rx_get_section_contents (bfd * abfd,
3375 bfd_size_type count)
3377 int exec = (abfd->flags & EXEC_P) ? 1 : 0;
3378 int s_code = (section->flags & SEC_CODE) ? 1 : 0;
3382 fprintf (stderr, "dj: get %ld %ld from %s %s e%d sc%d %08lx:%08lx\n",
3383 (long) offset, (long) count, section->name,
3384 bfd_big_endian(abfd) ? "be" : "le",
3385 exec, s_code, (long unsigned) section->filepos,
3386 (long unsigned) offset);
3389 if (exec && s_code && bfd_big_endian (abfd))
3391 char * cloc = (char *) location;
3392 bfd_size_type cnt, end_cnt;
3396 /* Fetch and swap unaligned bytes at the beginning. */
3401 rv = _bfd_generic_get_section_contents (abfd, section, buf,
3406 bfd_putb32 (bfd_getl32 (buf), buf);
3408 cnt = 4 - (offset % 4);
3412 memcpy (location, buf + (offset % 4), cnt);
3419 end_cnt = count % 4;
3421 /* Fetch and swap the middle bytes. */
3424 rv = _bfd_generic_get_section_contents (abfd, section, cloc, offset,
3429 for (cnt = count; cnt >= 4; cnt -= 4, cloc += 4)
3430 bfd_putb32 (bfd_getl32 (cloc), cloc);
3433 /* Fetch and swap the end bytes. */
3438 /* Fetch the end bytes. */
3439 rv = _bfd_generic_get_section_contents (abfd, section, buf,
3440 offset + count - end_cnt, 4);
3444 bfd_putb32 (bfd_getl32 (buf), buf);
3445 memcpy (cloc, buf, end_cnt);
3449 rv = _bfd_generic_get_section_contents (abfd, section, location, offset, count);
3456 rx2_set_section_contents (bfd * abfd,
3458 const void * location,
3460 bfd_size_type count)
3464 fprintf (stderr, " set sec %s %08x loc %p offset %#x count %#x\n",
3465 section->name, (unsigned) section->vma, location, (int) offset, (int) count);
3466 for (i = 0; i < count; i++)
3468 if (i % 16 == 0 && i > 0)
3469 fprintf (stderr, "\n");
3471 if (i % 16 && i % 4 == 0)
3472 fprintf (stderr, " ");
3475 fprintf (stderr, " %08x:", (int) (section->vma + offset + i));
3477 fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3479 fprintf (stderr, "\n");
3481 return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3483 #define _bfd_elf_set_section_contents rx2_set_section_contents
3487 rx_set_section_contents (bfd * abfd,
3489 const void * location,
3491 bfd_size_type count)
3493 bfd_boolean exec = (abfd->flags & EXEC_P) ? TRUE : FALSE;
3494 bfd_boolean s_code = (section->flags & SEC_CODE) ? TRUE : FALSE;
3496 char * swapped_data = NULL;
3498 bfd_vma caddr = section->vma + offset;
3500 bfd_size_type scount;
3505 fprintf (stderr, "\ndj: set %ld %ld to %s %s e%d sc%d\n",
3506 (long) offset, (long) count, section->name,
3507 bfd_big_endian (abfd) ? "be" : "le",
3510 for (i = 0; i < count; i++)
3512 int a = section->vma + offset + i;
3514 if (a % 16 == 0 && a > 0)
3515 fprintf (stderr, "\n");
3517 if (a % 16 && a % 4 == 0)
3518 fprintf (stderr, " ");
3520 if (a % 16 == 0 || i == 0)
3521 fprintf (stderr, " %08x:", (int) (section->vma + offset + i));
3523 fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3526 fprintf (stderr, "\n");
3529 if (! exec || ! s_code || ! bfd_big_endian (abfd))
3530 return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3532 while (count > 0 && caddr > 0 && caddr % 4)
3536 case 0: faddr = offset + 3; break;
3537 case 1: faddr = offset + 1; break;
3538 case 2: faddr = offset - 1; break;
3539 case 3: faddr = offset - 3; break;
3542 rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3546 location = (bfd_byte *) location + 1;
3552 scount = (int)(count / 4) * 4;
3555 char * cloc = (char *) location;
3557 swapped_data = (char *) bfd_alloc (abfd, count);
3559 for (i = 0; i < count; i += 4)
3561 bfd_vma v = bfd_getl32 (cloc + i);
3562 bfd_putb32 (v, swapped_data + i);
3565 rv = _bfd_elf_set_section_contents (abfd, section, swapped_data, offset, scount);
3572 location = (bfd_byte *) location + scount;
3577 caddr = section->vma + offset;
3582 case 0: faddr = offset + 3; break;
3583 case 1: faddr = offset + 1; break;
3584 case 2: faddr = offset - 1; break;
3585 case 3: faddr = offset - 3; break;
3587 rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3591 location = (bfd_byte *) location + 1;
3602 rx_final_link (bfd * abfd, struct bfd_link_info * info)
3606 for (o = abfd->sections; o != NULL; o = o->next)
3609 fprintf (stderr, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n",
3610 o->name, o->flags, o->vma, o->lma, o->size, o->rawsize);
3612 if (o->flags & SEC_CODE
3613 && bfd_big_endian (abfd)
3617 fprintf (stderr, "adjusting...\n");
3619 o->size += 4 - (o->size % 4);
3623 return bfd_elf_final_link (abfd, info);
3627 elf32_rx_modify_program_headers (bfd * abfd ATTRIBUTE_UNUSED,
3628 struct bfd_link_info * info ATTRIBUTE_UNUSED)
3630 const struct elf_backend_data * bed;
3631 struct elf_obj_tdata * tdata;
3632 Elf_Internal_Phdr * phdr;
3636 bed = get_elf_backend_data (abfd);
3637 tdata = elf_tdata (abfd);
3639 count = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
3642 for (i = count; i-- != 0;)
3643 if (phdr[i].p_type == PT_LOAD)
3645 /* The Renesas tools expect p_paddr to be zero. However,
3646 there is no other way to store the writable data in ROM for
3647 startup initialization. So, we let the linker *think*
3648 we're using paddr and vaddr the "usual" way, but at the
3649 last minute we move the paddr into the vaddr (which is what
3650 the simulator uses) and zero out paddr. Note that this
3651 does not affect the section headers, just the program
3652 headers. We hope. */
3653 phdr[i].p_vaddr = phdr[i].p_paddr;
3654 #if 0 /* If we zero out p_paddr, then the LMA in the section table
3656 phdr[i].p_paddr = 0;
3663 /* The default literal sections should always be marked as "code" (i.e.,
3664 SHF_EXECINSTR). This is particularly important for big-endian mode
3665 when we do not want their contents byte reversed. */
3666 static const struct bfd_elf_special_section elf32_rx_special_sections[] =
3668 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3669 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3670 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3671 { NULL, 0, 0, 0, 0 }
3676 struct bfd_link_info *info;
3677 bfd_vma table_start;
3679 bfd_vma *table_handlers;
3680 bfd_vma table_default_handler;
3681 struct bfd_link_hash_entry **table_entries;
3682 struct bfd_link_hash_entry *table_default_entry;
3687 rx_table_find (struct bfd_hash_entry *vent, void *vinfo)
3689 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3690 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3691 const char *name; /* of the symbol we've found */
3695 const char *tname; /* name of the table */
3696 bfd_vma start_addr, end_addr;
3698 struct bfd_link_hash_entry * h;
3700 /* We're looking for globally defined symbols of the form
3701 $tablestart$<NAME>. */
3702 if (ent->type != bfd_link_hash_defined
3703 && ent->type != bfd_link_hash_defweak)
3706 name = ent->root.string;
3707 sec = ent->u.def.section;
3710 if (strncmp (name, "$tablestart$", 12))
3713 sec->flags |= SEC_KEEP;
3717 start_addr = ent->u.def.value;
3719 /* At this point, we can't build the table but we can (and must)
3720 find all the related symbols and mark their sections as SEC_KEEP
3721 so we don't garbage collect them. */
3723 buf = (char *) malloc (12 + 10 + strlen (tname));
3725 sprintf (buf, "$tableend$%s", tname);
3726 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3727 if (!h || (h->type != bfd_link_hash_defined
3728 && h->type != bfd_link_hash_defweak))
3730 _bfd_error_handler (_("%B:%A: table %s missing corresponding %s"),
3731 abfd, sec, name, buf);
3735 if (h->u.def.section != ent->u.def.section)
3737 _bfd_error_handler (_("%B:%A: %s and %s must be in the same input section"),
3738 h->u.def.section->owner, h->u.def.section,
3743 end_addr = h->u.def.value;
3745 sprintf (buf, "$tableentry$default$%s", tname);
3746 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3747 if (h && (h->type == bfd_link_hash_defined
3748 || h->type == bfd_link_hash_defweak))
3750 h->u.def.section->flags |= SEC_KEEP;
3753 for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3755 sprintf (buf, "$tableentry$%d$%s", idx, tname);
3756 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3757 if (h && (h->type == bfd_link_hash_defined
3758 || h->type == bfd_link_hash_defweak))
3760 h->u.def.section->flags |= SEC_KEEP;
3764 /* Return TRUE to keep scanning, FALSE to end the traversal. */
3768 /* We need to check for table entry symbols and build the tables, and
3769 we need to do it before the linker does garbage collection. This function is
3770 called once per input object file. */
3773 (bfd * abfd ATTRIBUTE_UNUSED,
3774 struct bfd_link_info * info ATTRIBUTE_UNUSED)
3776 RX_Table_Info stuff;
3780 bfd_hash_traverse (&(info->hash->table), rx_table_find, &stuff);
3787 rx_table_map_2 (struct bfd_hash_entry *vent, void *vinfo)
3789 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3790 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3795 /* See if the symbol ENT has an address listed in the table, and
3796 isn't a debug/special symbol. If so, put it in the table. */
3798 if (ent->type != bfd_link_hash_defined
3799 && ent->type != bfd_link_hash_defweak)
3802 name = ent->root.string;
3804 if (name[0] == '$' || name[0] == '.' || name[0] < ' ')
3807 addr = (ent->u.def.value
3808 + ent->u.def.section->output_section->vma
3809 + ent->u.def.section->output_offset);
3811 for (idx = 0; idx < info->table_size; idx ++)
3812 if (addr == info->table_handlers[idx])
3813 info->table_entries[idx] = ent;
3815 if (addr == info->table_default_handler)
3816 info->table_default_entry = ent;
3822 rx_table_map (struct bfd_hash_entry *vent, void *vinfo)
3824 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3825 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3826 const char *name; /* of the symbol we've found */
3828 const char *tname; /* name of the table */
3829 bfd_vma start_addr, end_addr;
3831 struct bfd_link_hash_entry * h;
3834 /* We're looking for globally defined symbols of the form
3835 $tablestart$<NAME>. */
3836 if (ent->type != bfd_link_hash_defined
3837 && ent->type != bfd_link_hash_defweak)
3840 name = ent->root.string;
3842 if (strncmp (name, "$tablestart$", 12))
3846 start_addr = (ent->u.def.value
3847 + ent->u.def.section->output_section->vma
3848 + ent->u.def.section->output_offset);
3850 buf = (char *) malloc (12 + 10 + strlen (tname));
3852 sprintf (buf, "$tableend$%s", tname);
3853 end_addr = get_symbol_value_maybe (buf, info->info);
3855 sprintf (buf, "$tableentry$default$%s", tname);
3856 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3859 info->table_default_handler = (h->u.def.value
3860 + h->u.def.section->output_section->vma
3861 + h->u.def.section->output_offset);
3864 /* Zero is a valid handler address! */
3865 info->table_default_handler = (bfd_vma) (-1);
3866 info->table_default_entry = NULL;
3868 info->table_start = start_addr;
3869 info->table_size = (int) (end_addr - start_addr) / 4;
3870 info->table_handlers = (bfd_vma *) malloc (info->table_size * sizeof (bfd_vma));
3871 info->table_entries = (struct bfd_link_hash_entry **) malloc (info->table_size * sizeof (struct bfd_link_hash_entry));
3873 for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3875 sprintf (buf, "$tableentry$%d$%s", idx, tname);
3876 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3877 if (h && (h->type == bfd_link_hash_defined
3878 || h->type == bfd_link_hash_defweak))
3880 info->table_handlers[idx] = (h->u.def.value
3881 + h->u.def.section->output_section->vma
3882 + h->u.def.section->output_offset);
3885 info->table_handlers[idx] = info->table_default_handler;
3886 info->table_entries[idx] = NULL;
3891 bfd_hash_traverse (&(info->info->hash->table), rx_table_map_2, info);
3893 fprintf (info->mapfile, "\nRX Vector Table: %s has %d entries at 0x%08" BFD_VMA_FMT "x\n\n",
3894 tname, info->table_size, start_addr);
3896 if (info->table_default_entry)
3897 fprintf (info->mapfile, " default handler is: %s at 0x%08" BFD_VMA_FMT "x\n",
3898 info->table_default_entry->root.string,
3899 info->table_default_handler);
3900 else if (info->table_default_handler != (bfd_vma)(-1))
3901 fprintf (info->mapfile, " default handler is at 0x%08" BFD_VMA_FMT "x\n",
3902 info->table_default_handler);
3904 fprintf (info->mapfile, " no default handler\n");
3907 for (idx = 0; idx < info->table_size; idx ++)
3909 if (info->table_handlers[idx] == info->table_default_handler)
3912 fprintf (info->mapfile, " . . .\n");
3918 fprintf (info->mapfile, " 0x%08" BFD_VMA_FMT "x [%3d] ", start_addr + 4 * idx, idx);
3920 if (info->table_handlers[idx] == (bfd_vma) (-1))
3921 fprintf (info->mapfile, "(no handler found)\n");
3923 else if (info->table_handlers[idx] == info->table_default_handler)
3925 if (info->table_default_entry)
3926 fprintf (info->mapfile, "(default)\n");
3928 fprintf (info->mapfile, "(default)\n");
3931 else if (info->table_entries[idx])
3933 fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x %s\n", info->table_handlers[idx], info->table_entries[idx]->root.string);
3938 fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x ???\n", info->table_handlers[idx]);
3942 fprintf (info->mapfile, " . . .\n");
3948 rx_additional_link_map_text (bfd *obfd, struct bfd_link_info *info, FILE *mapfile)
3950 /* We scan the symbol table looking for $tableentry$'s, and for
3951 each, try to deduce which handlers go with which entries. */
3953 RX_Table_Info stuff;
3957 stuff.mapfile = mapfile;
3958 bfd_hash_traverse (&(info->hash->table), rx_table_map, &stuff);
3962 #define ELF_ARCH bfd_arch_rx
3963 #define ELF_MACHINE_CODE EM_RX
3964 #define ELF_MAXPAGESIZE 0x1000
3966 #define TARGET_BIG_SYM rx_elf32_be_vec
3967 #define TARGET_BIG_NAME "elf32-rx-be"
3969 #define TARGET_LITTLE_SYM rx_elf32_le_vec
3970 #define TARGET_LITTLE_NAME "elf32-rx-le"
3972 #define elf_info_to_howto_rel NULL
3973 #define elf_info_to_howto rx_info_to_howto_rela
3974 #define elf_backend_object_p rx_elf_object_p
3975 #define elf_backend_relocate_section rx_elf_relocate_section
3976 #define elf_symbol_leading_char ('_')
3977 #define elf_backend_can_gc_sections 1
3978 #define elf_backend_modify_program_headers elf32_rx_modify_program_headers
3980 #define bfd_elf32_bfd_reloc_type_lookup rx_reloc_type_lookup
3981 #define bfd_elf32_bfd_reloc_name_lookup rx_reloc_name_lookup
3982 #define bfd_elf32_bfd_set_private_flags rx_elf_set_private_flags
3983 #define bfd_elf32_bfd_merge_private_bfd_data rx_elf_merge_private_bfd_data
3984 #define bfd_elf32_bfd_print_private_bfd_data rx_elf_print_private_bfd_data
3985 #define bfd_elf32_get_section_contents rx_get_section_contents
3986 #define bfd_elf32_set_section_contents rx_set_section_contents
3987 #define bfd_elf32_bfd_final_link rx_final_link
3988 #define bfd_elf32_bfd_relax_section elf32_rx_relax_section_wrapper
3989 #define elf_backend_special_sections elf32_rx_special_sections
3990 #define elf_backend_check_directives rx_check_directives
3992 #include "elf32-target.h"
3994 /* We define a second big-endian target that doesn't have the custom
3995 section get/set hooks, for times when we want to preserve the
3996 pre-swapped .text sections (like objcopy). */
3998 #undef TARGET_BIG_SYM
3999 #define TARGET_BIG_SYM rx_elf32_be_ns_vec
4000 #undef TARGET_BIG_NAME
4001 #define TARGET_BIG_NAME "elf32-rx-be-ns"
4002 #undef TARGET_LITTLE_SYM
4004 #undef bfd_elf32_get_section_contents
4005 #undef bfd_elf32_set_section_contents
4008 #define elf32_bed elf32_rx_be_ns_bed
4010 #include "elf32-target.h"