1 /* Renesas RL78 specific support for 32-bit ELF.
2 Copyright (C) 2011-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"
29 #define valid_16bit_address(v) ((v) <= 0x0ffff || (v) >= 0xf0000)
31 #define RL78REL(n,sz,bit,shift,complain,pcrel) \
32 HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
33 bfd_elf_generic_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
35 static bfd_reloc_status_type rl78_special_reloc (bfd *, arelent *, asymbol *, void *,
36 asection *, bfd *, char **);
38 /* FIXME: We could omit the SHIFT parameter, it is always zero. */
39 #define RL78_OP_REL(n,sz,bit,shift,complain,pcrel) \
40 HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
41 rl78_special_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
43 /* Note that the relocations around 0x7f are internal to this file;
44 feel free to move them as needed to avoid conflicts with published
45 relocation numbers. */
47 static reloc_howto_type rl78_elf_howto_table [] =
49 RL78REL (NONE, 3, 0, 0, dont, FALSE),
50 RL78REL (DIR32, 2, 32, 0, signed, FALSE),
51 RL78REL (DIR24S, 2, 24, 0, signed, FALSE),
52 RL78REL (DIR16, 1, 16, 0, dont, FALSE),
53 RL78REL (DIR16U, 1, 16, 0, unsigned, FALSE),
54 RL78REL (DIR16S, 1, 16, 0, signed, FALSE),
55 RL78REL (DIR8, 0, 8, 0, dont, FALSE),
56 RL78REL (DIR8U, 0, 8, 0, unsigned, FALSE),
57 RL78REL (DIR8S, 0, 8, 0, signed, FALSE),
58 RL78REL (DIR24S_PCREL, 2, 24, 0, signed, TRUE),
59 RL78REL (DIR16S_PCREL, 1, 16, 0, signed, TRUE),
60 RL78REL (DIR8S_PCREL, 0, 8, 0, signed, TRUE),
61 RL78REL (DIR16UL, 1, 16, 2, unsigned, FALSE),
62 RL78REL (DIR16UW, 1, 16, 1, unsigned, FALSE),
63 RL78REL (DIR8UL, 0, 8, 2, unsigned, FALSE),
64 RL78REL (DIR8UW, 0, 8, 1, unsigned, FALSE),
65 RL78REL (DIR32_REV, 1, 16, 0, dont, FALSE),
66 RL78REL (DIR16_REV, 1, 16, 0, dont, FALSE),
67 RL78REL (DIR3U_PCREL, 0, 3, 0, dont, TRUE),
96 RL78REL (RH_RELAX, 0, 0, 0, dont, FALSE),
99 RL78REL (RH_SADDR, 0, 0, 0, dont, FALSE),
118 RL78_OP_REL (ABS32, 2, 32, 0, dont, FALSE),
119 RL78_OP_REL (ABS24S, 2, 24, 0, signed, FALSE),
120 RL78_OP_REL (ABS16, 1, 16, 0, dont, FALSE),
121 RL78_OP_REL (ABS16U, 1, 16, 0, unsigned, FALSE),
122 RL78_OP_REL (ABS16S, 1, 16, 0, signed, FALSE),
123 RL78_OP_REL (ABS8, 0, 8, 0, dont, FALSE),
124 RL78_OP_REL (ABS8U, 0, 8, 0, unsigned, FALSE),
125 RL78_OP_REL (ABS8S, 0, 8, 0, signed, FALSE),
126 RL78_OP_REL (ABS24S_PCREL, 2, 24, 0, signed, TRUE),
127 RL78_OP_REL (ABS16S_PCREL, 1, 16, 0, signed, TRUE),
128 RL78_OP_REL (ABS8S_PCREL, 0, 8, 0, signed, TRUE),
129 RL78_OP_REL (ABS16UL, 1, 16, 0, unsigned, FALSE),
130 RL78_OP_REL (ABS16UW, 1, 16, 0, unsigned, FALSE),
131 RL78_OP_REL (ABS8UL, 0, 8, 0, unsigned, FALSE),
132 RL78_OP_REL (ABS8UW, 0, 8, 0, unsigned, FALSE),
133 RL78_OP_REL (ABS32_REV, 2, 32, 0, dont, FALSE),
134 RL78_OP_REL (ABS16_REV, 1, 16, 0, dont, FALSE),
136 #define STACK_REL_P(x) ((x) <= R_RL78_ABS16_REV && (x) >= R_RL78_ABS32)
186 RL78_OP_REL (SYM, 2, 32, 0, dont, FALSE),
187 RL78_OP_REL (OPneg, 2, 32, 0, dont, FALSE),
188 RL78_OP_REL (OPadd, 2, 32, 0, dont, FALSE),
189 RL78_OP_REL (OPsub, 2, 32, 0, dont, FALSE),
190 RL78_OP_REL (OPmul, 2, 32, 0, dont, FALSE),
191 RL78_OP_REL (OPdiv, 2, 32, 0, dont, FALSE),
192 RL78_OP_REL (OPshla, 2, 32, 0, dont, FALSE),
193 RL78_OP_REL (OPshra, 2, 32, 0, dont, FALSE),
194 RL78_OP_REL (OPsctsize, 2, 32, 0, dont, FALSE),
199 RL78_OP_REL (OPscttop, 2, 32, 0, dont, FALSE),
202 RL78_OP_REL (OPand, 2, 32, 0, dont, FALSE),
203 RL78_OP_REL (OPor, 2, 32, 0, dont, FALSE),
204 RL78_OP_REL (OPxor, 2, 32, 0, dont, FALSE),
205 RL78_OP_REL (OPnot, 2, 32, 0, dont, FALSE),
206 RL78_OP_REL (OPmod, 2, 32, 0, dont, FALSE),
207 RL78_OP_REL (OPromtop, 2, 32, 0, dont, FALSE),
208 RL78_OP_REL (OPramtop, 2, 32, 0, dont, FALSE)
211 /* Map BFD reloc types to RL78 ELF reloc types. */
213 struct rl78_reloc_map
215 bfd_reloc_code_real_type bfd_reloc_val;
216 unsigned int rl78_reloc_val;
219 static const struct rl78_reloc_map rl78_reloc_map [] =
221 { BFD_RELOC_NONE, R_RL78_NONE },
222 { BFD_RELOC_8, R_RL78_DIR8S },
223 { BFD_RELOC_16, R_RL78_DIR16S },
224 { BFD_RELOC_24, R_RL78_DIR24S },
225 { BFD_RELOC_32, R_RL78_DIR32 },
226 { BFD_RELOC_RL78_16_OP, R_RL78_DIR16 },
227 { BFD_RELOC_RL78_DIR3U_PCREL, R_RL78_DIR3U_PCREL },
228 { BFD_RELOC_8_PCREL, R_RL78_DIR8S_PCREL },
229 { BFD_RELOC_16_PCREL, R_RL78_DIR16S_PCREL },
230 { BFD_RELOC_24_PCREL, R_RL78_DIR24S_PCREL },
231 { BFD_RELOC_RL78_8U, R_RL78_DIR8U },
232 { BFD_RELOC_RL78_16U, R_RL78_DIR16U },
233 { BFD_RELOC_RL78_SYM, R_RL78_SYM },
234 { BFD_RELOC_RL78_OP_SUBTRACT, R_RL78_OPsub },
235 { BFD_RELOC_RL78_OP_NEG, R_RL78_OPneg },
236 { BFD_RELOC_RL78_OP_AND, R_RL78_OPand },
237 { BFD_RELOC_RL78_OP_SHRA, R_RL78_OPshra },
238 { BFD_RELOC_RL78_ABS8, R_RL78_ABS8 },
239 { BFD_RELOC_RL78_ABS16, R_RL78_ABS16 },
240 { BFD_RELOC_RL78_ABS16_REV, R_RL78_ABS16_REV },
241 { BFD_RELOC_RL78_ABS32, R_RL78_ABS32 },
242 { BFD_RELOC_RL78_ABS32_REV, R_RL78_ABS32_REV },
243 { BFD_RELOC_RL78_ABS16UL, R_RL78_ABS16UL },
244 { BFD_RELOC_RL78_ABS16UW, R_RL78_ABS16UW },
245 { BFD_RELOC_RL78_ABS16U, R_RL78_ABS16U },
246 { BFD_RELOC_RL78_SADDR, R_RL78_RH_SADDR },
247 { BFD_RELOC_RL78_RELAX, R_RL78_RH_RELAX }
250 static reloc_howto_type *
251 rl78_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
252 bfd_reloc_code_real_type code)
256 if (code == BFD_RELOC_RL78_32_OP)
257 return rl78_elf_howto_table + R_RL78_DIR32;
259 for (i = ARRAY_SIZE (rl78_reloc_map); i--;)
260 if (rl78_reloc_map [i].bfd_reloc_val == code)
261 return rl78_elf_howto_table + rl78_reloc_map[i].rl78_reloc_val;
266 static reloc_howto_type *
267 rl78_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
271 for (i = 0; i < ARRAY_SIZE (rl78_elf_howto_table); i++)
272 if (rl78_elf_howto_table[i].name != NULL
273 && strcasecmp (rl78_elf_howto_table[i].name, r_name) == 0)
274 return rl78_elf_howto_table + i;
279 /* Set the howto pointer for an RL78 ELF reloc. */
282 rl78_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
284 Elf_Internal_Rela * dst)
288 r_type = ELF32_R_TYPE (dst->r_info);
289 if (r_type >= (unsigned int) R_RL78_max)
291 /* xgettext:c-format */
292 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
296 cache_ptr->howto = rl78_elf_howto_table + r_type;
300 get_symbol_value (const char * name,
301 struct bfd_link_info * info,
303 asection * input_section,
306 struct bfd_link_hash_entry * h;
311 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
314 || (h->type != bfd_link_hash_defined
315 && h->type != bfd_link_hash_defweak))
317 (*info->callbacks->undefined_symbol)
318 (info, name, input_bfd, input_section, offset, TRUE);
322 return (h->u.def.value
323 + h->u.def.section->output_section->vma
324 + h->u.def.section->output_offset);
328 get_romstart (struct bfd_link_info * info,
333 static bfd_boolean cached = FALSE;
334 static bfd_vma cached_value = 0;
338 cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
345 get_ramstart (struct bfd_link_info * info,
350 static bfd_boolean cached = FALSE;
351 static bfd_vma cached_value = 0;
355 cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
361 #define NUM_STACK_ENTRIES 16
362 static int32_t rl78_stack [ NUM_STACK_ENTRIES ];
363 static unsigned int rl78_stack_top;
365 #define RL78_STACK_PUSH(val) \
368 if (rl78_stack_top < NUM_STACK_ENTRIES) \
369 rl78_stack [rl78_stack_top ++] = (val); \
371 _bfd_error_handler (_("internal error: RL78 reloc stack overflow")); \
375 #define RL78_STACK_POP(dest) \
378 if (rl78_stack_top > 0) \
379 (dest) = rl78_stack [-- rl78_stack_top];\
382 _bfd_error_handler (_("internal error: RL78 reloc stack underflow")); \
388 /* Special handling for RL78 complex relocs. Returns the
389 value of the reloc, or 0 for relocs which do not generate
390 a result. SYMVAL is the value of the symbol for relocs
391 which use a symbolic argument. */
394 rl78_compute_complex_reloc (unsigned long r_type,
396 asection * input_section)
406 case R_RL78_ABS24S_PCREL:
407 case R_RL78_ABS16S_PCREL:
408 case R_RL78_ABS8S_PCREL:
409 RL78_STACK_POP (relocation);
410 relocation -= input_section->output_section->vma + input_section->output_offset;
414 case R_RL78_ABS32_REV:
416 case R_RL78_ABS16_REV:
422 RL78_STACK_POP (relocation);
427 RL78_STACK_POP (relocation);
428 return relocation >> 2;
432 RL78_STACK_POP (relocation);
433 return relocation >> 1;
435 /* The rest of the relocs compute values and then push them onto the stack. */
436 case R_RL78_OPramtop:
437 case R_RL78_OPromtop:
439 RL78_STACK_PUSH (symval);
443 RL78_STACK_POP (tmp1);
445 RL78_STACK_PUSH (tmp1);
449 RL78_STACK_POP (tmp2);
450 RL78_STACK_POP (tmp1);
452 RL78_STACK_PUSH (tmp1);
456 /* For the expression "A - B", the assembler pushes A,
457 then B, then OPSUB. So the first op we pop is B, not A. */
458 RL78_STACK_POP (tmp2); /* B */
459 RL78_STACK_POP (tmp1); /* A */
460 tmp1 -= tmp2; /* A - B */
461 RL78_STACK_PUSH (tmp1);
465 RL78_STACK_POP (tmp2);
466 RL78_STACK_POP (tmp1);
468 RL78_STACK_PUSH (tmp1);
472 RL78_STACK_POP (tmp2);
473 RL78_STACK_POP (tmp1);
475 RL78_STACK_PUSH (tmp1);
479 RL78_STACK_POP (tmp2);
480 RL78_STACK_POP (tmp1);
482 RL78_STACK_PUSH (tmp1);
486 RL78_STACK_POP (tmp2);
487 RL78_STACK_POP (tmp1);
489 RL78_STACK_PUSH (tmp1);
492 case R_RL78_OPsctsize:
493 RL78_STACK_PUSH (input_section->size);
496 case R_RL78_OPscttop:
497 RL78_STACK_PUSH (input_section->output_section->vma);
501 RL78_STACK_POP (tmp2);
502 RL78_STACK_POP (tmp1);
504 RL78_STACK_PUSH (tmp1);
508 RL78_STACK_POP (tmp2);
509 RL78_STACK_POP (tmp1);
511 RL78_STACK_PUSH (tmp1);
515 RL78_STACK_POP (tmp2);
516 RL78_STACK_POP (tmp1);
518 RL78_STACK_PUSH (tmp1);
522 RL78_STACK_POP (tmp1);
524 RL78_STACK_PUSH (tmp1);
528 RL78_STACK_POP (tmp2);
529 RL78_STACK_POP (tmp1);
531 RL78_STACK_PUSH (tmp1);
536 #undef RL78_STACK_PUSH
537 #undef RL78_STACK_POP
539 #define OP(i) (contents[reloc->address + (i)])
541 static bfd_reloc_status_type
542 rl78_special_reloc (bfd * input_bfd,
546 asection * input_section,
547 bfd * output_bfd ATTRIBUTE_UNUSED,
548 char ** error_message ATTRIBUTE_UNUSED)
550 bfd_reloc_status_type r = bfd_reloc_ok;
551 bfd_vma relocation = 0;
552 unsigned long r_type = reloc->howto->type;
553 bfd_byte * contents = data;
555 /* If necessary, compute the symbolic value of the relocation. */
559 relocation = (symbol->value
560 + symbol->section->output_section->vma
561 + symbol->section->output_offset
565 case R_RL78_OPromtop:
566 relocation = get_romstart (NULL, input_bfd, input_section,
570 case R_RL78_OPramtop:
571 relocation = get_ramstart (NULL, input_bfd, input_section,
576 /* Get the value of the relocation. */
577 relocation = rl78_compute_complex_reloc (r_type, relocation, input_section);
579 /* If the relocation alters the contents of the section then apply it now.
580 Note - since this function is called from
581 bfd_generic_get_relocated_section_contents via bfd_perform_relocation,
582 and not from the linker, we do not perform any range checking. The
583 clients who are calling us are only interested in some relocated section
584 contents, and not any linkage problems that might occur later. */
589 OP (1) = relocation >> 8;
590 OP (2) = relocation >> 16;
591 OP (3) = relocation >> 24;
594 case R_RL78_ABS32_REV:
596 OP (2) = relocation >> 8;
597 OP (1) = relocation >> 16;
598 OP (0) = relocation >> 24;
601 case R_RL78_ABS24S_PCREL:
604 OP (1) = relocation >> 8;
605 OP (2) = relocation >> 16;
608 case R_RL78_ABS16_REV:
610 OP (0) = relocation >> 8;
613 case R_RL78_ABS16S_PCREL:
620 OP (1) = relocation >> 8;
623 case R_RL78_ABS8S_PCREL:
640 #define OP(i) (contents[rel->r_offset + (i)])
642 /* Relocate an RL78 ELF section.
643 There is some attempt to make this function usable for many architectures,
644 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
645 if only to serve as a learning tool.
647 The RELOCATE_SECTION function is called by the new ELF backend linker
648 to handle the relocations for a section.
650 The relocs are always passed as Rela structures; if the section
651 actually uses Rel structures, the r_addend field will always be
654 This function is responsible for adjusting the section contents as
655 necessary, and (if using Rela relocs and generating a relocatable
656 output file) adjusting the reloc addend as necessary.
658 This function does not have to worry about setting the reloc
659 address or the reloc symbol index.
661 LOCAL_SYMS is a pointer to the swapped in local symbols.
663 LOCAL_SECTIONS is an array giving the section in the input file
664 corresponding to the st_shndx field of each local symbol.
666 The global hash table entry for the global symbols can be found
667 via elf_sym_hashes (input_bfd).
669 When generating relocatable output, this function must handle
670 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
671 going to be the section symbol corresponding to the output
672 section, which means that the addend must be adjusted
676 rl78_elf_relocate_section
678 struct bfd_link_info * info,
680 asection * input_section,
682 Elf_Internal_Rela * relocs,
683 Elf_Internal_Sym * local_syms,
684 asection ** local_sections)
686 Elf_Internal_Shdr * symtab_hdr;
687 struct elf_link_hash_entry ** sym_hashes;
688 Elf_Internal_Rela * rel;
689 Elf_Internal_Rela * relend;
692 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
693 sym_hashes = elf_sym_hashes (input_bfd);
694 relend = relocs + input_section->reloc_count;
696 splt = elf_hash_table (info)->splt;
698 for (rel = relocs; rel < relend; rel ++)
700 reloc_howto_type * howto;
701 unsigned long r_symndx;
702 Elf_Internal_Sym * sym;
704 struct elf_link_hash_entry * h;
706 bfd_reloc_status_type r;
707 const char * name = NULL;
708 bfd_boolean unresolved_reloc = TRUE;
711 r_type = ELF32_R_TYPE (rel->r_info);
712 r_symndx = ELF32_R_SYM (rel->r_info);
714 howto = rl78_elf_howto_table + ELF32_R_TYPE (rel->r_info);
720 if (r_symndx < symtab_hdr->sh_info)
722 sym = local_syms + r_symndx;
723 sec = local_sections [r_symndx];
724 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
726 name = bfd_elf_string_from_elf_section
727 (input_bfd, symtab_hdr->sh_link, sym->st_name);
728 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
732 bfd_boolean warned ATTRIBUTE_UNUSED;
733 bfd_boolean ignored ATTRIBUTE_UNUSED;
735 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
736 r_symndx, symtab_hdr, sym_hashes, h,
737 sec, relocation, unresolved_reloc,
740 name = h->root.root.string;
743 if (sec != NULL && discarded_section (sec))
744 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
745 rel, 1, relend, howto, 0, contents);
747 if (bfd_link_relocatable (info))
749 /* This is a relocatable link. We don't have to change
750 anything, unless the reloc is against a section symbol,
751 in which case we have to adjust according to where the
752 section symbol winds up in the output section. */
753 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
754 rel->r_addend += sec->output_offset;
758 switch (ELF32_R_TYPE (rel->r_info))
765 plt_offset = &h->plt.offset;
767 plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
769 if (! valid_16bit_address (relocation))
771 /* If this is the first time we've processed this symbol,
772 fill in the plt entry with the correct symbol address. */
773 if ((*plt_offset & 1) == 0)
777 x = 0x000000ec; /* br !!abs24 */
778 x |= (relocation << 8) & 0xffffff00;
779 bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
783 relocation = (splt->output_section->vma
784 + splt->output_offset
785 + (*plt_offset & -2));
788 char *newname = bfd_malloc (strlen(name)+5);
789 strcpy (newname, name);
790 strcat(newname, ".plt");
791 _bfd_generic_link_add_one_symbol (info,
794 BSF_FUNCTION | BSF_WEAK,
807 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
808 /* If the symbol is undefined and weak
809 then the relocation resolves to zero. */
813 if (howto->pc_relative)
815 relocation -= (input_section->output_section->vma
816 + input_section->output_offset
818 relocation -= bfd_get_reloc_size (howto);
821 relocation += rel->r_addend;
826 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
828 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
834 case R_RL78_RH_RELAX:
837 case R_RL78_DIR8S_PCREL:
852 case R_RL78_DIR16S_PCREL:
853 RANGE (-32768, 32767);
855 OP (1) = relocation >> 8;
859 if ((relocation & 0xf0000) == 0xf0000)
860 relocation &= 0xffff;
861 RANGE (-32768, 65535);
863 OP (1) = relocation >> 8;
869 OP (1) = relocation >> 8;
873 RANGE (-32768, 65536);
875 OP (1) = relocation >> 8;
878 case R_RL78_DIR16_REV:
879 RANGE (-32768, 65536);
881 OP (0) = relocation >> 8;
884 case R_RL78_DIR3U_PCREL:
887 OP (0) |= relocation & 0x07;
890 case R_RL78_DIR24S_PCREL:
891 RANGE (-0x800000, 0x7fffff);
893 OP (1) = relocation >> 8;
894 OP (2) = relocation >> 16;
898 RANGE (-0x800000, 0x7fffff);
900 OP (1) = relocation >> 8;
901 OP (2) = relocation >> 16;
906 OP (1) = relocation >> 8;
907 OP (2) = relocation >> 16;
908 OP (3) = relocation >> 24;
911 case R_RL78_DIR32_REV:
913 OP (2) = relocation >> 8;
914 OP (1) = relocation >> 16;
915 OP (0) = relocation >> 24;
919 RANGE (0xfff00, 0xfffff);
920 OP (0) = relocation & 0xff;
923 case R_RL78_RH_SADDR:
924 RANGE (0xffe20, 0xfff1f);
925 OP (0) = relocation & 0xff;
928 /* Complex reloc handling: */
930 case R_RL78_ABS32_REV:
931 case R_RL78_ABS24S_PCREL:
934 case R_RL78_ABS16_REV:
935 case R_RL78_ABS16S_PCREL:
944 case R_RL78_ABS8S_PCREL:
953 case R_RL78_OPsctsize:
954 case R_RL78_OPscttop:
960 relocation = rl78_compute_complex_reloc (r_type, 0, input_section);
966 OP (1) = relocation >> 8;
967 OP (2) = relocation >> 16;
968 OP (3) = relocation >> 24;
971 case R_RL78_ABS32_REV:
973 OP (2) = relocation >> 8;
974 OP (1) = relocation >> 16;
975 OP (0) = relocation >> 24;
978 case R_RL78_ABS24S_PCREL:
980 RANGE (-0x800000, 0x7fffff);
982 OP (1) = relocation >> 8;
983 OP (2) = relocation >> 16;
987 RANGE (-32768, 65535);
989 OP (1) = relocation >> 8;
992 case R_RL78_ABS16_REV:
993 RANGE (-32768, 65535);
995 OP (0) = relocation >> 8;
998 case R_RL78_ABS16S_PCREL:
1000 RANGE (-32768, 32767);
1001 OP (0) = relocation;
1002 OP (1) = relocation >> 8;
1006 case R_RL78_ABS16UL:
1007 case R_RL78_ABS16UW:
1009 OP (0) = relocation;
1010 OP (1) = relocation >> 8;
1015 OP (0) = relocation;
1022 OP (0) = relocation;
1025 case R_RL78_ABS8S_PCREL:
1028 OP (0) = relocation;
1037 if (r_symndx < symtab_hdr->sh_info)
1038 relocation = sec->output_section->vma + sec->output_offset
1039 + sym->st_value + rel->r_addend;
1041 && (h->root.type == bfd_link_hash_defined
1042 || h->root.type == bfd_link_hash_defweak))
1043 relocation = h->root.u.def.value
1044 + sec->output_section->vma
1045 + sec->output_offset
1050 if (h->root.type != bfd_link_hash_undefweak)
1052 (_("warning: RL78_SYM reloc with an unknown symbol"));
1054 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1057 case R_RL78_OPromtop:
1058 relocation = get_romstart (info, input_bfd, input_section, rel->r_offset);
1059 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1062 case R_RL78_OPramtop:
1063 relocation = get_ramstart (info, input_bfd, input_section, rel->r_offset);
1064 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1068 r = bfd_reloc_notsupported;
1072 if (r != bfd_reloc_ok)
1074 const char * msg = NULL;
1078 case bfd_reloc_overflow:
1079 /* Catch the case of a missing function declaration
1080 and emit a more helpful error message. */
1081 if (r_type == R_RL78_DIR24S_PCREL)
1082 /* xgettext:c-format */
1083 msg = _("%pB(%pA): error: call to undefined function '%s'");
1085 (*info->callbacks->reloc_overflow)
1086 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1087 input_bfd, input_section, rel->r_offset);
1090 case bfd_reloc_undefined:
1091 (*info->callbacks->undefined_symbol)
1092 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1095 case bfd_reloc_other:
1096 /* xgettext:c-format */
1097 msg = _("%pB(%pA): warning: unaligned access to symbol '%s' in the small data area");
1100 case bfd_reloc_outofrange:
1101 /* xgettext:c-format */
1102 msg = _("%pB(%pA): internal error: out of range error");
1105 case bfd_reloc_notsupported:
1106 /* xgettext:c-format */
1107 msg = _("%pB(%pA): internal error: unsupported relocation error");
1110 case bfd_reloc_dangerous:
1111 /* xgettext:c-format */
1112 msg = _("%pB(%pA): internal error: dangerous relocation");
1116 /* xgettext:c-format */
1117 msg = _("%pB(%pA): internal error: unknown error");
1122 _bfd_error_handler (msg, input_bfd, input_section, name);
1129 /* Function to set the ELF flag bits. */
1132 rl78_elf_set_private_flags (bfd * abfd, flagword flags)
1134 elf_elfheader (abfd)->e_flags = flags;
1135 elf_flags_init (abfd) = TRUE;
1139 static bfd_boolean no_warn_mismatch = FALSE;
1141 void bfd_elf32_rl78_set_target_flags (bfd_boolean);
1144 bfd_elf32_rl78_set_target_flags (bfd_boolean user_no_warn_mismatch)
1146 no_warn_mismatch = user_no_warn_mismatch;
1150 rl78_cpu_name (flagword flags)
1152 switch (flags & E_FLAG_RL78_CPU_MASK)
1155 case E_FLAG_RL78_G10: return "G10";
1156 case E_FLAG_RL78_G13: return "G13";
1157 case E_FLAG_RL78_G14: return "G14";
1161 /* Merge backend specific data from an object file to the output
1162 object file when linking. */
1165 rl78_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
1167 bfd *obfd = info->output_bfd;
1170 bfd_boolean error = FALSE;
1172 new_flags = elf_elfheader (ibfd)->e_flags;
1173 old_flags = elf_elfheader (obfd)->e_flags;
1175 if (!elf_flags_init (obfd))
1177 /* First call, no flags set. */
1178 elf_flags_init (obfd) = TRUE;
1179 elf_elfheader (obfd)->e_flags = new_flags;
1181 else if (old_flags != new_flags)
1183 flagword changed_flags = old_flags ^ new_flags;
1185 if (changed_flags & E_FLAG_RL78_CPU_MASK)
1187 flagword out_cpu = old_flags & E_FLAG_RL78_CPU_MASK;
1188 flagword in_cpu = new_flags & E_FLAG_RL78_CPU_MASK;
1190 if (in_cpu == E_FLAG_RL78_ANY_CPU || in_cpu == out_cpu)
1191 /* It does not matter what new_cpu may have. */;
1192 else if (out_cpu == E_FLAG_RL78_ANY_CPU)
1194 if (in_cpu == E_FLAG_RL78_G10)
1196 /* G10 files can only be linked with other G10 files.
1197 If the output is set to "any" this means that it is
1198 a G14 file that does not use hardware multiply/divide,
1199 but that is still incompatible with the G10 ABI. */
1203 /* xgettext:c-format */
1204 (_("RL78 ABI conflict: G10 file %pB cannot be linked"
1205 " with %s file %pB"),
1206 ibfd, rl78_cpu_name (out_cpu), obfd);
1210 old_flags &= ~ E_FLAG_RL78_CPU_MASK;
1211 old_flags |= in_cpu;
1212 elf_elfheader (obfd)->e_flags = old_flags;
1220 /* xgettext:c-format */
1221 (_("RL78 ABI conflict: cannot link %s file %pB with %s file %pB"),
1222 rl78_cpu_name (in_cpu), ibfd,
1223 rl78_cpu_name (out_cpu), obfd);
1227 if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
1230 (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
1232 if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
1233 /* xgettext:c-format */
1234 _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1237 /* xgettext:c-format */
1238 _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1248 rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
1250 FILE * file = (FILE *) ptr;
1253 BFD_ASSERT (abfd != NULL && ptr != NULL);
1255 /* Print normal ELF private data. */
1256 _bfd_elf_print_private_bfd_data (abfd, ptr);
1258 flags = elf_elfheader (abfd)->e_flags;
1259 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
1261 if (flags & E_FLAG_RL78_CPU_MASK)
1262 fprintf (file, " [%s]", rl78_cpu_name (flags));
1264 if (flags & E_FLAG_RL78_64BIT_DOUBLES)
1265 fprintf (file, _(" [64-bit doubles]"));
1271 /* Return the MACH for an e_flags value. */
1274 elf32_rl78_machine (bfd * abfd ATTRIBUTE_UNUSED)
1276 return bfd_mach_rl78;
1280 rl78_elf_object_p (bfd * abfd)
1282 bfd_default_set_arch_mach (abfd, bfd_arch_rl78,
1283 elf32_rl78_machine (abfd));
1287 /* support PLT for 16-bit references to 24-bit functions. */
1289 /* We support 16-bit pointers to code above 64k by generating a thunk
1290 below 64k containing a JMP instruction to the final address. */
1293 rl78_elf_check_relocs
1295 struct bfd_link_info * info,
1297 const Elf_Internal_Rela * relocs)
1299 Elf_Internal_Shdr * symtab_hdr;
1300 struct elf_link_hash_entry ** sym_hashes;
1301 const Elf_Internal_Rela * rel;
1302 const Elf_Internal_Rela * rel_end;
1303 bfd_vma *local_plt_offsets;
1307 if (bfd_link_relocatable (info))
1310 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1311 sym_hashes = elf_sym_hashes (abfd);
1312 local_plt_offsets = elf_local_got_offsets (abfd);
1313 dynobj = elf_hash_table(info)->dynobj;
1315 rel_end = relocs + sec->reloc_count;
1316 for (rel = relocs; rel < rel_end; rel++)
1318 struct elf_link_hash_entry *h;
1319 unsigned long r_symndx;
1322 r_symndx = ELF32_R_SYM (rel->r_info);
1323 if (r_symndx < symtab_hdr->sh_info)
1327 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1328 while (h->root.type == bfd_link_hash_indirect
1329 || h->root.type == bfd_link_hash_warning)
1330 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1333 switch (ELF32_R_TYPE (rel->r_info))
1335 /* This relocation describes a 16-bit pointer to a function.
1336 We may need to allocate a thunk in low memory; reserve memory
1340 elf_hash_table (info)->dynobj = dynobj = abfd;
1341 splt = elf_hash_table (info)->splt;
1344 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1345 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1346 | SEC_READONLY | SEC_CODE);
1347 splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
1349 elf_hash_table (info)->splt = splt;
1351 || ! bfd_set_section_alignment (dynobj, splt, 1))
1356 offset = &h->plt.offset;
1359 if (local_plt_offsets == NULL)
1364 size = symtab_hdr->sh_info * sizeof (bfd_vma);
1365 local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
1366 if (local_plt_offsets == NULL)
1368 elf_local_got_offsets (abfd) = local_plt_offsets;
1370 for (i = 0; i < symtab_hdr->sh_info; i++)
1371 local_plt_offsets[i] = (bfd_vma) -1;
1373 offset = &local_plt_offsets[r_symndx];
1376 if (*offset == (bfd_vma) -1)
1378 *offset = splt->size;
1388 /* This must exist if dynobj is ever set. */
1391 rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
1392 struct bfd_link_info *info)
1397 if (!elf_hash_table (info)->dynamic_sections_created)
1400 /* As an extra sanity check, verify that all plt entries have been
1401 filled in. However, relaxing might have changed the relocs so
1402 that some plt entries don't get filled in, so we have to skip
1403 this check if we're relaxing. Unfortunately, check_relocs is
1404 called before relaxation. */
1406 if (info->relax_trip > 0)
1409 dynobj = elf_hash_table (info)->dynobj;
1410 splt = elf_hash_table (info)->splt;
1411 if (dynobj != NULL && splt != NULL)
1413 bfd_byte *contents = splt->contents;
1414 unsigned int i, size = splt->size;
1416 for (i = 0; i < size; i += 4)
1418 unsigned int x = bfd_get_32 (dynobj, contents + i);
1419 BFD_ASSERT (x != 0);
1427 rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1428 struct bfd_link_info *info)
1433 if (bfd_link_relocatable (info))
1436 dynobj = elf_hash_table (info)->dynobj;
1440 splt = elf_hash_table (info)->splt;
1441 BFD_ASSERT (splt != NULL);
1443 splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
1444 if (splt->contents == NULL)
1452 /* Handle relaxing. */
1454 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1455 is within the low 64k, remove any entry for it in the plt. */
1457 struct relax_plt_data
1464 rl78_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1466 struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1468 if (h->plt.offset != (bfd_vma) -1)
1472 if (h->root.type == bfd_link_hash_undefined
1473 || h->root.type == bfd_link_hash_undefweak)
1476 address = (h->root.u.def.section->output_section->vma
1477 + h->root.u.def.section->output_offset
1478 + h->root.u.def.value);
1480 if (valid_16bit_address (address))
1483 data->splt->size -= 4;
1484 *data->again = TRUE;
1491 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1492 previously had a plt entry, give it a new entry offset. */
1495 rl78_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1497 bfd_vma *entry = (bfd_vma *) xdata;
1499 if (h->plt.offset != (bfd_vma) -1)
1501 h->plt.offset = *entry;
1509 rl78_elf_relax_plt_section (bfd *dynobj,
1511 struct bfd_link_info *info,
1514 struct relax_plt_data relax_plt_data;
1517 /* Assume nothing changes. */
1520 if (bfd_link_relocatable (info))
1523 /* We only relax the .plt section at the moment. */
1524 if (dynobj != elf_hash_table (info)->dynobj
1525 || strcmp (splt->name, ".plt") != 0)
1528 /* Quick check for an empty plt. */
1529 if (splt->size == 0)
1532 /* Map across all global symbols; see which ones happen to
1533 fall in the low 64k. */
1534 relax_plt_data.splt = splt;
1535 relax_plt_data.again = again;
1536 elf_link_hash_traverse (elf_hash_table (info), rl78_relax_plt_check,
1539 /* Likewise for local symbols, though that's somewhat less convenient
1540 as we have to walk the list of input bfds and swap in symbol data. */
1541 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1543 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1544 Elf_Internal_Shdr *symtab_hdr;
1545 Elf_Internal_Sym *isymbuf = NULL;
1548 if (! local_plt_offsets)
1551 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1552 if (symtab_hdr->sh_info != 0)
1554 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1555 if (isymbuf == NULL)
1556 isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1557 symtab_hdr->sh_info, 0,
1559 if (isymbuf == NULL)
1563 for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1565 Elf_Internal_Sym *isym;
1569 if (local_plt_offsets[idx] == (bfd_vma) -1)
1572 isym = &isymbuf[idx];
1573 if (isym->st_shndx == SHN_UNDEF)
1575 else if (isym->st_shndx == SHN_ABS)
1576 tsec = bfd_abs_section_ptr;
1577 else if (isym->st_shndx == SHN_COMMON)
1578 tsec = bfd_com_section_ptr;
1580 tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1582 address = (tsec->output_section->vma
1583 + tsec->output_offset
1585 if (valid_16bit_address (address))
1587 local_plt_offsets[idx] = -1;
1594 && symtab_hdr->contents != (unsigned char *) isymbuf)
1596 if (! info->keep_memory)
1600 /* Cache the symbols for elf_link_input_bfd. */
1601 symtab_hdr->contents = (unsigned char *) isymbuf;
1606 /* If we changed anything, walk the symbols again to reallocate
1607 .plt entry addresses. */
1608 if (*again && splt->size > 0)
1612 elf_link_hash_traverse (elf_hash_table (info),
1613 rl78_relax_plt_realloc, &entry);
1615 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1617 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1618 unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1621 if (! local_plt_offsets)
1624 for (idx = 0; idx < nlocals; ++idx)
1625 if (local_plt_offsets[idx] != (bfd_vma) -1)
1627 local_plt_offsets[idx] = entry;
1636 /* Delete some bytes from a section while relaxing. */
1639 elf32_rl78_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1640 Elf_Internal_Rela *alignment_rel, int force_snip)
1642 Elf_Internal_Shdr * symtab_hdr;
1643 unsigned int sec_shndx;
1644 bfd_byte * contents;
1645 Elf_Internal_Rela * irel;
1646 Elf_Internal_Rela * irelend;
1647 Elf_Internal_Sym * isym;
1648 Elf_Internal_Sym * isymend;
1650 unsigned int symcount;
1651 struct elf_link_hash_entry ** sym_hashes;
1652 struct elf_link_hash_entry ** end_hashes;
1657 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1659 contents = elf_section_data (sec)->this_hdr.contents;
1661 /* The deletion must stop at the next alignment boundary, if
1662 ALIGNMENT_REL is non-NULL. */
1665 toaddr = alignment_rel->r_offset;
1667 irel = elf_section_data (sec)->relocs;
1670 _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL, TRUE);
1671 irel = elf_section_data (sec)->relocs;
1674 irelend = irel + sec->reloc_count;
1676 /* Actually delete the bytes. */
1677 memmove (contents + addr, contents + addr + count,
1678 (size_t) (toaddr - addr - count));
1680 /* If we don't have an alignment marker to worry about, we can just
1681 shrink the section. Otherwise, we have to fill in the newly
1682 created gap with NOP insns (0x03). */
1686 memset (contents + toaddr - count, 0x03, count);
1688 /* Adjust all the relocs. */
1689 for (; irel && irel < irelend; irel++)
1691 /* Get the new reloc address. */
1692 if (irel->r_offset > addr
1693 && (irel->r_offset < toaddr
1694 || (force_snip && irel->r_offset == toaddr)))
1695 irel->r_offset -= count;
1697 /* If we see an ALIGN marker at the end of the gap, we move it
1698 to the beginning of the gap, since marking these gaps is what
1700 if (irel->r_offset == toaddr
1701 && ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
1702 && irel->r_addend & RL78_RELAXA_ALIGN)
1703 irel->r_offset -= count;
1706 /* Adjust the local symbols defined in this section. */
1707 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1708 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1709 isymend = isym + symtab_hdr->sh_info;
1711 for (; isym < isymend; isym++)
1713 /* If the symbol is in the range of memory we just moved, we
1714 have to adjust its value. */
1715 if (isym->st_shndx == sec_shndx
1716 && isym->st_value > addr
1717 && isym->st_value < toaddr)
1718 isym->st_value -= count;
1720 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1721 *end* is in the moved bytes but it's *start* isn't), then we
1722 must adjust its size. */
1723 if (isym->st_shndx == sec_shndx
1724 && isym->st_value < addr
1725 && isym->st_value + isym->st_size > addr
1726 && isym->st_value + isym->st_size < toaddr)
1727 isym->st_size -= count;
1730 /* Now adjust the global symbols defined in this section. */
1731 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1732 - symtab_hdr->sh_info);
1733 sym_hashes = elf_sym_hashes (abfd);
1734 end_hashes = sym_hashes + symcount;
1736 for (; sym_hashes < end_hashes; sym_hashes++)
1738 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1740 if ((sym_hash->root.type == bfd_link_hash_defined
1741 || sym_hash->root.type == bfd_link_hash_defweak)
1742 && sym_hash->root.u.def.section == sec)
1744 /* As above, adjust the value if needed. */
1745 if (sym_hash->root.u.def.value > addr
1746 && sym_hash->root.u.def.value < toaddr)
1747 sym_hash->root.u.def.value -= count;
1749 /* As above, adjust the size if needed. */
1750 if (sym_hash->root.u.def.value < addr
1751 && sym_hash->root.u.def.value + sym_hash->size > addr
1752 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1753 sym_hash->size -= count;
1760 /* Used to sort relocs by address. If relocs have the same address,
1761 we maintain their relative order, except that R_RL78_RH_RELAX
1762 alignment relocs must be the first reloc for any given address. */
1765 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1769 bfd_boolean swappit;
1771 /* This is almost a classic bubblesort. It's the slowest sort, but
1772 we're taking advantage of the fact that the relocations are
1773 mostly in order already (the assembler emits them that way) and
1774 we need relocs with the same address to remain in the same
1780 for (i = 0; i < count - 1; i ++)
1782 if (r[i].r_offset > r[i + 1].r_offset)
1784 else if (r[i].r_offset < r[i + 1].r_offset)
1786 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1787 && (r[i + 1].r_addend & RL78_RELAXA_ALIGN))
1789 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1790 && (r[i + 1].r_addend & RL78_RELAXA_ELIGN)
1791 && !(ELF32_R_TYPE (r[i].r_info) == R_RL78_RH_RELAX
1792 && (r[i].r_addend & RL78_RELAXA_ALIGN)))
1799 Elf_Internal_Rela tmp;
1804 /* If we do move a reloc back, re-scan to see if it
1805 needs to be moved even further back. This avoids
1806 most of the O(n^2) behavior for our cases. */
1816 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1817 rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1818 lrel, abfd, sec, link_info, scale)
1821 rl78_offset_for_reloc (bfd * abfd,
1822 Elf_Internal_Rela * rel,
1823 Elf_Internal_Shdr * symtab_hdr,
1824 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1825 Elf_Internal_Sym * intsyms,
1826 Elf_Internal_Rela ** lrel,
1828 asection * input_section,
1829 struct bfd_link_info * info,
1836 /* REL is the first of 1..N relocations. We compute the symbol
1837 value for each relocation, then combine them if needed. LREL
1838 gets a pointer to the last relocation used. */
1841 unsigned long r_type;
1843 /* Get the value of the symbol referred to by the reloc. */
1844 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1846 /* A local symbol. */
1847 Elf_Internal_Sym *isym;
1850 isym = intsyms + ELF32_R_SYM (rel->r_info);
1852 if (isym->st_shndx == SHN_UNDEF)
1853 ssec = bfd_und_section_ptr;
1854 else if (isym->st_shndx == SHN_ABS)
1855 ssec = bfd_abs_section_ptr;
1856 else if (isym->st_shndx == SHN_COMMON)
1857 ssec = bfd_com_section_ptr;
1859 ssec = bfd_section_from_elf_index (abfd,
1862 /* Initial symbol value. */
1863 symval = isym->st_value;
1865 /* GAS may have made this symbol relative to a section, in
1866 which case, we have to add the addend to find the
1868 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1869 symval += rel->r_addend;
1873 if ((ssec->flags & SEC_MERGE)
1874 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1875 symval = _bfd_merged_section_offset (abfd, & ssec,
1876 elf_section_data (ssec)->sec_info,
1880 /* Now make the offset relative to where the linker is putting it. */
1883 ssec->output_section->vma + ssec->output_offset;
1885 symval += rel->r_addend;
1890 struct elf_link_hash_entry * h;
1892 /* An external symbol. */
1893 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1894 h = elf_sym_hashes (abfd)[indx];
1895 BFD_ASSERT (h != NULL);
1897 if (h->root.type != bfd_link_hash_defined
1898 && h->root.type != bfd_link_hash_defweak)
1900 /* This appears to be a reference to an undefined
1901 symbol. Just ignore it--it will be caught by the
1902 regular reloc processing. */
1908 symval = (h->root.u.def.value
1909 + h->root.u.def.section->output_section->vma
1910 + h->root.u.def.section->output_offset);
1912 symval += rel->r_addend;
1915 r_type = ELF32_R_TYPE (rel->r_info);
1919 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1922 case R_RL78_OPromtop:
1923 symval = get_romstart (info, input_bfd, input_section, rel->r_offset);
1924 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1927 case R_RL78_OPramtop:
1928 symval = get_ramstart (info, input_bfd, input_section, rel->r_offset);
1929 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1939 case R_RL78_OPsctsize:
1940 case R_RL78_OPscttop:
1946 (void) rl78_compute_complex_reloc (r_type, 0, input_section);
1949 case R_RL78_DIR16UL:
1951 case R_RL78_ABS16UL:
1954 goto reloc_computes_value;
1956 case R_RL78_DIR16UW:
1958 case R_RL78_ABS16UW:
1961 goto reloc_computes_value;
1964 reloc_computes_value:
1965 symval = rl78_compute_complex_reloc (r_type, symval, input_section);
1972 case R_RL78_DIR24S_PCREL:
1973 case R_RL78_DIR16S_PCREL:
1974 case R_RL78_DIR8S_PCREL:
1985 int prefix; /* or -1 for "no prefix" */
1986 int insn; /* or -1 for "end of list" */
1987 int insn_for_saddr; /* or -1 for "no alternative" */
1988 int insn_for_sfr; /* or -1 for "no alternative" */
1989 } relax_addr16[] = {
1990 { -1, 0x02, 0x06, -1 }, /* ADDW AX, !addr16 */
1991 { -1, 0x22, 0x26, -1 }, /* SUBW AX, !addr16 */
1992 { -1, 0x42, 0x46, -1 }, /* CMPW AX, !addr16 */
1993 { -1, 0x40, 0x4a, -1 }, /* CMP !addr16, #byte */
1995 { -1, 0x0f, 0x0b, -1 }, /* ADD A, !addr16 */
1996 { -1, 0x1f, 0x1b, -1 }, /* ADDC A, !addr16 */
1997 { -1, 0x2f, 0x2b, -1 }, /* SUB A, !addr16 */
1998 { -1, 0x3f, 0x3b, -1 }, /* SUBC A, !addr16 */
1999 { -1, 0x4f, 0x4b, -1 }, /* CMP A, !addr16 */
2000 { -1, 0x5f, 0x5b, -1 }, /* AND A, !addr16 */
2001 { -1, 0x6f, 0x6b, -1 }, /* OR A, !addr16 */
2002 { -1, 0x7f, 0x7b, -1 }, /* XOR A, !addr16 */
2004 { -1, 0x8f, 0x8d, 0x8e }, /* MOV A, !addr16 */
2005 { -1, 0x9f, 0x9d, 0x9e }, /* MOV !addr16, A */
2006 { -1, 0xaf, 0xad, 0xae }, /* MOVW AX, !addr16 */
2007 { -1, 0xbf, 0xbd, 0xbe }, /* MOVW !addr16, AX */
2008 { -1, 0xcf, 0xcd, 0xce }, /* MOVW !addr16, #word */
2010 { -1, 0xa0, 0xa4, -1 }, /* INC !addr16 */
2011 { -1, 0xa2, 0xa6, -1 }, /* INCW !addr16 */
2012 { -1, 0xb0, 0xb4, -1 }, /* DEC !addr16 */
2013 { -1, 0xb2, 0xb6, -1 }, /* DECW !addr16 */
2015 { -1, 0xd5, 0xd4, -1 }, /* CMP0 !addr16 */
2016 { -1, 0xe5, 0xe4, -1 }, /* ONEB !addr16 */
2017 { -1, 0xf5, 0xf4, -1 }, /* CLRB !addr16 */
2019 { -1, 0xd9, 0xd8, -1 }, /* MOV X, !addr16 */
2020 { -1, 0xe9, 0xe8, -1 }, /* MOV B, !addr16 */
2021 { -1, 0xf9, 0xf8, -1 }, /* MOV C, !addr16 */
2022 { -1, 0xdb, 0xda, -1 }, /* MOVW BC, !addr16 */
2023 { -1, 0xeb, 0xea, -1 }, /* MOVW DE, !addr16 */
2024 { -1, 0xfb, 0xfa, -1 }, /* MOVW HL, !addr16 */
2026 { 0x61, 0xaa, 0xa8, -1 }, /* XCH A, !addr16 */
2028 { 0x71, 0x00, 0x02, 0x0a }, /* SET1 !addr16.0 */
2029 { 0x71, 0x10, 0x12, 0x1a }, /* SET1 !addr16.0 */
2030 { 0x71, 0x20, 0x22, 0x2a }, /* SET1 !addr16.0 */
2031 { 0x71, 0x30, 0x32, 0x3a }, /* SET1 !addr16.0 */
2032 { 0x71, 0x40, 0x42, 0x4a }, /* SET1 !addr16.0 */
2033 { 0x71, 0x50, 0x52, 0x5a }, /* SET1 !addr16.0 */
2034 { 0x71, 0x60, 0x62, 0x6a }, /* SET1 !addr16.0 */
2035 { 0x71, 0x70, 0x72, 0x7a }, /* SET1 !addr16.0 */
2037 { 0x71, 0x08, 0x03, 0x0b }, /* CLR1 !addr16.0 */
2038 { 0x71, 0x18, 0x13, 0x1b }, /* CLR1 !addr16.0 */
2039 { 0x71, 0x28, 0x23, 0x2b }, /* CLR1 !addr16.0 */
2040 { 0x71, 0x38, 0x33, 0x3b }, /* CLR1 !addr16.0 */
2041 { 0x71, 0x48, 0x43, 0x4b }, /* CLR1 !addr16.0 */
2042 { 0x71, 0x58, 0x53, 0x5b }, /* CLR1 !addr16.0 */
2043 { 0x71, 0x68, 0x63, 0x6b }, /* CLR1 !addr16.0 */
2044 { 0x71, 0x78, 0x73, 0x7b }, /* CLR1 !addr16.0 */
2049 /* Relax one section. */
2052 rl78_elf_relax_section
2055 struct bfd_link_info * link_info,
2056 bfd_boolean * again)
2058 Elf_Internal_Shdr * symtab_hdr;
2059 Elf_Internal_Shdr * shndx_hdr;
2060 Elf_Internal_Rela * internal_relocs;
2061 Elf_Internal_Rela * free_relocs = NULL;
2062 Elf_Internal_Rela * irel;
2063 Elf_Internal_Rela * srel;
2064 Elf_Internal_Rela * irelend;
2065 Elf_Internal_Rela * next_alignment;
2066 bfd_byte * contents = NULL;
2067 bfd_byte * free_contents = NULL;
2068 Elf_Internal_Sym * intsyms = NULL;
2069 Elf_Internal_Sym * free_intsyms = NULL;
2070 Elf_External_Sym_Shndx * shndx_buf = NULL;
2072 bfd_vma symval ATTRIBUTE_UNUSED = 0;
2073 int pcrel ATTRIBUTE_UNUSED = 0;
2074 int code ATTRIBUTE_UNUSED = 0;
2075 int section_alignment_glue;
2078 if (abfd == elf_hash_table (link_info)->dynobj
2079 && strcmp (sec->name, ".plt") == 0)
2080 return rl78_elf_relax_plt_section (abfd, sec, link_info, again);
2082 /* Assume nothing changes. */
2085 /* We don't have to do anything for a relocatable link, if
2086 this section does not have relocs, or if this is not a
2088 if (bfd_link_relocatable (link_info)
2089 || (sec->flags & SEC_RELOC) == 0
2090 || sec->reloc_count == 0
2091 || (sec->flags & SEC_CODE) == 0)
2094 symtab_hdr = & elf_symtab_hdr (abfd);
2095 if (elf_symtab_shndx_list (abfd))
2096 shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2100 /* Get the section contents. */
2101 if (elf_section_data (sec)->this_hdr.contents != NULL)
2102 contents = elf_section_data (sec)->this_hdr.contents;
2103 /* Go get them off disk. */
2106 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2108 elf_section_data (sec)->this_hdr.contents = contents;
2111 /* Read this BFD's symbols. */
2112 /* Get cached copy if it exists. */
2113 if (symtab_hdr->contents != NULL)
2114 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2117 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2118 symtab_hdr->contents = (bfd_byte *) intsyms;
2121 if (shndx_hdr && shndx_hdr->sh_size != 0)
2125 amt = symtab_hdr->sh_info;
2126 amt *= sizeof (Elf_External_Sym_Shndx);
2127 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2128 if (shndx_buf == NULL)
2130 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2131 || bfd_bread (shndx_buf, amt, abfd) != amt)
2133 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2136 /* Get a copy of the native relocations. */
2137 internal_relocs = (_bfd_elf_link_read_relocs
2138 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2139 link_info->keep_memory));
2140 if (internal_relocs == NULL)
2142 if (! link_info->keep_memory)
2143 free_relocs = internal_relocs;
2145 /* The RL_ relocs must be just before the operand relocs they go
2146 with, so we must sort them to guarantee this. We use bubblesort
2147 instead of qsort so we can guarantee that relocs with the same
2148 address remain in the same relative order. */
2149 reloc_bubblesort (internal_relocs, sec->reloc_count);
2151 /* Walk through them looking for relaxing opportunities. */
2152 irelend = internal_relocs + sec->reloc_count;
2155 /* This will either be NULL or a pointer to the next alignment
2157 next_alignment = internal_relocs;
2159 /* We calculate worst case shrinkage caused by alignment directives.
2160 No fool-proof, but better than either ignoring the problem or
2161 doing heavy duty analysis of all the alignment markers in all
2163 section_alignment_glue = 0;
2164 for (irel = internal_relocs; irel < irelend; irel++)
2165 if (ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
2166 && irel->r_addend & RL78_RELAXA_ALIGN)
2168 int this_glue = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2170 if (section_alignment_glue < this_glue)
2171 section_alignment_glue = this_glue;
2173 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2175 section_alignment_glue *= 2;
2177 for (irel = internal_relocs; irel < irelend; irel++)
2179 unsigned char *insn;
2182 /* The insns we care about are all marked with one of these. */
2183 if (ELF32_R_TYPE (irel->r_info) != R_RL78_RH_RELAX)
2186 if (irel->r_addend & RL78_RELAXA_ALIGN
2187 || next_alignment == internal_relocs)
2189 /* When we delete bytes, we need to maintain all the alignments
2190 indicated. In addition, we need to be careful about relaxing
2191 jumps across alignment boundaries - these displacements
2192 *grow* when we delete bytes. For now, don't shrink
2193 displacements across an alignment boundary, just in case.
2194 Note that this only affects relocations to the same
2196 next_alignment += 2;
2197 while (next_alignment < irelend
2198 && (ELF32_R_TYPE (next_alignment->r_info) != R_RL78_RH_RELAX
2199 || !(next_alignment->r_addend & RL78_RELAXA_ELIGN)))
2201 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2202 next_alignment = NULL;
2205 /* When we hit alignment markers, see if we've shrunk enough
2206 before them to reduce the gap without violating the alignment
2208 if (irel->r_addend & RL78_RELAXA_ALIGN)
2210 /* At this point, the next relocation *should* be the ELIGN
2212 Elf_Internal_Rela *erel = irel + 1;
2213 unsigned int alignment, nbytes;
2215 if (ELF32_R_TYPE (erel->r_info) != R_RL78_RH_RELAX)
2217 if (!(erel->r_addend & RL78_RELAXA_ELIGN))
2220 alignment = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2222 if (erel->r_offset - irel->r_offset < alignment)
2225 nbytes = erel->r_offset - irel->r_offset;
2226 nbytes /= alignment;
2227 nbytes *= alignment;
2229 elf32_rl78_relax_delete_bytes (abfd, sec, erel->r_offset - nbytes, nbytes,
2230 next_alignment, erel->r_offset == sec->size);
2236 if (irel->r_addend & RL78_RELAXA_ELIGN)
2239 insn = contents + irel->r_offset;
2241 nrelocs = irel->r_addend & RL78_RELAXA_RNUM;
2243 /* At this point, we have an insn that is a candidate for linker
2244 relaxation. There are NRELOCS relocs following that may be
2245 relaxed, although each reloc may be made of more than one
2246 reloc entry (such as gp-rel symbols). */
2248 /* Get the value of the symbol referred to by the reloc. Just
2249 in case this is the last reloc in the list, use the RL's
2250 addend to choose between this reloc (no addend) or the next
2251 (yes addend, which means at least one following reloc). */
2253 /* srel points to the "current" reloction for this insn -
2254 actually the last reloc for a given operand, which is the one
2255 we need to update. We check the relaxations in the same
2256 order that the relocations happen, so we'll just push it
2260 pc = sec->output_section->vma + sec->output_offset
2264 BFD_ASSERT (nrelocs > 0); \
2265 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2266 pcrel = symval - pc + srel->r_addend; \
2269 #define SNIPNR(offset, nbytes) \
2270 elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2272 #define SNIP(offset, nbytes, newtype) \
2273 SNIPNR (offset, nbytes); \
2274 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2276 /* The order of these bit tests must match the order that the
2277 relocs appear in. Since we sorted those by offset, we can
2280 /*----------------------------------------------------------------------*/
2281 /* EF ad BR $rel8 pcrel
2282 ED al ah BR !abs16 abs
2283 EE al ah BR $!rel16 pcrel
2284 EC al ah as BR !!abs20 abs
2286 FD al ah CALL !abs16 abs
2287 FE al ah CALL $!rel16 pcrel
2288 FC al ah as CALL !!abs20 abs
2296 61 C8 EF ad SKC ; BR $rel8
2297 61 D8 EF ad SKNC ; BR $rel8
2298 61 E8 EF ad SKZ ; BR $rel8
2299 61 F8 EF ad SKNZ ; BR $rel8
2300 61 E3 EF ad SKH ; BR $rel8
2301 61 F3 EF ad SKNH ; BR $rel8
2304 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_BRA)
2306 /* SKIP opcodes that skip non-branches will have a relax tag
2307 but no corresponding symbol to relax against; we just
2309 if (irel->r_addend & RL78_RELAXA_RNUM)
2318 case 0xde: /* BNC */
2319 case 0xdf: /* BNZ */
2320 if (insn[1] == 0x03 && insn[2] == 0xee /* BR */
2321 && (srel->r_offset - irel->r_offset) > 1) /* a B<c> without its own reloc */
2323 /* This is a "long" conditional as generated by gas:
2328 insn[0] ^= 0x02; /* invert conditional */
2330 SNIP (1, 2, R_RL78_DIR8S_PCREL);
2337 case 0xec: /* BR !!abs20 */
2344 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2347 else if (symval < 65536)
2350 insn[1] = symval & 0xff;
2351 insn[2] = symval >> 8;
2352 SNIP (2, 1, R_RL78_DIR16U);
2355 else if (pcrel < 32767
2359 insn[1] = pcrel & 0xff;
2360 insn[2] = pcrel >> 8;
2361 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2366 case 0xee: /* BR $!pcrel16 */
2367 case 0xed: /* BR $!abs16 */
2373 SNIP (2, 1, R_RL78_DIR8S_PCREL);
2378 case 0xfc: /* CALL !!abs20 */
2382 insn[1] = symval & 0xff;
2383 insn[2] = symval >> 8;
2384 SNIP (2, 1, R_RL78_DIR16U);
2387 else if (pcrel < 32767
2391 insn[1] = pcrel & 0xff;
2392 insn[2] = pcrel >> 8;
2393 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2398 case 0x61: /* PREFIX */
2399 /* For SKIP/BR, we change the BR opcode and delete the
2400 SKIP. That way, we don't have to find and change the
2401 relocation for the BR. */
2402 /* Note that, for the case where we're skipping some
2403 other insn, we have no "other" reloc but that's safe
2407 case 0xd3: /* BNH */
2409 if (insn[2] == 0x03 && insn[3] == 0xee
2410 && (srel->r_offset - irel->r_offset) > 2) /* a B<c> without its own reloc */
2412 /* Another long branch by gas:
2413 61 D3 03 EE ad.dr */
2417 insn[1] ^= 0x10; /* invert conditional */
2419 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2426 case 0xc8: /* SKC */
2427 if (insn[2] == 0xef)
2429 insn[2] = 0xde; /* BNC */
2434 case 0xd8: /* SKNC */
2435 if (insn[2] == 0xef)
2437 insn[2] = 0xdc; /* BC */
2442 case 0xe8: /* SKZ */
2443 if (insn[2] == 0xef)
2445 insn[2] = 0xdf; /* BNZ */
2450 case 0xf8: /* SKNZ */
2451 if (insn[2] == 0xef)
2453 insn[2] = 0xdd; /* BZ */
2458 case 0xe3: /* SKH */
2459 if (insn[2] == 0xef)
2461 insn[2] = 0xd3; /* BNH */
2462 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2466 case 0xf3: /* SKNH */
2467 if (insn[2] == 0xef)
2469 insn[2] = 0xc3; /* BH */
2470 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2478 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_ADDR16
2481 /*----------------------------------------------------------------------*/
2482 /* Some insns have both a 16-bit address operand and an 8-bit
2483 variant if the address is within a special range:
2485 Address 16-bit operand SADDR range SFR range
2486 FFF00-FFFFF 0xff00-0xffff 0x00-0xff
2487 FFE20-FFF1F 0xfe20-0xff1f 0x00-0xff
2489 The RELAX_ADDR16[] array has the insn encodings for the
2490 16-bit operand version, as well as the SFR and SADDR
2491 variants. We only need to replace the encodings and
2494 Note: we intentionally do not attempt to decode and skip
2495 any ES: prefix, as adding ES: means the addr16 (likely)
2496 no longer points to saddr/sfr space.
2506 if (0xffe20 <= symval && symval <= 0xfffff)
2509 is_saddr = (0xffe20 <= symval && symval <= 0xfff1f);
2510 is_sfr = (0xfff00 <= symval && symval <= 0xfffff);
2512 for (idx = 0; relax_addr16[idx].insn != -1; idx ++)
2514 if (relax_addr16[idx].prefix != -1
2515 && insn[0] == relax_addr16[idx].prefix
2516 && insn[1] == relax_addr16[idx].insn)
2520 else if (relax_addr16[idx].prefix == -1
2521 && insn[0] == relax_addr16[idx].insn)
2528 /* We have a matched insn, and poff is 0 or 1 depending
2529 on the base pattern size. */
2531 if (is_sfr && relax_addr16[idx].insn_for_sfr != -1)
2533 insn[poff] = relax_addr16[idx].insn_for_sfr;
2534 SNIP (poff+2, 1, R_RL78_RH_SFR);
2537 else if (is_saddr && relax_addr16[idx].insn_for_saddr != -1)
2539 insn[poff] = relax_addr16[idx].insn_for_saddr;
2540 SNIP (poff+2, 1, R_RL78_RH_SADDR);
2545 /*----------------------------------------------------------------------*/
2551 if (free_relocs != NULL)
2554 if (free_contents != NULL)
2555 free (free_contents);
2557 if (shndx_buf != NULL)
2559 shndx_hdr->contents = NULL;
2563 if (free_intsyms != NULL)
2564 free (free_intsyms);
2571 #define ELF_ARCH bfd_arch_rl78
2572 #define ELF_MACHINE_CODE EM_RL78
2573 #define ELF_MAXPAGESIZE 0x1000
2575 #define TARGET_LITTLE_SYM rl78_elf32_vec
2576 #define TARGET_LITTLE_NAME "elf32-rl78"
2578 #define elf_info_to_howto_rel NULL
2579 #define elf_info_to_howto rl78_info_to_howto_rela
2580 #define elf_backend_object_p rl78_elf_object_p
2581 #define elf_backend_relocate_section rl78_elf_relocate_section
2582 #define elf_symbol_leading_char ('_')
2583 #define elf_backend_can_gc_sections 1
2585 #define bfd_elf32_bfd_reloc_type_lookup rl78_reloc_type_lookup
2586 #define bfd_elf32_bfd_reloc_name_lookup rl78_reloc_name_lookup
2587 #define bfd_elf32_bfd_set_private_flags rl78_elf_set_private_flags
2588 #define bfd_elf32_bfd_merge_private_bfd_data rl78_elf_merge_private_bfd_data
2589 #define bfd_elf32_bfd_print_private_bfd_data rl78_elf_print_private_bfd_data
2591 #define bfd_elf32_bfd_relax_section rl78_elf_relax_section
2592 #define elf_backend_check_relocs rl78_elf_check_relocs
2593 #define elf_backend_always_size_sections \
2594 rl78_elf_always_size_sections
2595 #define elf_backend_finish_dynamic_sections \
2596 rl78_elf_finish_dynamic_sections
2598 #include "elf32-target.h"